변수 선언
Pro*C에서 SQL문에 placeholder로 사용한 Host 변수를 선언하기 위해서는 아래와 같은 DECLARE SECTION 내에 선언합니다. (Host 변수 = C언어의 변수)
EXEC SQL BEGIN DECLARE SECTION;
... /* 변수선언 */
EXEC SQL END DECLARE SECTION;
Example). Host 변수 선언
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR user_name[32];
int emp_number;
float salary, commission;
short comm_ind;
EXEC SQL END DECLARE SECTION;
Pro*C 컴파일시 옵션 MODE=ORACLE 을 추가하면 DECLARE SECTION 없이 host 변수를 선언할 수 있습니다. 그러나 CODE=CPP (소스를 C++로 generation한다면)이면 반드시 DECLARE SECTION에 선언해야 합니다.
안전하게 사용하려면 DECLARE SECTION을 사용하는 것이 좋을 듯 합니다.
VARCHAR type
Pro*C에서는 문자열을 처리하기 위한 변수로는 C언어에서 사용하는 char * 또는 char 배열을 그대로 사용하거나 추가적으로 VARCHAR 또는 varchar라는 type을 선언할 수 있습니다. VARCHAR는 Pro*C pre-compile 후에는 C언어의 구조체로 자동으로 변환합니다.
VARCHAR user_name[20];
-->
struct
{
unsigned short len;
unsigned char arr[20];
} user_name;
만약, VARCHAR user_name[20] 으로 선언하였다면,
strncpy(user_name.arr, "user1", 20);
user_name.len = 5;
처럼 데이터를 설정하여 사용합니다.
일반적으로 VARCHAR는 사용하기 불편하기 때문에 C언어의 char 배열을 사용하는 것이 좋습니다. C언어의 char 배열이나 char *를 사용하면 NULL terminated 문자열로 인식하여 데이터를 처리합니다.
VARCHAR는 .len에 설정된 값에 의해서 데이터의 범위가 저장됩니다. char */char 배열로 처리할 수 없는 것은 데이터에 0x00값을 포함되어 있는 것을 DB에 저장하려고 할 때 입니다. 이 때에는 VARCHAR가 유용합니다.
char *나 char 배열은 Column 길이 + 1 만큼의 크기를 설정해야 하지만, VARCHAR는 실제 Column의 길이만 설정해주면 됩니다.
VARCHAR의 가장 큰 단점은 .len의 type이 unsigned short이므로 최대 길이 65,535로 제한됩니다.
NULL indicator 변수
Table의 NULLable Column에 NULL값을 대입해야 하는 경우는 SQL문에 NULL을 직접 대입하면 되지만 일반적으로 변수를 사용하므로 NULL을 직접사용하지 못합니다. 이를 위하여 NULL indicator를 이용하여 NULL값을 설정하거나 조회된 내용이 NULL인지를 판단합니다. 특히, 변수의 type이 숫자 type(int, long)은 NULL값이 존재하지 않으므로 NULL값을 설정하려면 반드시 indicator 변수를 선언해야 합니다.
NULL indicator 변수는 short type의 변수로 선언하고 Host 변수 뒤에 콜론(:)으로 바로 붙여서 사용합니다.
Example). 조회 결과 NULL값 확인
short ind_comm;
EXEC SQL SELECT SAL, COMM
INTO :salary, :commission:ind_comm
FROM EMP
WHERE EMPNO = :emp_number;
if(ind_comm == -1) {
pay = salary;
} else {
pay = salary + commission;
}
위의 example에서 ind_comm에 값이 -1이면 COMM column의 값이 NULL값이므로 commission 변수에 저장된 값은 의미가 없다는 뜻이 됩니다.
Example). INSERT시 NULL값 설정하기
short ind_comm = -1;
...
EXEC SQL INSERT INTO emp (empno, comm)
VALUES (:emp_number, :commission:ind_comm);
위의 example에서는 comm의 type이 숫자 type이지만, INSERT시에 commission값은 NULL값이 저장됩니다. 그냥 NULL을 넣으면 되지 않느냐? 라고 생각할 수 있습니다. 그러면 위의 commission의 값에 따라서 SQL문이 2종류를 만들어서 실행해야 합니다. 그런데, NULLable column이 많으면 조합에 따라 수십개의 SQL문이 나올 수 있습니다. 위와 같이 하나의 SQL문으로 indicator변수의 값으로 적절히 NULL처리를 할 수 있습니다.
Example). WHERE절에 NULL값 체크하기
short ind_comm;
......
EXEC SQL SELECT ename, sal
INTO :emp_name, :salary
FROM emp
WHERE :commission INDICATOR :ind_comm IS NULL;
WHERE절에 :commission이 NULL 여부를 체크하기 위해서는 ind_comm의 값이 -1이면 IS NULL이 true가 됩니다.
NULL Indicator 변수의 의미
1. Input으로 사용되는 경우
-1이면, indicator 변수 앞에 있는 Host 변수를 NULL값으로 인식하고, 0보다 큰값이면, Host변수의 값을 그대로 인식하라는 의미입니다.
2. Output으로 사용된 경우
-1이면: indicator변수 앞에 있는 Host 변수의 값이 NULL값이라는 의미입니다.
0이면: 조회한 column의 값이 Host 변수에 값에 정확하게 저장되었다는 의미입니다.
0보다 큰값이면, Host 변수에 값이 잘려서 들어갔다는 의미이며, indicator 변수의 값은 원래 column의 크기가 저장됩니다.
-1보다 작은값이면, Host 변수에 값이 잘려서 들어갔다는 의미이며 원래 column의 크기를 알 수 없는 type이라는 의미입니다.(LONG type등)
Header file include하기
Pro*C에서도 C언어이므로 header file을 Include하여 사용해야 합니다. Header file을 Include하기 위해서는 #include 또는 INCLUDE문을 사용할 수 있습니다.
#include <stdio.h>
또는
EXEC SQL INCLUDE stdio;
그러나 header file내에 VARCHAR 변수가 사용 또는 선언된 경우에는 반드시 EXEC SQL INCLUDE를 사용해야합니다.
See Also : Pro*C 목차 및 Sample Source
'Oracle > Pro*C' 카테고리의 다른 글
Pro*C 5-2. 오류 처리하기 (WHENEVER) (0) | 2019.09.25 |
---|---|
Pro*C 5-1. 오류 처리하기 (SQLCA) (0) | 2019.09.25 |
Pro*C 4. 기본 SQL문 실행 (0) | 2019.09.25 |
Pro*C 2. DB 접속 해제 및 Commit / Rollback (0) | 2019.09.25 |
Pro*C 1. DBMS에 접속하기 (1) | 2019.09.25 |