콘텐츠로 이동

6. 내장 SQL문#

개요#

내장 SQL문은 응용 프로그램 내에 포함되어 있는 SQL문을 말한다.

구문#

EXEC SQL … ;

내장 SQL문은 "EXEC SQL"문장으로 시작해서 ";"으로 끝난다.

"EXEC SQL"과 ";"사이에 SELECT, UPDATE 등의 DML문, CREATE, DROP 등의 DDL문 등 다양한 SQL문을 사용할 수 있다.

제한 사항#

SQL문 길이는 최대 32Kbytes까지 허용한다.

예제#

다음은 내장 SQL문의 사용 예를 보여준다.

< SELECT문 : select.sc >

EXEC SQL BEGIN DECLARE SECTION;
short      s_dno;
char       s_dname[30+1];
char       s_dep_location[9+1];
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT DNAME, DEP_LOCATION 
INTO :s_dname, :s_dep_location
           FROM DEPARTMENTS 
WHERE DNO = :s_dno;

< INSERT문 : insert.sc >

EXEC SQL BEGIN DECLARE SECTION;
char    s_gno[10+1];
char    s_gname[20+1];
char    s_goods_location[9+1];
int     s_stock;
double  s_price;
EXEC SQL END DECLARE SECTION;

EXEC SQL INSERT INTO GOODS 
VALUES (:s_gno, :s_gname, 
:s_goods_location, 
:s_stock, :s_price);

각 내장 SQL문에 대한 구문은 뒤에서 더 자세히 다루도록 한다.

내장 SQL문 분류#

내장 SQL문은 크게 두 가지로 분류된다. 수행할 SQL문이 프로그램 작성 시 결정되느냐, 실행 시간에 결정되느냐에 따라 정적 SQL문과 동적 SQL문으로 나눌 수 있다. 본 장에서는 정적 SQL문에 대해서만 언급하기로 한다. 동적 SQL문에 대한 자세한 설명은 10장을 참조하기 바란다.

내장 SQL문은 데이터 처리 방식과 역할에 따라 다음과 같이 분류할 수 있다.

호스트 변수 선언부#

내장 SQL문에서 사용할 호스트 변수를 선언한다. 자세한 내용은 3장을 참조하기 바란다.

함수 인자 선언부#

호스트 변수로 사용할 함수 인자를 선언한다. 자세한 내용은 3장을 참조하기 바란다.

연결 관련 SQL문#

데이터베이스에 연결, 연결 해제와 관련된 SQL문을 말한다.

기본 내장 SQL문#

SELECT, UPDATE, INSERT, DELETE 등의 DML문과 CREATE, DROP, ALTER 등의 DDL문이 포함된다.

커서 처리 SQL문#

커서를 이용한 데이터 처리 SQL문을 말한다. 커서 정의, 커서 열기, 커서 이용하여 데이터 가져오기, 커서 닫기 등의 SQL문이 여기에 포함된다. 자세한 내용은 8장을 참조하기 바란다.

SQL/PSM 처리 SQL문#

저장 프로시저와 저장 함수 관련 SQL문을 말한다. 저장 프로시저/함수의 생성, 재컴파일, 실행, 삭제 등의 SQL문이 여기에 포함된다. 자세한 내용은 11장을 참조하기 바란다.

기타 내장 SQL문#

위의 경우를 제외한 모든 Altibase SQL문을 말한다. 작업 제어문, 시스템 제어문, 트랜잭션 처리문 등이 여기에 포함된다.

OPTION문#

C/C++전처리기가 제공하는 다양한 옵션 설정에 관련된 내장 SQL문을 말한다.

연결 관련 SQL문#

연결 관련 SQL문은 데이터베이스 서버와의 연결에 관련된 SQL문을 말한다. CONNECT문과 DISCONNECT문이 여기에 속한다.

CONNECT#

데이터베이스 서버에 연결한다.

구문#
EXEC SQL CONNECT <:user> IDENTIFIED BY <:passwd>
[ USING <:conn_opt1> [ , <:conn_opt2> ] ];
인자#
  • <:user>: 데이터베이스 서버에 연결할 사용자 이름

  • <:passwd>: 데이터베이스 서버에 연결할 사용자 암호

  • <:conn_opt1>: 데이터베이스 서버와의 연결 방식을 지정

    • DSN: 연결할 데이터베이스 서버의 IP주소

    • Server: DSN과 같은 의미로, DSN 대신 Server를 사용할 수 있다.

    • CONNTYPE: 데이터베이스 서버와의 통신 방법

      • 1: TCP/IP

      • 2: UNIX DOMAIN

      • 3: IPC

    • PORT_NO: 데이터베이스 서버에 연결할 연결 포트 번호

    • NLS_USE: 사용 언어 지정

      • KO16KSC5601: 한국어

      • US7ASCII: 영어

      • MS949

      • BIG5

      • GB231280

      • MS936

      • UTF8

      • SHIFTJIS

      • MS932

      • EUCJP

    • BATCH: 연결할 세션의 Batch Processing Mode 지정

      • ON: Batch Processing Mode

      • OFF: Non Batch Processing Mode

  • <:conn_opt2>: 연결 방식을 지정하는 방법은 conn_opt1과 동일하다. conn_opt1을 이용한 데이터베이스 서버와의 연결 실패 시 자동으로 conn_opt2를 이용하여 데이터베이스 서버와의 연결을 시도한다.

설명#

내장 SQL문 한 프로그램 내에서 하나 이상의 연결을 허용한다. 한 프로그램 내에서 여러 개의 연결을 할 경우, 연결 이름을 가지지 않는 연결은 하나만 허용하는데, 여기에서는 이 연결(연결 이름을 가지지 않는 경우)에 관해서만 다루기로 한다.

한 애플리케이션 내에서 두 개 이상의 연결을 이용하는 다중 연결 프로그램이나 멀티쓰레드 프로그램 방법에 대한 자세한 설명은 12장과 13장을 참조하기 바란다.

* 주의: 만일 연결 스트링에 PORT_NO와 NLS_USE 값을 명시하지 않은 경우 프로퍼티 파일에 설정된 값과 동일한 값으로 다음 환경변수를 이용하여 반드시 설정해야 한다.

export ALTIBASE_PORT_NO=20300
export ALTIBASE_NLS_USE=US7ASCII 
연결 옵션 2개 지정하는 경우 수행 결과#

SQL_SUCCESS: 처음 옵션으로 연결 성공한 경우.

SQL_SUCCESS_WITH_INFO: 처음 옵션으로 연결 실패하고, 두 번째 옵션으로 연결 성공하는 경우. 처음 연결 실패 에러 메시지는 sqlca.sqlerrm.sqlerrmc에 저장된다.

SQL_ERROR: 처음 옵션으로 연결 실패하고, 두 번째 옵션으로도 연결 실패하는 경우. 두 번의 연결 실패에 대한 에러 메시지는 sqlca.sqlerrm.sqlerrmc에 연속하여 저장된다.

주의 사항#

CONNECT 후 다시 CONNECT를 수행한다면 “Already connected” 오류가 발생한다. 따라서 CONNECT 후 다시 CONNECT를 수행하려면 먼저 DISCONNECT를 수행해야 한다.

USING절을 이용하여 연결 방식을 지정할 경우, CONNTYPE을 2 또는 3으로 지정한다면 DSN 또는 PORT_NO를 함께 지정하더라도 DSN, PORT_NO 옵션은 무시되고 로컬 데이터베이스 서버로 연결을 시도한다.

예제#

데이터베이스 서버에 연결하는 다양한 예를 보여준다.

[예제 1] 다음은 사용자 이름과 사용자 암호를 이용하여 데이터베이스 서버에 연결하는 예를 보여준다. 이 경우, 다른 필요한 연결 정보는 환경 변수로부터 읽을 것이다.

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

EXEC SQL BEGIN DECLARE SECTION;
char usr[10];
char pwd[10];
EXEC SQL END DECLARE SECTION;

strcpy(usr, "SYS");
strcpy(pwd, "MANAGER"); 

EXEC SQL CONNECT :usr IDENTIFIED BY :pwd; 

[예제 2] 다음은 USING절에 연결 방식을 지정하여 데이터베이스 서버에 연결하는 예를 보여준다. usr과 pwd에 저장된 사용자 이름과 사용자 암호, conn_opt3에 저장된 연결 정보를 이용하여 데이터베이스 서버에 연결한다. 이 때 conn_opt3에 지정하지 않은 연결 정보는 환경 변수로부터 읽을 것이다.

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

EXEC SQL BEGIN DECLARE SECTION;
char usr[10];
char pwd[10];
char conn_opt3[100];
EXEC SQL END DECLARE SECTION;

strcpy(usr, "SYS");
strcpy(pwd, "MANAGER"); 
strcpy(conn_opt3, "DSN=192.168.11.12;CONNTYPE=1;PORT_NO=53000"); 

EXEC SQL CONNECT :usr IDENTIFIED BY :pwd USING :conn_opt3;  

[예제 3] 다음은 USING절에 연결 방식을 2개 지정하여 데이터베이스 서버에 연결하는 예를 보여준다. 먼저 usr과 pwd에 저장된 사용자 이름과 사용자 암호, conn_opt1에 저장된 연결 정보를 이용하여 데이터베이스 서버에 연결을 시도하고, 실패할 경우 같은 사용자 이름과 사용자 암호, conn_opt2에 저장된 연결 정보를 이용하여 데이터베이스 서버에 연결한다.

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

EXEC SQL BEGIN DECLARE SECTION;
char usr[10];
char pwd[10];
char conn_opt1[100];
char conn_opt2[100];
EXEC SQL END DECLARE SECTION;

strcpy(usr, "SYS");
strcpy(pwd, "MANAGER"); 
strcpy(conn_opt1, "DSN=192.168.11.12;CONNTYPE=1;PORT_NO=53000"); 
strcpy(conn_opt2, "DSN=192.168.11.22;CONNTYPE=1;PORT_NO=53000");

EXEC SQL CONNECT :usr IDENTIFIED BY :pwd USING :conn_opt1, :conn_opt2;  
if (sqlca.sqlcode == SQL_SUCCESS) /* check sqlca.sqlcode */
{
    printf("Success connection to altibase server with first option\n\n");
}
else if (sqlca.sqlcode == SQL_SUCCESS_WITH_INFO)
{
    /* fail connection with first option and then success connection with second option */
    printf("Success connection to altibase server with second option\n");
    printf("First connection error : [%d] %s\n\n", SQLCODE, sqlca.sqlerrm.sqlerrmc);
}
else
{
    printf("Fail connection to altibase server both first option and second option\n");
    printf("Error : [%d]\n", SQLCODE);
    printf("%s\n\n", sqlca.sqlerrm.sqlerrmc);
    exit(1);
}

DISCONNECT#

데이터베이스 서버와의 연결을 해제한다.

구문#
EXEC SQL DISCONNECT;
인자#

없음

설명#

데이터베이스 서버와의 연결을 해제하고, 연결에 할당된 자원을 모두 해제한다.

예제#

다음 예제는 DISCONNECT문의 사용 예를 보여준다.

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

EXEC SQL DISCONNECT;

예제 프로그램#

connect1.sc#

$ALTIBASE_HOME/sample/APRE/connect1.sc 참고

실행결과#
$ is -f schema/schema.sql
$ make connect1
$ connect1
<CONNECT 1>
------------------------------------------------------
[Connect]
------------------------------------------------------
Success connection to altibase server

------------------------------------------------------
[Disconnect]
------------------------------------------------------
Success disconnection from altibase server
connect2.sc#

$ALTIBASE_HOME/sample/APRE/connect2.sc 참고

실행결과#
$ is -f schema/schema.sql
$ make connect2
$ connect2
<CONNECT 2>
------------------------------------------------------
[Connect With Two ConnOpt]
------------------------------------------------------
Fail connection to altibase server both first option and second option
Error : [-327730]
Failed first connection : Client unable to establish connection
Failed second connection : Client unable to establish connection

기본 내장 SQL문#

기본 내장 SQL문에는 SELECT, UPDATE, INSERT, DELETE 등의 DML문과 CREATE, DROP, ALTER 등의 DDL문이 있다.

SELECT#

데이터베이스에서 조건에 맞는 레코드를 검색하여 호스트 변수에 저장한다. 기본적인 구문은 Altibase SQL의 SELECT문과 동일하나, 호스트 변수를 사용하기 위해 추가적으로 INTO절이 필요하다.

구문#
EXEC SQL SELECT [ ALL | DISTINCT ] <target_list>
INTO <host_var_list> 
FROM <table_expression> [ WHERE … ]; 
인자#
  • <target_list> : SQL Reference참조

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

  • <table_expression> : SQL Reference참조

설명#

호스트 변수가 배열이 아니라면 반환되는 레코드는 한 건이어야 한다. 한 건 이상이 반환될 경우 "Too many rows returned." 오류가 발생한다. 이 경우 CURSOR문을 이용해야 한다.

호스트 변수가 배열이라면 반환되는 레코드 개수는 배열 크기보다 작거나 같아야 한다. 배열 크기보다 많은 건수가 반환될 경우 "Too many rows returned." 오류가 발생한다. 이 경우 배열 크기를 크게 하던지 CURSOR문을 이용하여야 한다.

수행 결과#
호스트 변수가 배열이 아닌 경우 호스트 변수가 배열인 경우
반환된 레코드 개수 수행 결과 반환된 레코드 개수 수행 결과
0 SQL_NO_DATA 0 SQL_NO_DATA
1 SQL_SUCCESS 배열 크기보다 작은 경우 SQL_SUCCESS
배열 크기와 같은 경우 SQL_SUCCESS
1보다 큰 경우 SQL_ERROR 배열 크기보다 큰 경우 SQL_ERROR

수행 결과가 SQL_NO_DATA의 경우 반환된 레코드 개수는 0개이므로 이 때의 호스트 변수 값은 무의미(garbage value)하다.

제한 사항#
  • 입력 호스트 변수는 배열일 수 없다.

    예:

    EXEC SQL BEGIN DECLARE SECTION;
    int var1;
    int var2[10];
    int var3[10];
    EXEC SQL END DECLARE SECTION;
    
    EXEC SQL SELECT * INTO :var1 
    FROM T1 WHERE i1 = :var3;   (X)
    
    또는
    
    EXEC SQL SELECT * INTO :var2 
    FROM T1 WHERE i1 = :var3;   (X)
    

  • GROUP BY 절에 CAST 연산자를 사용해서 호스트 변수의 타입을 명시한 표현식이 존재하는 경우 해당 표현식을 TARGET 절에서 사용할 수 없다.

    예:

    prepare select trunc(QTY - cast(:jstm as integer)) / cast(:unit as integer) from orders;                        (O)
    
    prepare SELECT trunc(QTY - cast(:jstm as integer)) from orders GROUP BY trunc(QTY - cast(:jstm as integer));    (X)
    

  • INTO절의 호스트 변수가 구조체의 배열이라면 출력 호스트 변수는 하나만 사용할 수 있다. 자세한 설명은 5장 "호스트 변수 데이터 타입"을 참조한다.

  • INTO절의 호스트 변수가 varchar 타입의 배열일 때, 다른 출력 호스트 변수와 함께 사용할 수 없다. 자세한 설명은 5장 "호스트 변수 데이터 타입"을 참조한다.

  • SELECT 문의 LIMIT 절에는 입력 호스트 변수만 사용 가능하고, 입력 지시자 변수는 사용할 수 없다. 또한, 입력 호스트 변수의 데이터 타입은 int만 지원한다.

예제#

다양한 SELECT 문의 사용 예를 보여준다.

[예제 1] 다음은 DNO가 s_dno의 값을 가지는 레코드를 검색하여 DNAME, DEP_LOCATION 칼럼 값을 각각 s_dname, s_dep_location 호스트 변수에 저장하는 예를 보여준다.

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

EXEC SQL BEGIN DECLARE SECTION;
short s_dno;
char  s_dname[30+1];
char  s_dep_location[9+1];
EXEC SQL END DECLARE SECTION;

s_dno = 1001;
EXEC SQL SELECT DNAME, DEP_LOCATION 
INTO :s_dname, :s_dep_location
FROM DEPARTMENTS 
WHERE DNO = :s_dno;

[예제 2] 다음은 구조체 타입의 호스트 변수를 사용하는 경우로, DNO가 s_dno의 값을 가지는 레코드를 검색하여 모든 칼럼값을 각각 대응되는 s_department의 구성 요소에 저장하는 예를 보여준다.

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

EXEC SQL BEGIN DECLARE SECTION;
typedef struct department
{
    short dno; 
    char  dname[30+1];
    char  dep_location[9+1];
    int   mgr_no;
} department;
EXEC SQL END DECLARE SECTION;

< 예제 프로그램 : select.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;
short s_dno;
department s_department;
EXEC SQL END DECLARE SECTION;

s_dno = 1002;
EXEC SQL SELECT * 
INTO :s_department
FROM DEPARTMENTS 
WHERE DNO = :s_dno;

[예제 3] 다음은 T_LOB 테이블을 검색하여, INTEGER 칼럼을 sI1 호스트 변수에, CLOB 칼럼을 APRE_FILE_CREATE 옵션으로 생성한 sI2FName의 파일에 저장하는 예를 보여준다.

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

EXEC SQL BEGIN DECLARE SECTION;
int          sI1;
char         sI2FName[33];
unsigned int sI2FOpt;
SQLLEN       sI2Ind;
EXEC SQL END DECLARE SECTION;

strcpy(sI2FName, aOutFileName);
sI2FOpt = APRE_FILE_CREATE;

EXEC SQL SELECT * INTO :sI1, CLOB_FILE :sI2FName OPTION :sI2FOpt INDICATOR :sI2Ind FROM T_LOB;

* BLOB, CLOB 타입의 칼럼의 데이터를 조회하여 파일로 저장하는 예제는 부록 A를 참조하기 바란다.

INSERT#

테이블에 새로운 레코드를 삽입한다.

구문#
SQL Reference 참조
인자#

없음

설명#

VALUES절에 호스트 변수와 지시자 변수를 사용할 수 있다.

예제#

다양한 INSERT문의 사용 예를 보여준다.

[예제 1] 다음은 GOODS 테이블에 새로운 레코드를 삽입하는 예를 보여준다.

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

EXEC SQL BEGIN DECLARE SECTION;
char    s_gno[10+1];
char    s_gname[20+1];
char    s_goods_location[9+1];
int     s_stock;
double  s_price;
EXEC SQL END DECLARE SECTION;

strcpy(s_gno, "F111100002");
strcpy(s_gname, "XX-101");
strcpy(s_goods_location, "FD0003");
s_stock = 5000;
s_price = 9980.21;

EXEC SQL INSERT INTO GOODS 
VALUES (:s_gno, :s_gname, :s_goods_location, 
:s_stock, :s_price);

[예제 2] 다음은 구조체 타입의 호스트 변수를 사용하여 GOODS 테이블에 새로운 레코드를 삽입하는 예를 보여준다.

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

EXEC SQL BEGIN DECLARE SECTION;
typedef struct goods
{
    char   gno[10+1];
    char   gname[20+1];
    char   goods_location[9+1];
    int    stock;
    double price;
} goods;
EXEC SQL END DECLARE SECTION;

< 예제 프로그램 : insert.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;
goods   s_goods;
EXEC SQL END DECLARE SECTION;

strcpy(s_goods.gno, "F111100003");
strcpy(s_goods.gname, "XX-102");
strcpy(s_goods.goods_location, "AD0003");
s_goods.stock = 6000;
s_goods.price = 10200.96;

EXEC SQL INSERT INTO GOODS VALUES (:s_goods);

* 파일의 데이터를 읽어서 BLOB, CLOB 타입의 칼럼에 입력하는 예제는 부록 A를 참조하기 바란다.

UPDATE#

조건을 만족하는 레코드를 찾아 명시한 칼럼들의 값을 변경한다.

구문#
SQL Reference 참조
인자#

없음

설명#

SET절과 WHERE절에 호스트 변수와 지시자 변수를 사용할 수 있다.

제한 사항#
  • 배열 타입과 배열이 아닌 타입을 함께 사용할 수 없다. 예를 들어, SET절의 호스트 변수가 배열 타입이라면 WHERE절의 호스트 변수도 배열 타입이어야 한다.

    예:

    EXEC SQL BEGIN DECLARE SECTION;
    int var1[10]; 
    int var2[10];
    int var3;
    EXEC SQL END DECLARE SECTION;
    
    EXEC SQL UPDATE T1 
    SET I1 = :var1, I2 = :var2 
    WHERE I1 = :var3;               (X)
    

예제#

다양한 UPDATE문의 사용 예를 보여준다.

[예제 1] 다음은 ENO 칼럼값이 s_eno와 같은 DNO, EMP_JOB 칼럼값을 각각 s_dno, s_emp_job.arr 값으로 변경하는 예를 보여준다.

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

EXEC SQL BEGIN DECLARE SECTION;
int      s_eno;
short    s_dno;
varchar  s_emp_job[15+1];
EXEC SQL END DECLARE SECTION;

s_eno = 2;
s_dno = 1001;
strcpy(s_emp_job.arr, "ENGINEER");
s_emp_job.len = strlen(s_emp_job.arr);

EXEC SQL UPDATE EMPLOYEES 
SET DNO      = :s_dno,
     EMP_JOB = :s_emp_job
WHERE ENO = :s_eno;

[예제 2] 다음은 구조체 타입의 호스트 변수를 사용하는 경우로, ENO 칼럼값이 s_eno와 같은 DNO, EMP_JOB, JOIN_DATE 칼럼값을 각각 s_employees.s_dno, s_employees.s_emp_job.arr값과 SYSDATE로 변경하는 예를 보여준다.

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

EXEC SQL BEGIN DECLARE SECTION;
typedef struct employee
{
      int        eno;
      char      ename[20+1];
      varchar   emp_job[15+1];
      char      emp_tel[15+1];
      short     dno;
      double    salary;
      char      sex;
      char      birth[4+1];
      char      join_date[19+1];
      char      status[1+1];
} employee;
EXEC SQL END DECLARE SECTION;

< 예제 프로그램 : update.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;
employee s_employee;
EXEC SQL END DECLARE SECTION;

s_eno = 20;
s_employee.dno = 2001;
strcpy(s_employee.emp_job.arr, "TESTER");
s_employee.emp_job.len = strlen(s_employee.emp_job.arr);

EXEC SQL UPDATE EMPLOYEES 
SET DNO        = :s_employee.dno,
     EMP_JOB   = :s_employee.emp_job,
               JOIN_DATE = SYSDATE
           WHERE ENO = :s_eno;

DELETE#

조건을 만족하는 레코드를 해당 테이블에서 삭제한다.

구문#
SQL Reference 참조
인자#

없음

설명#

WHERE절에 호스트 변수와 지시자 변수를 사용할 수 있다.

예제#

다음은 조건에 맞는 레코드를 EMPLOYEES 테이블에서 삭제하는 예를 보여준다.

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

EXEC SQL BEGIN DECLARE SECTION;
int      s_eno;
short    s_dno;
EXEC SQL END DECLARE SECTION;

s_eno = 5;
s_dno = 1000;

EXEC SQL DELETE FROM EMPLOYEES 
           WHERE ENO > :s_eno AND 
DNO > :s_dno AND 
EMP_JOB LIKE 'P%';

예제 프로그램#

select.sc#

$ALTIBASE_HOME/sample/APRE/select.sc 참고

실행결과#
$ is -f schema/schema.sql
$ make select
$ ./select
<SELECT>
------------------------------------------------------
[Scalar Host Variables]                                           
------------------------------------------------------
DNO      DNAME                          DEP_LOCATION              
------------------------------------------------------
1001     RESEARCH DEVELOPMENT DEPT 1    New York 

------------------------------------------------------
[Structure Host Variables]                                        
------------------------------------------------------------------
DNO      DNAME                          DEP_LOCATION       MGR_NO 
------------------------------------------------------------------
1002     RESEARCH DEVELOPMENT DEPT 2    Sydney             13

------------------------------------------------------
[Error Case : Scalar Host Variables]                              
------------------------------------------------------
Error : [-594092] Returns too many rows
insert.sc#

$ALTIBASE_HOME/sample/APRE/insert.sc 참고

실행결과#
$ is -f schema/schema.sql
$ make insert
$ ./insert
<INSERT>
------------------------------------------------------
[Scalar Host Variables]                                           
------------------------------------------------------
1 rows inserted

------------------------------------------------------
[Structure Host Variables]                                        
------------------------------------------------------
1 rows inserted
update.sc#

$ALTIBASE_HOME/sample/APRE/update.sc 참고

실행결과#
$ is -f schema/schema.sql
$ make update
$ ./update
<UPDATE>
------------------------------------------------------
[Scalar Host Variables]                                           
------------------------------------------------------
1 rows updated

------------------------------------------------------
[Structure Host Variables]                                        
------------------------------------------------------
1 rows updated
delete.sc#

$ALTIBASE_HOME/sample/APRE/delete.sc 참고

실행결과#
$ is -f schema/schema.sql
$ make delete
$ ./delete
<DELETE>
------------------------------------------------------
[Scalar Host Variables]                                           
------------------------------------------------------
7 rows deleted

기타 내장 SQL문#

작업 제어문, 시스템 제어문, 트랜잭션 처리문 등과 INCLUDE 문, THREADS OPTION문 등이 여기에 속한다.

AUTOCOMMIT#

구문#
EXEC SQL AUTOCOMMIT { ON | OFF };
인자#

없음

설명#

현재 세션의 AUTOCOMMIT 모드를 변경한다.

예제#

다음은 AUTOCOMMIT 모드를 변경하는 예를 보여준다.

EXEC SQL AUTOCOMMIT ON;    -- AUTOCOMMIT 모드로 변경
EXEC SQL AUTOCOMMIT OFF;   -- NON-AUTOCOMMIT 모드로 변경

COMMIT#

구문#
EXEC SQL COMMIT;
인자#

없음

설명#

현재의 트랜잭션을 성공적으로 종료한다. 트랜잭션에서 수행된 변경 연산의 결과는 데이터베이스에 영구히 저장된다.

주의 사항#

현재 세션이 AUTOCOMMIT 모드이더라도 오류는 발생하지 않는다.

예제#

다음 예제는 COMMIT문의 사용 예를 보여준다.

EXEC SQL COMMIT;

SAVEPOINT#

구문#
EXEC SQL SAVEPOINT <savepoint_name>;
인자#
  • <savepoint_name>: 저장점 이름
설명#

저장점은 지금까지의 트랜잭션을 임시 저장하는 것이다. 이 내장 SQL문은 트랜잭션 내에서 롤백 할 지점을 명시적으로 지정하기 위한 저장점을 지정한다.

주의 사항#

현재 세션이 AUTOCOMMIT 모드이더라도 오류는 발생하지 않는다.

예제#

다음 예제는 SAVEPOINT문의 사용 예를 보여준다.

EXEC SQL SAVEPOINT sp;

ROLLBACK#

구문#
EXEC SQL ROLLBACK [ TO SAVEPOINT <savepoint_name> ];
인자#
  • <savepoint_name> : 저장점 이름
설명#

가장 최근의 DDL문이나 COMMIT문 이전 상태로 트랜잭션을 철회시켜, 트랜잭션에서 수행된 변경 연산의 결과는 취소된다.

저장점 이름을 지정하면, 현재부터 그 지점까지의 트랜잭션만 철회된다.

주의 사항#

현재 세션이 AUTOCOMMIT 모드이더라도 오류는 발생하지 않는다.

예제#

다음 예제는 ROLLBACK문의 사용 예를 보여준다.

EXEC SQL ROLLBACK;
또는
EXEC SQL ROLLBACK TO SAVEPOINT sp;

BATCH#

연결 속성을 변경하여 Batch Processing을 작동시키거나 정지 시킬 수 있다.

구문#
EXEC SQL BATCH { ON | OFF };
인자#

없음

설명#

배치 처리 모드를 활성화하면 SELECT문이나 COMMIT이 수행되기 전까지 내장 SQL문의 수행(서버로의 전송)을 지연한다. 이것은 COMMIT되지 않은 INSERT, UPDATE, DELETE문은 같은 트랜잭션에서만 읽을 수 있다는 점을 이용한 것이다.

INSERT, UPDATE, DELETE문이 자주 발생하는 경우 배치 처리 모드를 활성화하면 성능 향상을 기대할 수 있다.

예제#

다음 예제는 BATCH문의 사용 예를 보여준다.

EXEC SQL BATCH ON;        - 배치 처리 모드로 동작
EXEC SQL BATCH OFF;       - 배치 처리 모드를 사용하지 않음

INCLUDE#

전처리 시 포함할 헤더파일을 지정한다.

구문#
EXEC SQL INCLUDE <filename>;
인자#
  • <filename> : 전처리 시 사용할 헤더 파일의 이름
설명#

호스트 변수와 호스트 변수의 데이터 타입으로 사용할 타입 정의는 전처리를 하기 위해 APRE가 알아야 할 중요한 정보이다. 따라서, 호스트 변수가 선언되어 있거나 호스트 변수 타입으로 사용할 타입 정의가 되어 있는 헤더 파일은 반드시 INCLUDE문을 이용하여 include하여야 한다(-parse 전처리 명령행 옵션을 "full"로 설정하지 않는다면).

이 구문은 전처리 할 파일(.sc)과 EXEC SQL INCLUDE로 포함한 헤더파일(.h) 내에서 사용할 수 있으며 #include로 포함한 헤더파일 내에서는 사용할 수 없다.

제한 사항#

헤더 파일은 상호 참조할 수 없다. 즉, myheader1.h가 myheader2.h를 참조하고 myheader2.h가 myheader1.h를 참조해서 사용할 수 없다.

예: <myheader1.h>

EXEC SQL INCLUDE myheader2.h;
…

<myheader2.h>
EXEC SQL INCLUDE myheader1.h;   (X)
…
예제#

다음은 전처리 시 사용할 헤더파일을 INCLUDE 구문을 이용하여 지정하는 예를 보여준다.

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

EXEC SQL INCLUDE hostvar.h;

OPTION 문#

C/C++ 전처리기에서 제공하는 다양한 옵션들을 OPTION 문을 이용하여 지정할 수 있다.

INCLUDE#

전처리 시 사용하는 헤더 파일의 위치를 지정하기 위해서 내장 SQL문은 다양한 방법을 제공한다. 그 중 하나가 바로 INCLUDE OPTION문이다.

구문#
EXEC SQL OPTION (INCLUDE = <pathname>);
인자#
  • <pathname> : 전처리 시 사용할 헤더 파일의 위치
설명#

전처리 시 사용할 헤더 파일의 위치를 지정한다.

여러 개의 위치를 지정하기 위해서는 콤마(,)로 구분한다.

이 OPTION문은 반드시 INCLUDE문 이전에 선언하여야 한다.

예제#

다음은 hostvar.h의 위치인 ./include 디렉토리를 INCLUDE OPTION문을 이용하여 지정하고 hostvar.h를 include하는 예를 보여준다.

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

EXEC SQL OPTION (INCLUDE=./include);
EXEC SQL INCLUDE hostvar.h;

THREADS#

내장 SQL문은 멀티쓰레드 프로그램을 지원한다. 이 OPTION문은 전처리 할 파일이 멀티쓰레드 프로그램인지 아닌지 판단하는 근거를 전처리기에게 제공한다.

구문#
EXEC SQL OPTION (THREADS = { TRUE | FALSE });
인자#

없음

설명#
  • TRUE : 전처리 할 파일이 멀티쓰레드 프로그램인 경우

  • FALSE : 전처리 할 파일이 멀티쓰레드 프로그램이 아닌 경우

기본적으로 THREADS OPTION값은 FALSE이다. 전처리 할 파일이 멀티쓰레드 프로그램이라면 THREADS OPTION값을 TRUE로 지정하여야 한다. 멀티쓰레드 프로그램 전처리 시 command line에서 -mt 옵션을 지정한다면 이 OPTION문은 생략 가능하다.

예제#

다음은 전처리 할 파일이 멀티쓰레드 프로그램일 경우 OPTION문을 이용하여 THREADS OPTION값을 TRUE로 지정하는 예를 보여준다.

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

EXEC SQL OPTION (THREADS=TRUE);