2014년 10월 10일 금요일

Embedded SQL Programming Guide


1. SUNDB ESQL-C

1.1. 변수명에 사용할 수 없는 단어


__func__, _alignof, _bool, _complex, _imaginary, allocate, at, atomic, auto, autocommit, binary, boolean, char, const, context, continue, date, day, default, do, double, enum, extern, float, for, found, free, goto, goto, hour, include, inline, int, interval, long, longvarbinary, longvarchar, minute, month, month, not, number, off, offset, on, option, register, restrict, second, short, signed, sizeof, sql_context, sqlerror, sqlwarning, static, stop, struct, time, timestamp, timezone, to, typedef, union, unsigned, use, varbinary, varchar, void, volatile, whenever, while, with, year



1.2. 시간설정을 위한 값

sysdate 는 sysdate, systime, systimestamp등으로 변경 해야 합니다.
 


1.3. EXEC SQL INCLUDE SQLCA;

gc 파일에 SQLCA를 include 합니다. "#define SQLCA_STORAGE_CLASS extern" 문장은 SQLCA의 중복 include를 방지 하기 위해 사용 합니다.


#define SQLCA_STORAGE_CLASS extern
EXEC SQL INCLUDE SQLCA;



1.4. EXEC SQL DECLARE cur_name CURSOR 

EXEC SQL DECLARE 절이 소스 코드의 위치에서 OPEN, FETCH, CLOSE보다 이전에 코딩이 되어 있어야 하고, 같은 파일 내에 존재 해야 합니다.


EXEC SQL DECLARE cur_name CURSOR FOR ..
EXEC SQL OPEN cur_name;
EXEC SQL FETCH cur_name INTO …
EXEC SQL CLOSE cur_name;



1.5. SESC_DECLARE
SESC_DECLARE 절이 사용된 경우는 define문을 사용하여 회피 합니다.

1.5.1. As-Is 코드

#define SESC_DECLARE
#ifdef SESC_DECLARE

typedef struct _st_Code
{
 int code_id;
 char code_name[8];
}

#endif


1.5.2. To-Be 코드


#ifdef SUNDB_GPEC

EXEC SQL BEGIN DECLARE SECTION;
typedef struct _st_Code
{
 int code_id;
 char code_name[8];
}
EXEC SQL END DECLARE SECTION;

#else // SUNDB_GPEC

typedef struct _st_Code
{
 int code_id;
 char code_name[8];
}

#endif // SUNDB_GPEC



1.6. EXEC SQL BEGIN 과 END DECLARE 사이의 define문 불가

변수 선언문 또는 구조체의 선언문 외에 매크로는 사용할 수 없습니다.

1.6.1. As-Is 코드

EXEC SQL BEGIN DECLARE SECTION;
...
#define CODE_VALUE 8

EXEC SQL END DECLARE SECTION;



1.6.2. To-Be 코드

#define CODE_VALUE 8

EXEC SQL BEGIN DECLARE SECTION;
...
EXEC SQL END DECLARE SECTION;



2. EXEC SQL ATOMIC FOR

ATOMIC문은 현재 지원하지 않습니다.

2.1.1. As-Is 코드

EXEC SQL ATOMIC FOR ..



2.1.2. To-Be 코드

EXEC SQL FOR ..



3. Cursor

3.1. Scroll cursor


149   EXEC SQL DECLARE CS_SQL SCROLL CURSOR FOR SELECT * FROM BJDSISE WHERE COD2 = :cod2;
150
151    EXEC SQL OPEN CS_SQL;
152
153    EXEC SQL FETCH CS_SQL INTO :bjdsise;
154
155    for ( ii = 0; ii < icnt; ii++)
156    {
157    EXEC SQL FETCH CURRENT CS_SQL INTO :bjdsise;
158
159    if (sqlca.sqlcode == SQL_SUCCESS)
160    {
161    }
162    else if (sqlca.sqlcode == SQL_NO_DATA)
163    {
164    printf("[%s] no data \n", arg->name);
165    break;
166    }
167    else
168    {
169    error(arg->name, sqlca);
170    break;
171    }
172    }
173
174    EXEC SQL CLOSE CS_SQL;



3.2. Cursor


149    EXEC SQL DECLARE CS_SQL CURSOR FOR SELECT * FROM BJDSISE WHERE COD2 = :cod2;
150
151    EXEC SQL OPEN CS_SQL;
152
155    for ( ii = 0; ii < icnt; ii++)
156    {
157    EXEC SQL FETCH CS_SQL INTO :bjdsise;
158
159    if (sqlca.sqlcode == SQL_SUCCESS)
160    {
161    }
162    else if (sqlca.sqlcode == SQL_NO_DATA)
163    {
164    printf("[%s] no data \n", arg->name);
165    break;
166    }
167    else
168    {
169    error(arg->name, sqlca);
170    break;
171    }
172    }
173
174    EXEC SQL CLOSE CS_SQL;