Oracle Embedded SQL ProC Chap 5 Copyright by
Oracle Embedded SQL Pro*C : Chap 5 Copyright by Sun. Young Kim 작 성 자: 김선영 메 일: sunyzero@gmail. com 버 전: 1. 8
Preface v Oracle 은 Oracle 의 등록상표입니다. v Pro*C 는 Oracle 의 제품입니다. v 예제는 지면 제약상 한줄에 여러라인이 코딩될 수 있습니다. v 본 자료에 대한 질문사항은 연락처를 참고해주시기 바랍니다. v E-mail address § sunyzero@gmail. com § sunyzero@empal. com Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
Cursor (con't) v DECLARE 지시문 § SELECT 문을 CURSOR 와 연결하여 선언한다. § CURSOR 와 연결되는 SELECT 문에는 INTO 를 쓸 수 없다. § DECLARE <cursor_identifier> CURSOR FOR <SQL literal> EXEC SQL DECLARE C CURSOR FOR SELECT NAME FROM E_MEMBERS WHERE AGE > 20; Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
Cursor (con't) v OPEN 지시문 § 선언된 CURSOR 를 열어서(SQL 실행) Active set 을 만든다. § Active set 은 단지 커서의 실행결과에서 위치하는 논리적 공간일뿐이다. § OPEN <cursor_identifier> EXEC SQL OPEN C; Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
Cursor (con't) v FETCH 지시문 § Active set 으로부터 데이터를 읽어온다. § Active set 에 더이상 데이터가 없다면 NOT FOUND 에러로 감지할 수 있다. § FETCH <cursor_identifier> INTO <host_var> [ INDICATOR <ind_var> ] § host var. 는 구조체도 될 수 있다. EXEC SQL WHENEVER NOT FOUND DO break; while (1) { EXEC SQL FETCH C INTO : a_name INDICATOR : ind_name; printf("Name : %sn", a_name); } Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
Cursor (con't) v CLOSE 지시문 § 열린 커서를 닫고 자원을 해제한다. § CLOSE <cursor_identifier> EXEC SQL CLOSE C; Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
Example: Cursor v pr 6. pc : basic example #define MAX_ITERATION 50 typedef struct e_member { int idnum; char name[21]; short age; char desc[513]; int uniqid; } E_MEMBER; void pr_em(const E_MEMBER *s); int main(int argc, char *argv[]) { int i; E_MEMBER *p_em; if (argc != 3) { printf("Usage : %s <username> <passwd>n", argv[0]); exit(EXIT_SUCCESS); } if ((p_em = (E_MEMBER *) calloc(1, sizeof(E_MEMBER))) == NULL) { fprintf(stderr, "[%s: %d] Fail: calloc(): %sn", __FILE__, __LINE__, strerror(errno)); return EXIT_SUCCESS; } Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
Example: Cursor (con't) /* (연습) get_dbconn() 을 이용하여 DB 연결을 한다 */ EXEC SQL DECLARE C CURSOR FOR SELECT IDNUM, NAME, AGE, DESCRIPT, UNIQID FROM E_MEMBERS WHERE AGE > 30; EXEC SQL OPEN C; /* open cursor */ /* 숙제 1) uniqid 에 indicator 를 사용한다. */ /* 숙제 2): WHENEVER statement 를 제거하고 SQLCODE값으로 대치하도록 함 */ EXEC SQL WHENEVER NOT FOUND DO break; for(i=0; i<MAX_ITERATION; i++) { EXEC SQL FETCH C INTO : p_em->idnum, : p_em->name, : p_em->age, : p_em->desc, : p_em->uniqid; pr_em(p_em); } EXEC SQL CLOSE C; EXEC SQL COMMIT WORK RELEASE; /* ( 연습) 라이브러리로 교체하여 작성 */ return EXIT_SUCCESS; } Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
ORACA v oraca(Oracle Communication Area) § sqlca 의 정보보다 자세한 정보를 요구할때 사용 § oraca. h : #include 후 EXEC ORACLE OPTION (ORACA=YES) 로 활성화 시킴 /* ORACA */ struct oraca { /* text */ char oracaid[8]; /* Reserved */ /* ub 4 /* Reserved */ /* */ int oracabc; Flags which are setable by User. */ /* ub 4 */ int oracchf; /* <> 0 if "check cur cache consistncy"*/ /* ub 4 */ int oradbgf; /* <> 0 if "do DEBUG mode checking" /* ub 4 */ int orahchf; /* <> 0 if "do Heap consistency check" */ /* ub 4 */ int orastxtf; /* SQL stmt text flag */ */ #define ORASTFNON 0 /* = don't save text of SQL stmt */ #define ORASTFERR 1 /* = only save on SQLERROR */ #define ORASTFWRN 2 /* = only save on SQLWARNING/SQLERROR */ #define ORASTFANY 3 /* = always save */ Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
ORACA (con't) v oraca(Oracle Communication Area) struct { /* ub 2 */ unsigned short orastxtl; /* text */ char orastxtc[70]; } orastxt; /* text of last SQL stmt */ struct { /* ub 2 */ /* text */ unsigned short orasfnml; char orasfnmc[70]; } orasfnm; /* name of file containing SQL stmt */ /* ub 4 */ int oraslnr; /* line nr-within-file of SQL stmt */ /* ub 4 */ int orahoc; /* highest max open Ora. Curs requested */ /* ub 4 */ int oramoc; /* max open Ora. Cursors required */ /* ub 4 */ int oracoc; /* current Ora. Cursors open */ /* ub 4 */ int oranor; /* nr of Ora. Cursor re-assignments */ /* ub 4 */ int oranpr; /* nr of parses */ /* ub 4 */ int oranex; /* nr of executes */ }; Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
ORACA (con't) v oracaid § 식별자 "ORACA"로 초기화 v oracabc § oraca 구조체의 크기 (byte) v oracchf : cur cache consistncy checking flag § 0 이 아닌 경우 현재 커서 캐시의 일관성을 체크하도록 함 v oradbgf : do DEBUG mode checking flag § 0 이 아닌 경우 디버깅 모드로 작동하도록 함 v orahchf : do Heap consistency checking flag § 0 이 아닌 경우 힙의 일관성을 체크하도록 함 Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
ORACA (con't) v orastxtf : SQL stmt text flag § #define ORASTFNON 0 /* = don't save text of SQL stmt */ § #define ORASTFERR 1 /* = only save on SQLERROR */ § #define ORASTFWRN 2 /* = only save on SQLWARNING/SQLERROR */ § #define ORASTFANY 3 /* = always save */ v struct { } orastxt : text of last SQL stmt § orastxtl : orastxtc 의 길이 (byte) § orastxtc : orastxtf 조건에 충족할때 SQL 문을 70 B 까지 저장함 v struct { } orasfnm : name of file containing SQL stmt § orasfnml : orasfnmc 의 길이 (byte) § orasfnmc : 현재 SQL 구문을 담고 있는 파일명을 70 B 까지 저장함 Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
ORACA (con't) v oraslnr : line nr-within-file of SQL stmt § 현재 SQL 문이 위치한 행번호 § oraca. orastxtf = ORASTFERR 시. pc 의 오류행 번호, 디버깅시 유효) v orahoc : highest max open Ora. Curs requested § 최대 커서 오픈 제한 v oramoc : max open Ora. Cursors required § 최대로 오픈할 수 있는 커서 수 v oracoc : current Ora. Cursors open § 현재 사용중인 오픈 커서 수 Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
ORACA (con't) v oranor : nr of Ora. Cursor re-assignments § 재할당된 커서캐시의 개수 v oranpr : nr of parses § 파싱된 SQL 문의 개수 v oranex : nr of executes § 실행된 SQL 문의 개수 Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
ORACA example v ORACA 의 사용 #include <oraca. h> EXEC ORACLE OPTION (ORACA=YES); . . . (생략). . . EXEC SQL WHENEVER SQLERROR DO branch_ora_err(); oraca. orastxtf = ORASTFERR; . . . (생략). . . void branch_ora_err() { log_ora_err(); /* error logging */. . . (생략). . . error handling 을 하기에 앞서 로깅을 하는 방식으로 라이브러리 수정! } void log_ora_err() { printf("n%. *sn", sqlca. sqlerrml, sqlca. sqlerrmc); printf("in "%. *s. . . 'n", oraca. orastxtl, oraca. orastxtc); printf("on line %d of %. *s. nn", oraca. oraslnr, oraca. orasfnml, oraca. orasfnmc); . . . (생략). . . Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
- Slides: 18