콘텐츠로 이동

3. 호스트 변수 선언부#

호스트 변수 선언부#

호스트 변수의 이름, 타입, 길이 등의 정보는 전처리 과정에서 중요한 정보이다. 따라서, 사용될 호스트 변수는 C/C++ 전처리기가 인식할 수 있는 구문으로 표기되어야 하며, 이것은 호스트 변수 선언부에서 이루어진다.

호스트 변수 선언부에서는 프로그램에서 사용할 호스트 변수를 선언한다.

구문#

호스트 변수 선언부는 다음의 구문으로 지원한다.

EXEC SQL BEGIN DECLARE SECTION;
/* variable_declarations */
EXEC SQL END DECLARE SECTION;

이 구문의 호스트 변수 선언부는 "EXEC SQL BEGIN DECLARE SECTION;" 문장으로 시작되며, "EXEC SQL END DECLARE SECTION;" 문장으로 끝난다. 프로그램에서 사용할 호스트 변수는 이 두 문장 사이에 선언되어야 한다.

호스트 변수 선언부는 전처리할 파일(.sc)과 전처리에서 사용하는 헤더파일(.h) 내에 위치할 수 있다.

하지만, #include로 포함된 헤더파일(.h) 내에는 호스트 변수 선언부가 올 수 없으므로, 호스트 변수 선언부 없이 호스트 변수를 선언하고 -parse 명령행 옵션을 full로 설정하여 precompile하면 된다. EXEC SQL INCLUDE로 포함된 헤더파일(.h)의 경우에는 호스트 변수 선언부를 헤더 파일 내에 사용할 수 있다.

그 이유는 #include로 포함된 헤더파일(.h)은 전처리할 파일(.sc)에서만 참조하는 것이 아니라 내장 SQL이 포함되지 않은 C(.c) 또는 C++(.cpp) 소스 파일에서도 참조할 수가 있는데, 이 때 컴파일 오류가 발생하기 때문이다. 자세한 내용은 4장의 "#include 제약"을 참고하기 바란다.

변수 선언 범위(Scope)#

호스트 변수 선언부는 전역 또는 지역에 위치할 수 있다. 변수 선언 범위는 C/C++과 유사하며, 같은 이름의 변수가 다른 범위에서 중첩되어 선언되면, 가장 가까운 범위에서 선언된 변수가 상위 범위의 변수 선언에 우선한다(overriding).

이러한 중첩은 최대 50단계까지 허용된다.

예제#

다음은 다른 범위에서 같은 이름의 변수를 선언하여 사용하는 예를 보여준다. myfunc() 함수 안에서는 지역으로 선언된 name(#2)이 전역 변수인 name(#1)보다 우선 순위가 높으므로 이후의 name(#3)은 지역 변수를 참조한다.

EXEC SQL BEGIN DECLARE SECTION; 
char name[20];          <- #1
EXEC SQL END DECLARE SECTION;   

int myfunc(void)
{
EXEC SQL BEGIN DECLARE SECTION; 
char name[20];          <- #2
EXEC SQL END DECLARE SECTION;   

EXEC SQL INSERT INTO T1 VALUES (:name);     <- #3
}

예제#

다음은 다양한 호스트 변수 선언 예를 보여준다.

EXEC SQL BEGIN DECLARE SECTION; <- #1
int x, y, z;    <- #2
char c1[50], c2[100];       <- #3
varchar v1[50];         <- #4
struct tag1 
{   
int  x;
char  y[50];
varchar  z[50];
} st1;                  <- #5
struct tag1 st2;        <- #6
EXEC SQL END DECLARE SECTION;   <- #7
  • #1 : 호스트 변수 선언부의 시작을 표시한다.
  • #2 : int 타입의 변수 x, y, z를 호스트 변수로 선언한다.
  • #3 : char 타입의 변수 c1, c2를 각각 50, 100 바이트 크기로 선언한다.
  • #4 : varchar 타입의 변수 v1를 50 바이트 크기로 선언한다.
  • #5 : tag1구조체 타입의 변수 st1을 선언하고, 태그이름을 tag1으로 정의한다.
  • #6 : tag1 구조체 타입의 변수 st2를 선언한다.
  • #7 : 호스트 변수 선언부의 끝을 표시한다.

자료형 정의#

내장 SQL문에는 내장 SQL문이 지원하는 자료형 외에 사용자가 typedef문을 이용하여 정의한 자료형을 호스트 변수의 자료형으로 사용할 수 있다.

설명#

호스트 변수의 자료형으로 사용될 자료형 정의(typedef)는 전처리기가 인식할 수 있는 구문으로 표기되어야 하며, 자료형 정의(typedef)의 위치는 호스트 변수 선언부로 제한된다. 자료형 정의(typedef)된 새로운 자료형은 다른 자료형과 함께 호스트 변수의 자료형으로 사용할 수 있다.

예제#

자료형 정의의 다양한 예를 보여준다.

[예제 1] 다음은 자료형 정의(typedef)의 사용 예를 보여준다.

EXEC SQL BEGIN DECLARE SECTION; 
typdef unsigned int UINT;
typdef unsigned char UCHAR;
EXEC SQL END DECLARE SECTION; 

[예제 2] 다음은 구조체 자료형 정의의 다양한 예를 보여준다.

(1) 구조체 정의 후 자료형 정의

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

(2) 구조체 정의와 자료형 정의를 동시에

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;   

(3) 자료형 정의 후 구조체 정의

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

함수 인자 선언부#

함수의 인자를 호스트 변수로 사용할 경우 C/C++ 전처리기에게 함수 인자에 대한 정보를 제공해 줄 방법이 필요하다. 함수 인자 선언부가 함수 인자에 대한 정보를 C/C++ 전처리기에게 알려주는 역할을 한다.

구문#

함수 인자 선언부의 구문은 다음과 같다.

EXEC SQL BEGIN ARGUMENT SECTION;
/* 호스트 변수로 사용할 함수 인자를 선언 */
EXEC SQL END ARGUMENT SECTION;

함수 인자 선언부는 "EXEC SQL BEGIN ARGUMENT SECTION;" 문장으로 시작되며, "EXEC SQL END ARGUMENT SECTION;" 문장으로 끝난다. 호스트 변수로 사용할 함수 인자들은 이 두 문장 사이에 선언하어야 한다.

함수 인자 선언 시 함수 정의 시와 똑같이(같은 이름, 같은 타입) 선언해 주어야 한다.

설명#

함수 인자 선언부는 전처리 할 소스 파일(.sc)내에 있는 함수 안에만 위치할 수 있다.

호스트 변수 선언부의 제한 사항이 함수 인자 선언부에도 그대로 적용된다.

예제 프로그램#

argument.sc#

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

실행결과#
$ is -f schema/schema.sql
$ make argument
$ ./argument
         <ARGUMENT>