레이블이 proc인 게시물을 표시합니다. 모든 게시물 표시
레이블이 proc인 게시물을 표시합니다. 모든 게시물 표시

2010년 3월 20일 토요일

간단한 proc 프로그램 예제

4절. 간단한 proc 프로그램 예제

다음은 zipcode 테이블에 총몇개의 자료가 들어있는지 알아오는 아주 간단한 프로그램이다.

예제 : zipcode.pc

 
#include <stdio.h>
#include <unistd.h>

/* SQLCA 를 선언한다 */
EXEC SQL INCLUDE SQLCA;

int main(int argc, char **argv)
{
    /* 선언부 */
    EXEC SQL BEGIN DECLARE SECTION;
            int count = 0;
            char userid[40]= "system/manager@ORACLE";
    EXEC SQL END DECLARE SECTION;

    /* DB 연결 */
    EXEC SQL CONNECT :userid;

    /* 에러 처리 */
    if (sqlca.sqlcode < 0)
    {
            printf("%s\n", sqlca.sqlerrm.sqlerrmc);
            EXEC SQL ROLLBACK WORK RELEASE;
            exit(0);
    }

    /* 쿼리 */ 
    EXEC SQL SELECT count(*) 
            INTO: count  
            FROM zipcode;

    /* 쿼리 결과에 대한 에러처리 */
    if (sqlca.sqlcode != 0) 
    {
            EXEC SQL COMMIT WORK RELEASE;
            return 0;
    }

    printf("우편주소 데이타 : %d 개\n", count);

    /* DB 연결 종료 */
    EXEC SQL COMMIT WORK RELEASE;
}
		
코드를 보면 알겠지만 뭐 복잡하게 이것 저것 인클루드 시켜줄 필요도 없고, SQL 문이 거의 그대로 쓰여서 이해하기도 매우 쉽다는 것을 알수 있을 것이다. 참고로 오라클 proc 쏘쓰파일에서의 주석은 /* */ 만 사용가능하다. // 을 썼다가는 오류가 발생한다.

이번 문서는 단지 이런식으로 프로그래밍이 가능하다라는 정도만 보여줄 것임으로 위의 코드의 설명은 생략하도록 하겠다. 나중에 자세히 다루도록 하겠다.


4.1절. 컴파일 하기

우선 zipcode.pc 파일을 proc 선행 컴파일러를 이용해서 zipcode.c 파일을 얻어낸다음 gcc를 이용해서 object 파일을 만들고 링크과정을 거쳐서 실행파일을 만들어야 한다. 다음은 이러한 일련의 과정이다.

[oracle@localhost proc]$ proc zipcode INCLUDE=include/ \ 
> include=/usr/u01/product/8.1.7/precomp/public/ \
> include=/usr/u01/product/8.1.7/rdbms/demo/ \
> include=/usr/u01/product/8.1.7/rdbms/public/ \
> include=/usr/u01/product/8.1.7/network/public/ \
> PARSE=NONE RELEASE_CURSOR=YES MODE=ANSI

Pro*C/C++: Release 8.1.7.0.0 - Production on Thu Oct 31 00:29:15 2002

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

System default option values taken from: /usr/u01/product/8.1.7/precomp/admin/pcscfg.cfg

[oracle@localhost proc]$ gcc -c -o zipcode.o zipcode.c -I$ORACLE_HOME/precomp/public \ 
> -I$ORACLE_HOME/rdbms/demo -I$ORACLE_HOME/rdbms/public \
> -I$ORACLE_HOME/network/public

[oracle@localhost proc]$ gcc -o zipcode zipcode.o -L$ORACLE_HOME/lib -lclntsh
			
이 프로그램을 실행시키면 다음과 같은 결과값을 보여줄 것이다.
[oracle@localhost proc]$ ./zipcode 
우편주소 데이타 : 43476 개
			

4.2절. 컴파일 과정을 Makefile 로 관리하기

하지만 위의 방법대로 수동으로 코드를 컴파일 하는건 비 생산적인 방법이다. 그러므로 Makefile 을 만들어서 관리하도록 하자.

Makefile

TARGET          = zipcode

CC              = gcc
PROC            = proc
LIB             = -L$(ORACLE_HOME)/lib -lclntsh
MYINC           = include/
PROCINC         = include=$(ORACLE_HOME)/precomp/public/ include=$(ORACLE_HOME)/rdbms/demo/ \
	include=$(ORACLE_HOME)/rdbms/public/ \
	include=$(ORACLE_HOME)/network/public/ 
CINC            = -I$(ORACLE_HOME)/precomp/public/ -I$(ORACLE_HOME)/rdbms/demo/ \
	-I$(ORACLE_HOME)/rdbms/public/ -I$(ORACLE_HOME)/network/public/ 

ORA_OPT         = PARSE=NONE RELEASE_CURSOR=YES MODE=ANSI
CC_OPT          =

OBJECT          = zipcode.o
ORA_GARBAGE     = *.dcl *.cod *.cud *.lis

######## implicit rules
.SUFFIXES: .pc .c

.pc.c:
	$(PROC) $* INCLUDE=$(MYINC) $(PROCINC) $(ORA_OPT)
.c.o:
	$(CC) -c -o $*.o $*.c -I $(MYINC) $(CINC)

####### build rules

all:            $(TARGET)

$(TARGET):      $(OBJECT)
	$(CC) -o $(TARGET) $(OBJECT) $(LIB)

zipcode.c: zipcode.pc
zipcode.o: zipcode.c

clean:
	rm -f $(TARGET) $(OBJECT) $(ORA_GARBAGE)
			
이해하는데 특별히 어려움은 없을것이라고 생각된다. Makefile 에 대한 내용은 make 를 이용한 프로젝트 관리 (1)를 참고하도록 한다.

출처 :

Proc 설정하기

1. Prepare

 * Oracle 10g ( or 11g)

 * precomp demo

 * ProC 를 컴파일하기 위해서는 오라클 과, precomp demo 파일( 필수 사항은 아님) 이 있어야한다.

 * 10g 이상부터 오라클 일반설치를 하면 자동으로 proc 가 install 되기 때문에 추가적으로 깔아 주어야

    할것은 없다. ( Client 를 깔아야 된다는 예기도 있던데 없어도 컴파일 가능하다. )

 

2. Setting

$ORACLE_HOME/precomp/admin/pcscfg.cfg

 * 위의 파일은 *.pc 파일을 *.c 파일로 변환해 주는데 필요한 환경변수들이 있는곳이다.

 * 기본으로 설치하면 자신의 리눅스 환경과는 맞지 않는 설정으로 되어 있으므로,

   아래와 같이 다시 세팅해 주어야한다.

 

PARSE=NONE
sys_include=($ORACLE_HOME/precomp/public,/usr/include,/usr/lib/gcc/i586-redhat-linux/4.4.1/include,$ORACLE_HOME/lib)
include=($ORACLE_HOME/precomp/lib)
include=($ORACLE_HOME/precomp/public)
include=($ORACLE_HOME/rdbms/lib)
include=($ORACLE_HOME/rdbms/public)
include=($ORACLE_HOME/rdbms/demo)
include=($ORACLE_HOME/network/lib)
include=($ORACLE_HOME/network/public)
include=($ORACLE_HOME/plsq/public)
ltype=short

 

3. Compile

 

*.pc 파일을 c/c++ 로 변환후 컴파일을 수행한다.

기본적으로 proc 를 사용하여 c 로 변환시킨다.

proc sample1.pc

pcscfg.cfg 의 환경변수를 이용하여, sample1.c 파일이 생성된다.

c 파일을 gcc / cc 컴파일러를 이용하여 컴파일하여 실행파일로 만든다.

 

gcc -o run sample1.c -I$ORACLE_HOME/precomp/public -L$ORACLE_HOME/lib -lclntsh

 

* 위의 설정으로는 demo 의 sample.pc 파일들을 컴파일 할때 대부분 오류가 발생한다.

따라서 코드를 수정해 줘야한다. ( 해결사항은 추후 기재 ..;;)


[에러 조치사항]

 추후 기재 ...