'Study/c'에 해당되는 글 1건

  1. 2013.05.03 [펌]ESQL/C 개략
2013. 5. 3. 15:31

원문출처 : 

http://www.dbguide.net/db.db?cmd=view&boardUid=13724&boardConfigUid=9&categoryUid=216&boardIdx=58&boardStep=1

ESQL/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;

그림 1: include

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 범위

그림 2: 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;
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 등

그림 3: GET DIAGNOSTICS 사용

Indicator 사용
  • 데이터를 호스트변수에 저장할 때 다음과 같은 Exception 이 발생할 수 있다
    • · NULL 값을 fetch 하였다
    • · 컬럼 데이터에 비해 호스트 변수의 크기가 작다
  • 사용법
    • · :host 변수:indicator 변수
    • · $host 변수 $indicator 변
    • · :host 변수 INDICATOR indicator 변수 (ANSI 표준)

그림 4: Indicator 사용

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

그림 5: 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

그림 6: Scroll Cursor

  • 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 ;

그림 7: Fetch Buffer Size

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 ;

그림 8: Autofree

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 ;

그림 9: Update Cursor

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 ;

Posted by 땡보