2013. 5. 3. 15:31
원문출처 :
http://www.dbguide.net/db.db?cmd=view&boardUid=13724&boardConfigUid=9&categoryUid=216&boardIdx=58&boardStep=1ESQL/C Programming Highlights
Overview
ESQL/C
- C 프로그램 내에 sql 구문을 바로 넣어 그 실행 결과를 프로그램에서 다양하게 사용할 수 있도록 제공되는 어플리케이션 개발 tool
- ESQL/C 의 주된 component는 preprocessor 로서 ESQL/C code 를 C code로 변환하여 C compiler에게 에게 넘겨준다.
ESQL/C 프로그램 작성 규칙
- ESQL/C preprocessor가 다른 C code와 구별할 수 있게 하기 위해 SQL은 “$” 혹은 “EXEC SQL” 으로 시작
- SQL 구문의 끝에는 “;”를 붙임.
- SQL 구문 안의 변수(host 변수라 부름)는 변수 이름 앞에 “:”를 붙임.
- 주석은 표준 C의 주석인 “/* */ ”사용
ESQL/C 프로그램 컴파일
- esql l [-e] [preprocessor e] [preprocessor 옵 옵션] [cc 매개변수] [-o 실행파일] ] 소스. ec
[링크옵션]
include에 지정된 지정된 파일을 찾는 순서
- 현재 디렉토리
- 컴파일시 -I 옵션으로 지정한 디렉토리
- $INFORMIXDIR/incl/esql
- /usr/include
다음과 같은 preprocessor 구문을 사용할 수 있다
- define, undef
- ifdef, elseif, else, endif, ifndef
- 예제
EXEC SQL define USERTRANSACTIONS;
EXEC SQL ifdef USERTRANSACTIONS;
EXEC SQL begin work;
EXEC SQL endif;
Host variables
호스트 변수 : SQL 데이터를 저장하는 C 변수
대소문자 구분
SQL 문장안에서 컬럼명과 구분하기 위하여 호스트변수 앞에 : 기호 사용
선언
- 달러 기호 사용
$ CHAR * desc ; - EXEC SQL 키워드 사용
EXEC SQL begin declare section;
char * desc;
EXEC SQL end declare section;
사용
- SQL 내에서
EXEC SQL update customer set zipcode = : zipcode ; - C 구문 안에서
gets (dbname);
EXEC SQL database : dbname;
external 이나 static 으로 선언하지 않은 경우자동적으로 local 범위
Database Connections
ESQL/C 구문
- CONNECT TO 데이터베이스명
- DISCONNECT ALL
CONNECT 구문의 옵션
- Connection 이름
· EXEC SQL CONNECT TO ‘‘stores@ munish’AS ‘munich_con’; - User 절
· EXEC SQL CONNECT TO ‘stores@ munish’ USER :uid USING : passwd ; - Default 절 (데이터베이스를 오픈하지 않고 서버에 연결)
· EXEC SQL CONNECT TO DEFAULT ;
· Default 절 사용 후 다음과 같은 문장이 필요
√ DATABASE
√ CREATE DATABASE
√ START DATABASE
연결 전환 (switching)
- 구문
EXEC SQL SET CONNECTION ‘munish _con’;
EXEC SQL SET CONNECTION :connect_id ;
EXEC SQL SET CONNECTION DEFAULT;
연결 종료 (disconnecting)
- 열린 데이터베이스를 닫고 connection을 종료한다
EXEC SQL DISCONNECT :connect_id ;
EXEC SQL DISCONNECT CURRENT ;
EXEC SQL DISCONNECT DEFAULT ;
EXEC SQL DISCONNECT ALL ; - default로 connect 했거나 connection이 하나 일 경우 DEFAULT 사용
Error Handling
SQL 문을 실행한 후 서버에서 SQLCA라 불리는 영역에 feedback 정보를 남긴다
- errors
- performance
- warnings
SQLCODE 는 sqlca. sqlcode 값과 같다
- SQLCODE < 0 : 에러 코드 값
- SQLCODE = 0 : 정상적 처리
- SQLCODE = 100 : SQLNOTFOUND, 찾는 행이 없음
- SQLCODE = 1~99 : Dynamic SQL
에러 메시지를 얻기 위한 함수
- rgetmsg, rgetlmsg
SQL 문이 실행되고 다음과 같은 4가지 중 하나의 상태가 된다
- 성공
- 성공, 찾을 수 있는 데이터는 없음
- 성공, 경고(warning) 메시지가 있음
- 실패
성공 외의 나머지 상태에 대한 처리 방법을 exception처리로 제어한다
- WHENEVER exception action
- exception : NOT FOUND, SQLWARNING, SQLERROR
- action : GO TO label, CALL function, STOP, CONTINUE
- 디폴트 action은 CONTINUE
WHENEVER 문의 scope는 한 소스 파일에서 global 성격을 가진다
struct sqlca_s {
long sqlcode ;
char sqlerrm[72] ;
char sqlerrp[8] ;
long sqlerrd[6] ;
struct sqlcaw_s {
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
} sqlwarn;
} ;
extern structsqlca_s sqlca;
long sqlcode ;
char sqlerrm[72] ;
char sqlerrp[8] ;
long sqlerrd[6] ;
struct sqlcaw_s {
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
char sqlwarn0 ;
} sqlwarn;
} ;
extern structsqlca_s sqlca;
GET DIAGNOSTICS 사용
- GET DIAGNOSTICS 문은 여러 개의 SQL exception을 처리할 수 있고, ANSI및 X/OPEN 표준으로 컴파일된다
- SQLCA 는 계속 사용 가능하다
- 다음 세가지 분류로 사용한다
- · SQLSTATE
- · GET DIAGNOSTICS 문
- · GET DIAGNOSTICS EXCEPTION 문
- GET DIAGNOSTICS 의 정보
- · MORE : 모든 exception이 반환되었음을 나타냄
- · NUMBER : exception의 갯수
- · ROW_COUNT : SQL 에 의해 처리된 행 수
- EXCEPTION 의 정보
- · RETURNED_SQLSTATE
- · SERVER_NAME
- · CONNECTION_NAME
- · CLASS_ORIGIN 등
Indicator 사용
- 데이터를 호스트변수에 저장할 때 다음과 같은 Exception 이 발생할 수 있다
- · NULL 값을 fetch 하였다
- · 컬럼 데이터에 비해 호스트 변수의 크기가 작다
- 사용법
- · :host 변수:indicator 변수
- · $host 변수 $indicator 변
- · :host 변수 INDICATOR indicator 변수 (ANSI 표준)
Prepare, Execute
Prepare / Execute 구문
PREPARE prepare_statement_id FROM { “quoted_string” | :host_variable } ;
EXECUTE prepare_statement_id [ USING :host_variables ]
단일 SQL문 처리 예
EXEC SQL insert into customer (customer_num, fname, lname , company)
values (0, : fname, :lname , ‘MPS Corp’ );
EXEC SQL insert into items values (: itemsrec);
※ itemsrec 변수는 items 테이블의 컬럼 순서로 선언된 structure 형
PREPARE / EXECUTE 사용
EXEC SQL PREPARE ins_p from
“insert into customer (customer_num, fname , lname, company)
values (0,?,?,?)” ;
EXEC SQL EXECUTE ins_p using : fnam, lname , :company;
PREPARE를 사용하는 이유
- PREPARE 시점에 SQL문장에 대하여 미리 parsing되고 query plan이 생성된다
- EXECUTE 시점에는 처리해야 할 값만 넘겨주면 즉시 실행된다
- 하나의 DML문장에서 여러번 값을 바꿔서 넘겨주어야 할 때 PREPARE 에서 한 번만 query plan을 생성하므로 유용하게 사용할 수 있다
Cursor
Cursor 이해
- Cursor 는 select 구문에 의해 선택된 row 들을 가리키고 있는 일종의 marker라고 볼 수 있음.
- 여러 개의 row 를 가져오는 select 문의 결과에 대해 처리하기 위해서 필요함.
- Cursor 종류
- Select cursor
- √ Scroll cursor
- √ Non-scroll cursor
- √ For update cursor
- Insert cursor
Scroll Cursor
구문
- DECLARE
DECLARE cursor_id SCROLL CURSOR [WITH HOLD] FOR select_stmt; - OPEN
OPEN cursor_id ; - FETCH
FETCH [position] Cursor_id [INTO host_variable_list] ;
Position : FIRST, LAST, CURRENT, NEXT, PREVIOUS, ABSOLUTE n, RELATIVE n
- CLOSE
CLOSE cursor_id ; - FREE
FREE Cursor_id ;
WITH HOLD 구문
- WITH HOLD 구문을 사용한 커서는 transaction이 종료되어도 close되지 않는다.
Fetch Buffer Size
- 환경변수 : export FET_BUF_SIZE=30000
- 전역변수 : EXEC SQL include sqlhdr ;
FetBufSize=30000 ;
Deferred Prepare
- 환경변수 : export IFX_DEFERRED_PREPARE=1 (enable)
export IFX_DEFERRED_PREPARE=0 (disable) - SQL 구문 : EXEC SQL set deferred_prepare ;
EXEC SQL set deferred_prepare enabled ;
EXEC SQL set deferred_prepare disabled ;
Open-Fetch-Close
- 환경변수 : export OPTOFC=1 (enable)
export OPTOFC=0 (disable)
Autofree
- 환경변수 : export IFX_AUTOFREE=1 (enable)
export IFX_AUTOFREE=0 (disable) - SQL 구문 : EXEC SQL set autofree; ; EXEC SQL set autofree enabled ; EXEC SQL set autofree disabled ;
For Update Cursor
구문
- DECLARE
DECLARE cursor_id CURSOR [WITH HOLD] FOR select_stmt FOR UPDATE ; - OPEN
OPEN cursor_id ; - FETCH
FETCH cursor_id [INTO host_variable_list] ; - UPDATE
UPDATE ... WHERE CURRENT OF cursor_id ; - CLOSE
CLOSE cursor_id ; - FREE
FREE cursor_id ;
Insert Cursor
구문
- DECLARE
DECLARE cursor_id CURSOR FOR insert_stmt ; - OPEN
OPEN cursor_id ; - PUT
PUT cursor_id [ FROM host_variable_list ] ; - FLUSH
FLUSH cursor_id ; - CLOSE
CLOSE cursor_id ; - FREE
FREE cursor_id ;