>> Edit article
이름
제목
패스워드
원문 중간중간에 약간의 주석을 달았습니다. 참고하세요. : <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@netizen.ne.kr : : : : : </pre>--3월 10일이 첫째아들 경찬이의 생일입니다. 어제 선물로 레고블럭을 사다 줬습니다. 연년생 동생과 재미있게 놀았습니다.
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved