>> Delete Reply from No. 2294 article
No. RE: 약간 수정하자면... ^^;

등록 2002-03-08 09:31:00     조회 5
이름 조준기    

		원문 중간중간에 약간의 주석을 달았습니다. 참고하세요.
 : <pre>
: Oracle설치와 Apache나 PHP소스등에 대한 설정부분은 다 하실꺼라...
: PHP하다 지나가는 길에 PROC를 해보다 몇가지 삽질을해서..
: 그거 해결해보구 몇글자 적어요.......
: 틀린내용이 있으면 수정해주세요...저도 잘 알고 하는게 아니라...-_-)
:
: 1) 우선 Apache에 httpd.conf설정 화일 안에 CGI가 가능 하도록 설정.
:    Options FollowSymLinks ExecCGI 원하는 디렉토리에 설정해두세요.
:    AddHandler cgi-script .cgi 설정.
:
: 2) 간단하게 C언어로 CGI가 잘 수행중인지 TEST.
:    main()
:    {
:     printf("Content-type: text/html ");
:     printf("CGI TEST");
:    }
:    gcc -o test.cgi test.c
:
: 3) $ORACLE_HOME에 가신다음 precomp안에 있는 DEMO디렉안에 sample8.pc
를 컴파일.
:     proc sample8.pc 했을경우 여러 ERROR가 나오면 다음을 수정하세요.
:     admin/pcscfg.cfg 안에...
:     sys_include=(/usr/include,/usr/lib/gcc-lib/i386-redhat-
linux/egcs-2.91.66/include)
:     include=($ORACLE_HOME/precomp/public)
:     include=($ORACLE_HOME/rdbms/demo)
:     include=($ORACLE_HOME/network/public)
:     include=($ORACLE_HOME/plsql/public)
:     ltype=short
:     제 경우 9.0.1을 설치 했을때 suse로 설정이 ...-_-
:
: 4) 확장자 pc에 파일을 proc sample8.pc 를 수행하시면 sample8.c가 나옵
니다.
:    이 sample8.c를 다음과 같이 컴파일 해보세요.
:    gcc -o sample8.cgi sample8.c -L/backup/oracle/product/9.0.1/lib -
lclntsh
:    컴파일중 에러가 나오면 Oracle환경변수와 라이브러리문제입니다.
:    . .bash_profile처럼 수행해서 환경변수를 올려주시고 해도 무관할것
같네요..
:
:    위 과정이 끝나고 나서 브라우져로 확인을 하면 internal서버에러가 나
옵니다.
:    그럼 $ORACLE_HOME디렉 안에 LIB안에 libclntsh.so.9.0를 /usr/lib로
복사
 =============
 /etc/ld.so.conf 파일에 $ORACLE_HOME/lib 디렉토리를 추가해 주고
($ORACLE_HOME을 환경변수처럼 써 놓았는데, 절대 경로로 써 줘야만 합니
다) ldconfig 명령을 한번 돌리면 라이브러리 카피 안해도 됩니다.
이렇게 해 놓으면 그 디렉토리 순서대로 뒤지면서 라이브러리를 찾게 되지
요.
다른 유닉스에서는 런타임시에 LD_LIBRARY_PATH나 SHLIB_PATH 등의 환경변수
를 참조하는데, 리눅스는 안그렇더군요.
 한가지 더 말씀드리자면, 컴파일 스크립트를 하나 만들어 쓰면 편합니다.
 make -f demo_proc.mk sample1 > pc
 이렇게 하면 sample1.pc를 컴파일할때 사용했던 모든 명령들이 pc 라고 하
는 텍스트 파일에 저장됩니다. 여기에는 PRO*C 프리컴파일러와 gcc 컴파일러
를 부르는 부분과 이 프로그램들의 출력들이 섞여 있는데, proc 를 호출하
는 부분과 gcc를 호출하는 부분만 남기고 전부 지운 뒤 sample1 이라는 문자
열을 $1으로 치환합니다. 이렇게 하고 실행 퍼미션을 줍니다.
 pc sample1
 이렇게 하면 간단히 컴파일 되겠지요.(지금 회사라서 딱 떨어진 자료가 없습
니다. 집에 가서 컴파일러 스크립트 만드는 예제를 찾아서 이 글을 수정해
놓도록 하겠습니다.)
 =============
 :
:    그런후 다시 CGI파일을 불러 보세요...만약 그래도 문제가 있다면..
:    Apache httpd.conf안에 SenEnv로 몇가지 설정을 해주세요..
:    SetEnv ORACLE_HOME /backup/oracle/product/9.0.1
:    SetEnv ORACLE_BASE /backup/oracle
:    SetEnv NLS_LANG AMERICAN.KO16KSC5601
:    SetEnv ORACLE_SID ORCL    etc..
:
:    다른 방법 : Oracle환경변수를 업한 상태에서 httpd를 수행하세요.
:
==============
 PRO*C 프로그램 내부에서 세팅하는 방법도 있습니다. C함수중 putenv라는 놈
을 다음과 같이 써 주면 됩니다. 실제의 데이터베이스 접속은 이 함수들을
호출한 다음에 해 주면 정상적으로 됩니다.
 ... ...
 EXEC SQL INCLUDE SQLCA; /* #include "sqlca.h" 라고 해도 됩니다. */
 ... ...
 void main() {
     ... ...
     putenv("ORACLE_HOME=/backup/oracle/product/9.0.1");
    putenv("ORACLE_BASE=/backup/oracle");
    putenv("NLS_LANG=AMERICAN.KO16KSC5601");
    putenv("ORACLE_SID=ORCL");
     EXEC SQL CONNECT :hv_username IDENTIFIED BY :hv_passwd
        USING :hv_dbname;
     if (sqlca.sqlcode != 0) {
        printf("<h1>('DB 접속 에러입니다.<br>%s</h1>",
            sqlca.sqlerrm.sqlerrmc);
        exit(0);
    }
     ... ...
 }
 ... ...
 EXEC SQL INCLUDE SQLCA 또는  #include "sqlca.h" 는 꼭 넣어 주셔야 합니
다. 안그러면 DB관련 에러 체크를 할 수 없게됩니다. 샘플 프로그램에는 적
용이 되어 있으니 참고하시면 되고, 에러 체크는 EXEC SQL WHENEVER 구문을
사용하는 것보다는 sqlca.sqlcode 를 직접 참조하는것을 추천드립니다. SQL
문을 수행한 뒤 sqlca.sqlcode를 체크해서 0 이면 정상적으로 수행된 것이
도, 0 이 아니면 에러입니다. 에러코드는 1403을 제외고 전부다 음수값입니
다. 특이한 에러코드가 하나 있는데 1403 을 리턴하는 경우입니다. DB에서
데이터가 발견되지 않는 경우를 뜻하는데, 루프를 돌려 가면서 데이터를 가
져오는 경우 마지막 데이터를 가져오고 나서 또 데이터 가져오기를 시도하
면 발생합니다. 리턴코드가 1403 일경우 루프를 탈출하게 코딩하면 되겠지
요.
     while(1) {
         EXEC SQL FETCH C_EMP INTO :hv_empno, :hv_hname;
         if (sqlca.sqlcode == 1403) break;
        if (sqlca.sqlcode < 0) {
            ... ... /* 에러처리 부분을 넣어줍니다. */
        }
    }
 환경변수를 httpd.conf에 값을 지정할 경우는 아파치 전반에 걸쳐서 환경변
수가 적용되는데, 이렇게 할 경우는 이 함수들이 들어가 있는 프로그램에서
만 환경변수가 적용됩니다. 어떤 경우가 더 좋을지는 알아서 판단하십시오.
 =================
 : 5) qDecoder C CGI라이브러리와 같이 쓰시면 이제 CGI를 짜실수 있을껍니
다.
:    qDecoder를 써보니 C언어로 CGI짤때 정말 편하네요...컴파일과 코딩
은..딥따 간단 해요..
:    include "qdecoder.h"
:    include etc.header
:    main() {}
:    컴파일.
:    gcc -o sample8.cgi sample8.c -L/backup/oracle/product/9.0.1/lib -
lclntsh libqdecoder.a
:    이렇게 하심...
:
: 읽어 주셔가꼬 감사하구요...전 이만....^^)/.
: sysop at netizen.ne.kr :
:
:
:
: </pre>--3월 10일이 첫째아들 경찬이의 생일입니다.
어제 선물로 레고블럭을 사다 줬습니다.
연년생 동생과 재미있게 놀았습니다.
[관리자] 패스워드를 입력 하십시오. 답장이 존재하면 함께 삭제됩니다.[ 목록 | 이전 ]
패스워드:    

Copyleft 1999-2026 by JSBoard Open Project
Theme Designed by IDOO All right reserved