| Oracle8 Administrator's Reference for LINUX Release 8.0.5 A66585-01 |
|
오라클 전처리기는 고급 언어로 쓰여진 프로그램들과 오라클 데이터베이스로부터 SQL명령문을 결합시키는 어플리케이션을 설계하는 툴이다. 오라클 전처리기는 ANSI SQL과 호환된다. 그리고 오라클8에서 실행되는 개방형, 맞춤형 어플리케이션 또는 다른 ANSI SQL DBMS를 개발하는데 쓰인다.
모든 전처리기 실행파일은 makefile 즉, $ORACLE_HOME/precomp/lib/ins_precomp.mk를 이용하여 Relink 된다. make명령어는 다음 방식으로 사용한다.
$ make -f ins_precomp.mk relink EXENAME=executable
이 명령어는 $ORACLE_HOME/precomp/lib 디렉토리에서 새로운 실행파일을 만들어 낼 것이다. 그 다음에 $ORACLE_HOME/bin 디렉토리로 그것을 옮긴다. 그것을 $ORACLE_HOME/bin로 옮기지 않고 새로운 실행파일을 만들려면, 다음 명령어를 이용한다:
$ make -f ins_precomp.mk executable
여기서 사용하는 제품에 따라 실행파일의 이름은 Talbe 5-1로 부터 결정될 수 있다.
| 제품 | 실행파일 |
|---|---|
|
Pro*C/C++ |
|
|
Object Type Translator |
|
예를 들어, Pro*C/C++ 실행파일을 relink하기 위해서, 다음 명령어를 이용한다:
$ cd $ORACLE_HOME/precomp/lib $ make -f ins_precomp.mk relink EXENAME=proc
$ORACLE_HOME/precomp/admin에는 여섯 개의 .cfg 시스템 설정 파일들이 들어있다. 이들은 Table 5-2에 설명되어 있다.
| 제품 | 설정파일 |
|---|---|
|
Pro*C/C++ |
|
|
Object Type Translator |
|
C 이외의 언어에서, 여러분들이 사용하는 컴파일러는 대문자로 된 함수 또는 부프로그램(subprogram)의 이름을 소문자로 변환한다. 이것은 "No such user exit" 에러의 원인이 된다. 이렇한 경우 여러분들의 옵션파일에 있는 함수 또는 부프로그램의 이름과 iapxtb 테이블의 것을 대소문자를 비교해서 확인해 본다.
전처리기와 업자들이 공급하는 디버거(debugger)들은 아마 호환이 되지 않을 것이다. 오라클사는 디버거하에서 실행되는 어떤 프로그램이 운영체제하에서도 같은 방법으로 실행될 것이라는 것을 보증하지 않는다.
The ireclen 과 oreclen 변수들은 최대값을 가지고 있지 않다.
다음 문서들은 전처리기와 인터페이스 특징에 대하여 추가적인 정보를 제공한다:
Pro*C/C++ release 8.0.5에 관한 추가적인 정보를 위해서는, $ORACLE_HOME/precomp/doc/proc2/readme.doc에 있는 README 파일을 참조하라.
Pro*C/C++ 시스템 설정 파일은 $ORACLE_HOME/precomp/admin/pcscfg.cfg이다.
Pro*C/C++을 사용하는데 앞서, 운영체제의 정확한 버전에 맞는 컴파일러가 올바르게 설치되었는지 확인해라. 요구되는 운영체계의 버전은 Oracle8 Installation Guide for LINUX의 Chapter1에 기술되어 있다.
Pro*C/C++의 다양한 기능을 보여주기 위한 Demo 프로그램들이 되어 있다. 3가지 종류의 Demo 프로그램들이 있다: C, C++ 그리고 Object Program - 후자는 Oracle8의 객체사양을 보여준다. 모든 Demo 프로그램들은 $ORACLE_HOME/precomp/demo/proc에 위치해 있고, 모든 프로그램들은 패스워드가 TIGER인 SCOTT스키마 안에 존재하는 $ORACLE_HOME/sqlplus/demo/demobld.sql에 의해서 Demo 테이블이 만들어졌다고 가정한다.
SQL*Plus에서 사용되는 Demo 프로그램들을 만드는 더 나은 정보를 얻기 위해서는, 이 책의 page 4-3에 있는 "Demonstration Tables" 을 보면 된다. Demo 프로그램들에 대한 보다 자세한 정보는 Programmer's Guide to the Pro*C/C++ Precompiler 를 참조하라.
$ORACLE_HOME/precomp/demo/proc/demo_proc.mk라는 makefile은 Demo 프로그램들을 만드는데 사용되어야만 한다. 예를들어, sample1 Demo 프로그램을 프리컴파일, 컴파일 또는 link 하기 위해서는 다음 명령어를 입력한다.
$ make -f demo_proc.mk sample1
다른 방법으로 다음 명령어를 이용할 수 있는데, 좀더 명확한 문법을 사용해야만이 정확히 같은 결과를 얻을 수 있다.
$ make -f demo_proc.mk build OBJS=sample1.o EXE=sample1
기본적으로 모든 프로그램들은 $ORACLE_HOME/lib/libclntsh.so 라는 클라이언트 공유 라이브러리와 동적으로 link 되어 있다.
Pro*C/C++의 모든 C Demo 프로그램들을 만들기 위해서, 다음 명령어를 입력한다:
$ make -f demo_proc.mk samples
Pro*C/C++의 모든 C++ Demo 프로그램들을 만들기 위해서, 이 명령어를 입력한다:
$ make -f demo_proc.mk cppsamples
Pro*C/C++의 모든 Object Demo 프로그램들을 만들기 위해서, 다음 명령어를 사용한다:
$ make -f demo_proc.mk object_samples
일부 Demo 프로그램들을 실행하기 위해서는 $ORACLE_HOME/precomp/demo/sql에 있는 SQL 스크립트를 요구한다. 이런 Demo 프로그램을 만들고, 해당 SQL script를 실행하기 위해서는 make 매크로 인자 RUNSQL=run을 명형행에 포함시켜 줘야만 한다. 예를 들면, calldemo Demo 프로그램을 생성하고 실행하기 위해서는 $ORACLE_HOME/precomp/demo/sql/calldemo.sql 라는 스크립트가 필요하다. 다음과 같이 명형을 입력한다:
$ make -f demo_proc.mk calldemo RUNSQL=run
다른 예로, 모든 Object Demo 프로그램들을 만들고 실행하기 위해서는 해당 SQL 스크립트를 전부 필요로 한다. 다음 명령어를 입력한다.
$ make -f demo_proc.mk object_samples RUNSQL=run
필요하다면 SQL 스크립트를 수동으로 실행할 수도 있다.
$ORACLE_HOME/precomp/demo/proc/demo_proc.mk라는 makefile은 사용자 프로그램들을 만드는데 사용된다. demo_proc.mk와 사용자 프로그램들을 link 하기 위한 일반적인 문법은 다음과 같다:
$ make -f demo_proc.mk target OBJS="objfile1 objfile2 ..." \
EXE=exename
예를 들어, Pro*C/C++ 소스인 myprog.pc로 부터 myprog 프로그램을 만들기 위해서는 소스와 원하는 실행파일의 형태에 따라 다음 명령어 중 하나를 이용한다.
C 소스를 클라이언트 공유 라이브러리와 동적으로 link 한다:
$ make -f demo_proc.mk build OBJS=myprog.o EXE=myprog
C 소스에서 정적으로 link 한다:
$ make -f demo_proc.mk build_static OBJS=myprog.o EXE=myprog
C++소스를 client shared library와 동적으로 link한다:
$ make -f demo_proc.mk cppbuild OBJS=myprog.o EXE=myprog
C++소스를 정적 link 한다:
$ make -f demo_proc.mk cppbuild_static OBJS=myprog.o EXE=myprog
리눅스에서 공유 라이브러리 사용에 관한 문제는 LINUX 문서를 참고한다.
Oracle Call Interface (OCI)를 사용하기 전에, 컴파일러가 적절하게 설치되었는지 정확한 버젼을 확인하라. 여러분들의 운영체제에 따라 요구되는 버전은 Oracle8 Installation Guide for LINUX 의 Chapter 1에 명시되어 있다.
OCI의 다양한 기능을 보여주는 Demo 프로그램들이 제공된다. Demo 프로그램들은 C, C++ 2가지 종류로 준비되어 있다. 모든 Demo 프로그램들은 $ORACLE_HOME/rdbms/demo에 위치해 있다. 대부분의 Demo 프로그램들은 패스워드가 TIGER인 SCOTT스키마 안에 존재하는 $ORACLE_HOME/sqlplus/demo/demobld.sql에 의해서 Demo 테이블이 만들어졌다고 가정한다.
SQL*Plus에서 사용되는 Demo 프로그램들을 만드는 보다 자세한 정보를 얻기 위해서는, 이 책의 page 4-3에 있는 "Demonstration Tables"을 보면 된다.
Demo 프로그램에 대한 보다 자세한 정보는 Programmer's Guide to the Oracle Call Interface와 다른 프로그램의 세부항목 프로그램 소스를 보면 된다.
데모 프로그램을 만들기 위해 $ORACLE_HOME/rdbms/demo/demo_rdbms.mk makefile을 사용해야 한다. 예를 들어, cdemo1 데모 프로그램을 컴파일하고, link 하기 위해서는 다음 명령어를 입력한다:
$ make -f demo_rdbms.mk cdemo1
다른 방법으로, 다음 명령어를 이용하수 도 있다. 이것은 좀더 명확한 문법으로 기술해 줘야만이 정확히 같은 결과를 얻을 수 있다:
$ make -f demo_rdbms.mk build OBJS=cdemo1.o EXE=cdemo1
기본적으로 모든 프로그램들은 $ORACLE_HOME/lib/libclntsh.so
client shared library와 동적으로 link되어있다.
모든 OCI C Demo 프로그램들을 만들기 위해서는 다음 명령어를 입력한다:
$ make -f demo_rdbms.mk demos
모든 OCI C++ Demo 프로그램들을 만들기 위해서는 이 명령어를 입력한다:
$ make -f demo_rdbms.mk c++demos
어떤 Demo 프로그램들은 프로그램이 수행되기 전에 수동으로 실행시키기 위해서 $ORALCE_HOME/rdbms/demo에 있는 SQL 스크립트를 요구한다. 대부분의 경우에, SQL스크립트 이름은 프로그램 이름에 .sql 붙인것과 같다. 예를 들어, oci02 프로그램의 SQL 스크립트는 oci.02.sql 이다.
어떠한 경우라도 SQL 스크립트가 요구되어진다고 결정한 프로그램을 시작할 때는 꼭주석을 읽는다.
$ORACLE_HOME/rdbms/demo/demo_rdbms.mk makefile은 사용자 프로그램을 만드는데 사용된다. demo_rdbms.mk 가 사용자 프로그램을 link하는 일반적인 문법은:
$ make -f demo_rdbms.mk target OBJS="objfile1 objfile2 ..." \
EXE=exename
예를 들어, myprog.c C언어 소스로부터 myprog 프로그램을 만들기 위해서는 요구되어지는 실행파일의 타입에 따라서 다음 명령어 중에 하나를 사용해야 한다:
C 소스가 client shared library를 동적 link 하기 위해서:
$ make -f demo_rdbms.mk build OBJS=myprog.o EXE=myprog
C 소스가 정적 link 하기 위해서:
$ make -f demo_rdbms.mk build_static OBJS=myprog.o EXE=myprog
myproc.cc C++ 소스로부터 myprog 프로그램을 만들때:
C++ 소스가 client shared library를 동적 link 하기 위해서:
$ make -f demo_rdbms.mk buildc++ OBJS=myprog.o EXE=myprog
C++ 소스가 정적 link 하기 위해서:
$ make -f demo_rdbms.mk buildc++_static OBJS=myprog.o EXE=myprog
제공된 demo_product.mk makefiles은 이번장의 특징적인 제품 부분에서 묘사되어 있는 사용자 프로그램들을 link할 때 사용할 것을 권장한다. 만약 제공된 makefile을 변경하는 것이 필요하거나 또는 사용자가 만든 makefile을 사용하기로 했다면 다음 지시에 따라서 한다:
ddemo_product.mk makefile 파일을 사용한다.
프로그램을 link할 때 일반적인 에러는 정의되지 않는 symbol들 때문이다. 이것은 다음과 비슷하다:
$ make -f demo_proc.mk sample1 Undefined first referenced symbol in file sqlcex sample1.o sqlglm sample1.o ld: fatal: Symbol referencing errors. No output written to sample1
이 에러는 linker가 참조되는 symbol을 위한 정의를 찾지 못했을 때 일어난다. 일반적으로 이런 종류의 문제를 위한 해결책은 정의가 포함되어 있는 link line이 존재하는 라이브러리 또는 object 파일을 확실하게 하는 것이다. 그리고 linker는 파일이 들어있는 그 디렉토리에서 찾을 수 있다.
오라클은 심볼이 정의되어 있는 곳에 라이브러리 또는 object파일이 위치하는 것을 돕기 위해서 symfind를 호출하는 유틸리티를 제공한다. 여기에 sqlcex symbol이 위치한 곳에 symfind의 결과 예제가 있다:
$ symfind sqlcex SymFind - Find Symbol <sqlcex> in <**>.a, .o, .so ------------------------------------------------------ Command: /u01/app/oracle/product/8.0.5/bin/symfind sqlcex Local Directory: /u01/app/oracle/product/8.0.5 Output File: (none) Note: I do not traverse symbolic links Use '-v' option to show any symbolic links Locating Archive and Object files ... [11645] | 467572| 44|FUNC |GLOB |0 |8 |sqlcex ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ./lib/libclntsh.so [35] | 0| 44|FUNC |GLOB |0 |5 |sqlcex ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ./lib/libsql.a
오라클 라이브러리는 이번 릴리이즈에서 안정되고, 다중 스레드 어플리케이션(multi-threaded applications)을 지원하는 스레드를 지원한다.
프리컴파일러와 OCI 어플리케이션들은 정적, 동적 라이브러리들과 link 할 수 있다. 정적 link의 경우에는, 모든 어플리케이션의 라이브러리들과 object들이 하나의 실행 프로그램안에 함께 link 되어 있다. 결과적으로, 어플리케이션 실행파일들은 상당히 크게 될 수 있다.
동적 link의 경우에는, 실행 프로그램 안에 수행 코드가 부분적으로는 실행 프로그램안에 존재한다. 그리고 실행시(run-time)에 동적 어플리케이션에 의해서 link 되는 라이브러리들도 존재한다. 실행시에 link 되는 라이브러리들은 동적 또는 공유 라이브러리들이다. 여기에 동적 link 의 중요한 두가지 이익을 설명한다:
오라클 공유 라이브러리는 $ORACLE_HOME/lib/libclntsh.so 에 있다. 만약 오라클이 어플리케이션을 link하기 위해서 사용하는 demo_product.mk makefile을 제공한다면, 오라클 공유 라이브러리는 기본적으로 사용되어진다.
프로세스가 시작되었을 때 실행시 로더(runtime loader)가 오라클 공유 라이브러리를 찾을수 있도게 하기 위해서 LD_LIBRARY_PATH 에 환경변수를 세팅하는 것이 필요하다. 만약 실행파일을 시작했을 때 다음과 같은 에러가 났다면, LD_LIBRARY_PATH가 오라클 공유 라이브러리가 존재하는 디렉토리에 세팅되어 있어야만 한다.
% sample1 ld.so.1: sample1: fatal: libclntsh.so.1.0: can't open file: errno=2 Killed
LD_LIBRARY_PATH은 다음과 같이 세팅한다:
% setenv LD_LIBRARY_PATH $ORACLE_HOME/lib
오라클 공유 라이브러리는 인스톨하는 동안에 자동으로 만들어진다. 만약 오라클 공유 라이브러리를 다시 만들 필요가 있다면, SQL*Plus나 Recovery Manager와 같은 모든 오라클 클라이언트 어플리케이션들을 포함한 오라클 공유 라이브러리를 사용하고 있는 모든 클라이언트 어플리케이션들을 종료하고, oracle로 로그인 한 후에 다음 명령어를 실행시킨다.
% cd $ORACLE_HOME/rdbms/lib % make -f ins_rdbms.mk client_sharedlib
이 부분은 오라클8이 두 작업간의 통신(two-task communication)에 사용하는 시그널을 설명한다. 그리고 signal handler를 어떻게 셋업 하는가를 설명한다.
Signal은 당신이 데이터베이스에 접속할 때 그리고 접속 상태가 아닌 상태에서 다시 인스톨할 때 사용자 프로세스에 인스톨되어 있다.
오라클8은 두 작업간의 통신(two-task communication)을 위해서 다음 signal들을 사용한다:
리스트된 signal들은 Pro*C 또는 다른 전처리기 어플리케이션들에 영향을 미친다. 당신은 오라클 프로세스에 접속되어 있을 때 SIGCLD (또는 SIGCHLD) 그리고 SIGPIPE를 위한 하나의 signal handler를 인스톨할 수 있다. osnsui() 루틴이 셋업을 위해서 호출되는 동안 SIGINT를 위한 multiple signal handler들을 만들 수 있다. 당신은 원할 때 다른 signal들을 위해서 많은 signal들을 인스톨할 수 있다. 만약 the oracle process 접속되어 있지 않다면, multiple signal handler를 만들 수 있다.
다음 예제는 signal 루틴과 catching 루틴을 어떻게 셋업할 수 있는지 보여준다. SIGINT에서는 signal-catching루틴을 등록하고 삭제하기 위해서 osnsui() 와 osncui()를 사용한다.
/* 사용자 측 인터럽트 세팅 */ word osnsui( /*_ word *handlp, void (*astp), char * ctx, _*/) /* ** osnsui: 운영체제 의존 사용자측 인터럽트 네트워크 세팅 ** ** handling procedure astp 인터럽트를 더한다. ** ** 사용자 인터럽트(^C와 같은)가 발생할때마다 ctx 인자와 함께 astp를 호출한다. ** ** 이 handler를 위한 *handlp 핸들을 넣는다. 그래서 osncui 와 함께 지운다. ** ** 많은 handler들이 보일 것이다. ** 사용되고 있는 osncui 는 각각 지워져야 한다. ** 만약에 에러가 발생하면 에러코드를 리턴한다. */ /* 사용자 측 인터럽트 삭제 */ word osncui( /*_ word handle _*/ ); /* ** osncui : 운영체제 의존 사용자측 인터럽트 삭제 ** ** 열거된 handler를 지운다. 인자는 osnsui로부터 얻어진 handle이다. ** ** aksdir 에러가 발생하면 에러코드를 리턴한다. */
다음은 어플리케이션 안에서 osnsui()와 osncui()를 사용하기 위한 템플릿이다:
/* ** 자신의 사용자 인터럽트 handler. */ void sig_handler() { ... } main(argc, argv) int arc; char **argv; { int handle, err; ... /* 자신의 사용자 인터럽트 핸들러를 셋업한다 */ if (err = osnsui(&handle, sig_handler, (char *) 0)) { /* 만약 리턴값이 0이 아니면, 에러가 발생한다. 어떤 것은 여기에 사용한다 */ ... } ... /* 자신의 인터럽트 핸들러를 지운다 */ if (err = osncui(handle)) { /* 만약 리턴값이 0이 아니면, 어떤 것은 여기에 사용한다. */ ... } ...
}
XA 어플리케이션 TP-모니터를 만들 때 오라클 클라이언트 공유 라이브러리에 앞서 link line에 위치하고 있는 TP-모니터 라이브러리들(ax_reg와 ax_unreg symbol을 정의한)을 확정한다. 이 link의 제약조건은 오직 XA의 동적 등록(Oracle XA switch xaoswd)에 사용될 때 요구되어진다.
Oracle8 서버는 Oracle7 7.1.6 XA의 호출(뿐만아니라 7.3 XA 호출)을 제공하지 않는다. 그러므로 7.1.6 XA 호출을 사용하는 TP-모니터 XA 어플리케이션은 Oracle8 XA 라이브러리와 함께 다시 link 되어야만 한다. Oracle8 XA 호출은 $ORACLE_HOME/lib/libclntsh.so 공유 라이브러리와 $ORACLE_HOME/lib/libclient.a 정적 라이브러리 모두에서 정의되어진다.