> For the complete documentation index, see [llms.txt](https://docs.tibero.com/tibero-manuals/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/tibero-manuals/7.2.6.manuals/tbesql-c-guide/tbesql-c-precompiler-options.md).

# tbESQL/C 프리컴파일러 옵션

tbESQL/C 프리컴파일러를 동작시킬 때 사용할 수 있는 옵션에 대해 설명합니다.

## **개요**

tbESQL/C 프리컴파일러 옵션은 프리컴파일러를 동작시킬 때 프리컴파일러가 추가적인 기능을 수행하도록 설정하기 위해서 사용됩니다.

프리컴파일러를 사용하려면, 다음과 같이 입력합니다.

**\[예 1] tbESQL/C 프리컴파일 실행**

```
tbpc test1.tbc
```

위 예를 보면 **tbpc** 유틸리티를 통해 프리컴파일을 하게 됩니다. **'test1.tbc'**&#xC740; 프리컴파일을 실행할 대상 파일의 이름입니다. 프리컴파일을 실행할 때 대상 파일의 확장자가 '.tbc'일 경우 확장자를 생략하고 사용해도 무방합니다.'test1.tbc'는 tbESQL/C에서 제공하는 프리컴파일러의 옵션 중 하나인 INAME에 해당합니다. 모든 프리컴파일러의 옵션 중에서 옵션의 이름을 생략할 수 있는 것은 INAME 하나뿐입니다.

따라서 INAME을 생략하지 않고, 다음과 같이 사용해도 위의 예와 동일한 의미를 갖습니다.

```
tbpc INAME=test1.tbc
```

다음은 INAME과 INCLUDE 옵션을 사용한 예입니다.

**\[예 2] tbESQL/C 프리컴파일러의 옵션을 사용한 프리컴파일 실행**

```
tbpc test1.tbc INCLUDE=/home/tibero/include
```

위의 예는 tbESQL/C에서 제공하는 프리컴파일러 옵션 2개를 함께 사용한 것입니다. 앞서 언급했듯이 'INAME='은 생략할 수 있습니다. INCLUDE 옵션은 'test1.tbc' 안에서 사용된 각종 Include 파일이 같은 디렉터리에 있지 않을 경우 프리컴파일을 실행할 때 에러를 발생하게 됩니다. 따라서 이런 Include 파일들이 존재하는 디렉터리를 지정해줄 때 사용하는 옵션입니다.

## **tbESQL/C** 프리컴파일러 옵션 지정

프리컴파일러 옵션은 명령 프롬프트에서 직접 입력할 수도 있지만, 환경설정 파일이나 프로그램 내부에서도 지정할 수 있습니다. 옵션의 종류에 따라 지정할 수 있는 장소가 다릅니다. 어떤 곳에서도 옵션을 지정하지 않았을 경우 기본값이 적용됩니다.

옵션이 적용되는 순서는 다음과 같습니다.

1. 기본값
2. 환경설정 파일
3. 명령 프롬프트
4. 프로그램 내부

하나의 항목만을 허용하는 동일한 한 가지 옵션에 여러 번에 걸쳐 다른 항목이 지정되었을 경우 항상 마지막에 지정된 내용만 유효합니다. 또한 옵션을 프로그램 내부에서 지정할 경우 옵션의 영향 범위는 C 프로그래밍 언어의 문법에서의 변수의 영향 범위와는 무관합니다. 무조건 프로그램의 소스 코드의 진행 순서에서가장 마지막에 지정된 옵션이 적용됩니다. INAME의 경우는 다른 옵션과 달리, 두 번 이상 INAME이 나타날 경우 에러가 발생합니다.

### **환경설정 파일**

옵션을 지정할 때 환경설정 파일을 사용하는 방법에는 다음의 두 가지가 있습니다.

#### **기본 환경설정 파일**

tbESQL/C에서는 기본적으로 tbpc.cfg라는 환경설정 파일을 $TB\_HOME/client/config 디렉터리에 두고 있습니다. 이 환경설정 파일을 수정해서 원하는 옵션을 지정할 수 있습니다. 만약 별도의 환경설정 파일이 지정되지 않으면 tbpc 유틸리티는 자동으로 이 환경설정 파일을 먼저 읽습니다.

다음은 tbpc.cfg 파일을 사용하여 프리컴파일러 옵션을 지정하는 예입니다.

```
#INCLUDE=$TB_HOME/demo/chb/new_src/OV 
INCLUDE=$TB_HOME/client/include 
DYNAMIC=ANSI
```

위의 예에서처럼 #을 이용해서 행 전체에 대해 주석 처리를 할 수 있습니다. 환경설정 파일에서도 하나의 항목만 허용하는 옵션이 두 번 이상 나타났을 경우 마지막에 지정된 옵션이 적용됩니다.

#### **사용자 환경설정 파일**

사용자가 환경설정 파일을 임의로 생성하여 사용할 수도 있습니다. 파일의 위치와 파일의 이름 등을 사용자가 임의로 정할 수 있습니다. 이 경우 명령 프롬프트를 통해 사용할 환경설정 파일을 지정합니다. 이렇게 환경설정 파일을 지정하면, tbpc.cfg 파일은 사용되지 않습니다.

다음은 사용자 환경설정 파일을 지정하는 예입니다.

```
tbpc test1.tbc CONFIG=config1.cfg
```

### **명령 프롬프트**

tbESQL/C 프리컴파일러 옵션은 명령 프롬프트에서 지정할 수도 있습니다.

명령 프롬프트에서는 다음과 같은 형태로 옵션을 지정할 수 있습니다.

```
[OPTION_NAME=value]
```

다음은 명령 프롬프트에서 프리컴파일러 옵션을 지정하는 예입니다.

```
tbpc test1.tbc CHAR_MAP=STRING SELECT_ERROR=NO
```

### **프로그램 내부**

프로그램 내부에서도 프리컴파일러 옵션을 지정할 수 있습니다.

이 방법은 프리컴파일을 실행하는 도중에 옵션을 변경하고자 할 때 유용하게 사용할 수 있습니다. 또한 운영체제에 따라 입력할 수 있는 글자 길이의 제한으로 인해 명령 프롬프트에서 옵션을 지정할 수 없는 경우가 있습니다. 이러한 경우 환경설정 파일을 사용할 수도 있지만 프로그램 내부에서 옵션을 지정할 수도 있습니다.

프로그램 내부에서는 다음과 같은 형태로 옵션을 지정할 수 있습니다.

```
EXEC TIBERO OPTION (OPTION_NAME=value)
```

프로그램 내부에서 프리컴파일러의 옵션을 지정할 때 한 가지 주의할 점은 프로그램 내부에서 지정한 옵션은 C 프로그래밍 언어의 문법에 따른 변수의 영향 범위와는 전혀 무관하다는 것입니다. 즉, EXEC TIBERO OPTION으로 프로그램 내부에 준 옵션 값은 소스 프로그램에서 그 문장 이후에 나오는 tbESQL/C 문장에만 영향을 미칩니다.

예를 들면 다음과 같습니다.

```
...
EXEC TIBERO OPTION (HOLD_CURSOR=NO);
... /* 이 부분에서는 어떠한 C 프로그래밍 언어의 문법이 있더라도 그 영향 범위와는 무관하게 
        모든 tbESQL/C의 HOLD_CURSOR 옵션 값은 NO입니다. */
        
EXEC TIBERO OPTION (HOLD_CURSOR=YES);
... /* 이 부분에서는 어떠한 C 프로그래밍 언어의 문법이 있더라도 그 영향 범위와는 무관하게 
        모든 tbESQL/C의 HOLD_CURSOR 옵션 값은 YES입니다. */
```

## **tbESQL/C** 프리컴파일러 옵션 목록

본 절에서는 Tibero에서 제공하는 프리컴파일러 옵션을 알파벳 순으로 설명합니다.

다음은 tbESQL 프리컴파일러 옵션을 요약한 목록입니다.

<table><thead><tr><th width="251">옵션</th><th>설명</th></tr></thead><tbody><tr><td>CHAR_MAP</td><td>문자 배열(Character Array)을 호스트 변수로 사용할 때 남는 공간을 어떻게 채울지를 지정</td></tr><tr><td>CLOSE_ON_COMMIT</td><td>커밋할 때 커서를 닫을 것인지를 지정</td></tr><tr><td>CODE</td><td>전처리기로 전처리하여 생성되는 결과 파일의 코드를 지정</td></tr><tr><td>CONFIG</td><td>옵션이 기록될 환경설정 파일을 지정</td></tr><tr><td>CPOOL</td><td>Connection Pool 기능 사용 여부를 지정</td></tr><tr><td>CMAX</td><td>커넥션 풀에 담을 수 있는 연결의 최대 개수를 지정</td></tr><tr><td>CMIN</td><td>커넥션 풀에서 유지할 최소 연결 개수를 지정</td></tr><tr><td>CINCR</td><td>추가 연결이 필요할 때 한 번에 늘어나는 연결 수를 지정</td></tr><tr><td>CTIMEOUT</td><td>풀 내부에서 사용하지 않는 유휴 상태의 연결을 종료하기까지의 시간(초)을 지정</td></tr><tr><td>CNOWAIT</td><td>커넥션 풀이 최대 연결 수(CMAX)에 도달했을 때, 새 커넥션 요청이 대기(0)할지 또는 즉시 실패할지 설정</td></tr><tr><td>CPP_SUFFIX</td><td>생성되는 C++ 결과 파일 이름의 Suffix를 지정</td></tr><tr><td>DEF_SQLCODE</td><td>SQLCODE 매크로를 생성할 것인지를 지정</td></tr><tr><td>DEFINE</td><td>directives 전처리를 할 때 필요한 이름들을 지정</td></tr><tr><td>DYNAMIC</td><td>Dynamic SQL 문장의 타입을 지정</td></tr><tr><td>END_OF_FETCH</td><td>END-OF-FETCH 상황에 대한 SQLCODE 값을 지정</td></tr><tr><td>ERROR_CODE</td><td>ESQL 애플리케이션에서 많이 사용되는 3개의 에러 코드를 Tibero와 Oracle 중 어느 것으로 사용할지 지정</td></tr><tr><td>HOLD_CURSOR</td><td>커서가 닫힌 후 커서 정보를 유지할 것인가를 지정</td></tr><tr><td>IGNORE_ERROR</td><td>존재하지 않는 객체에 대한 TBR-15044 에러를 무시하고 프리컴파일을 계속 진행할지 여부를 지정</td></tr><tr><td>INAME</td><td>프리컴파일을 실행할 파일의 이름을 지정</td></tr><tr><td>INCLUDE</td><td>#include 파일의 경로를 지정</td></tr><tr><td>INSERT_NO_DATA_ERROR</td><td>INSERT, SELECT 시에도 NO_DATA_FOUND 기능을 사용할 것인지 지정</td></tr><tr><td>LAZY_PSTMT_CHECK</td><td>컴파일 시점에서 DECLARE CURSOR가 참조하는 Statement의 존재 여부 확인을 생략할지 지정</td></tr><tr><td>LINES</td><td>디버깅을 위한 <code>#line</code> 정보의 출력 여부를 지정</td></tr><tr><td>LOG_LVL</td><td><ul><li>디버깅용 로그 생성 여부를 결정</li><li><code>RUNTIME_MODE</code>가 ODBC인 경우에만 유효</li></ul></td></tr><tr><td>MODE</td><td>프로그램이 전반적으로 Tibero의 형식을 따를 것인지 아니면 ANSI의 기준을 따를 것인지를 지정</td></tr><tr><td>ONAME</td><td>출력 파일의 이름을 지정</td></tr><tr><td>ORACA</td><td>ORACA 구조체 사용 여부를 지정</td></tr><tr><td>PARSE</td><td>전처리를 할 때 입력 파일의 내용을 어느 범위까지 파싱할 것</td></tr><tr><td>PREFETCH</td><td>프로그램의 속도 향상을 위해 몇 개의 로우를 미리 가져올지 지정</td></tr><tr><td>RELEASE_CURSOR</td><td>커서가 닫힌 후 커서 정보의 해제 여부를 지정</td></tr><tr><td>RUNTIME_MODE</td><td>런타임에 사용할 드라이버를 지정</td></tr><tr><td>SELECT_ERROR</td><td>주어진 수 보다 많은 로우가 결과로 나왔을 때 에러를 발생시킬 것인가의 여부를 지정</td></tr><tr><td>SQLCHECK</td><td>SQL 문장의 내용을 어느 범위까지 검사할 것인가를 지정</td></tr><tr><td>SQLERRD_INIT</td><td>모든 ESQL 문장 수행 전에 SQLERRD[2] 값을 초기화 여부를 지정</td></tr><tr><td>STMT_CACHE</td><td>Dynamic SQL 문장에 대해 cache size를 지정</td></tr><tr><td>SYS_INCLUDE</td><td>전처리를 할 때 사용할 시스템 헤더 파일의 경로를 지정</td></tr><tr><td>THREADS</td><td>멀티 스레드를 지원할 것인가를 지정</td></tr><tr><td>TYPE_CODE</td><td>Dynamic SQL 문장의 방법 4를 사용하는 방법을 지정</td></tr><tr><td>UNSAFE_NULL</td><td>지시자 변수가 없더라도 NULL 값을 허용할 것인가를 지정</td></tr><tr><td>USERID</td><td>SQLCHECK가 SEMANTICS로 지정되었을 때 서버에 접속하기 위한 사용자 정보를 지정</td></tr><tr><td>VARCHAR_SIZE</td><td>VARCHAR 타입의 메모리 정렬(memory alignment) 적용 여부를 지정</td></tr><tr><td>WORDSIZE</td><td>생성되는 결과 파일을 사용할 플랫폼의 WORDSIZE를 지정</td></tr></tbody></table>

#### **CHAR\_MAP**

**CHAR\_MAP**는 문자 배열을 호스트 변수로 사용할 때 남는 공간을 어떻게 채울지를 지정하는 옵션입니다.

기본값은 CHARZ입니다.

CHAR\_MAP의 세부 내용은 다음과 같습니다.

* **문법**

```
CHAR_MAP={VARCHAR2 | CHARZ | STRING | CHARF}
```

다음은 문자 배열을 호스트 변수로 사용할 때 각 항목별로 Null-terminated와 Blank-padded의 여부를 나타낸 표입니다. **Null-terminated**는 실제 데이터의 마지막에 NULL문자가 삽입 되는 것을 말하고, **Blank- padded**는 실제 데이터의 마지막 이후에 남는 공간을 빈칸으로 채우는 것을 말합니다.

<table><thead><tr><th width="217">CHAR_MAP</th><th width="246">Null-terminated 여부</th><th>Blank-padded 여부</th></tr></thead><tbody><tr><td>VARCHAR2</td><td>X</td><td>O</td></tr><tr><td>CHARF</td><td>X</td><td>O</td></tr><tr><td>CHARZ</td><td>O</td><td>O</td></tr><tr><td>STRING</td><td>O</td><td>X</td></tr></tbody></table>

CHARF는 VARCHAR2와 동일하지만 데이터 자체가 NULL인 실제 데이터의 남는 공간을 빈칸으로 채우지 않고 그대로 둡니다.

* **지정 장소**\
  환경설정 파일, 명령 프롬프트, 프로그램 내부

#### **CLOSE\_ON\_COMMIT**

**CLOSE\_ON\_COMMIT**은 커밋을 할 때 커서를 닫을 것인가 아니면 닫지 않을 것인가를 지정하는 옵션입니다.

CLOSE\_ON\_COMMIT의 세부 내용은 다음과 같습니다.

* **문법**

```
CLOSE_ON_COMMIT={YES | NO}
```

<table><thead><tr><th width="128">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td>EXEC SQL COMMIT을 실행할 때 해당 트랜잭션이 처리되는 동안에 열려있던 커서를 자동으로 닫음</td></tr><tr><td>NO</td><td>EXEC SQL CLOSE cursor_name을 사용해서 사용자가 직접 열린 커서를 닫아야 함 (기본값)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **CODE**

**CODE**는 전처리기로 전처리하여 생성되는 결과 파일의 코드를 지정하는 옵션입니다.

CODE의 세부 내용은 다음과 같습니다.

* **문법**

```
CODE={C | CPP}
```

<table><thead><tr><th width="242">항목</th><th>설명</th></tr></thead><tbody><tr><td>C</td><td>프리컴파일러는 C 코드를 생성 (기본값)</td></tr><tr><td>CPP</td><td>프리컴파일러는 C++ 코드를 생성</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **CONFIG**

**CONFIG**는 옵션이 기록될 환경설정 파일을 지정하는 옵션입니다.

CONFIG의 세부 내용은 다음과 같습니다.

* **문법**

```
CONFIG=filename
```

<table><thead><tr><th width="162">항목</th><th>설명</th></tr></thead><tbody><tr><td>filename</td><td><ul><li>옵션이 기록될 환경설정 파일의 이름을 명시</li><li>기본값은 $TB_HOME/client/config 디렉터리의 tbpc.cfg 파일</li></ul></td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트

#### **CPOOL**

**CPOOL**은 이 옵션에 따라, 프리컴파일러 연결 풀 기능을 사용하거나 사용하지 않도록 설정하는 적절한 코드를 생성하는 옵션입니다.

CPOOL의 세부 내용은 다음과 같습니다.

* **문법**

```
CPOOL={YES | NO}
```

<table><thead><tr><th width="185">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td>connection pooling을 지원</td></tr><tr><td>NO</td><td>다른 connection pooling 옵션들은 프리컴파일러에 의해 무시 (기본값)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### CMAX

**CMAX**는 데이터베이스에 대해 열 수 있는 물리 연결의 최대 개수를 지정하는 옵션입니다. 이 값에 도달하면 더 이상 물리 연결을 열 수 없다. CMAX 값은 항상 CMIN+CINCR 이상이어야 합니다.

이 옵션들은 CPOOL=YES 로 설정된 경우에만 의미가 있습니다.

* **문법**

```
CMAX=integer
```

<table><thead><tr><th width="124">항목</th><th>설명</th></tr></thead><tbody><tr><td>integer</td><td><ul><li>유효 범위: 1 ~ 65535</li><li>기본값: 100</li><li>데이터베이스에 대해 동시에 열 수 있는 물리 연결의 최대 개수를 지정</li><li>일반적인 애플리케이션에서는 100개의 동시 작업으로 충분하며, 필요에 따라 적절히 설정</li></ul></td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트<br>
* **사용법**\
  CPOOL=YES일 때만 적용됩니다.

#### CMIN

**CMIN**는 커넥션 풀에서 유지할 최소 물리 연결 개수를 지정합니다. 초기에는 CMIN 개수만큼의 물리 연결이 미리 열리고, 이후에는 필요할 때만 추가로 연결을 연다. 최적의 성능을 위해 애플리케이션에서 동시에 실행될 계획/예상 문장 수에 맞게 설정하는 것이 좋다. 이 옵션들은 CPOOL=YES로 설정된 경우에만 의미가 있습니다.

* **문법**

```
CMIN=integer
```

<table><thead><tr><th width="170">항목</th><th>설명</th></tr></thead><tbody><tr><td>integer</td><td><ul><li>유효 범위: 1 ~ (CMAX - CINCR)</li><li>기본값: 1</li><li>커넥션 풀에서 유지할 최소 물리 연결 개수</li></ul></td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트<br>
* **사용법**\
  CPOOL=YES일 때만 적용됩니다.

```
CINCR=integer
```

<table><thead><tr><th width="164">항목</th><th>설명</th></tr></thead><tbody><tr><td>integer</td><td><ul><li>유효 범위: 1 ~ (CMAX - CMIN)</li><li>기본값: 1</li><li>추가로 열 물리 연결의 증가 단위</li></ul></td></tr></tbody></table>

#### CINCR

**CINCR**는 현재 열린 물리 연결 수가 CMAX보다 작은 경우, 데이터베이스에 추가로 열 물리 연결의 증가 단위를 지정합니다. 불필요한 연결 생성을 피하기 위해 기본값은 1입니다. 이 옵션들은 CPOOL=YES로 설정 된 경우에만 의미가 있습니다.

* 문법

```
CINCR=integer
```

<table><thead><tr><th width="174">항목</th><th>설명</th></tr></thead><tbody><tr><td>integer</td><td><ul><li>유효 범위: 1 ~ (CMAX - CMIN)</li><li>기본값: 1</li><li>추가로 열 물리 연결의 증가 단위</li></ul></td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트<br>
* **사용법**\
  CPOOL=YES일 때만 적용됩니다.

#### CTIMEOUT

**CTIMEOUT**는 지정된 시간(초) 이상 유휴 상태인 물리 연결을 종료하여, 열린 물리 연결의 수를 적정하게 유지하기 위한 옵션입니다. 설정하지 않으면 유휴 연결을 타임아웃하지 않는다. 이 옵션들은 CPOOL=YES 로 설정된 경우에만 의미가 있습니다.

* **문법**

```
CTIMEOUT=integer
```

<table><thead><tr><th width="133">항목</th><th>설명</th></tr></thead><tbody><tr><td>integer</td><td><ul><li>유효 범위: 1 ~ 65535</li><li>기본값: 0 (미설정, 타임아웃하지 않음)</li><li>지정된 시간(초) 이상 유휴 상태인 물리 연결을 종료</li></ul></td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트<br>
* **사용법**\
  CPOOL=YES일 때만 적용됩니다. 새로운 물리 연결 생성에는 서버 왕복 비용이 수반됩니다.

#### CNOWAIT

**CNOWAIT**는 커넥션 풀에서 모든 물리 연결이 바쁘고 총 물리 연결 수가 이미 최대치(CMAX)에 도달한 상 황에서, 즉시 오류를 반환할지 아니면 자유 연결이 생길 때까지 대기할지를 결정합니다. 기본적으로 설정하 지 않으면 대기합니다. 이 옵션은 CPOOL=YES로 설정된 경우에만 의미가 있습니다.

* **문법**

```
CNOWAIT=integer
```

<table><thead><tr><th width="114">항목</th><th>설명</th></tr></thead><tbody><tr><td>integer</td><td><ul><li>유효 범위: 1 ~ 65535</li><li>기본값: 0 (미설정, 대기)</li><li>설정 시, 사용 가능한 연결이 없고 더 이상 생성할 수 없으면 즉시 에러를 반환</li><li>미설정 시에는 자유 연결을 획득할 때까지 대기</li></ul></td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### CPP\_SUFFIX

**CPP\_SUFFIX** 옵션은 CODE=CPP 옵션이 지정되어 있을 때 생성되는 C++ 파일 이름 앞에 붙여줄 SUFFIX를 지정하는 옵션입니다.

CPP\_SUFFIX의 세부 내용은 다음과 같습니다.

* **문법**

```
CPP_SUFFIX=filename_extension
```

다음은 CPP\_SUFFIX의 항목에 대한 설명입니다.

<table><thead><tr><th width="207">항목</th><th>설명</th></tr></thead><tbody><tr><td>filename_extension</td><td>예를 들어 CPP_SUFFIX=cpp 또는 CPP_SUFFIX=cc (기본값: 없음)</td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트

#### DEF\_SQLCODE

**DEF\_SQLCODE**는 프리컴파일 후 생성된 코드에 SQLCODE 매크로를 포함할 것인지를 지정하는 옵션입니다.

DEF\_SQLCODE의 세부 내용은 다음과 같습니다.

* **문법**

```
DEF_SQLCODE={YES | NO}
```

<table><thead><tr><th width="128">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td>SQLCODE 매크로를 포함시킴</td></tr><tr><td>NO</td><td>SQLCODE 매크로를 포함시키지 않음 (기본값)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트<br>
* **사용법**\
  DEF\_SQLCODE를 'YES'로 설정하면 다음의 코드가 생성됩니다.

```
#define SQLCODE sqlca.sqlcode
```

위의 sqlca.sqlcode는 SQL 문장의 수행 결과를 나타내는 상태 변수입니다.

sqlca.sqlcode를 사용하기 위해서는 다음의 두 가지 방법 중 한 가지를 사용해 헤더 파일을 프로그램 소 스 코드에 추가해야 합니다. 만약 이 두 가지 방법 중 하나라도 헤더 파일에 포함시키지 않는다면, tbESQL/C 프로그램을 프리컴파일할 때 에러가 발생합니다.

– 프로그램 내부

```
#include <sqlca.h>
```

– 명령 프롬프트

```
EXEC SQL INCLUDE SQLCA
```

#### **DEFINE**

**DEFINE** 옵션은 전처리를 할 때 필요한 매크로 이름을 지정하는 옵션입니다.

DEFINE의 세부 내용은 다음과 같습니다.

* **문법**

```
DEFINE=name
```

다음은 DEFINE의 항목에 대한 설명입니다.

<table><thead><tr><th width="205">항목</th><th>설명</th></tr></thead><tbody><tr><td>name</td><td>이 명령행 옵션은 코드 내에 directives에 대해 처리해줌</td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트

#### **DYNAMIC**

**DYNAMIC**은 Dynamic SQL 문장의 타입을 지정하는 옵션입니다.

DYNAMIC의 세부 내용은 다음과 같습니다.

* **문법**

```
DYNAMIC={ANSI | ISO | TIBERO | ORACLE}
```

<table><thead><tr><th width="132">항목</th><th>설명</th></tr></thead><tbody><tr><td>ANSI</td><td><ul><li>ANSI 타입의 동적 SQL을 사용하도록 지정</li><li>이 옵션 값이 지정될 경우 Tibero 타입의 동적 SQL을 사용하면 프리컴파일러에서 문법 에러를 발생</li></ul></td></tr><tr><td>ISO</td><td>ANSI와 같은 결과를 가짐</td></tr><tr><td>TIBERO</td><td><ul><li>Tibero 타입의 동적 SQL을 사용하도록 지정(기본값)</li><li>이 옵션 값이 지정되었을 경우 ANSI 타입의 동적 SQL을 사용하면 프리컴파일러에서 문법 에러를 발생</li></ul></td></tr><tr><td>ORACLE</td><td>TIBERO와 같은 결과를 가짐</td></tr></tbody></table>

ANSI 타입과 ISO 타입은 실제로 동작 방법이 완전히 일치합니다. 또한 TIBERO 타입과 ORACLE 타입도 동작 방법이 같습니다.

Dynamic SQL 문장에 대한 자세한 내용은 “[Dynamic SQL](/tibero-manuals/7.2.6.manuals/tbesql-c-guide/dynamic-sql.md)”을 참고합니다.

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **END\_OF\_FETCH**

**END\_OF\_FETCH**는 SQL 문장의 수행 후 END-OF-FETCH 상황에서 사용자에게 반환할 SQLCODE 값을 지정하는 옵션입니다.

END\_OF\_FETCH의 세부 내용은 다음과 같습니다.

* **문법**

```
END_OF_FETCH={1403 | 100}
```

<table><thead><tr><th width="172">항목</th><th>설명</th></tr></thead><tbody><tr><td>1403</td><td>설정하지 않을 경우 1403이 SQLCODE 값이 됨 (기본값)</td></tr><tr><td>100</td><td>ANSI 모드 또는 사용자를 지정할 경우 100이 SQLCODE 값이 됨NSI 모드 또는 사용자를 지정할 경우 100이 SQLCODE 값이 됨</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **ERROR\_CODE**

**ERROR\_CODE**는 ESQL Application에서 많이 사용되는 3개의 에러 코드를 Tibero와 Oracle 중에 어느 것으로 사용할지 지정합니다.

관련된 에러 코드는 다음과 같습니다.

```
No data found: Tibero -9072, Oracle -1403.
```

```
Indicator variable was not specified in INTO clause: Tibero -9094, Oracle -1405.
```

```
Unique Constraint violation: Tibero -10007, Oracle -1.
```

ERROR\_CODE의 사용법은 다음과 같습니다.

* **문법**

```
ERROR_CODE={ TIBERO | ORACLE }
```

<table><thead><tr><th width="240">항목</th><th>설명</th></tr></thead><tbody><tr><td>TIBERO</td><td>Tibero 에러 코드를 사용</td></tr><tr><td>ORACLE</td><td>Oracle 에러 코드를 사용 (기본값)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **HOLD\_CURSOR**

**HOLD\_CURSOR**는 커서가 닫힌 후 커서 정보를 유지할 것인가를 지정하는 옵션입니다.

HOLD\_CURSOR의 세부 내용은 다음과 같습니다.

* **문법**

```
HOLD_CURSOR={YES | NO}
```

<table><thead><tr><th width="172">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td>커서가 닫힌 후 커서의 정보를 유지</td></tr><tr><td>NO</td><td>커서가 닫힌 후 커서의 정보를 삭제 (기본값)</td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트, 프로그램 내부

#### IGNORE\_ERROR

**IGNORE\_ERROR**는 SQLCHECK가 SEMANTICS 또는 FULL로 설정된 경우, 존재하지 않는 객체(프로시 저, 함수 등)를 참조할 때 발생하는 TBR-15044 에러를 무시하고 프리컴파일을 계속 진행할지 여부를 지정하는 옵션입니다.

IGNORE\_ERROR의 세부 내용은 다음과 같습니다.

* 문법

```
IGNORE_ERROR={YES | NO}
```

<table><thead><tr><th width="109">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td><ul><li>TBR-15044 에러가 발생해도 프리컴파일을 계속 진행</li><li>에러 메시지는 여전히 출력되지만 프리컴파일은 성공적으로 완료</li></ul></td></tr><tr><td>NO</td><td>TBR-15044 에러가 발생하면 프리컴파일을 중단(기본값)</td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트<br>
* **사용법**

PSM 블록에서 존재하지 않는 프로시저나 함수를 호출하는 경우, TBR-15044 에러를 무시하고 오라클 Pro\*C와 유사한 동작을 위해 이 옵션을 YES로 설정할 수 있습니다.

```
EXEC SQL EXECUTE
  BEGIN
      RefreshMaterializedView(); /* 존재하지  않는  프로시저  */
  END;
END-EXEC;
```

#### **INAME**

**INAME**은 프리컴파일을 실행할 대상 파일을 지정하는 옵션입니다.

INAME의 세부 내용은 다음과 같습니다.

* **문법**

```
INAME=filename
```

다음은 INAME의 항목에 대한 설명입니다.

<table><thead><tr><th width="151">항목</th><th>설명</th></tr></thead><tbody><tr><td>filename</td><td>프리컴파일을 실행할 대상 파일의 이름을 명시 (기본값: 없음)</td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트<br>
* **사용법**

파일의 이름을 지정할 때 'INAME= 부분'과 파일의 확장자가 tbc일 경우 .tbc도 생략할 수 있습니다.

따라서 다음의 예는 모두 같은 의미입니다.

```
tbpc INAME=test1.tbc
tbpc test1.tbc
tbpc test1
```

#### **INCLUDE**

**INCLUDE**는 Include 파일이 위치한 경로를 지정하는 옵션입니다. 프로그램 소스 내부에 사용된 각종 Include 파일이 같은 디렉터리에 있지 않은 경우 프리컴파일할 때 에러가 발생합니다. 따라서 Include 파일이 존재하는 디렉터리를 지정해 주어야 하며, 그때 이 옵션을 사용합니다.

INCLUDE의 세부 내용은 다음과 같습니다.

* **문법**

```
INCLUDE=pathname
```

<table><thead><tr><th width="189">항목</th><th>설명</th></tr></thead><tbody><tr><td>항목</td><td>설명</td></tr><tr><td>pathname</td><td>Include 파일이 존재하는 디렉터리를 명시 (기본값: 없음)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **INSERT\_NO\_DATA\_ERROR**

현재 no data found 처리는 UPDATE와 DELETE 문에 대해서만 적용되고 있습니다. INSERT\_NO\_DATA\_ERROR는 insert, select 구문을 사용하는 경우에도 no data found 처리를 할 것인지 지정하는 옵션입니다.

INSERT\_NO\_DATA\_ERROR의 세부 내용은 다음과 같습니다.

* **문법**

```
INSERT_NO_DATA_ERROR={YES | NO}
```

<table><thead><tr><th width="148">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td>EXEC SQL INSERT, SELECT 사용 시에 선택된 row가 없으면 NO_DA TA_FOUND를 반환</td></tr><tr><td>NO</td><td>선택된 row가 없어도 NO_DATA_FOUND 처리 없이 진행됨(기본값)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### LAZY\_PSTMT\_CHECK

**LAZY\_PSTMT\_CHECK**는 컴파일 시점에서 DECLARE CURSOR 구문이 참조하는 Statement의 존재 여부를 확인하지 않는 옵션입니다. 이 옵션을 YES로 설정하면 DECLARE CURSOR와 PREPARE 구문의 실 행 순서에 관계없이 코드를 작성할 수 있습니다. 그러나 컴파일 단계에서 PREPARE 구문의 누락을 감지할 수 없어 런타임에 정의되지 않은 동작(undefined behavior)이 발생할 위험이 있습니다.

따라서 OPEN 구문을 실행하기 전에 반드시 PREPARE 구문을 포함해야 합니다. 참고로 EXECUTE 구문에는 이 옵션이 적용되지 않습니다.

LAZY\_PSTMT\_CHECK의 세부 내용은 다음과 같습니다.

* **문법**

```
LAZY_PSTMT_CHECK={YES | NO}
```

<table><thead><tr><th width="102">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td><ul><li>컴파일 시점에서 DECLARE CURSOR 구문이 참조하는 Statement 존재 여 부를 확인하지 않음</li><li>DECLARE, PREPARE 순서로 사용 가능하지만, OPEN 이전에 PREPARE를 하지 않으면 컴파일은 문제없지만 런타임 시점에 Undefined Behavior가 발생할 수 있음</li></ul></td></tr><tr><td>NO</td><td>컴파일 시점에서 Declare CURSOR 구문이 참조하는 Statement 존재 여부를 확인<br>(기본값)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트<br>
* **사용법**

```
# tbpc LAZY_PSTMT_CHECK=YES dynamic_method3.tbc

int main() {
    EXEC SQL BEGIN DECLARE SECTION;
    ...
        char *sql_string = "SELECT ename FROM emp WHERE empno = :id";
    ...
    EXEC SQL END DECLARE SECTION;

    ...

    EXEC SQL DECLARE emp_cursor CURSOR FOR stmt;
    EXEC SQL PREPARE stmt FROM :sql_string;  // LAZY_PSTMT_CHECK=NO 이면 PREPARE
                                             // 문장이 DELCARE CURSAOR 문장보다 앞에
                                             // 있어야 합니다.

    ...

    EXEC SQL OPEN emp_cursor USING :emp_ids; // PREPARE 문장이 꼭 OPEN 문장보다
                                             // 앞에 있어야 합니다.

    ...

    return 0;
}

```

#### LINES

**LINES**는 디버깅을 위한 #line 정보를 프리컴파일의 결과 파일에 출력할 것인지 여부를 지정하는 옵션입니다.

LINES의 세부 내용은 다음과 같습니다.

* 문법

```
LINES={YES | NO}
```

<table><thead><tr><th width="90">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td><ul><li>#line 정보를 출력</li><li>YES로 설정하고 프리컴파일할 경우 생성되는 파일(일반적으로 .c 파일)에 #line 정보를 추가됨</li><li>따라서 GDB 등의 디버깅 툴을 사용할 때 원본 파일 (일반적으로 .tbc 파일)을 참고하면서 디버깅 작업을 할 수 있음</li></ul></td></tr><tr><td>NO</td><td>#line 정보를 출력하지 않음(기본값)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### LOG\_LVL

**LOG\_LVL**은 디버깅용 로그 생성 여부를 결정하는 옵션으로, RUNTIME\_MODE가 ODBC인 경우에만 유효합니다. 구체적으로 ESQL 런타임에서 tbertl\_odbc 라이브러리를 사용할 때만 동작합니다.

LOG\_LVL의 세부 내용은 다음과 같습니다.

* 문법

```
LOG_LVL={NONE | TRACE | DEBUG}
```

<table><thead><tr><th width="134">항목</th><th>설명</th></tr></thead><tbody><tr><td>NONE</td><td>로그를 생성하지 않음 (기본값)</td></tr><tr><td>TRACE</td><td>TRACE 레벨의 로그를 stdout으로 출력</td></tr><tr><td>DEBUG</td><td>DEBUG 레벨의 로그를 stdout으로 출력</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트
* **사용법**

이 옵션은 RUNTIME\_MODE=ODBC로 설정된 경우에만 적용됩니다. stdout에 로그가 출력됩니다.

ODBC아닌 경우에 로그를 출력하는 방법은 ESQL\_LOG\_DIR과 ESQL\_LOG\_LVL 환경변수를 사용하 여 로그 파일을 생성이 가능하며, 이 경우에 stdout에 로그가 출력되는 것이 아니라 파일에 저장됩니다.

다음은 LOG\_LVL=TRACE로 설정했을 때의 사용 예입니다.

```
tbpc RUNTIME_MODE=ODBC LOG_LVL=TRACE sample.tbc
gcc -o sample sample.c -I$TB_HOME/client/include -L$TB_HOME/client/lib \
-ltbertl_odbc -lpthread -lm -ltbodbc
./sample
```

위와 같이 설정하면 다음과 같은 형태의 로그가 stdout으로 출력됩니다.

```
esql_log[TRACE]  ertl_odbc initialized
esql_log[DEBUG]  ESQL_EXECUTE:stmt[DROP TABLE IF EXISTS emp] stmt_type[12]
esql_log[TRACE]  SQLExecDirect:hstmt[50331654] stmt[DROP TABLE IF EXISTS emp]
esql_log[DEBUG]  EXECUTE ERROR_OCCURED:err_code[-509073]
```

#### **MODE**

**MODE**는 tbESQL/C 프로그램이 전반적으로 Tibero의 형식을 따를 것인지 아니면, ANSI의 기준을 따를 것인지를 지정하는 옵션입니다. 이 옵션은 여러 가지 옵션을 한꺼번에 지정해 주는 역할을 합니다. 이 옵션으로 CLOSE\_ON\_COMMIT, DYNAMIC, TYPE\_CODE 등의 옵션 값을 한꺼번에 지정할 수 있으며, 추가로 다른 조건을 지정할 수도 있습니다.

MODE의 세부 내용은 다음과 같습니다.

* **문법**

```
MODE={ANSI | ISO | TIBERO | ORACLE}
```

<table><thead><tr><th width="185">항목</th><th>설명</th></tr></thead><tbody><tr><td>ANSI</td><td><ul><li>ANSI 타입의 동적 SQL을 사용하도록 지정</li><li>이 옵션 값이 지정되었을 경우 Tibero 타입의 동적 SQL을 사용하면 프리컴파일러에서 문법 에러를 발생</li></ul></td></tr><tr><td>ISO</td><td>ANSI와 같은 결과를 가짐</td></tr><tr><td>TIBERO</td><td><ul><li>Tibero 타입의 동적 SQL을 사용하도록 지정 (기본값)</li><li>이 옵션 값이 지정되었을 경우 ANSI 타입의 동적 SQL을 사용하면 프리컴파일러에서 문법 에러를 발생</li></ul></td></tr><tr><td>ORACLE</td><td>TIBERO와 같은 결과를 가짐</td></tr></tbody></table>

다음은 MODE 옵션에 지정된 값에 따라 설정되는 세부 옵션입니다.

| 옵션                | ANSI | TIBERO |
| ----------------- | ---- | ------ |
| CLOSE\_ON\_COMMIT | YES  | NO     |
| DYNAMIC           | ANSI | TIBERO |
| TYPE\_CODE        | ANSI | TIBERO |

ANSI는 ISO와, TIBERO는 ORACLE과 동일한 기능을 합니다.

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **ONAME**

**ONAME**은 프리컴파일러의 결과물로 나오는 출력 파일의 이름을 지정하는 옵션입니다.

ONAME의 세부 내용은 다음과 같습니다.

* **문법**

```
ONAME=filename
```

<table><thead><tr><th width="193">항목</th><th>설명</th></tr></thead><tbody><tr><td>filename</td><td><p>원하는 출력 파일의 이름을 명시</p><p>(기본값: 입력된 파일 이름에서 확장자만 .c로 바꿈)</p></td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **ORACA**

**ORACA**는 Oracle Communications Area 구조체를 사용할지 여부를 지정하는 옵션입니다.

ORACA의 세부 내용은 다음과 같습니다.

* **문법**

```
ORACA={YES | NO}
```

<table><thead><tr><th width="108">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td>프로그램 내에 EXEC SQL INCLUDE ORACA나 #include oraca.h 문장이 존재해야 함</td></tr><tr><td>NO</td><td>기본값</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **PARSE**

**PARSE**는 tbESQL/C 문장의 내용을 전처리할 때 어느 범위까지 파싱할 것인가를 지정하는 옵션입니다.

PARSE의 세부 내용은 다음과 같습니다.

* **문법**

```
PARSE={NONE | PARTIAL | FULL}
```

<table><thead><tr><th width="131">항목</th><th>설명</th></tr></thead><tbody><tr><td>NONE</td><td>EXEC SQL {BEGIN | END} DECLARE SECTION 안에 있는 호스트 변수 선언들과 매크로 명령들만을 처리</td></tr><tr><td>PARTIAL</td><td><ul><li>EXEC SQL {BEGIN | END} DECLARE SECTION 안에 있는 호스트 변수 선언들과 모든 매크로 명령들을 처리</li><li>Windows 환경과 C++ 언어를 사용할 때는 반드시 이 값을 사용해야 함</li></ul></td></tr><tr><td>FULL</td><td>전처리기에 내장되어 있는 c parser가 EXEC SQL {BEGIN | END} DECLARE SECTION 안에 뿐만 아니라 밖에 선언된 변수들도 처리를 하며, include되는 헤더 파일의 매크로, 변수까지도 처리를 함. (기본값)</td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트, 프로그램 내부

#### **PREFETCH**

**PREFETCH**는 속도 향상을 위해 몇 개의 로우를 미리 가져올지를 지정하는 옵션입니다.

PREFETCH의 세부 내용은 다음과 같습니다.

* **문법**

```
PREFETCH=integer
```

<table><thead><tr><th width="195">항목</th><th>설명</th></tr></thead><tbody><tr><td>integer</td><td>미리 가져올 로우의 개수를 지정 (기본값: 1)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **RELEASE\_CURSOR**

**RELEASE\_CURSOR**는 커서가 닫힌 후 커서에 저장된 정보의 해제 여부를 지정하는 옵션입니다.

RELEASE\_CURSOR의 세부 내용은 다음과 같습니다.

* **문법**

```
RELEASE_CURSOR={YES | NO}
```

<table><thead><tr><th width="185">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td>커서가 닫히면 커서의 정보를 해제</td></tr><tr><td>NO</td><td>커서가 닫혀도 커서의 정보를 해제하지 않음 (기본값)</td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트, 프로그램 내부

#### **RUNTIME\_MODE**

**RUNTIME\_MODE**는 런타임에 사용할 드라이버를 지정하는 옵션입니다.

RUNTIME\_MODE의 세부 내용은 다음과 같습니다.

* **문법**

```
RUNTIME_MODE={ODBC | TIBERO}
```

<table><thead><tr><th width="166">항목</th><th>설명</th></tr></thead><tbody><tr><td>ODBC</td><td><ul><li>odbc 함수를 사용</li><li>컴파일과 링크 과정에서 tbERTL 라이브러리 이외에 odbc 라이브러리를 함께 링크해야 함</li></ul></td></tr><tr><td>TIBERO</td><td><ul><li>tbCLI 함수를 사용</li><li>컴파일과 링크 과정에서 tbERTL 라이브러리 이외에 tbCLI 라이브러리를 함께 링크해야 함 (기본값)</li></ul></td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트, 프로그램 내부

#### **SELECT\_ERROR**

**SELECT\_ERROR**는 호스트 변수 등으로 인해 주어진 수행 결과 개수보다 실제로 질의를 수행한 결과가 더 많이 반환된 경우 에러를 발생시킬 것인가를 지정하는 옵션입니다.

SELECT\_ERROR의 세부 내용은 다음과 같습니다.

* **문법**

```
SELECT_ERROR={YES | NO}
```

<table><thead><tr><th width="182">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td>더 많은 로우가 반환되었을 경우 에러를 발생시킴 (기본값)</td></tr><tr><td>NO</td><td>더 많은 로우가 반환되어도 에러를 발생시키지 않음</td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트, 프로그램 내부<br>
* **사용법**

다음은 tbESQL/C 프로그램의 예입니다.

```
char EMPNO[4]; 
char PNO[4];

EXEC SQL SELECT EMPNUM, PNUM
         INTO :EMPNO, :PNO 
         FROM WORKS
         WHERE EMPNUM = 'E3';
```

위 예에서 만약 질의를 수행한 결과가 더 많은 로우를 반환하는 경우 SELECT\_ERROR 옵션에 지정된 값에 따라 다음과 같이 나타나는 결과가 다릅니다.

<table><thead><tr><th width="106">항목</th><th>결과</th></tr></thead><tbody><tr><td>YES</td><td>ERROR_ESQL_TOO_MANY_ROW_IN_SELECT 에러가 발생</td></tr><tr><td>NO</td><td><ul><li>수행된 질의 결과의 첫 번째 로우를 호스트 변수에 할당</li><li>이때 에러는 발생하지 않음</li></ul></td></tr></tbody></table>

#### **SQLCHECK**

**SQLCHECK**는 tbESQL/C 문장의 내용을 어느 범위까지 검사할 것인가를 지정하는 옵션입니다.

SQLCHECK의 세부 내용은 다음과 같습니다.

* **문법**

```
SQLCHECK={SEMANTICS | FULL | SYNTAX}
```

<table><thead><tr><th width="143">항목</th><th>설명</th></tr></thead><tbody><tr><td>SEMANTICS</td><td><ul><li>SEMANTICS로 지정되면, 프리컴파일러는 서버에 접속을 시도</li><li>따라서 SEMANTICS로 설정하기 위해서는 USERID 옵션이 반드시 필요</li><li>접속이 성공하면 프리컴파일러는 SQL 문장을 서버로 보내 문법뿐만 아니라 SQL 문장이 참조하는 스키마 객체의 내용까지 검사하며, 컬럼의 타입 정보 등을 바탕으로 올바른 타입끼리 호스트 변수에 바인딩 되는지도 검사</li><li>tbESQL/C 문장뿐만 아니라 DDL이나 PSM일 경우에도 문법과 내용을 모두 검사</li></ul></td></tr><tr><td>FULL</td><td>SEMANTICS와 동일한 의미를 가짐</td></tr><tr><td>SYNTAX</td><td>tbpc 유틸리티는 서버에 접속하지 않고 자체적으로 ESQL 문법과 SQL 문법 을 검사(기본값)</td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트, 프로그램 내부

#### **SQLERRD\_INIT**

**SQLERRD\_INIT**은 모든 ESQL 문장의 수행 전에 이전 ESQL 문장 수행에 의해 남아있는 SQLCA.SQLER RD\[2] 값의 초기화 여부를 지정하는 옵션입니다.

SQLERRD\_INIT의 세부 내용은 다음과 같습니다.

* **문법**

```
SQLERRD_INIT={YES | NO}
```

<table data-header-hidden><thead><tr><th width="204">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td>SQLCA.SQLERRD[2]의 값을 초기화 (기본값)</td></tr><tr><td>NO</td><td>SQLCA.SQLERRD[2]의 값을 초기화하지 않음</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **STMT\_CACHE**

**STMT\_CACHE**는 Dynamic SQL 문장에 대해 cache size를 지정하는 옵션입니다.

STMT\_CACHE의 세부 내용은 다음과 같습니다.

* **문법**

```
STMT_CACHE=integer
```

<table><thead><tr><th width="118">항목</th><th>설명</th></tr></thead><tbody><tr><td>integer</td><td>애플리케이션에서 distinct한 Dynamic SQL 문에 대해 cache size를 지정(기본값: 10)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **SYS\_INCLUDE**

**SYS\_INCLUDE**는 system header 파일이 위치한 경로를 지정하는 옵션입니다.

SYS\_INCLUDE의 세부 내용은 다음과 같습니다.

* **문법**

```
SYS_INCLUDE=pathname
```

<table><thead><tr><th width="196">항목</th><th>설명</th></tr></thead><tbody><tr><td>pathname</td><td>system header 파일이 존재하는 디렉터리를 명시 (기본값: 없음)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **THREADS**

**THREADS**는 멀티 스레드를 지원 여부를 지정하는 옵션입니다.

THREADS의 세부 내용은 다음과 같습니다.

* **문법**

```
THREADS={YES | NO}
```

<table><thead><tr><th width="201">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td>멀티 스레드를 지원</td></tr><tr><td>NO</td><td>멀티 스레드를 지원하지 않음(기본값)</td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트<br>
* **사용법**\
  다음과 같은 문장에 멀티 스레드를 사용하려면, THREADS 옵션의 값은 반드시 **'YES'**&#xB85C; 설정되어 있어야 합니다.
  * ENABLE THREADS
  * CONTEXT USE
  * CONTEXT ALLOCATE
  * CONTEXT FREE

#### **TYPE\_CODE**

**TYPE\_CODE**는 Dynamic SQL 문장을 사용하는 방법 중에 방법 4를 사용하는 방법을 지정하는 옵션입니다.Dynamic SQL 문장에 대한 자세한 내용은 “[Dynamic SQL](/tibero-manuals/7.2.6.manuals/tbesql-c-guide/dynamic-sql.md)”을 참고합니다.

TYPE\_CODE의 세부 내용은 다음과 같습니다.

* **문법**

```
TYPE_CODE={ANSI | ISO | TIBERO | ORACLE}
```

<table><thead><tr><th width="141">항목</th><th>설명</th></tr></thead><tbody><tr><td>ANSI</td><td><ul><li>ANSI 타입의 동적 SQL을 사용하도록 지정</li><li>이 옵션 값이 지정되었을 경우 Tibero 타입의 동적 SQL을 사용하면 프리컴파일러에서 문법 에러를 발생</li></ul></td></tr><tr><td>ISO</td><td>ANSI와 같은 결과를 가짐</td></tr><tr><td>TIBERO</td><td><ul><li>Tibero 타입의 동적 SQL을 사용하도록 지정(기본값)</li><li>이 옵션 값이 지정되었을 경우 ANSI 타입의 동적 SQL을 사용하면 프리컴파일러에서 문법 에러를 발생</li></ul></td></tr><tr><td>ORACLE</td><td>TIBERO와 같은 결과를 가짐</td></tr></tbody></table>

ANSI 타입은 ISO 타입과 동작 방법이 동일하며, TIBERO 타입은 ORACLE 타입과 동작 방법이 동일합니다.

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **UNSAFE\_NULL**

**UNSAFE\_NULL**은 지시자 변수가 없을 때 NULL 값을 허용할 것인지의 여부를 지정하는 옵션입니다.

NULL데이터가 예상되는 경우에도 편의 상 지시자 변수 사용을 생략하고 싶을 때 이 옵션을 사용합니다.

UNSAFE\_NULL의 세부 내용은 다음과 같습니다.

* **문법**

```
UNSAFE_NULL={YES | NO}
```

<table><thead><tr><th width="106">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td><ul><li>NULL을 허용</li><li>지시자 변수 없이 NULL 데이터를 호스트 변수로 받아도 에러는 발생하지 않음</li></ul></td></tr><tr><td>NO</td><td><ul><li>NULL을 허용하지 않음 (기본값)</li><li>지시자 변수 없이 NULL 데이터를 호스트 변수로 받으면 <strong>1405</strong> 에러 발생</li><li><strong>1405</strong> 에러는 가져온 데이터가 NULL이나 지시자 변수가 존재하지 않아 tbESQL/C 런타임 라이브러리가 개발자에게 NULL 값의 존재 여부를 알려줄 방법이 없을 경우 발생되는 에러</li></ul></td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트

#### **USERID**

**USERID**는 서버 접속을 할 때 필요한 사용자 계정의 정보를 지정하는 옵션입니다. 이 옵션은 SQL 문장의 내용을 검사하기 위한 접속 정보일 뿐이며, 실제 데이터베이스를 실행할 때의 접속 정보와는 무관합니다.

USERID의 세부 내용은 다음과 같습니다.

* **문법**

```
USERID=username/password
```

<table><thead><tr><th width="187">항목</th><th>설명</th></tr></thead><tbody><tr><td>username</td><td>사용자의 이름을 명시</td></tr><tr><td>password</td><td>사용자의 패스워드를 명시</td></tr></tbody></table>

* **지정 장소**\
  명령 프롬프트<br>
* **사용법**\
  SQLCHECK를 SEMANTICS나 FULL로 지정할 경우 반드시 이 옵션을 사용해야 합니다.

#### VARCHAR\_SIZE

**VARCHAR\_SIZE**는 VARCHAR 타입의 메모리 정렬(memory alignment)을 적용할지 여부를 지정하는 옵션입니다. 이 옵션을 YES로 설정하면 효율적인 메모리 사용을 위해 VARCHAR 생성 크기가 조정됩니다.

VARCHAR\_SIZE의 세부 내용은 다음과 같습니다.

* 문법

```
VARCHAR_SIZE={YES | NO}
```

<table><thead><tr><th width="110">항목</th><th>설명</th></tr></thead><tbody><tr><td>YES</td><td><ul><li>VARCHAR 크기에 대해 메모리 정렬을 적용</li><li>선언된 크기를 4바이트 경계에 맞게 조정하여 효율적인 메모리 사용을 제공</li></ul></td></tr><tr><td>NO</td><td><ul><li>VARCHAR 크기에 대해 메모리 정렬을 적용하지 않음</li><li>선언된 크기 그대로 사용 (기본값)</li></ul></td></tr></tbody></table>

* **지정 장소**\
  환경설정 파일, 명령 프롬프트<br>
* 사용법

VARCHAR\_SIZE=YES로 설정하면 다음과 같은 크기 조정이 적용됩니다.

```
/* 예제: VARCHAR_SIZE=YES인 경우 컴파일 전과 후*/
varchar a[5];
=> struct __tag07 { unsigned short len; unsigned char arr[6]; } a;

/* 수식도 계산됨 */
varchar b[14+1];
=> struct __tag08 { unsigned short len; unsigned char arr[18]; } b;
```

크기 조정 규칙: (조정된 크기 + 2)가 4의 배수가 되도록 조정됩니다. VARCHAR\_SIZE=NO인 경우 선언한 크기가 그대로 유지됩니다:

```
/* 예제: VARCHAR_SIZE=NO인 경우 경우 컴파일 전과 후*/
varchar a[5];
=> struct __tag07 { unsigned short len; unsigned char arr[5]; } a;
```

{% hint style="warning" %}
**주의사항**

이 옵션을 사용할 때는 다음 사항에 주의해야 합니다:

기존 코드와의 호환성: VARCHAR\_SIZE=YES로 설정하면, 기존 코드에서 개발자가 선언된 크기를 그대로 최대 크기로 가정하고 작성한 부분에 영향을 줄 수 있습니다.

예를 들어

```
varchar var[5];
EXEC SQL SELECT ... INTO :var FROM ...;

printf("%.*s\n", var.len, var.arr);
```

개발자는 \`varchar var\[5]\`라고 선언했으므로 문자열 최대 길이가 5일 것이라고 생각할 수 있습니다. 하지만 VARCHAR\_SIZE=YES일 경우 내부적으로 배열 크기가 6으로 확장됩니다. 따라서 SELECT 결과가 최대 6바이트까지 들어올 수 있으며, 이로 인해 출력 시 예상보다 더 큰 문자열이 처리될 수 있습니다.

즉, 기존에 "최대 길이 = 선언 크기"라고 가정한 로직은 깨질 수 있으므로 주의해야 합니다.
{% endhint %}

#### **WORDSIZE**

**WORDSIZE**는 64bits에서 32bits용 소스 또는 그 반대로도 프리컴파일러로 소스를 생성할 수 있도록 하는 옵션입니다. (기본값: 64)

WORDSIZE의 세부 내용은 다음과 같습니다.

* **문법**

```
WORDSIZE={64 | 32}
```

* **지정 장소**\
  환경설정 파일, 명령 프롬프트
