원문 중간중간에 약간의 주석을 달았습니다. 참고하세요.
: <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일이 첫째아들 경찬이의 생일입니다.
어제 선물로 레고블럭을 사다 줬습니다.
연년생 동생과 재미있게 놀았습니다.