반응형

    윈도우즈에서 리눅스 서버(오라클설치)로 원격 접속하여 Pro*C 환경설정 및 컴파일 과정입니다.

    putty 이용하여 root 계정 및 오라클 계정으로 접속하여 진행합니다.

     

    1. 사용자 계정 환경설정

    $ vi .bash_profile 
    
    
    
    # ORACLE 11g Env
    
    export TMP=/tmp
    
    export TMPDIR=$TMP
    
    export ORACLE_BASE=/usr/oracle/app /*개인경로에 맞게 수정*/
    
    export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/dbhome_2  /*개인경로에 맞게수정*/
    
    export ORACLE_SID=orcl 
    
    export TNS_ADMIN=$ORACLE_HOME/network/admin
    
    export ORA_NLS10=$ORACLE_HOME/nls/data
    
    export ORACLE_TERM=xterm
    
    export NLS_LANG=KOREAN_KOREA.AL32UTF8
    
    export PATH=$HOME/bin:$ORACLE_HOME/bin:/bin:/usr/bin:/usr/sbin:.:$PATH
    
    export SHLIB_PATH=$ORACLE_HOME/lib:/usr/lib:/lib:/usr/local/lib:$SHLIB_PATH
    
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/lib:/usr/local/lib:$LD_LIBRARY_PATH

     

    -적용

    $ . ~/.bash_profile


    2.  환경변수 수정 

    - stddef.h 파일 경로 확인

    $ find /usr -name "stddef.h"

    위의 경로를 기억합니다

    - pcscfg.cfg 파일 수정 

    $ find / -name 'pcscfg.cfg' 경로찾기

    - 환경변수 수정 (위의 경로 그대로 복사)

    $ vi /usr/oracle/app/product/11.2.0/dbhome_2/precomp/admin/pcscfg.cfg
    
    
    
    sys_include=($ORACLE_HOME/precomp/public,/usr/include,/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include)
    
    
    include=($ORACLE_HOME/precomp/public) 
    include=$ORACLE_HOME/rdbms/demo 
    include=$ORACLE_HOME/network/public 
    include=$ORACLE_HOME/plsql/public
    
    
    ltype=short 
    PARSE=NONE

     

    : 아래 부분 개인경로설정 중요!

    /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include

    위에서 stddef.h 확인한 경로

    기본 경로 확인할때는 

    /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/ 로 나옵니다. 

    하지만! gcc-v 확인시 4.8.5 로 나오므로 4.8.2 부분 4.8.5로 수정해야 합니다.

     

    $ gcc -v

     

    gcc version 4.8.5 를 확인할 수 있습니다.


    3. pc  파일 작성

    $ vi test.pc 
    
    
    
    #include <stdio.h>
    
    #include <string.h>
    
    
    
    EXEC SQL INCLUDE SQLCA;  /*#include <sqlca.h> 와 동일, 프로그램 정보를 데이터베이스와 교환하기 위한 sql 통신영역 */
    
    
    
    int main() {
    
    
    
            /* 호스트 변수(SQL,프로그램 문에서 참조되어 사용) 선언 */
    
            EXEC SQL BEGIN DECLARE SECTION;
    
    
    
                VARCHAR user[20],pass[20],tnsname[20];
    
                char name[20];
    
                int  id;
    
                int i=0;
    
                const char* uid = "SCOTT";  개인PC 설정 확인
    
                const char* pwd = "1234"; 개인PC 설정 확인
    
                const char* tns = "ORCL"; 개인PC 설정 확인
    
    
    
            EXEC SQL END DECLARE SECTION;
    
    
    
            /* log on oracle */
    
            strcpy((char*)user.arr, uid);
    
            user.len=(unsigned short)strlen((char *)user.arr);
    
            strcpy((char*)pass.arr, pwd);
    
            pass.len=(unsigned short)strlen((char *)pass.arr);
    
            strcpy((char*)tnsname.arr, tns);
    
            tnsname.len=(unsigned short)strlen((char *)tnsname.arr);
    
    
    
            /* sql 묵시적 오류 처리 : SQLERROR: 현재문장이 에러를 발생시킬때 error_msg로 이동 */
    
            EXEC SQL WHENEVER SQLERROR GOTO error_msg;     
    
    
    
            /* Connect Database */
    
            EXEC SQL CONNECT :user IDENTIFIED BY :pass using :tnsname;
    
            printf("Connect successful\n");
    
    
    
            printf("Starting to get data from emp\n");
    
            EXEC SQL declare emp_cursor cursor for select empno, ename from emp;
    
            EXEC SQL open emp_cursor;
    
           
    
    /* NOT FOUND 처리 */
    
    EXEC SQL WHENEVER NOT FOUND DO break;
    
            while(1)
    
            {
    
                    EXEC SQL fetch emp_cursor into :id, :name;  /* 호스트변수 사용 콜론( : ) */
    
                    printf("ID is %d || Name is %s\n", id, name);
    
            }
    
            EXEC SQL close emp_cursor;
    
            EXEC SQL commit work release;
    
    
    
            return 0;
    
    
    
    /* SQL 오류발생시 error_msg : Connect failed 출력 */
    
    error_msg: 
    
            printf("Connect failed\n");     
    
            return -1;
    
    }
    
    

    4. Makefile 작성

    $ vi Makefile
    
    
    
    OBJ=test.o
    
    PCSRC=test.pc
    
    SRC=test.c
    
    CC=gcc
    
    PROC=proc
    
    
    
    LDLIB=/$(ORACLE_HOME)/lib  
    
    FLAGS=-ldl -lm -lclntsh
    
    
    
    TARGET=test
    
    
    
    $(TARGET) : $(OBJ) 
    
            $(CC) -o $(TARGET) $(OBJ) -L$(LDLIB) $(FLAGS)
    
    
    
    $(OBJ) : $(SRC)
    
            $(CC) -c $(SRC)
    
    
    
    $(SRC) : $(PCSRC)
    
            $(PROC) $(PCSRC)
    
    
    
    clean :
    
            rm -rf $(OBJ) $(SRC) $(TARGET) *.lis
    
    
    
    all : $(TARGET)

     

    /* 컴파일 tip

    1. proc iname=test.pc

    2. cc -c test.c

    3. cc -o test.c  test.o -L/$ORACLE_HOME/lib -lclntsh */

    5. 컴파일

     

    $ make all

    : test 파일 생성된것을 확인할 수 있습니다.

    gcc -o test test.o -L/usr/oracle/app/product/11.2.0/dbhome_2/lib -ldl -lm -lclntsh

    PCC-S-02201 에러가 발생하는 경우가 많습니다.

    이때는 2번과정으로 돌아가 pcscfg.cfg 환경변수 파일을 다시 한번 확인해 보도록 합니다. 

    6. 신규로 생성된 test 파일 실행

     

    $ ./test 

    결과값을 확인할 수 있습니다.


    * 그 외 오류 해결 

     

    1  ./test 파일 실행시 connet failed 발생

    test.pc의 TNS 네임을 잘못 설정하여 발생한 오류입니다.

     

    현재 원격 서버는 192.168.70.~~~ 에 접속중이며 TNS_NAME 은 ORCL 로 되어있습니다.

    즉 3번 과정의 vi test.pc 파일을 실행하여 아래의 값을 확인해봅니다.

     

          const char* uid = "SCOTT";    접속할 계정명

            const char* pwd = "1234";   비밀번호 

            const char* tns = "ORCL";  위의 TNS명 과 일치하는지 확인! 

     

    2   PCC-S-02015 

    #include <gnu/stubs-32.h>

    PCC-S-02015, 포함하고 있는 파일을 열 수 없습니다

     

    컴파일과 실행은 되지만 오류 msg가 뜹니다. 64 bit 리눅스에서 진행시 stubs-32.h 파일이 누락되어 발생하는 문제인것 같습니다.

    아래의 코드 실행시 glibc-devel 설치가 진행되며 오류가 더이상 뜨지 않습니다.

     

    # yum -y install glibc-devel.i686 glibc-devel

     

    참고사이트 ( cent_os 외 다른버전 참고하세요)

    https://www.cyberciti.biz/faq/x86_64-linux-error-gnustub-32h-missing-error-and-solution/

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기