proc 파헤치기

Oracle 2007. 1. 21. 17:07

1절. 소개

이번장에서는 Proc 프로그래밍을 좀더 깊이 있게 다루어 보도록 하겠다. Proc 프로그래밍 환경은 이미 다 갖추어져 있으며, proc 가 무엇인지도 개념을 잡고 있다고 가정하고 강좌를 진행할 것이다. sql 역시 기본적으로 사용할줄 아는걸로 가정하겠다.

만약 위의 내용들이 준비되어 있지 못하다면 proc 프로그래밍(1)오라클 817 설치하기 문서를 먼저 읽어 보기 바란다.

이외에도 Proc 와 직접적인 관련은 없지만 termios 를 이용한 터미널 제어와 ANSI 를 이용한 화면조정에 대한 내용도 코드를 통해서 약간 다루게 될것이다. termios 는 조만간 자료를 만들어서 올릴 생각이니, 이 문서에서는 그냥 이러한 도구를 이용해서 터미널 제어가 가능하구나.. 하는 정도로만 알아두길 바란다.


2절. proc 프로그래밍의 기본

2.1절. proc 문의 구조

기본적으로 proc 는 C 코드와 함께 쓰이도록 되어 있다. 이를테면 C 코드안에 SQL 문을 포함(embedded) 시키는 일을 한다. 그럼으로 proc 가 구조적으로 가져야될 가장 중요한 특징은 바로 (oracle)sql 과 C 프로그램과의 데이타 교환이 될것이다.

proc 는 C 와의 데이타 교환을 지원하기 위해서 4가지 큰 구조로 나뉜다. 하나는 Executable 영역이며, 다른 하나는 Declarative 영역이다. 또한 PL/SQL 블럭을 추가 시킬수 있으며, SQL 명령의 실행 상태를 측정하기 위함 Indicator Variables 등을 사용할수 있다.


2.1.1절. Executable 영역

Executable 이라는 어감에서 알수 있듯이, Executable 은 SQLLIB 를 실행시간에 호출하기 위해서 사용되는 영역이다. SQLLIB 를 호출함으로써 C(혹은 C++)로 된 코드에서 오라클 SQL 을 실행하고 때에 따라서는 SQL 문에 C 에서 선언한 값을 입력하거나 혹은 SQL 쿼리 결과를 C 에서 선언한 변수에 출력할수 있게 된다.

Executable 영역은 오라클 에서 데이타베이스 관리를 위해서 사용하는 표준 SQL 과 확장(오라클에서 추가한) SQL 문을 실행한다. 즉 테이블을 생성하거나 CREATE, 지우고 DROP, 권한 설정을 하고 GRANT, 값을 가져오거나 SELECT, 값을 지우는 DELETE 등의 일을 처리하게 된다. SQL 문을 C 코드에 embeded 시키기 위한 영역이라고 생각하면 된다.

다음은 Executable 영역에서 다룰수 있는 SQL 관련 실행문이다. 이 문서는 ORACLE SQL 자체에 대한 강의문서는 아님으로 이러한 일들을 할수 있다라는 정도로 열거만 하도록 하겠다. 조금이라도 SQL 을 다루어 보았다면 대부분 무슨일을 하는 명령어인지 이해될것이다.

CLOSE, CONNECT, CREATE, DROP, FREE, GRANT, AOAUDIT, RENAME, TRUNCATE, DELETE, EXPLAIN PLAN, FETCH, INSERT, LOCK TABLE, OPEN, SELECT, UPDATE, COMMIT(트랜잭션관리), ROLLBACK, SAVEPOINT, SET TRANSACTION, DESCRIBE(dynamic sql 용), EXECUTE, PREPARE, ALTER SESSION(세션 제어용) 
위의 명령어들은 다시 Interactive 한것과 그렇지 않은 것 (no Interactive)으로 나뉜다. 인터엑티브란 SQL문 실행결과와 C프로그램간의 데이타 교환이 있는 것을 말하며, no 인터엑티브란 SQL 문만 단독으로 실행되며 C 프로그램과의 데이타 교환이 없는걸 말한다. no Interactive 한 문으로는 CONNECT, FETCH, OPEN, DESCRIBE, EXECUTE, PREPARE 가 있다. - 나머지는 모두 C코드와 인터엑티브 하게 작용(상호작용)한다 - 복잡하게 생각할 필요 없이 그냥 상식적으로 생각하면 된다. 오라클과 연결하고, DB 를 OPEN 하는데는 C코드와 얘기할 필요가 전혀 없을 것이다. 그냥 연결하고 오픈하면 되기 때문이다. 반면 SELECT 의 경우 오라클에서 SELECT 한 결과를 C 프로그램에 되돌려주어야 함으로 interactive 하게 작용할 필요가 있다.

interactive 하게 사용하기 위해서보통 ":" 을 사용하게 된다. 예를들어서 오라클 DB 에서 셀렉트한 결과를 C 프로그램의 변수에 저장하길 원한다면 아래와 같은 방법으로 사용하면 된다.

char zipcode[12];EXEC SQL SELECT zipcode          INTO : zipcode[12]          FROM zipcode where zipcode_no = "500-180"; 
C 프로그램에서 알아와야 될 값은 SELECT 로 가져오게 되는 zipcode 값이다. 이것을 C 프로그램에서 선언한 zipcode 로 넘겨주기 위해서(INTO) ":" 를 사용하고 있음을 알수 있다.


2.1.2절. DECLARATIVE 지원

기본적으로 C 의 자료형과 SQL 에서 다루는 자료형은 서로 호환되지 않는다.

그럼으로 이들의 호환을 보장해줄수 있어야 한다. 해서 proc 는 별도의 선언(Declarative) 영역을 두어서, 선언을 하게 하고 proc 프리컴파일러를 돌려서 나중에 C 코드와 호환가능 하도록 변환하는 정책을 사용하고 있다.


2.1.3절. Embedded PL/SQL Blocks

proc 는 PL/SQL 블럭을 C 코드상에서 사용할수 있도록 도와준다. PL/SQL 블럭을 추가하기 위해서 단지 EXEC SQL EXECUTE 와 END-EXEC 만을 사용하면 된다.

PL/SQL 은 기본적으로 모든 SQL 데이타를 제어할수 있도록 지원하며, 아울러 트랜잭션까지도 해결해준다. 그럼으로 훨씬 안정성있고, 유지 관리 편한 코드를 만들수 있도록 도와 준다.


2.1.4절. host 변수와 indicator 변수

Host 변수는 오라클과 어플리케이션(C/C++ 로된) 사이의 통신(데이타 교환)을 위해서 사용된다. 이들 변수는 C 코드 상에서 생성되며, 선언된 변수는 C 와 공유할수 있게 된다.

host 변수는 크게 input host 변수와 output host 변수가 있는데, input host 변수는 프로그램 데이타를 Oracle 에 넘겨주기 위해서 사용되며, output host 변수는 오라클의 데이타(쿼리 결과등)을 프로그램에게 넘겨주기 위해서 사용한다. 이러한 호스트변수의 사용은 오라클문장에 ":" 를 이용함으로써 사용가능하게 된다.

또한 indicator 변수를 사용할수도 있는데, indicator 란 뜻에서 생각할수 있듯이 오라클문의 실행결과를 측정하기 위한 용도로 사용한다. 이를테면 CONNECT 를 통해서 ORACLE DB 서버로 연결을 시도했을때의 성공혹은 실패에 대한 리턴값이라고 보면 될것이다. 좀더 기술적으로 말하자면 indicator 변수는 host 변수의 상태를 측정하기 위한 용도로 상요된다.


2.1.5절. Cursor 과 Fetch 의 지원

fetch 라면 특히 php+mysql 을 이용한 웹플밍 작업을 하면서 많이 다루어 보았을것이다. proc 에서는 쿼리결과물(리스트) 의 관리를 위해서 Cursor 과 Fetch 를 지원한다.


2.2절. 오라클의 데이타 타입

proc 프로그래밍의 일반적인 방법은 C 프로그램에서 input host 변수를 통해서 ORACLE 측에 데이타를 요청하면, ORACLE 데이타베이스는 output host 변수를 통해서 C 프로그램에 데이타를 되돌려 주는 방식을 사용한다. 그러므로 오라클은 반드시 C 프로그램과의 통신에 사용되는 데이타의 타입에 대해서 알고 있어야만 한다.

오라클은 interanl 과 external 2가지의 데이타 타입을 인식한다. interanl 데이타 타입은 오라클 데이타베이스에서 각각의 칼럼의 데이타 타입을 지정하기 위해서 사용하는 데이타 타입이다.

external 데이타 타입은 host 변수를 통해서 저장될 데이타의 타입을 말한다. 만약 C 프로그램에서 input host 변수를 통해서 오라클에 데이타를 전달했다면, 오라클은 이 변수를 external 데이타로 간주하고 이것을 오라클자신이 사용하는 internal 데이타 타입과 일치시켜서 작업을 하게 된다. 마찬가지로 작어을 마치고 데이타를 되돌려 줄때도 internal 데이타 타입을 external 데이타 타입으로 변경시킨후 output host 변수에 저장해서 되돌려 주게 된다. 이러한 복잡한 데이타 변환작업이 일어나는 이유는 C 프로그램에서 사용하는 데이타 타입과 오라클에서 사용하는 데이타 타입이 근본적으로 서로 다르기 때문이다. 내부적으로 보자면 proc 는 이러한 데이타 타입의 일치를 위해서 void * 형변환을 이용한다.

proc 는 호스트 변수로 배열을 사용할수 있도록 지원하며, 마찬가지로 구조체도 지원한다. 이러한 배열/구조체 가 사용될수 있는 곳은 SQL 문을 사용할경우이다. 즉 SELECT, FETCH, DELETE, INSERT, UPDATE 등에 사용할수 있다.


2.3절. Transaction

오라클에서 Transaction 은 매우 중요한 요소이다. Transaction 은 이를테면 데이타의 무결성을 검증시켜주기 위해서 SQL 상태를 논리적인 하나의 상태로 관리하는 것이라고 볼수 있다.

oracle 은 transaction 을 유지하기 위해서 COMMIT 와 ROLLBACK 를 이용하는데, proc 에서도 마찬가지로 COMMIT, ROLLBACK 를 그대로 이용해서 트랜잭션을 처리할수 있도록 도와준다. 이러한 작업은 특히 PL/SQL 구문을 이용함으로써 C 코드상에 쉽게 임베디드 시킬수 있다. 아래는 Executable SQL문을 이용해서 어떻게 트랜잭션처리를 할수 있는지를 벼여준다.

...EXEC SQL   UPDATE zipcode    SET dong =: mdong   WHERE bunji =: mbungiif (sqlca.sqlcode == 0)    EXEC SQL COMMIT WORKelse     EXEC SQL ROLLBACK WORK;... 


2.4절. Error 제어

제대로된 프로그램은 제대로된 에러처리 루틴을 가진다. proc 는 WHENEVER 문을 통해서 ORACLE 에서의 작업중 발생한 문제를 C 어플리케이션에서 알수 있도록 도와준다.

이것은 단지 SQLCA 를 include 시키는 것으로 가능하며, 에러를 체크해야될 부분에서 간단하게 사용할수 있다. 예를들어 오라클 서버에 연결을 시도하고 연결 시도 결과를 체크하고 싶다면, 아래와 같은 간단한 방법으로 에러를 제어할수 있다.

EXEC SQL INCLUDE SQLCA;....int main(){    ....    EXEC SQL CONNECT :userid;    // 에러 검사    if (sqlca.sqlcode < 0)    {        // 자세한 에러메시지 출력        printf("%s\n", sqlca.sqlerrm.sqlerrmc);        exit(0);    }} 


2.5절. Proc를 이용한 어플리케이션 개발방법

전체적으로 보자면 다음과 같은 방법을 통해서 Proc 개발이 이루어진다.

그림 1. Proc를 이용 오라클 DB프로그래밍 과정

보면 알겠지만 일반적인 C 어플리케이션 개발방법과 비교해서 "Proc 코드작성", "Precomplie" 가 들어간것만 빼고는 동일하다는걸 알수 있을 것이다.


3절. 셈플작성

가장 빠른 이해를 위해서는 역시 셈플 작성만한게 없다. 이미 모든 테스트 환경은 가추어져 있다고 가정을 하고 셈플을 작성할 것이다. 셈플 프로그램은 "우편주소 검색" 프로그램이다.

셈플프로그램은 모듈별로 분할되어서 Makefile 로 관리 될것이며, 헤더 파일은 include 라는 서브디렉토리를 만들것어서 관리하게 된다. 다음은 이번 예제의 쏘쓰 트리구성도이다.

 +--/---+--- Makefile      make 파일        |        +--- main.pc       main 함수를 포함        |        +--- myterm.pc     teminal 제어 관련 함수        |        +--- zipcode.pc    DB연결및 쿼리 관련        |        +--- include ----+-- menu.h     메뉴들                          |                         +-- myterm.h                           |                         +-- zipcode.h 

셈플 어플리케이션은 사용자와의 인터페이스를 위해서 ANSI 와 termios 를 조합해서 사용할것이다. ANSI 는 출력의 모양 - 커서이동, 화면 정리 - 을 조정하기 위해서 사용되며, termios 는 터미널 특성(입출력) 을 제어하기 위해서 사용될것이다.

예를들어서 보통 패스워드 입력을 위해서는 패스워드를 화면에 출력하지 않고 "*" 로 대치시켜서 출력하게 된다. 이러한 기능은 termios 의 터미널특성 제어를 통해서 구현하게 된다. termios 는 별도의 문서를 이용해서 자세히 설명하도록 할것이다.

ANSI 는 커서의 움직임과 화면지우기, 라인지우기 등의 구현을 위해서 사용한다.


3.1절. Makefile

아주 간단하다. 분석하는데 어려움이 없을것이다.

TARGET          = zipcodeCC              = gccPROC            = procLIB             = -L$(ORACLE_HOME)/lib -lclntshMYINC           = include/PROCINC         = include=$(ORACLE_HOME)/precomp/public/ include=$(ORACLE_HOME)/rdbms/demo/ \    include=$(ORACLE_HOME)/rdbms/public/ \    include=$(ORACLE_HOME)/network/public/ CINC            = -I$(ORACLE_HOME)/precomp/public/ -I$(ORACLE_HOME)/rdbms/demo/ \    -I$(ORACLE_HOME)/rdbms/public/ -I$(ORACLE_HOME)/network/public/ ORA_OPT         = PARSE=NONE RELEASE_CURSOR=YES MODE=ANSICC_OPT          =OBJECT          = main.o \                zipcode.o \                myterm.oORA_GARBAGE     = *.dcl *.cod *.cud *.lis######## implicit rules.SUFFIXES: .pc .c.pc.c:    $(PROC) $* INCLUDE=$(MYINC) $(PROCINC) $(ORA_OPT).c.o:    $(CC) -c -o $*.o $*.c -I $(MYINC) $(CINC)####### build rulesall:            $(TARGET)$(TARGET):      $(OBJECT)    $(CC) -o $(TARGET) $(OBJECT) $(LIB)main.c: main.pcmain.o: main.c zipcode.c myterm.czipcode.c : zipcode.pczipcode.o : zipcode.cmyterm.c : myterm.pcmyterm.o : myterm.cclean:    rm -f $(TARGET) $(OBJECT) $(ORA_GARBAGE) *.c 


3.2절. main.pc

#include <unistd.h>#include <stdio.h>#include <zipcode.h>#include <myterm.h>#include <termios.h>int main(){    /* 터미널 초기화 */      termio_init();    /* 로그인 */      if (login(3) < 0)    {        login_error();        exit(0);    }        /* 로그인에 성공했다면     * 실제 작업에 들어간다.      */    search_zipcode();    /* 최초 터미널 상태로 복원시킨다 */      termio_default();    return 1;} 


3.3절. myterm.pc

#include <unistd.h>#include <stdio.h>#include <zipcode.h>#include <myterm.h>/* * 터미널 초기화 */void termio_init(){    tcgetattr(0, &stored_settings);    default_settings = stored_settings;    tcsetattr(0, TCSANOW, &default_settings);    stored_settings.c_lflag &= (~ICANON);    tcsetattr(0, TCSANOW, &stored_settings);}void termio_default(){    tcsetattr(0, TCSANOW, &default_settings);}/* 패스워드를 화면에 보이지 않기 위해서 * 입력을 화면에 반향(echo) 하지 않도록 설정한다. */void echo_off(){    struct termios new_settings;    tcgetattr(0, &stored_settings);    new_settings = stored_settings;    new_settings.c_lflag &= (~ECHO);    tcsetattr(0, TCSANOW, &new_settings);    return;}/* * 기본 터미널 상태로 되돌린다. */void echo_on(){    tcsetattr(0, TCSANOW, &stored_settings);    return ;} 


3.4절. zipcode.pc

실질적으로 오라클데이타 베이스와 관련된 작업을 하는 함수들은 여기에 정의되어 있다. 그리 복잡하지 않으니 대충 훑어봐도 이해 가능할것이다.

#include <stdio.h>#include <zipcode.h>#include <myterm.h>#include <menu.h>EXEC SQL INCLUDE SQLCA;/* * 패스워드를 받아들인다. * echo_off 함수를 호출해서 * 키보드입력이 반향되지 않도록한후 * 키입력을 "*" 로 대체한다. * 입력을 마친후에는 echo_on 함수를 호출하여 * 입력을 반향한다. */void get_pass(char *pass){    char buf;    int i = 0;    echo_off();    while ((buf=getc(stdin)) != '\n')    {        pass[i] = buf;        printf("%c", '*');        i++;    }    echo_on();    return ;}/* * 단일 문자를 입력받기 위해서 사용한다. * getc 를 이용한 단일 문자 입력시 * 개행문자가 반향되지 * 않도록 echo_off 함수를 호출한다. */int ngetc(){    char buf;    echo_off();    buf = getc(stdin);    if (buf != '\n')        printf("%c", buf);    echo_on();    return buf;}/* * 여러줄의 입력을 받기 위해서 사용한다. * 개행문자는 제거한후 되돌려준다. */void get_input(char *str){    char buf;    int i = 0;    while ((buf=getc(stdin)) != '\n')    {        str[i] = buf;        i++;    }    return ;}/* * 우편번호를 출력한다. * 실제 검색은 dong 만을 가지고 한다. */int print_zipcode(char *city, char *dong){    int state;    int i;    int running = 1;    /*     * DECLARE 영역     */    EXEC SQL BEGIN DECLARE SECTION;        /*         * Select 한 데이타가 들어갈 구조체이다.          * 주의해야 할점은 각 멤버변수의 크기를          * 잡을때 실제 필드의 크기보다 +1 만큼 더크게          * 배열 공간을 잡아야 한다는 것이다.          * 실제 zipcode table 의 zipcode 필드는 7의 크기이다.         * +1 만큼 더 크게 잡는 이유는 널값을 저장하기 위함이다.            */        struct testdata        {            char zipcode[8];            char sido[11];            char gugun[15];            char bunji[19];            char dong[45];            char numb[3];        } mydata;        char mdong[16];        int page = 1;        int page_per_list = 17;        int start_listnum, end_listnum;    EXEC SQL END DECLARE SECTION;    /*     * 문자열 copy 를 통해서 dong 변수를     * declare 영역에서 선언된 오라클 변수로 복사한다.     */    strcpy(mdong, dong);    strcat(mdong,"%");    while(running)    {        int i;        /* 주소리스트 영역 (5-17 라인)을 지운다 */        SCR_CLEAR2(5,17);        MOVE_CURSOR(5, 1);        /* 출력하고자 하는 주소리스트 영역을 계산한다         * page          : 보고자 하는 페이지         * end_listnum   : 현재 페이지에서 가장큰 리스트번호         * start_listnum : 현재 페이지의 시작 리스트 번호         * page_per_list : 한페이지에 보여줘야할 리스트 수 (17)         */        end_listnum = page_per_list * page;        start_listnum = end_listnum - page_per_list;        /*         * CURSOR 을 만든다.         * mysql 에서 범위지정을 위해사용하는 limit 를 오라클에서는         * 제공하지 않음으로, rownum 을 이용한 in-line view 를 사용한다.         */        EXEC SQL DECLARE zip_cursor CURSOR FOR            SELECT * FROM            (                SELECT ZIPCODE, SIDO, GUGUN, BUNJI, DONG, ROWNUM NUMB                FROM ZIPCODE WHERE DONG like : mdong            )             WHERE NUMB > : start_listnum            AND NUMB < : end_listnum;        printf("dong : (%s)\n", mdong);        if (sqlca.sqlcode !=0 )        {            printf("ERROR\n");            return -1;        }        /*         * 커서를 사용하기 위해서 연다.         */        EXEC SQL OPEN zip_cursor ;        /*         * 열린 커서에서 FETCH 작업중 더이상 FETCH 할         * 데이타가 없으면 DO 이후의 문인 break 를 실행한다.         */        EXEC SQL WHENEVER NOT FOUND DO break;        for (i=0; ;i++)        {            /*             * FETCH 한 데이타는 mydata 구조체에 입력한다.             */            EXEC SQL FETCH zip_cursor INTO: mydata;            /*             * proc 에서는 FETCH 한 레코드의 특정필드에 데이타가             * 없을경우 에러(-1405) 처리를 한다.              * 그러나 필드의 특성에 따라서 NULL 이 될수도 있음으로             * 이 에러는 무시하고 넘어가도록 한다.             */            if (sqlca.sqlcode < 0)            {                if (sqlca.sqlcode != -1405)                {                    break;                 }            }            /*              * 우편번호 데이타 출력              */            printf("%s %s %s %s\n",                     mydata.zipcode,                       mydata.sido, mydata.gugun,                    mydata.dong, mydata.bunji);        }        /* 페이지 출력 */        MOVE_CURSOR(22, 1);        LINE_CLEAR;        printf("page : %d", page);        /*          * 열린 커서는 더이상 사용하지 않을경우         * 닫아주어야 한다.         * 그렇지 않을경우 메모리 누수가 생길수 있다.          */        EXEC SQL CLOSE zip_cursor;        /*         * move_page 함수를 호출하여 키입력을         * 받아들여서 페이지 이동을 한다.         */        if (i == 16 || page > 1)        {            int ans;            while(1)            {                ans = move_page();                if (ans == NEXT)                {                    if (i == 16)                    {                        page++;                        break;                    }                }                else if (ans == PREV)                {                    if (page > 1)                    {                        page--;                        break;                    }                }                else                    return 1;            }        }        else        {            return 1;        }    }}/* * 로그인 * check_num 만큼 아이디와 패스워드를 묻는다. */int login(int check_num){    int loop = 1;    char id[16];    char pass[16];    SCR_CLEAR;    while(1)    {        memset(pass, 0x00, 16);        memset(id, 0x00, 16);        MOVE_CURSOR(10,5);        printf("%s\n", login_prompt);        if (loop > 1)        {            MOVE_CURSOR(15, 23);            printf("Login Failure !! %s", pass);        }        MOVE_CURSOR(12, 34);        get_input(id);        MOVE_CURSOR(13, 34);        get_pass(pass);         if ((dbconnect(id, pass) < 0))        {            if (loop == check_num)            {                return -1;            }            #ifdef __DEBUG             MOVE_CURSOR(22, 1);            printf("%s", sqlca.sqlerrm.sqlerrmc);            #endif        }        else        {            MOVE_CURSOR(22, 1);            printf("Connection Success !!");            return 1;        }        loop++;    }}/* * 아이디와, 패스워드를 이용해서 * 로그인을 실시한다.   */int dbconnect(char *id, char *pass){    EXEC SQL BEGIN DECLARE SECTION;        char loginid_pass[40];    EXEC SQL END DECLARE SECTION;        sprintf(loginid_pass, "%s/%s@oracle", id, pass);    EXEC SQL CONNECT: loginid_pass;    return sqlca.sqlcode;} /* * 동이름을 이용해서 우폄번호 검색을 한다. */ int search_zipcode(){       char city[16];    char dong[16];    int running = 1;    SCR_CLEAR;    MOVE_CURSOR(4,2);    printf("%s", hr);    MOVE_CURSOR(23,2);    printf("%s", hr);    while(running)    {        MOVE_CURSOR(1,1);        printf("%s\n", query_prompt);        memset(city, 0x00, 16);        memset(dong, 0x00, 16);        MOVE_CURSOR(2, 13);        get_input(city);        MOVE_CURSOR(3, 13);        get_input(dong);        if (strlen(city) == 0 && strlen(dong) == 0)        {            if (question_end() == YES)                running = 0;        }        else        {            MOVE_CURSOR(5, 1);            print_zipcode(city, dong);        }    }    /*     * 오라클서버와의 연결을 끊는다.     */    EXEC SQL COMMIT WORK RELEASE;    /*     * 화면을 클리어 하고 커서를     * 처음화면으로 되돌린다.     */    SCR_CLEAR;    MOVE_CURSOR(1, 1);}/* 페이지 이동 관련 */int move_page(){    char ans;    while(1)    {        MOVE_CURSOR(24, 2);        LINE_CLEAR;        printf("%s", "페이지 이동 (P:이전 N:다음 Q:종료)");        ans = ngetc();        switch(ans)        {            case('N'):            case('n'):                return NEXT;                break;            case('P'):            case('p'):                return PREV;                break;            case('q'):            case('Q'):                return QUIT;                break;        }    }}/* 종료할것인지를 묻는다 */int question_end(){    char ans;    while(1)    {        MOVE_CURSOR(24, 2);        LINE_CLEAR;        printf("%s", ques_end);          ans = ngetc();        switch(ans)        {            case('y'):            case('Y'):                return YES;                break;            case('n'):            case('N'):                return NO;                break;            default:                break;        }    }}int login_error() {    MOVE_CURSOR(23, 1);    printf("Login failure!!\n");    return -1;} 


3.5절. include/menu.h

메뉴와 관련된 변수들이 선언되어 있다.

#ifndef _MENU_H_#define _MENU_H_#define SCR_CLEAR printf("^[[2J")#define MOVE_CURSOR(x,y) printf("^[[%d;%dH", x,y)#define WAIT_INPUT(x) printf("%s", x); getchar()#define chop(str) str[strlen(str)-1] = '\0'#define LINE_CLEAR printf("^[[K")#define SCR_CLEAR2(x, y) for (i=0; i < y; i++) \{ \    MOVE_CURSOR(x+i, 1);\    printf("^[[2K");\}\MOVE_CURSOR(x, 1);#define STDIN 0#define YES 1#define NO  0 #define UNKNOWN 2 #define NEXT 1#define PREV 0#define QUIT 2char *login_prompt ="                    +----------+-----------------+                    | 아 이 디 | ____________    |                    | 패스워드 | ____________    |                    +----------+-----------------+                    |                            |                    +----------+-----------------+";char *query_prompt =" 도시이름 : __________ 동 이 름 : __________";char *hr ="=============================================================================";char *question = "선택 (Y,N,X) : ";char *ques_end = "종료하시겠습니까 (Y/N) ? ";#endif 


3.6절. myterm.h

myterm.pc 함수에 대한 선언

#ifndef _MYTERM_H_ #define _MYTERM_H_#include <termios.h>static struct termios stored_settings;static struct termios default_settings;void termio_init();void termio_default();void echo_off();void echo_on();#endif 


3.7절. zipcode.h

zipcode.pc 함수에 대한 선언

#ifndef _ZIPCODE_H_#define _ZIPCODE_H_void get_pass(char *pass);int ngetc();int login(int);int dbconnect();int search_zipcode();int question_end();void get_input(char *str);print_zipcode(char *city, char *dong);int login_error();#endif 


4절. 테스트

위의 어플리케이션을 실행하면 다음과 같은 화면들을 보여줄것이다. 참고로 도시이름검색은 하지 않고 단지 "동이름" 으로만 검색한다.

로그인

                    +----------+-----------------+                    | 아 이 디 | system______    |                    | 패스워드 | *******_____    |                     +----------+-----------------+                    |                            |                    +----------+-----------------+ 

검색

 도시이름 : __________ 동 이 름 : 역삼______ =============================================================================dong : (역삼%)135-706 서울       강남구         역삼1동 공무원연금관리공단                  135-703 서울       강남구         역삼1동 과학기술회관                        135-707 서울       강남구         역삼1동 남영빌딩                            135-977 서울       강남구         역삼1동 로담코빌딩                          135-709 서울       강남구         역삼1동 빅토리아빌딩                        135-979 서울       강남구         역삼1동 삼부빌딩                            135-980 서울       강남구         역삼1동 삼성역삼빌딩                        135-751 서울       강남구         역삼1동 삼성제일빌딩                        135-768 서울       강남구         역삼1동 삼일프라자오피스텔                  135-711 서울       강남구         역삼1동 삼흥빌딩                            135-917 서울       강남구         역삼1동 성지하이츠1차빌딩                   135-717 서울       강남구         역삼1동 성지하이츠3차빌딩                   135-984 서울       강남구         역삼1동 스타타워                            135-718 서울       강남구         역삼1동 아가방빌딩                          135-978 서울       강남구         역삼1동 아주빌딩                            135-748 서울       강남구         역삼1동 여삼빌딩                            page : 1 ============================================================================= 페이지 이동 (P:이전 N:다음 Q:종료) 
N/n, P/p 를 이용해서 페이지 이동이 가능하다.


5절. 결론

이상 proc 플밍에 대한 좀더 깊이 있는 내용을 다루어 보았다. 그러나 여기에서 다룬 내용은 전체 proc 내용에 비하면 정말 맛보기정도 이다. 말했듯이 proc 는 그 자체만으로도 책몇권분량이 쉽게 나오는 방대한 분량이다. 또한 PL/SQL 에 대한 내용도 어느정도 알고 있어야 한다.

이문서는 어디까지나 부담없이 proc 플밍을 접할수 있도록 하기 위한 지침서 이다. (일단 컴파일 할줄은 알아야 깊이 들어가든지 말든지 할테니까)

proc 플밍에 대한 더욱 깊은 내용은 각자의 몫이 될것이다.

출처 : http://blog.naver.com/tipster2/100012807885

'Oracle' 카테고리의 다른 글

SQL문 기본  (0) 2007.01.21
Pro*C에서 변수의 사용  (0) 2007.01.21
LINUX + ORACLE 10g 10.1 Install  (0) 2006.06.11
Installing Oracle9iR2(9.2.0.4) on RH AS4  (0) 2006.06.11
Redhat 7.2 + Oracle 9i 설치하기  (0) 2006.06.11
, .

Oracle을 위한 Fedora의 진혼곡이 몇번이었던가?

외국의 사이트에 나와있던 Oracle 9i 인스톨을 끝내 져버리고..

10g 로 다시 인스톨 하였다..

어찌하여 linux용 오라클은 이모양 이지경인지 모르겠으나..

목마른 사람이 우물을 파야 하지 않겠는가?

참고로

http://www.oracle.com/technology/global/kr/pub/articles/smiley_10gdb_install.html

주소에 오라클 10g를 인스톨 하는 방법이 무려 한글로 나와 있으니 한번 읽어보아도 좋을듯..

하지만 봐서 알겠지만 무척 길고, 지루하고, 어려워 보이며, 재미 없다..

뭐 어찌 되었건 준비부터 하자..

일단은 뭐 있느냐?

다운이다..

그렇다 다운인것이다..

오라클은 꽤 유명하지만서도 매우 관대하게(?) 가입만 하면 무료로 다운을 할수 있다..

좋겠다.. 무료란다..

허나 다운만 무료다..

개발용으로 혼자 놓고 쓰면 지지고 볶든 말든 무료란다..

단 서비스는 하면 안 된다..

뭐 어쨌든 다운 받자..

http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/linuxsoft.html

계정이 없다면 가입 해야 한다.

mkdir oracle

한후 이곳에 저장을 하자..

일단 워크스테이션용을 기준으로 다음과 같은 패키지는 꼭 있어야 한다.

compat-db-4.2.52-2.i386.rpm

compat-gcc-32-3.2.3-47.fc4.i386.rpm

compat-libstdc++-33.3.2.3-47.fc4.i386.rpm

compat-gcc-32-c++-3.2.3-47.fc4.i386.rpm

이다..

미러 사이트에 .../Fedora/RPMS/ 에 존재할 것이다..

인스톨이 끝나면..

사용자를 생성하고 그 계정으로 설치를 하자..

root로는 설치가 안 된다..

groupadd oinstall

useradd -g oinstall -d /oracle oracle

passwd oracle

패스 워드는 알아서 정하자..

이제 계정을 생성 했으니 디렉토리 소유권을 주자.

chown oracle.oinstall /oracle

끝났는가?

그럼 이제 파일이다..

chown oracle.oinstall ship.db.lnx32.cpio.gz

chown 다음의 oracle은 계정 . 다음의 oinstall은 그룹이다..

소유권이 주어 줬으니 계정으로 접속하여 인스톨을 하자

su - oracle

이렇게 하면 root 에서 oracle 계정으로 변신..

다음은 무엇이던가??

cd /oracle 하여 이동해서 압축을 풀어보자..

gz 파일은 어찌 푼단 말인가?

gunzip ship.db.lnx32.cpio.gz 하여 끝에 gz가 없는 그냥 .cpio 파일을 만들자

다음은

cpio -idmv < ship.db.lnx32.cpio 하면 된다

그러면 압축이 쫘~악 풀린다.

그럼 이제 다시 설정이다..

exit 하여 root 로 돌아온다.

vi /etc/sysctl.conf 하여

kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

저장

======================================

vi /etc/security/limits.conf 하여

* soft nproc 2047

* hard nproc 16386

* soft nofile 1024

* hard nofile 65536

저장 ( *도 써줘야 한다.)

=================================================

vi /etc/profile 하여

if [ $USER = "oracle" ]; then

ulimit -u 16384 -n 65536

fi

저장

=======================================================

vi /etc/pam.d/login 하여

sessionrequired /lib/securit/pam_limits.so

저장

=================================================

정말 많다..

다시

vi /oracle/.bash_profile

ORACLE_BASE=/oracle

ORACEL_SID=ora10

LANG=C

ORACLE_HOME=$ORACLE_BASE/product/10.1

ORACLE_OWNER=oracle

export ORACLE_BASE ORACLE_SID LANG ORACLE_HOME ORACLE_OWNER

저장

리부트 !!

이제 막바지로 치 닫는다..

xhost + 하고

cp/etc/redhat-release /etc/redhat-release.backup

vi /etc/redhat-release

하고

다 지우고 redhat-3 만 쓰고 저장

su - oracle

cd /oracle/Disk1

./runInstaller

설치하다가 Certain actions need~ 로 시작되는 메시지가 나오면

콘솔창을 띄워서

(root계정으로) /oracle/oraIventory/orainstRoot.sh

계속 설치 도중 Database creation complete. check the log 메시지 나오면

콘솔창을 띄워서

(root계정으로) /oracle/product/10.1/root.sh 실행

설치가 끝났다면

mv /etc/redhat-release.backup /etc/redhat-release

yes

마지막으로

vi /oracle/product/10.1/bin

하여

PATH=$PATH:%HOME/bin:$HOME/product/10.1/bin 추가

export LANG=C 삭제

export NLS_LANG='AMERICAN_AMERICA.KO16KSB5601' 추가

하면 끝..

이상 내용은 오라클 사이트의 문서

(http://www.oracle.com/technology/global/kr/pub/articles/smiley_10gdb_install.html) 와

한빛미디어 에서 나온 우재남 님의 '뇌를 자극하는 레드햇 페도라 리눅스서버 & 네트워크'를 참고

상당히 괜찮은 책으로 사료 되느 한번 봐도 좋을듯 하더이다..

http://blog.naver.com/ranoshu/130001444119에서 퍼온 자료 입니다.

'Oracle' 카테고리의 다른 글

SQL문 기본  (0) 2007.01.21
Pro*C에서 변수의 사용  (0) 2007.01.21
proc 파헤치기  (0) 2007.01.21
Installing Oracle9iR2(9.2.0.4) on RH AS4  (0) 2006.06.11
Redhat 7.2 + Oracle 9i 설치하기  (0) 2006.06.11
, .

Installing Oracle9iR2(9.2.0.4) on RH AS4

에러없이 설치까지 일주일 삽질했습니다. -_-;;

목차

[1] oracle 다운로드 및 압축해제
[2] oracle 유저생성 및 권한부여
[3] pre-install RPM
[4] jdk 설치
[5] 공유메모리 및 세마포설정
[6] 오라클사용자 초기화파일구성
[7] 오라클 셋업
[8] 에러조치
[9] TIP & TECH

[1] oracle 다운로드 및 압축해제


zcat ship_lnx_920_disk1.cpio.gz | cpio -idmv
zcat ship_lnx_920_disk2.cpio.gz | cpio -idmv
zcat ship_lnx_920_disk3.cpio.gz | cpio -idmv

Disk1, Disk2, Disk3 이 생기고 생긴 파일들은 /home/oracle로 이동.


[2] oracle 유저생성 및 권한부여

groupadd dba
useradd oralce -g dba
chown -R oracle.dba /home/oracle

chmod 777 /home
chmod 777 /home/oracle

[3] pre-install RPM

링크에러를 없애기 위해 삽질을 거듭한 끝에 RPM에서 결론에 도달.

compat-db-4.1.25-9
compat-gcc-32-c++-3.2.3-47.3
compat-gcc-32-3.2.3-47.3
compat-libgcc-296-2.96-132.7.2
compat-libstdc++-296-2.96-132.7.2
compat-libstdc++-33-3.2.3-46.1
openmotif21-2.1.30-8.i386.rpm
java-1.4.2-gcj-compat-1.4.2.0-26jpp
nss_db-compat-2.2-28
gnome-libs-1.4.1.2.90-44.1.i386.rpm
xorg-x11-deprecated-libs-devel-6.8.1-23.EL.i386.rpm
libaio-0.3.102-1
libaio-devel-0.3.102-1

아래 두 파일은 메타링크 p4198954_21_LINUX.zip 패치 안에 들어있습니다.
compat-oracle-rhel4-1.0-5.i386.rpm
compat-libcwait-2.0-2.i386.rpm

RPM설치시 의존성에 걸리는건 당연히 같이 설치.


[4] jdk 설치

다운로드 : https://sdlcweb3b.sun.com/ECom/EComActionServlet/LegalPage:~:com.sun.sunit.sdlc.content.LegalWebPageInfo;jsessionid=8EE1E6E69336B04C95ADAF32CC1FF719;jsessionid=8EE1E6E69336B04C95ADAF32CC1FF719

RPM in self-extracting file (j2sdk-1_4_2_08-linux-i586-rpm.bin, 33.64 MB)
chmod +x를 주고 실행후
rpm -Uvh 로 설치
/usr/java/j2sdk_1.4_2_08 에서 /usr/local/j2sdk_1.4_2_08로 이동후
$/usr/local/에서 ln -s j2sdk_1.4_2_08 java

/etc/profile에 다음내용을 설정

# For Java
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:.:$PATH

[5] 공유메모리 및 세마포설정

/etc/sysctl.conf 에서

kernel.sysrq=0
라인아래에
kernel.shmmax=1073741812(또는 최대값으로 2147483648)
kernel.sem=250 32000 100 128
설정후 재부팅


[6] 오라클사용자 초기화파일구성

# Set the LD_ASSUME_KERNEL environment variable only for Red Hat 9 and
# for Red Hat Enterprise Linux Advanced Server 3 (RHEL AS 3) !!
# Use the "Linuxthreads with floating stacks" implementation instead of NPTL:
export LD_ASSUME_KERNEL=2.4.1

# Oracle Environment
export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE/product/9.2.0
export ORACLE_OWNER=oracle
export ORACLE_SID=ora9
export ORACLE_TERM=xterm
export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/demo:/lib:/usr/lib
export LD_LIBRARY_PATH
export TEMPDIR=/tmp
export EDITOR=vi

#set shell search paths
export PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/JRE/bin


# Set shell search paths
export PATH=$PATH:$ORACLE_HOME/bin

#vi /etc/ld.so.conf
/lib
/usr/lib
/usr/local/lib => 세가지 경로 추가
#reboot

[7] 오라클 셋업

x-windows에 oracle계정으로 로그인

oracle에서 ./runinstaller
언어가 깨지거나 실행이 안될경우는 다음명령 실행.
unset LANG

Unix Group Name -> oinstall 또는 dba
sid-> 일반적으로 ora9
Global Database Name -> ora9.도메인

문자셋은 [6] 사용자초기화 파일에서 설정한것과 같아야 한다.
export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601

설치중간에 orainstRoot.sh 팝업이 나올시
새창에서 su -root
cd /tmp
./orainstRoot.sh실행
완료후 진행

설치진행 100%후
*/oracle/ora92/root.sh 실행 대화상자 팝업
$su - root
#cd /oracle/ora92
#./root.sh
시스템 기본 디렉토리 묻는다. /usr/bin 으로 설정


[8] 에러조치

agent configuration assistance가 정상적으로 설치되지 않고
다음과 같은 에러를 낼때,

Parameter "orahome"=/home/oracle/product/9.2.0
Parameter "nodeinfo"=NO_VALUE
agnet serivce failed

오라클 DB운용과는 상관없는 부분이지만 설치에러0%를 위하여 설치후 패치할것입니다.
일단 넘어감.

인스톨러종료후
$ agentctl start 했을시

DBSNMP for Linux: Version 9.2.0.4.0 - Production on 07-JAN-2004 19:11:14

Copyright (c) 2003 Oracle Corporation. All rights reserved.

Starting Oracle Intelligent Agent.../opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156: 1855 Segmentation fault nohup $ORACLE_HOME/bin/dbsnmp $*
>>$DBSNMP_WDLOGFILE 2>&1
/opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156: 1868 Segmentation fault nohup $ORACLE_HOME/bin/dbsnmp $* >>$DBSNMP_WDLOGFILE 2>&1
/opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156: 1880 Segmentation fault nohup $ORACLE_HOME/bin/dbsnmp $* >>$DBSNMP_WDLOGFILE 2>&1
/opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156: 1892 Segmentation fault nohup $ORACLE_HOME/bin/dbsnmp $* >>$DBSNMP_WDLOGFILE 2>&1

정상구동시는 이상없이 설치가 된 경우이고 위와 같을경우

메타링크에서 p3238244_9204_LINUX.zip 다운로드 받고 다음 작업 진행.
반드시 Instance 종료후 작업 진행

p2617419_10102_GENERIC.zip(Opatch파일)을 이용
p3238244_9204_LINUX.zip 패치실행후

orlace계정으로
$ find $ORACLE_HOME -name "*.mk" | xargs grep -l dbsnmp
/opt/oracle/product/9.2.0/network/lib/ins_oemagent.mk
/opt/oracle/product/9.2.0/network/lib/env_oemagent.mk
$
$ cd $ORACLE_HOME/network/lib
$ make -f ins_oemagent.mk install
$ agentctl start

agent started.


[9] TIP & TECH

- 설치로그보기 -

tail -f $ORA_HOME/app/oracle/product/orainventory/logs/installactions.log

- oracle 삭제 -

$ORACLE_HOME 디렉토리에 있는 설치화일을 전부삭제
/etc밑에 orainst.loc, oratab 삭제
/usr/local/bin/oraenv 파일삭제
/tmp디렉토리에서 관련파일삭제
elete the /etc/oratab file. If using 9iAS delete the /etc/emtab file also.
# rm /etc/oratab /etc/emtab
끝 재설치 하면됩니다.

'Oracle' 카테고리의 다른 글

SQL문 기본  (0) 2007.01.21
Pro*C에서 변수의 사용  (0) 2007.01.21
proc 파헤치기  (0) 2007.01.21
LINUX + ORACLE 10g 10.1 Install  (0) 2006.06.11
Redhat 7.2 + Oracle 9i 설치하기  (0) 2006.06.11
, .

redhat 7.2 + oracle 9i 설치하기


참고(여기저기 있는 문서들 합쳐서 설치한번 해봤슴돠)
otn.oracle.co.kr/포럼란(질답)
http://free-zg.hinet.hr/denisk/oracle/901install_en.html


테스트 시스템사양

펜3 600
램 390
커널 2.4.13
스왑 2G
오라클 설치공간 8G
(오라클사에서는 메모리 512, 스왑 1.5 G,수세7.2, gligc 2.2, jre1.3.1 기타등등..이 필요 하다더군요.)

필요한 패키지

j2re-1_3_1_01-linux-i386.bin
binutils-2.10.91.0.4-1.i386.rpm


1. 커널컴파일시 커널파라미터 수정


/usr/src/linux/include/asm/shmparam.h 이라는 파일을 열어서

#define SHMMAX 4294967295 ## 공유메모리 세크먼트의 최대크기(바이트 단위로서 약 4GB)
#define SHMMIN 1 ## 한개의 공유 메모리 세그먼트 최소 크기
#define SHMMNI 100 ## 시스템 내 공유메로리 세그먼트의 최대 개수
#define SHMSEG 10 ## 사용자 프로세스하나가 사용할수 있는 공유메모리 세그먼트의 최대 개수

/usr/src/linux/include/linux/sem.h 에는
#define SEMMNI 128
#define SEMMSL 250 ## 한개의 세마포어세트에 존재할수 있는 세마포어의 최대개수
#define SEMMNS (SEMMNI*SEMMSL)
#define SEMOPM 100 ## Semop call 당 operations 의 최대 개수
#define SEMVMX 32767 ## 세마포어의 최대값을 결정

/usr/src/linux/include/linux/msg.h 에는
#define MSGMNI 128
#define MSGMAX 8192
#define MSGMNB 81920

이렇게 써주고 커널컴파일을 한다.

2. jdk 설치, binutil 설치


jdk 설치

http://java.sun.com/j2se/1.3/download-linux.html 에서 jdk를 다운.

#cd /usr/local
#./j2re-1_3_1_01-linux-i386.bin
#ln -s jdk1.3.1_01 jdk
#ln -s jdk1.3.1_01 java

binutil 설치

Oracle9i Database를 설치하는 과정에서 relink 관련하여
에러가 발생합니다. 이에 대한 해결방법이니 참고 바랍니다.
==================================================================
O/S: Redhat 7.1 (이하 RH7.1이라 함)
원인: RH7.1에 포함된 ld 프로그램의 문제로 야기됨.
해결: binutil-2.10.91.0.2-2 패키지를 v2.10.91.0.4-1으로 업그레이드함.

binutil-2.10.91.0.4-1은 http://www.kernel.org에서 다운
http://www.kernel.org/pub/linux/devel/binutils/ 에 있음.
===================================================================
#rpm -Uvh binutils-2.10.91.0.4-1.i386.rpm

3. oracle 압축해제

http://otn.oracle.co.kr 에서 리눅스용 9i를 다운받으세용.

# gzip -d Linux9i_Disk1.cpio.gz
# gzip -d Linux9i_Disk2.cpio.gz
# gzip -d Linux9i_Disk3.cpio.gz

# cpio -idmv < Linux9i_Disk1.cpio
# cpio -idmv < Linux9i_Disk2.cpio
# cpio -idmv < Linux9i_Disk3.cpio

4. oracle 홈디렉토리 생성

# groupadd dba
# useradd -g dba oracle
# passwd oracle *******

# mkdir -p /home/oracle/product/9.0.1
# chown -R oracle.oinstall /home/oracle/*

/home/oracle/.bash_profile 에 다음내용 추가

export ORACLE_HOME=/home/oracle/product/9.0.1
export ORACLE_BASE=/home/oracle
export NLS_LANG=American_Amerca.KO16KSC5601 #한글설정
export ORACLE_SID=ORCL
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export ORACLE_TERM=xterm
export NLS_SORT=xcroatian
export PATH=$PATH:$ORACLE_HOME/bin:/usr/local/java/bin
export TNS_ADMIN=$ORACLE_HOME/config

if [ -z $LD_LIBRARY_PATH ]
then
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
else
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
fi
if [ -z $CLASSPATH ]
then
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
export CLASSPATH
else
CLASSPATH=$CLASSPATH:$ORACLE_HOME/JRE:$ORACLE_HOME/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
export CLASSPATH
fi


5. 메모리 부족을 위한 해결책(스왑추가)

오라클 9i 를 설치하기 위한 사양이 상당히 높더군요. 기본 512 램에 스왑 1.5 G 이렇게 안되시는 분은 다음과 같이 스왑을 좀 잡아주시는게 좋겠죠?

# dd if=/dev/zero of=tempswap bs=1k count=300000
# chmod 600 tempswap
# mke2fs tempswap
# mkswap tempswap
# swapon tempswap

이렇게 하고 free 를 해보시면 스왑이 추가된걸 볼수 있습니다.

6. oracle 설치

oracle 유저로 로그인하고 X를 구동시킨후 /Disk1/runInstaller 를 실행하시면 됩니다.

참고1

화면보호기는 꺼두시고 하심이...그냥한번 했다가. 시스템이 꼬진(?)시스템이다 보니..
화면보호기가 뜨면서 화면이 하얗게 변한다음...돌아 오질 않았슴..구래서 다시 설치했음..쿠쿠쿠...^^;

참고2

설치시디가 3장 이잖습니까? 이거 첫번째 시디를 넣고 두번째 시디를 넣어 달라기는 하는데...
인스톨러가 실행된 상태라 언마운트가 안되더군요...쿠쿠...강제 언마운트를 할려다가...기양...^^;
그래서 하드에 모조리 카피해놓고 설치를 시작했습니다. 그랬더니..모..묻지도 않고 알아서 하더군요..

참고3

하드는 넉넉하게 잡으시는게 조을거 같습니다. 거의 모 4GB 가 조금안되게 깔리더군요....
넉넉한 하드에서 하시길......

참고4

커널컴파일 한다음 binutils 를 설치하시기 바랍니다. 7.1 에선 어떤지 모르겠는데
7.2에서 binutils 을 다운그레이드 한다음 커널을 컴파일 하려니깐....에러가 나더군요...
커널을 꼭 먼저 컴파일 하시고 binutils를 설치하시길..아니면 저같인 몇번을 다시 설치해야하는..수가....쿠쿠

'Oracle' 카테고리의 다른 글

SQL문 기본  (0) 2007.01.21
Pro*C에서 변수의 사용  (0) 2007.01.21
proc 파헤치기  (0) 2007.01.21
LINUX + ORACLE 10g 10.1 Install  (0) 2006.06.11
Installing Oracle9iR2(9.2.0.4) on RH AS4  (0) 2006.06.11
, .