커서 처리 SQL문의 종류

커서 처리 SQL문은 커서를 처리하고 조작하는 방법과 기능에 따라 커서 선언문, 커서 OPEN문, 커서 FETCH문, 커서 CLOSE문, 커서 CLOSE RELEASE문으로 구분된다. 여기에서는 각각의 커서 처리 SQL문들에 대해 자세히 알아보기로 하자.

DECLARE CURSOR

커서를 선언한다.

구문

EXEC SQL DECLAREcursor name> CURSOR for

<cursor specification>;

인자

<cursor name> : 커서 이름. 최대 50자까지 허용

<cursor specification> : Altibase SQL의 SELECT문에 해당한다. ALTIBASE SQL User'sManual 참조

설명

커서 선언문은 커서 처리 SQL문 중에서 가장 먼저 수행되어야 한다. 선언되지 않은 커서 이름으로 다른 커서 조작문을 수행할 경우 "Not defined" 오류가 발생한다.

커서 선언문에서는 지정한 SQL문의 구문 검사(syntax check), 의미 검사(semantic check), 최적화(optimization), 실행 계획(plan tree) 작성 등 SQL문 수행을 위한 준비(prepare)를 한다. 이렇게 미리 SQL문의 수행 준비를 함으로써 한 번만 준비(prepare-DECLARE CURSOR)하여 여러 번 실행(execute-OPEN CURSOR)할 수 있으므로 성능 향상의 효과를 얻을 수 있다.

제한 사항

SELECT문의 제한 사항이 그대로 적용된다.

설명

커서 선언문은 커서 처리 SQL문 중에서 가장 먼저 수행되어야 한다. 선언되지 않은 커서 이름으로 다른 커서 조작문을 수행할 경우 "Not defined" 오류가 발생한다.

커서 선언문에서는 지정한 SQL문의 구문 검사(syntax check), 의미 검사(semantic check), 최적화(optimization), 실행 계획(plan tree) 작성 등 SQL문 수행을 위한 준비(prepare)를 한다. 이렇게 미리 SQL문의 수행 준비를 함으로써 한 번만 준비(prepare-DECLARE CURSOR)하여 여러 번 실행(execute-OPEN CURSOR)할 수 있으므로 성능 향상의 효과를 얻을 수 있다.

예제

다음은 DEPARTMENT 테이블의 모든 레코드를 검색하는 커서를 선언하는 예를 보여준다.

< 예제 프로그램 : cursor1.sc >

EXEC SQL DECLARE DEPT_CUR CURSOR FOR 

             SELECT *

             FROM DEPARTMENT;              

              

OPEN

커서를 오픈한다.

구문

EXEC SQL OPEN <cursor name>;

인자

<cursor name> : 커서 이름

설명

커서 OPEN문은 커서 선언문의 SQL문을 수행한다.

수행되는 SQL문은 이미 커서 선언문에서 수행 준비가 끝난 SQL문이다. SQL문이 수행될 때 데이터베이스 서버는 테이블에서 조건에 맞는 레코드를 찾는다.

예제

다음은 DEPT_CUR을 OPEN하는 예를 보여준다.

< 예제 프로그램 : cursor1.sc >

EXEC SQL OPEN DEPT_CUR;              

              

FETCH

오픈된 커서로부터 컬럼값들을 읽어 대응되는 호스트 변수에 저장한다.

구문

EXEC SQL FETCH <cursor name>

INTO <host_var_list>;

인자

<cursor name> : 커서 이름

<host_var_list> : 출력 호스트 변수와 출력 지시자 변수 리스트

설명

커서 FETCH문은 리턴된 컬럼값들을 대응되는 호스트 변수에 저장한다.

수행 결과

다음은 커서 FETCH문의 수행 결과가 SQL_SUCCESS인 경우와 SQL_NO_DATA인 경우에 대해 설명한다.

  • 결과가 SQL_SUCCESS인 경우

    현재 FETCH 결과가 호스트 변수에 성공적으로 저장되고 데이터베이스 서버에는 리턴할 결과가 남아 있음을 의미한다.

    일반적으로 결과가 SQL_SUCCESS인 경우 FETCH를 계속한다.

  • 결과가 SQL_NO_DATA인 경우

    현재 FETCH 결과가 없으며 호스트 변수에는 아무것도 저장되지 않기 때문에 호스트 변수값은 무의미(garbage value)하다. 데이터베이스 서버는 조건에 맞는 레코드를 모두 리턴하였거나, 조건에 맞는 레코드가 없음을 의미한다.

예제

다음은 DEPT_CUR를 FETCH하는 예를 보여준다. 리턴된 컬럼값들은 각각 s_department의 구성 요소에 저장된다. s_dept_ind 지시자 변수를 이용해 리턴된 컬럼값의 NULL 여부를 검사할 수 있다. while loop 안에서 SQL_NO_DATA가 리턴될 때까지 FETCH하여 조건에 맞는 모든 레코드를 가져온다.

< 예제 프로그램 : hostvar.h >

#define SESC_DECLARE

#ifdef SESC_DECLARE

typedef struct department

{

    short dno; 

    char  dname[30+1];

    char  dep_location[9+1];

    int   mgr_no;

} department;



typedef struct dept_ind

{

    int dno; 

    int dname;

    int dep_location;

    int mgr_no;

} dept_ind;

#endif



< 예제 프로그램 : cursor1.sc >

/* specify path of header file */

EXEC SQL OPTION (INCLUDE=./include);

/* include header file for precompile */

EXEC SQL INCLUDE hostvar.h;



EXEC SQL BEGIN DECLARE SECTION;

/* declare host variables */

department s_department;

/* structure indicator variables */

dept_ind s_dept_ind;

EXEC SQL END DECLARE SECTION;



while(1)

{

EXEC SQL FETCH DEPT_CUR

       INTO :s_department :s_dept_ind;

    if (sqlca.sqlcode == SQL_SUCCESS) 

{

        printf("%d     %s %s          %d\n",

                  s_department.dno, s_department.dname,

                  s_department.dep_location, 

s_department.mgr_no);

    }

    else if (sqlca.sqlcode == SQL_NO_DATA)

    {

        break;

    }

    else 

    {

        printf("Error : [%d] %s\n", SQLCODE, 

sqlca.sqlerrm.sqlerrmc);

        break;

    }

}              

              

CLOSE

커서를 닫는다.

구문

EXEC SQL CLOSE <cursor name>;

인자

<cursor name> : 커서 이름

설명

커서 CLOSE문은 데이터베이스 서버에서 리턴할 결과가 남아 있다면(FETCH를 끝까지 하지 않은 경우) 그 결과를 삭제한다. 즉, 커서 CLOSE문 수행 후 같은 커서 이름으로 커서 FETCH문을 수행할 수 없다. 만약 같은 커서 이름을 재사용하고자 한다면 커서 OPEN 후 FETCH하여야 한다.

리턴할 결과가 남아 있지 않다면 (FETCH를 끝까지 한 경우) 커서 CLOSE문 수행 시 아무 일도 하지 않는다. 따라서 FETCH를 끝까지 한 경우 커서 CLOSE문은 생략 가능하다.

커서 CLOSE문은 커서에 할당된 자원을 해제하지 않고 커서 선언문에서 수행한 SQL문의 준비 작업 내용도 그대로 저장하고 있다. 따라서 커서 CLOSE문 수행 후 같은 커서 이름을 재사용할 경우 커서 선언문은 생략하고 바로 커서 OPEN문 수행이 가능하다.

예제

다음은 DEPT_CUR를 CLOSE하는 예를 보여준다.

< 예제 프로그램 : cursor1.sc >

EXEC SQL CLOSE DEPT_CUR;              

              

CLOSE RELEASE

커서를 닫고 커서에 할당된 자원을 해제한다.

구문

EXEC SQL CLOSE RELEASE <cursor name>;

인자

<cursor name> : 커서 이름

설명

커서 CLOSE RELEASE문은 커서에 할당된 자원을 해제하고 커서 선언문에서 수행한 SQL문을 실행하기 위한 준비 작업 내용도 모두 삭제한다. 만약 커서가 리턴할 결과가 남아 있다면 그 결과도 모두 삭제한다. 따라서 커서 CLOSE RELEASE문 수행 후 동일한 커서 이름을 재사용할 경우 커서 선언문, 커서 OPEN문 순서로 수행하여야 한다. 즉, 커서 CLOSE RELEASE문 수행 후 같은 커서 이름으로 커서 OPEN문을 수행할 수 없다.

예제

다음은 EMP_CUR를 CLOSE RELEASE 하는 예를 보여준다. 이 때, EMP_CUR의 선언문에서 수행된 SQL문의 준비 작업 내용이 삭제되고, EMP_CUR에 할당된 모든 자원이 해제된다.

< 예제 프로그램 : cursor2.sc >

EXEC SQL CLOSE RELEASE EMP_CUR;
Posted by gala
l