[번역] 데이터유형과 호스트 변수 (Datatypes and Host Variables ) - 04

Language/Pro*C 2015. 5. 20. 17:08

목 차

▣ 오라클 데이터 유형 (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 )
6) 포인터 변수 ( Pointer Variables )
C언어는 다른 변수를 지적하는 포인터를 제공한다. 포인터는 그것의 값이 아닌, 변수
의 주소(저장위치)를 가지고 있다.
6-1) 포인터 변수 선언
아래의 예제는 일반 C언어에서처럼 호스트 변수를 포인터를 선언한것이다.
int *int_ptr;
char *char_ptr;
6-2) 포인터 변수 참조
아래의 예제는, 포인터를 쿼리에서 사용한 예이다.
EXEC SQL SELECT intcol INTO :int_ptr FROM ...
문자열 포인터를 제외하고 참조값을 크기는 주여진 형의 크기에 따라 결정된다.
문자열은 NULL terminater가 들어가서 실행시 strlen()함수에 의해서 크기가
결정된다. 자세한 사항은 "Globalization Support" 장에서 보도록 하자.
포인터는 구조체의 맴버를 참조하기위해서 사용할 수 있다.
아래의 예제처럼, 구조체 변수를 선언하여 사용할 수 있으며 구조체 맴버의 데이터형과
포인터변수의 데이터형은 같아야만 한다. 대부분의 컴파일러는 맞지 않을경우
경고를 표시한다.

struct
{
int i;
char c;
} structvar;

int *i_ptr;
char *c_ptr;
...

main()
{
i_ptr = &structvar.i;
c_ptr = &structvar.c;
/* Use i_ptr and c_ptr in SQL statements. */
...

6-3) 구조체 포인터
호스트 변수로서 구조체에대한 포인터를 사용할 수 있다. 아래의 예제에서

◎ 구조체 선언
◎ 구조체에대한 포인터 선언
◎ 구조체을 위한 메모리 할당
◎ 쿼리에서 호스트 변수로서 구조체를 사용
◎ 결과를 출력하기위해서 구조체 요소를 참조 한다.
struct EMP_REC
{
int emp_number;
float salary;
};

char *name = "HINAULT";
...

struct EMP_REC *sal_rec;
sal_rec = (struct EMP_REC *) malloc(sizeof (struct EMP_REC));

...

EXEC SQL SELECT empno, sal INTO :sal_rec
FROM emp
WHERE ename = :name;
printf("Employee number and salary for %s: ", name);
printf("%d, %gn", sal_rec->emp_number, sal_rec->salary);

위의 쿼리에서 호스트 구조체에대한 포인터는 호스트 구조체 사용과 같은 방법으로
참조하면 주소참조기호(&)를 사용하지 않는다.
7) Globalization Support
아시아 언어들과 같은 2바이트 문자들에 대한 처리방법에 대한 설명을 할것이다.
오라클은 Globalization을 지원하기때문에 다른 언어 환경에서도 작동된다.
오라클은 NLS parameters 혹은 다양한 Globalization support를 지정하므로서 언어
독립적으로 작동 시킬 수 있다.
오라클 초기 파일에 이런 내용를 설정 할 수있으며, 테이블 4-6은 지원 파라미터를
보여주고 있다.




주요한 파라미터는 NLS_LANGUAGE 와 NLS_TERRITORY이다. NLS_LANGUAGE는 서버 메세지에
대한 언어, 월/일이름에 대한 언어, sort 순서등을 지정 할 수 있다.
NLS_TERRITORY 파라미터는 날짜형식, Decimal character, 그룹 분리자 (group separator),
Local currency symbol, ISO currency symbol등을 지정 한다.

NLS_LANG = <language>_<territory>.<character set>

위와 같은 형태로 파라미터를 지정하며, language는 사용자 세션에대한 NLS_LANGUAGE의 값을
설정하고, territorysms NLS_TERRITORY의 값을 설정하며 character set은 터미널에서 사용되는
인코딩 구조(문자셋 혹은 code page)를 지정한다. 인코딩 구조는 수치코드의 범위이다.

NLS_LANG는 환경변수로 시스템에 선언한다. 예를 들어서, C쉘에서 NLS_LANG는 아래와 같이
선언한다.

setenv NLS_LANG French_France.WE8ISO8859P1

오라클 데이터베이스 세션내에서 아래와 같은 문장을 이용해서 파라미터를 변경할 수 있다.

ALTER SESSION SET <globalization support_parameter> = <value>

Pro*C/C++에서는 모든 Globalization을 지원한다. 즉 다국어로 저장된 데이터를 처리하기위한
함수들을 오라클은 제공하고 있다.

8) NCHAR 변수
3개의 내부 데이타유형은 전체국가의 문자셋 데이터를 저장할수 있다.
(NCHAR,NCLOB, NVARCHAR2 = NCHAR VARYING)
Pro*C/C++은 초기버젼의 멀티바이트 NCHAR호스트 변수를 지원한다. NLS_LOCAL값이 YES로
설정되어 있을때, 멀티바이트(초기버젼)는 SQLLIB에서 제공될것이다( oracle 7).
NLS_LOCAL값이 NO로 설정되면, Oracle7이후버젼의 새로운 의미의 멀티바이트 스트링을 지원한다.
새로운 어플리케이션을 위해서는 NLS_LOCAL=NO로 설정하고 사용하라.

8-1) CHARACTER SET [IS] NCHAR_CS
전체국가의 문자셋 데이터를 가질수 있는 호스트 변수를 지정하기위해서는 문자변수를
선언할때 "CHARACTER SET [IS] NCHAR_CS"절을 삽입한다. 이렇게 하면 선언한 변수에
다국어를 지원하는 문자셋 데이터를 저장 할 수 있다. IS는 생락가능하며 NCHAR_CS는
다국어 문자셋의 이름이된다.
예를 들면,

char character set is nchar_cs *str = "<Japanese_string>";

<Japanese_string>은 AL16UTF16문자셋인 유니코드 문자로 구성된다.

EXEC SQL
SELECT ENAME INTO :str FROM EMP WHERE DEPT = n’<Japanese_string1>’;

str에 데이타를 취득하기위해서, 위의 쿼리를 사용한다.
혹은 아래와 같이 사용할 수 있다.

EXEC SQL
SELECT DEPT INTO :dept FROM DEPT_TAB WHERE ENAME = :str;

8-2) 환경 변수 - NLS_NCHAR
NLS_LOCAL = NO되어 있을 경우나, NLS_NCHAR 환경변수가 설정되어있을 경우에 데이터
베이스 서버는 NCHAR를 지원한다. NLS_NCHAR는 전처리시나 실행시에 유효한 전체국가의
문자셋분류가 지정되어 있어야만 한다.

8-3) CONVBUFSZ Clause in VAR
EXEC SQL VAR문은 선택할 수 있는 절이다 : CONVBUFSZ (<size>).
<size>는 바이트이며 문자셋을 변환할 수 있는 오라클 런타임 라이브러리의 버퍼
크기를 지정하는데 사용한다.

문법은 다음과 같다. :

EXEC SQL VAR host_variable IS datatype [CONVBUFSZ [IS] (size)] ;
혹은
EXEC SQL VAR host_variable [CONVBUFSZ [IS] (size)];
여기에서 데이타형은 :
type_name [ ( { length | precision, scale } ) ]

8-4) 임베디드 SQL에서의 문자 스트링 (Character Strings in Embedded SQL)
스트링은 통상적으로 따옴표(')를 사용한다.
예를들어 임베디드 SQL은 아래와 같다 :

EXEC SQL SELECT empno INTO :emp_num FROM emp
WHERE ename = N'<Japanese_string>';

8-5) 스트링의 제한
Dynamic SQL method 4는 Pro*C/C++에서 멀티바이트 문자스트링 호스트 변수를 사용할
수 없다.

8-6) 지시자 변수 ( Indicator Variables )
멀티바이트 문자인 호스트 문자 변수는 지시자 변수와 함께 사용 할 수 있다.


출처 - http://younbok.egloos.com/9342726

: