[번역] 데이터유형과 호스트 변수 (Datatypes and Host Variables ) - 02
Language/Pro*C 2015. 5. 20. 15:55목 차
▣ 오라클 데이터 유형 (Oracle Datatypes)
▣ 호스트 변수 ( Host Variables )
▣ 지시자 변수 ( Indicator Variables )
▣ VARCHAR 변수 ( VARCHAR Variables )
▣ 커서 변수 ( Cursor Variables )
▣ CONTEXT 변수 ( CONTEXT Variables )
▣ Universal ROWIDs
▣ 호스트 구조체 ( Host Structures )
▣ 포인터 변수 ( Pointer Variables )
▣ Globalization Support
▣ NCHAR 변수 ( NCHAR Variables )
▣ 호스트 변수 ( Host Variables )
▣ 지시자 변수 ( Indicator Variables )
▣ VARCHAR 변수 ( VARCHAR Variables )
▣ 커서 변수 ( Cursor Variables )
▣ CONTEXT 변수 ( CONTEXT Variables )
▣ Universal ROWIDs
▣ 호스트 구조체 ( Host Structures )
▣ 포인터 변수 ( Pointer Variables )
▣ Globalization Support
▣ NCHAR 변수 ( NCHAR Variables )
3) 지시자 변수 ( Indicator Variables )
호스트 변수는 임의의 지시자 변수와 연관 시킬 수 있다. 지시자 변수는 2바이트
정수로 정의 되어야만 한다. SQL문에서 colon(:)이 앞에 붙어야하고, 호스트변수
바로뒤에 나와야한다(INDICATOR문을 사용하지 않은 경우). 만약에 Declare Section을
사용한다면, Declare Section문내에 지시자 변수를 선언해야만 한다.
호스트 변수는 임의의 지시자 변수와 연관 시킬 수 있다. 지시자 변수는 2바이트
정수로 정의 되어야만 한다. SQL문에서 colon(:)이 앞에 붙어야하고, 호스트변수
바로뒤에 나와야한다(INDICATOR문을 사용하지 않은 경우). 만약에 Declare Section을
사용한다면, Declare Section문내에 지시자 변수를 선언해야만 한다.
3-1) INDICATOR 키워드
가독성을 높이기 위해서, INDICATOR를 선행해서 사용할 수 있다. 정확한 문법은
아래와 같다.
:host_variable INDICATOR :indicator_variable
같은 표현으로
:host_variable:indicator_variable 와 같이 사용 할 수도 있다.
호스트 프로그램에서는 두가지 형식을 다 사용할 수 있다. 지시자의 값과 그의미를
아래의 표에서 설명하고 있다.
3-2) 지시자 변수 사용의 예제
일반적으로, 지시자 변수는 입력호스트 변수에 NULL을 할당하는데 사용하며 출력
호스트 변수에 잘려진 값이나 NULL값을 감지하기위해서 사용한다. 아래의 예제에서
3개의 호스트 변수를 선언하고 1개의 지시자 변수를 선언한다. 그리고 SELECT문으로
데이터베이스에서 사원번호가 호스트 변수 emp_number와 같은정보를 찾는데 사용한다.
맞는 행이 발견되었을때, 오라클데이터베이스는 출력변수 salary와 commission에
그행의 컬럼 SAL과 COMM의 값을 설정한다. 그리고 지시자변수 ind_comm에 return
code를 저장한다. 그 다음문장에서 ind_comm를 이용해서 어떤행위를 할지를 결정한다.
EXEC SQL BEGIN DECLARE SECTION;
int emp_number;
float salary, commission;
short comm_ind; /* indicator variable */
EXEC SQL END DECLARE SECTION;
char temp[16];
float pay; /* not used in a SQL statement */
...
printf("Employee number? ");
gets(temp);
emp_number = atof(temp);
EXEC SQL SELECT SAL, COMM
INTO :salary, :commission:ind_comm
FROM EMP
WHERE EMPNO = :emp_number;
if(ind_comm == -1) /* commission is null */
pay = salary;
else
pay = salary + commission;
3-3) 지시자 변수 가이드 (INDICATOR Variable Guidelines)
다음의 가이드라인은 지시자변수를 선언하고 참조하는데 적용된다.
지시자변수는
▶ 2바이트 정수로 선언되어야만 한다.
▶ SQL문에 콜론(:)을 앞에 붙인다.
▶ SQL문이나 PL/SQL 블록 바로다음에 위치한다.
VARCHARs는 구조체이다.대부분의 C 컴파일러는 값으로 구조체인자를 함수에 넘기는것이
가능하다. Pro*C/C++에서 레퍼런스로 VARCHAR을 함수로 넘겨야 한다. 아래의 예제는
함수에 VARCHAR변수를 인자로 넘기는 정확한 방법을 예시하고 있다.
VARCHAR emp_name[20];
...
emp_name.len = 20;
SELECT ename INTO :emp_name FROM emp
WHERE empno = 7499;
...
print_employee_name(&emp_name); /* pass by pointer */
...
print_employee_name(name)
VARCHAR *name;
{
...
printf("name is %.*sn", name->len, name->arr);
...
}
4-4) VARCHAR Array Component의 길이 얻기
전처리기가 VARCHAR선언을 처리할때, 생성된 구조체의 배열요소의 길이는 선언된것보다
길어질 수 있다. 예를들어, SUN시스템에서는
VARCHAR my_varchar[12];
위와같은 선언이 아래와 같이 전처리기에의해서 확장된다.
struct my_varchar
{
unsigned short len;
unsigned char arr[12];
};
그러나, 전처리기나 C 컴파일러는 이 시스템에서 14바이트로 변경한다.
이것은 구조체 길이를 16바이트로 변경한다(14바이트 : 배열, 2바이트 : 길이).
SQLVarcharGetLength() 함수는 배열의 실제 길이를 리턴한다.
VARCHAR 호스트 변수의 데이터 길이나 혹은 VARCHAR호스트변수 포인터를 인자로 넘기고
SQLVarcharGetLength() 함수는 VARCHAR의 배열요소의 전체 길이를 리턴한다.
SQLVarcharGetLength() 함수는 다음과 같다.
SQLVarcharGetLength (dvoid *context, unsigned long *datlen, unsigned long *totlen);
단일 쓰레드 프로그램에서, sqlvcp()함수를 사용하라. 이함수를 호출하기전에 datlen 인자에
varchar의 길이를 설정하고, 함수가 리턴할때는 totlen인자에 배열의 전체길이가 포함되어
있다. 두개의 인자모두 unsigned long integer형인 포인터이면 반드시 reference로 넘겨야
한다.
4-5) 예제 프로그램 : Using sqlvcp()
아래의 예제 프로그램은 Pro*C/C++ application에서 함수를 어떻게 사용하는지 보여줄
것이다. 예제는 또한 sqlgls()함수를 사용한다. 그예제는 VARCHAR 포인터를 선언하고
VARCHAR버퍼에 요구되는 크기를 결정하기위해서 sqlvcp()함수를 사용한다.
프로그램은 사원이름을 EMP테이블에서 취득해서 출력하는 프로그램이다. 이 예제는
SQL문및 함수의 코딩,길이특성을 출력하기 위해서 sqlgls()함수를 사용한다.
/*************************************************************************************
* sqlvcp.pc 프로그램은 VARCHAR구조체의 실제크기를 결정하는 sqlvcp()함수를 어떻게 사용
* 하는지를 보여주고 있다. 그 크기는 배열의 포인터를 증가시키는 옵셋으로 사용된다.
#include <stdio.h>
#include <sqlca.h>
#include <sqlcpr.h>
/* VARCHAR 포인터를 위한 유형을 선언*/
EXEC SQL BEGIN DECLARE SECTION;
void sql_error();
extern void sqlvcp(), sqlgls();
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EXEC SQL WHENEVER SQLERROR DO sql_error();
EXEC SQL CONNECT :username;
/* VARCHAR의 바람직한 데이터의 길이 설정 */
vcplen = 10;
if (names == 0)
{
printf("Memory allocation error.n");
exit(1);
}
/* FETCH전에 최대길이 값을 설정. 효율적인 VARCHAR * 값을 얻기위한 방법임 */
for (vc_ptr = (my_vc_ptr *) names, i = 0; i < limit; i++)
{
vc_ptr->len = (short) padlen;
vc_ptr = (my_vc_ptr *)((char *) vc_ptr +
padlen + sizeof (short));
}
EXEC SQL WHENEVER SQLERROR CONTINUE;
가독성을 높이기 위해서, INDICATOR를 선행해서 사용할 수 있다. 정확한 문법은
아래와 같다.
:host_variable INDICATOR :indicator_variable
같은 표현으로
:host_variable:indicator_variable 와 같이 사용 할 수도 있다.
호스트 프로그램에서는 두가지 형식을 다 사용할 수 있다. 지시자의 값과 그의미를
아래의 표에서 설명하고 있다.
3-2) 지시자 변수 사용의 예제
일반적으로, 지시자 변수는 입력호스트 변수에 NULL을 할당하는데 사용하며 출력
호스트 변수에 잘려진 값이나 NULL값을 감지하기위해서 사용한다. 아래의 예제에서
3개의 호스트 변수를 선언하고 1개의 지시자 변수를 선언한다. 그리고 SELECT문으로
데이터베이스에서 사원번호가 호스트 변수 emp_number와 같은정보를 찾는데 사용한다.
맞는 행이 발견되었을때, 오라클데이터베이스는 출력변수 salary와 commission에
그행의 컬럼 SAL과 COMM의 값을 설정한다. 그리고 지시자변수 ind_comm에 return
code를 저장한다. 그 다음문장에서 ind_comm를 이용해서 어떤행위를 할지를 결정한다.
EXEC SQL BEGIN DECLARE SECTION;
int emp_number;
float salary, commission;
short comm_ind; /* indicator variable */
EXEC SQL END DECLARE SECTION;
char temp[16];
float pay; /* not used in a SQL statement */
...
printf("Employee number? ");
gets(temp);
emp_number = atof(temp);
EXEC SQL SELECT SAL, COMM
INTO :salary, :commission:ind_comm
FROM EMP
WHERE EMPNO = :emp_number;
if(ind_comm == -1) /* commission is null */
pay = salary;
else
pay = salary + commission;
3-3) 지시자 변수 가이드 (INDICATOR Variable Guidelines)
다음의 가이드라인은 지시자변수를 선언하고 참조하는데 적용된다.
지시자변수는
▶ 2바이트 정수로 선언되어야만 한다.
▶ SQL문에 콜론(:)을 앞에 붙인다.
▶ SQL문이나 PL/SQL 블록 바로다음에 위치한다.
4) VARCHAR 변수 ( VARCHAR Variables )
varchar유형은 가변길이 스트링을 선언할때 사용한다. DB에서 varchar2나 혹은 long형 컬럼
에서 입출력하는 string을 다룰때, 표준 C 스트링을 대신해서 VARCHAR호스트 변수를 사용하는
것이 편리한다. VARCHAR라는 이름의 유형은 대소문자 다 사용가능하고 혼용해서는 사용이
불가능한다.
4-1) VARCHAR변수 선언
varchar유형은 가변길이 스트링을 선언할때 사용한다. DB에서 varchar2나 혹은 long형 컬럼
에서 입출력하는 string을 다룰때, 표준 C 스트링을 대신해서 VARCHAR호스트 변수를 사용하는
것이 편리한다. VARCHAR라는 이름의 유형은 대소문자 다 사용가능하고 혼용해서는 사용이
불가능한다.
4-1) VARCHAR변수 선언
VARCHAR변수를 확장된 C 유형이나 미리선언된 구조체로 생각하면된다. 예를들어 전처리 컴파일
러는 VARCHAR선언을 아래와 같이 확장한다.
VARCHAR username[20];
위의 선언을 아래와 같이 확장하게 된다.
struct
{
unsigned short len;
unsigned char arr[20];
} username;
VARCHAR변수 사용의 장점은 SELECT나 FETCH후에 VARCHAR구조체의 길이 member변수를
참조 할 수 있다는 것이다. 길이 member변수는 스트링의 길이가 저장된다. 이길이를
NULL terminator를 추가하는것과 같은 경우에 이 member변수를 사용할 수있다.
username.arr[username.len] = ’’;
strncpy 혹은 printf문에서 길이를 사용하는데 쓰인다.
printf("Username is %.*sn", username.len, username.arr);
VARCHAR변수에 최대길이를 지정하는데 그 범위는 1~65533이며, 아래의 예와 같은 경우
길이가 지정되지 않아 유요하지 않은 경우를 보여주고 있다.
VARCHAR null_string[]; /* invalid */
한 라인에 여러개의 VARCHAR 변수를 선언할 수 있다.
VARCHAR emp_name[ENAME_LEN], dept_loc[DEPT_NAME_LEN];
4-2) VARCHAR변수 참조 (VARCHAR Variable Referencing )
SQL문에서, 아래의 예처럼 VARCHAR 변수를 사용할 수 있다 :
...
int part_number;
VARCHAR part_desc[40];
...
main()
{
...
EXEC SQL SELECT pdesc INTO :part_desc
FROM parts
WHERE pnum = :part_number;
...
쿼리가 실행된후에, part_desc.len에 스트링의 실제길이가 저장되고 스트링은 part_desc.arr에
저장된다. C문장에서, 어떻게 사용되는 아래의 예를 보면 알수 있다:
printf("nnEnter part description: ");
gets(part_desc.arr);
/* You must set the length of the string
before using the VARCHAR in an INSERT or UPDATE */
part_desc.len = strlen(part_desc.arr);
4-3) 함수인자로 VARCHAR을 전달( Pass VARCHAR Variables to a Function )
VARCHAR username[20];
위의 선언을 아래와 같이 확장하게 된다.
struct
{
unsigned short len;
unsigned char arr[20];
} username;
VARCHAR변수 사용의 장점은 SELECT나 FETCH후에 VARCHAR구조체의 길이 member변수를
참조 할 수 있다는 것이다. 길이 member변수는 스트링의 길이가 저장된다. 이길이를
NULL terminator를 추가하는것과 같은 경우에 이 member변수를 사용할 수있다.
username.arr[username.len] = ’’;
strncpy 혹은 printf문에서 길이를 사용하는데 쓰인다.
printf("Username is %.*sn", username.len, username.arr);
VARCHAR변수에 최대길이를 지정하는데 그 범위는 1~65533이며, 아래의 예와 같은 경우
길이가 지정되지 않아 유요하지 않은 경우를 보여주고 있다.
VARCHAR null_string[]; /* invalid */
한 라인에 여러개의 VARCHAR 변수를 선언할 수 있다.
VARCHAR emp_name[ENAME_LEN], dept_loc[DEPT_NAME_LEN];
4-2) VARCHAR변수 참조 (VARCHAR Variable Referencing )
SQL문에서, 아래의 예처럼 VARCHAR 변수를 사용할 수 있다 :
...
int part_number;
VARCHAR part_desc[40];
...
main()
{
...
EXEC SQL SELECT pdesc INTO :part_desc
FROM parts
WHERE pnum = :part_number;
...
쿼리가 실행된후에, part_desc.len에 스트링의 실제길이가 저장되고 스트링은 part_desc.arr에
저장된다. C문장에서, 어떻게 사용되는 아래의 예를 보면 알수 있다:
printf("nnEnter part description: ");
gets(part_desc.arr);
/* You must set the length of the string
before using the VARCHAR in an INSERT or UPDATE */
part_desc.len = strlen(part_desc.arr);
4-3) 함수인자로 VARCHAR을 전달( Pass VARCHAR Variables to a Function )
VARCHARs는 구조체이다.대부분의 C 컴파일러는 값으로 구조체인자를 함수에 넘기는것이
가능하다. Pro*C/C++에서 레퍼런스로 VARCHAR을 함수로 넘겨야 한다. 아래의 예제는
함수에 VARCHAR변수를 인자로 넘기는 정확한 방법을 예시하고 있다.
VARCHAR emp_name[20];
...
emp_name.len = 20;
SELECT ename INTO :emp_name FROM emp
WHERE empno = 7499;
...
print_employee_name(&emp_name); /* pass by pointer */
...
print_employee_name(name)
VARCHAR *name;
{
...
printf("name is %.*sn", name->len, name->arr);
...
}
4-4) VARCHAR Array Component의 길이 얻기
전처리기가 VARCHAR선언을 처리할때, 생성된 구조체의 배열요소의 길이는 선언된것보다
길어질 수 있다. 예를들어, SUN시스템에서는
VARCHAR my_varchar[12];
위와같은 선언이 아래와 같이 전처리기에의해서 확장된다.
struct my_varchar
{
unsigned short len;
unsigned char arr[12];
};
그러나, 전처리기나 C 컴파일러는 이 시스템에서 14바이트로 변경한다.
이것은 구조체 길이를 16바이트로 변경한다(14바이트 : 배열, 2바이트 : 길이).
SQLVarcharGetLength() 함수는 배열의 실제 길이를 리턴한다.
VARCHAR 호스트 변수의 데이터 길이나 혹은 VARCHAR호스트변수 포인터를 인자로 넘기고
SQLVarcharGetLength() 함수는 VARCHAR의 배열요소의 전체 길이를 리턴한다.
SQLVarcharGetLength() 함수는 다음과 같다.
SQLVarcharGetLength (dvoid *context, unsigned long *datlen, unsigned long *totlen);
단일 쓰레드 프로그램에서, sqlvcp()함수를 사용하라. 이함수를 호출하기전에 datlen 인자에
varchar의 길이를 설정하고, 함수가 리턴할때는 totlen인자에 배열의 전체길이가 포함되어
있다. 두개의 인자모두 unsigned long integer형인 포인터이면 반드시 reference로 넘겨야
한다.
4-5) 예제 프로그램 : Using sqlvcp()
아래의 예제 프로그램은 Pro*C/C++ application에서 함수를 어떻게 사용하는지 보여줄
것이다. 예제는 또한 sqlgls()함수를 사용한다. 그예제는 VARCHAR 포인터를 선언하고
VARCHAR버퍼에 요구되는 크기를 결정하기위해서 sqlvcp()함수를 사용한다.
프로그램은 사원이름을 EMP테이블에서 취득해서 출력하는 프로그램이다. 이 예제는
SQL문및 함수의 코딩,길이특성을 출력하기 위해서 sqlgls()함수를 사용한다.
/*************************************************************************************
* sqlvcp.pc 프로그램은 VARCHAR구조체의 실제크기를 결정하는 sqlvcp()함수를 어떻게 사용
* 하는지를 보여주고 있다. 그 크기는 배열의 포인터를 증가시키는 옵셋으로 사용된다.
*
* 이 프로그램은 또난 sqlgls() 함수를 어떻게 사용하는 지 보여주고 있다. 마지막에 실행된 SQL문
* 이 프로그램은 또난 sqlgls() 함수를 어떻게 사용하는 지 보여주고 있다. 마지막에 실행된 SQL문
* 의 TEXT를 얻기위해 사용되었다. sqlgls()함수는 "Error Handling" 장에서 설명된다.
*************************************************************************************/
*************************************************************************************/
#include <stdio.h>
#include <sqlca.h>
#include <sqlcpr.h>
/* VARCHAR 포인터 유형을 선언 */
struct my_vc_ptr
{
unsigned short len;
unsigned char arr[32767];
};
struct my_vc_ptr
{
unsigned short len;
unsigned char arr[32767];
};
/* VARCHAR 포인터를 위한 유형을 선언*/
typedef struct my_vc_ptr my_vc_ptr;
my_vc_ptr *vc_ptr;
my_vc_ptr *vc_ptr;
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR *names;
int limit; /* FETCH FOR 절에서 사용하기위해 선언 */
char *username = "scott/tiger";
int limit; /* FETCH FOR 절에서 사용하기위해 선언 */
char *username = "scott/tiger";
EXEC SQL END DECLARE SECTION;
void sql_error();
extern void sqlvcp(), sqlgls();
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Main 함수
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
unsigned int vcplen, function_code, padlen, buflen;
int i;
char stmt_buf[120];
{
unsigned int vcplen, function_code, padlen, buflen;
int i;
char stmt_buf[120];
EXEC SQL WHENEVER SQLERROR DO sql_error();
EXEC SQL CONNECT :username;
printf("nConnected.n");
/* 테이블의 행수를 취득 */
EXEC SQL SELECT COUNT(*) INTO :limit FROM emp;
EXEC SQL SELECT COUNT(*) INTO :limit FROM emp;
/* 커서를 선언*/
EXEC SQL DECLARE emp_name_cursor CURSOR FOR
SELECT ename FROM emp;
EXEC SQL FOR :limit OPEN emp_name_cursor;
EXEC SQL DECLARE emp_name_cursor CURSOR FOR
SELECT ename FROM emp;
EXEC SQL FOR :limit OPEN emp_name_cursor;
/* VARCHAR의 바람직한 데이터의 길이 설정 */
vcplen = 10;
/* 메모리를 할당하기위한 길이를 찾는데 SQLVCP 함수를 사용한다. */
sqlvcp(&vcplen, &padlen);
printf("Actual array length of VARCHAR is %ldn", padlen);
sqlvcp(&vcplen, &padlen);
printf("Actual array length of VARCHAR is %ldn", padlen);
/* 이름 버퍼를 할당한다. FOR 을 위한 limit변수를 설정한다. */
names = (VARCHAR *) malloc((sizeof (short) + (int) padlen) * limit);
names = (VARCHAR *) malloc((sizeof (short) + (int) padlen) * limit);
if (names == 0)
{
printf("Memory allocation error.n");
exit(1);
}
/* FETCH전에 최대길이 값을 설정. 효율적인 VARCHAR * 값을 얻기위한 방법임 */
for (vc_ptr = (my_vc_ptr *) names, i = 0; i < limit; i++)
{
vc_ptr->len = (short) padlen;
vc_ptr = (my_vc_ptr *)((char *) vc_ptr +
padlen + sizeof (short));
}
/* FETCH를 실행한다. */
EXEC SQL FOR :limit FETCH emp_name_cursor INTO :names;
EXEC SQL FOR :limit FETCH emp_name_cursor INTO :names;
/* 결과 출력 */
printf("Employee names--n");
printf("Employee names--n");
for (vc_ptr = (my_vc_ptr *) names, i = 0; i < limit; i++)
{
printf("%.*st(%d)n", vc_ptr->len, vc_ptr->arr, vc_ptr->len);
vc_ptr = (my_vc_ptr *)((char *) vc_ptr +
padlen + sizeof (short));
}
{
printf("%.*st(%d)n", vc_ptr->len, vc_ptr->arr, vc_ptr->len);
vc_ptr = (my_vc_ptr *)((char *) vc_ptr +
padlen + sizeof (short));
}
/* 가장최근 의 통계를 얻음. SQL statement using SQLGLS. Note that
* the most recent statement in this example
* is not a FETCH, but rather "SELECT ENAME FROM EMP"
* (the cursor).
*/
buflen = (long) sizeof (stmt_buf);
* the most recent statement in this example
* is not a FETCH, but rather "SELECT ENAME FROM EMP"
* (the cursor).
*/
buflen = (long) sizeof (stmt_buf);
/* 리턴값은 1이어야하며, 이는 에러가 없음을 알려준다. */
sqlgls(stmt_buf, &buflen, &function_code);
sqlgls(stmt_buf, &buflen, &function_code);
if (buflen != 0)
{
/* SQL문을 출력한다. */
printf("The SQL statement was--n%.*sn", buflen, stmt_buf);
/* 리턴된 길이를 출력 */
printf("The statement length is %ldn", buflen);
{
/* SQL문을 출력한다. */
printf("The SQL statement was--n%.*sn", buflen, stmt_buf);
/* 리턴된 길이를 출력 */
printf("The statement length is %ldn", buflen);
/* 특성을 출력. */
printf("The function code is %ldn", function_code);
EXEC SQL COMMIT RELEASE;
exit(0);
}
else
{
printf("The SQLGLS function returned an error.n");
EXEC SQL ROLLBACK RELEASE;
exit(1);
}
}
printf("The function code is %ldn", function_code);
EXEC SQL COMMIT RELEASE;
exit(0);
}
else
{
printf("The SQLGLS function returned an error.n");
EXEC SQL ROLLBACK RELEASE;
exit(1);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // sql_error()함수 - 에러 메시지를 출력한다.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void sql_error()
{
char err_msg[512];
int buf_len, msg_len;
void sql_error()
{
char err_msg[512];
int buf_len, msg_len;
EXEC SQL WHENEVER SQLERROR CONTINUE;
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
printf("%.*sn", msg_len, err_msg);
EXEC SQL ROLLBACK RELEASE;
exit(1);
}
}
출처 - http://younbok.egloos.com/9342728
'Language > Pro*C' 카테고리의 다른 글
[번역] 데이터유형과 호스트 변수 (Datatypes and Host Variables ) - 04 (0) | 2015.05.20 |
---|---|
[번역] 데이터유형과 호스트 변수 (Datatypes and Host Variables ) - 03 (0) | 2015.05.20 |
[번역] 데이터유형과 호스트변수( Datatypes and Host Variables ) - 01 (0) | 2015.05.20 |
[번역] pro*c 데이터베이스 개념(Database Concepts) - 03 (0) | 2015.05.20 |
[번역] pro*c 데이터베이스 개념(Database Concepts) - 02 (0) | 2015.05.20 |