> 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-statements.md).

# tbESQL/C 문장

tbESQL/C 프로그램에서 데이터베이스 처리를 위해 사용하는 tbESQL/C 문장을 설명합니다.

## **개요**

tbESQL/C 프로그램은 C 프로그래밍 언어의 소스 코드와 tbESQL/C 문장이 혼합되어 있습니다. **tbESQL/C** 문장(tbESQL/C Statement)은 tbESQL/C 프로그램 내에서 SQL 질의, 로우의 삽입과 갱신, 제거 등과 같은 데이터베이스와 관련된 처리를 하는 문장입니다.

tbESQL/C 문장은 크게 다음과 같이 두 가지로 구성됩니다.

* 실행 문장(Executable Statements)\
  실행 문장은 말 그대로 데이터베이스에 어떠한 동작을 실행하기 위한 문장입니다.<br>
* 지시어(Directive)\
  지시어는 tbESQL/C 프로그램의 실행을 설정하기 위한 것으로 데이터베이스에 대한 실행은 이루어지지 않습니다.

## **tbESQL/C** 문장 문법

다음은 tbESQL/C 문장의 문법을 나타내는 그림입니다.

**\[그림 1] tbESQL/C 문장의 문법**

<figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/42jqCo6qZRryaUKTJk8n/image.png" alt=""><figcaption></figcaption></figure>

\[그림 1]을 기준으로 tbESQL/C 문장의 문법을 해석하는 방법은 다음과 같습니다.

<table><thead><tr><th width="155">항목</th><th>설명</th></tr></thead><tbody><tr><td><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/bQ4iOkFI4fvxxA95ELjh/spaces_Fs24KfxvLw5zUUqFROUN_uploads_wkdXFQuPfQeAjk5mIcvD_0.png" alt="" data-size="original"></td><td>ESQL/C 문장의 문법을 대표하는 이름은 왼쪽 위에 나타냄(예: esql_stmt)</td></tr><tr><td><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/3ektFRtwpv4Si0QGRKHd/1.png" alt="" data-size="original"></td><td>타원 안의 포함되는 문자는 키워드(Keyword)이며, 반드시 tbESQL/C 문장 내에 포함되어 있어야 함 (예: EXEC SQL, STMT)</td></tr><tr><td><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/OyKBthfga7qwTdySGOsx/2.png" alt="" data-size="original"></td><td>사각형 안의 문자는 tbESQL/C 문장에 포함된 문법의 구성요소이며, 구성요소에 맞는 적절한 문자열로 바꾸어야 함 (예: option, param, choice1, choice2)</td></tr><tr><td><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/aG2QVCVSGxyzJRvoNKNF/3.png" alt="" data-size="original"></td><td>원 안의 문자는 tbESQL/C 문장의 기호이며, 반드시 tbESQL/C 문장 내에 포함되어 있어야 함 (예: 소괄호(( )), 콤마(,))</td></tr><tr><td><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/LRYNACZS5mLKsWMk7Vvb/4.png" alt="" data-size="original"></td><td><ul><li>tbESQL/C 문장을 완성하는 순서는 화살표를 따라가면 됨</li><li>여러 갈래로 갈라지면서 순방향으로 이동하는 화살표는 두 가지 형태로 띔</li><li>이는 [그림 1]에서 option은 포함되거나 포함되지 않은 경우이며, choice1, choice2는 여러 가지 중에 하나만이 tbESQL/C 문장에 포함되어야 하는 경우</li><li>또는 역방향으로 이동하는 화살표는 포함되지 않거나 한번 이상 포함되는 경우</li><li>[그림 1]에서 콤마(,)에 해당되며, param은 반드시 한번 이상 포함되어야 함</li></ul></td></tr></tbody></table>

다음의 tbESQL/C 문장은 \[그림 1]에 따라 모두 유효한 예입니다.

```
EXEC SQL STMT (param) choice1;
EXEC SQL STMT option (param, param) choice1; 
EXEC SQL STMT (param, param) choice2;
```

## **tbESQL/C** 문장 공통 문법

본 절에서는 tbESQL/C 문장에서 공통적으로 자주 사용되는 부분을 설명합니다.

### **AT** 절

**AT** 절은 이름이 있는 데이터베이스 연결을 사용해 tbESQL/C 문장을 수행할 때 사용합니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/39q0kV2Rk1UVwcB8LE2H/image.png" alt="" width="325"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="190">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>database_name</td><td><ul><li>사용할 데이터베이스의 이름을 명시</li><li>여러 개의 데이터베이스 접속을 구분하여 관리하고 싶을 때 database_name을 사용</li><li>데이터베이스의 이름은 DECLARE DATABASE를 사용해 미리 선언되어 있어야 함</li><li>만약 선언되어 있지 않은 이름을 사용할 경우 에러가 발생</li></ul></td></tr><tr><td>:host_variable</td><td><ul><li>사용할 데이터베이스의 이름이 저장된 호스트 변수 명시</li><li>데이터베이스의 이름은 미리 선언되어 있어야 함</li></ul></td></tr></tbody></table>

### **FOR 절**

**FOR** 절은 tbESQL/C 문장을 반복해서 수행할 필요가 있을 때 사용합니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/Isy9qbkNF7FXxIlUzXT5/image.png" alt="" width="315"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="192">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>integer</td><td>반복 횟수를 명시</td></tr><tr><td>:host_variable</td><td><ul><li>반복 횟수가 저장된 호스트 변수 명시</li><li>호스트 변수는 int 등의 숫자를 저장할 수 있는 타입이면 됨</li></ul></td></tr></tbody></table>

### **DESCRIPTOR 이름**

**DESCRIPTOR** 이름은 Dynamic SQL을 사용할 때 필요한 DESCRIPTOR를 가리키는 이름입니다.

DESCRIPTOR 이름은 프리컴파일러 옵션 즉 MODE, DYNAMIC의 값에 따라 다음과 같이 사용될 수 있습니다.

<table><thead><tr><th width="196">옵션 값</th><th>설명</th></tr></thead><tbody><tr><td>ANSI</td><td>ansi_descriptor_name이 사용됨</td></tr><tr><td>ANSI 외</td><td>normal_descriptor_name이 사용됨</td></tr></tbody></table>

DESCRIPTOR 이름의 세부 내용은 다음과 같습니다.

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/iRfNoubGaiaYIZ3Kofub/image.png" alt="" width="325"><figcaption></figcaption></figure></div>

* **구성요소**

**- descriptor\_name**

<table><thead><tr><th width="264">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>normal_descriptor_name</td><td>MODE가 TIBERO(ORACLE)일 때 사용</td></tr><tr><td>ansi_descriptor_name</td><td>MODE가 ANSI(ISO)일 때 사용</td></tr></tbody></table>

**- normal\_descriptor\_name**

<table><thead><tr><th width="267">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>identifier</td><td>서술자의 이름을 정의한 식별자</td></tr></tbody></table>

**- ansi\_descriptor\_name**

<table><thead><tr><th width="217">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td><ul><li>서술자의 이름이 저장된 호스트 변수를 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등의 문자열을 저장할 수 있는 타입</li></ul></td></tr><tr><td>string literal</td><td>서술자의 이름을 작은따옴표(' ')로 감싸서 사용</td></tr></tbody></table>

## **tbESQL/C** 문장 목록

본 절에서는 Tibero에서 제공하는 tbESQL/C 문장을 알파벳 순으로 설명합니다. 단, 각 tbESQL/C 문장의 구성요소를 설명할 때 키워드는 특별한 경우가 아니면 설명하지 않습니다.

다음은 tbESQL/C 문장을 요약한 목록입니다.

* **실행문장**

<table><thead><tr><th width="250">tbESQL/C 문장</th><th>설명</th></tr></thead><tbody><tr><td>ALLOCATE</td><td>PL/SQL 블록에서 커서변수를 사용하기 위해 커서를 할당</td></tr><tr><td>ALLOCATE DESCRIPTOR</td><td>서술자에 메모리를 할당</td></tr><tr><td>CALL</td><td>저장된 프러시저를 호출하여 해당 프러시저를 수행</td></tr><tr><td>CLOSE</td><td>커서를 닫고 더 이상 사용하지 않음</td></tr><tr><td>COMMIT</td><td>트랜잭션을 커밋</td></tr><tr><td>CONNECT</td><td>Tibero의 데이터베이스에 접속</td></tr><tr><td>CONTEXT ALLOCATE</td><td>컨텍스트에 메모리를 할당</td></tr><tr><td>CONTEXT FREE</td><td>컨텍스트에 할당된 메모리를 해제</td></tr><tr><td>CONTEXT USE</td><td>지정된 컨텍스트를 사용</td></tr><tr><td>DEALLOCATE DESCRIPTOR</td><td>서술자에 할당된 메모리를 해제</td></tr><tr><td>DELETE</td><td>로우를 삭제</td></tr><tr><td>EXECUTE</td><td>준비된 Dynamic SQL 문장을 실행</td></tr><tr><td>EXECUTE DESCRIPTOR</td><td>준비된 Dynamic SQL 문장을 실행 (ANSI)</td></tr><tr><td>EXECUTE ... END-EXEC</td><td>PL/SQL 블록을 실행</td></tr><tr><td>EXECUTE IMMEDIATE</td><td>Dynamic SQL 문장을 바로 실행</td></tr><tr><td>FETCH</td><td>커서를 이용하여 다음 로우를 읽음</td></tr><tr><td>FETCH DESCRIPTOR</td><td>커서를 이용하여 다음 로우를 읽음 (ANSI)</td></tr><tr><td>GET DESCRIPTOR</td><td>지정한 서술자에서 원하는 정보를 가져옴</td></tr><tr><td>INSERT</td><td>로우를 삽입</td></tr><tr><td>LOB CLOSE</td><td>오픈된 LOB 대용량 객체를 닫음</td></tr><tr><td>LOB CREATE TEMPORARY</td><td>TEMPORARY LOB을 생성</td></tr><tr><td>LOB DESCRIBE</td><td>대용량 객체형의 데이터 타입의 속성을 얻어옴</td></tr><tr><td>LOB FREE TEMPORARY</td><td>생성된 TEMPORARY LOB의 메모리를 해제</td></tr><tr><td>LOB OPEN</td><td>LOB 대용량 객체를 오픈</td></tr><tr><td>LOB READ</td><td>LOB 지시자(LOB locator)를 사용하여 내용을 읽음</td></tr><tr><td>LOB WRITE</td><td>LOB 지시자가 가리키는 위치에 내용을 기록</td></tr><tr><td>OPEN</td><td>커서를 열고 연관된 SQL 문장을 실행</td></tr><tr><td>PREPARE</td><td>Dynamic SQL 문장을 준비</td></tr><tr><td>ROLLBACK</td><td>트랜잭션에 롤백을 수행</td></tr><tr><td>SAVEPOINT</td><td>저장점(Savepoint)을 설정</td></tr><tr><td>SELECT</td><td>SQL 질의를 수행</td></tr><tr><td>UPDATE</td><td>로우를 갱신</td></tr></tbody></table>

* **지시어**

<table><thead><tr><th width="256">tbESQL/C 문장</th><th>설명</th></tr></thead><tbody><tr><td>DECLARE CURSOR</td><td>SQL 문장과 연관된 커서를 선언</td></tr><tr><td>DECLARE DATABASE</td><td>새로운 데이터베이스 접속을 선언</td></tr><tr><td>DECLARE STATEMENT</td><td>SQL 문장이나 PL/SQL 문장을 identifier를 통해 선언.</td></tr><tr><td>DESCRIBE</td><td>서술자를 초기화</td></tr><tr><td>DESCRIBE DESCRIPTOR</td><td>서술자에 호스트 변수의 정보를 저장</td></tr><tr><td>ENABLE THREADS</td><td>멀티 스레드를 사용</td></tr><tr><td>SET DESCRIPTOR</td><td>지정한 서술자에 사용자가 입력해야 할 정보를 씀</td></tr><tr><td>TYPE</td><td>사용자가 지정한 데이터 타입을 외부 데이터 타입으로 동격화</td></tr><tr><td>VAR</td><td>특정 호스트 변수의 데이터 타입을 외부 데이터 타입으로 동격화</td></tr><tr><td>WHENEVER</td><td>에러가 발생했을 때 해당 에러에 대한 처리 방법을 지정</td></tr></tbody></table>

#### **ALLOCATE**

**ALLOCATE**는 PL/SQL 블록에서 cursor variable을 사용하기 위한 문장입니다. cursor variable은 ALLOCATE 문장을 사용하기 전에 SQL\_CURSOR를 통해 선언되어야 합니다.

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

* 문법

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/rTRGP394StDgPmTliLeY/image.png" alt="" width="512"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/XV4kd12judLd3d45Aspd/image.png" alt="" width="354"><figcaption></figcaption></figure></div>

* **구성요소**

**- allocate\_statement**

<table><thead><tr><th width="197">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>커밋을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>alloc_dest</td><td>커서를 할당할 변수를 명시</td></tr></tbody></table>

**- alloc\_dest**

<table><thead><tr><th width="195">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>커서 변수를 저장하고 있는 호스트 변수</td></tr><tr><td>indicator</td><td>지시자 변수를 명시할 때 사용</td></tr></tbody></table>

* **예제**

다음은 ALLOCATE DESCRIPTOR를 사용하는 예입니다.

```
EXEC SQL BEGIN DECLARE SECTION;
    SQL_CURSOR csr_var;
EXEC SQL END DECLARE SECTION;

EXEC SQL ALLOCATE :csr_var;
```

#### **ALLOCATE DESCRIPTOR**

**ALLOCATE DESCRIPTOR**는 서술자에 메모리를 할당할 때 사용하는 문장입니다. 단, 이 문장은 ANSI 타입의 Dynamic SQL 문장에만 사용할 수 있습니다.

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

* 문법

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/VHEzHoLI8rA4evz4W44r/image.png" alt="" width="518"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="208">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>for_clause</td><td><ul><li>반복 횟수를 지정</li><li>자세한 내용은 “<a href="#for">FOR 절</a>”을 참고</li></ul></td></tr><tr><td>descriptor_name</td><td><ul><li>서술자의 이름이 저장된 호스트 변수 또는 문자열을 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등 문자열을 저장할 수 있는 타입으로 이미 선언되어 있어야 함</li><li>서술자는 ALLOCATE DESCRIPTOR를 통해 이미 할당되어 있어야 함</li><li>자세한 내용은 “<a href="#descriptor">DESCRIPTOR 이름</a>”을 참고</li></ul></td></tr><tr><td>WITH MAX integer</td><td>사용할 호스트 변수의 최대 개수를 지정 (기본값: 100)</td></tr></tbody></table>

* **예제**

다음은 ALLOCATE DESCRIPTOR를 사용하는 예입니다.

```
EXEC SQL ALLOCATE DESCRIPTOR 'input_descriptor';

EXEC SQL ALLOCATE DESCRIPTOR 'output_descriptor';
```

#### **CALL**

**CALL**은 저장된 프러시저를 호출하여 해당 프러시저를 수행하는 문장입니다. 이 문장을 사용하기 위해선 먼저 프러시저가 저장된 데이터베이스에 접속한 상태여야 합니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/FfEXkR51C8meC4rSGlFr/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

**– call\_statement**

<table><thead><tr><th width="207">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>schema</td><td>프러시저를 가지고 있는 스키마를 명시</td></tr><tr><td>pkg</td><td>프러시저가 저장된 패키지를 명시</td></tr><tr><td>dblink</td><td>프러시저가 위치한 database link 이름을 명시</td></tr><tr><td>proc_param</td><td>프러시저의 input으로 쓰이는 파라미터를 명시</td></tr><tr><td>host_var</td><td>프러시저의 return value를 저장할 host variable을 명시</td></tr><tr><td>indicator_clause</td><td>indicator를 명시</td></tr></tbody></table>

**– indicator\_clause**

<table><thead><tr><th width="210">구성요소</th><th></th></tr></thead><tbody><tr><td>host_var</td><td>indicator 정보를 저장할 host variable을 명시</td></tr></tbody></table>

* **예제**\
  \
  다음은 CALL을 사용하는 예입니다.

```
int hv_a = 1; 
int hv_b = 2; 
int hv_result;

EXEC SQL CALL get_result_sum( :hv_a, :hv_b ) INTO :hv_result;
```

#### **CLOSE**

**CLOSE**는 커서를 닫을 때 사용하는 문장입니다. 이 문장은 현재 열려 있는 커서에만 사용할 수 있습니다.

커서를 닫으면 커서를 생성할 때 할당되었던 모든 시스템 리소스가 반환됩니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/Ibgt3gUdp0Vb8FRYdatF/image.png" alt="" width="369"><figcaption></figcaption></figure></div>

* **구성요소**

**- close\_statement**

<table><thead><tr><th width="201">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>cursor_name</td><td>닫으려는 커서의 이름을 명시</td></tr></tbody></table>

**- cursor\_name**

<table data-header-hidden><thead><tr><th width="200">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>identifier</td><td>커서의 이름을 정의한 식별자</td></tr></tbody></table>

* **예제**

다음은 CLOSE를 사용하는 예입니다.

```
EXEC SQL CLOSE emp_cursor;
```

#### **COMMIT**

**COMMIT**은 현재 진행 중인 트랜잭션을 커밋하고 트랜잭션에 의해 갱신된 모든 내용을 데이터베이스에 반영할 때 사용하는 문장입니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/M1p90JmOsha13sr4h0Bq/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="149">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>커밋을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>WORK</td><td>기존 ESQL 프로그램과의 호환성을 위한 키워드로 별도의 기능적 의미는 없음</td></tr><tr><td>RELEASE</td><td>모든 리소스를 반환하고 데이터베이스 접속을 종료</td></tr></tbody></table>

* **예제**

다음은 COMMIT을 사용하는 예입니다.

```
EXEC SQL COMMIT;
EXEC SQL COMMIT WORK RELEASE;
```

#### **CONNECT**

**CONNECT**는 데이터베이스에 접속할 때 사용하는 문장입니다. 이 문장을 사용할 때는 사용자 이름과 패스워드를 반드시 명시해야 합니다. 데이터베이스 관리자(DBA: Database Administrator, 이하 DBA)로 접속할 수도 있습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/o2Y3WwThyZ9Mp3y0vNba/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/7hThZ06ElJD75ptyxEuh/image.png" alt="" width="230"><figcaption></figcaption></figure></div>

* **구성요소**

**- connect\_statement**

<table><thead><tr><th width="205">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>user_and_passwd</td><td>사용자 이름과 패스워드를 명시</td></tr><tr><td>at_clause</td><td><ul><li>접속할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>using_clause</td><td>데이터베이스의 별칭을 명시</td></tr></tbody></table>

**- user\_and\_passwd**

<table><thead><tr><th width="205">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>user_password</td><td><ul><li>사용자 이름과 패스워드를 명시</li><li>사용자 이름과 패스워드의 중간에 슬래시(/)를 포함해 하나의 문자열로 표현(예: 'tibero/tibero')</li></ul></td></tr><tr><td>user_id</td><td><ul><li>사용자 이름을 명시</li><li>호스트 변수이며, 문자열이 직접 올 수 없음</li></ul></td></tr><tr><td>passwd</td><td><ul><li>패스워드를 명시</li><li>호스트 변수이며, 문자열이 직접 올 수 없음</li></ul></td></tr></tbody></table>

**- user\_passwd**

<table><thead><tr><th width="207">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>사용자 이름과 패스워드를 저장하고 있는 호스트 변수</td></tr></tbody></table>

**- user\_id**

<table><thead><tr><th width="213">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>사용자의 계정을 저장하고 있는 호스트 변수</td></tr></tbody></table>

**- passwd**

<table><thead><tr><th width="214">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>패스워드를 저장하고 있는 호스트 변수</td></tr></tbody></table>

**- using\_clause**

<table><thead><tr><th width="216">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>db_alias</td><td>데이터베이스의 별칭을 명시</td></tr></tbody></table>

**- database\_name**

<table><thead><tr><th width="221">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>identifier</td><td>데이터베이스의 이름을 정의한 식별자</td></tr></tbody></table>

* **예제**

다음은 CONNECT를 사용하는 예입니다.

```
EXEC SQL CONNECT :user IDENTIFIED BY :password;
```

#### **CONTEXT ALLOCATE**

**CONTEXT ALLOCATE**는 tbESQL/C 문장의 실행 정보를 담고 있는 컨텍스트를 위한 메모리를 할당할 때 사용하는 문장입니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/TuE03lvEcieg7gGtL6k1/image.png" alt="" width="457"><figcaption></figcaption></figure></div>

* **구성요소**

**– context\_allocate\_statement**

<table><thead><tr><th width="160">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>context</td><td><ul><li>할당할 컨텍스트 변수</li><li>sql_context 타입의 포인터로 미리 선언해둔 호스트 변수여야 함</li></ul></td></tr></tbody></table>

**– context**

<table><thead><tr><th width="164">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>sql_context 타입의 포인터로 선언한 호스트 변수</td></tr></tbody></table>

* **예제**

다음은 CONTEXT ALLOCATE를 사용하는 예입니다.

```
EXEC SQL CONTEXT ALLOCATE :ctx1;
```

#### **CONTEXT FREE**

**CONTEXT FREE**는 컨텍스트에 할당된 메모리를 해제할 때 사용하는 문장입니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/Z269CLKBfzlVzDwtaRhJ/image.png" alt="" width="401"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="188">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>context</td><td><ul><li>해제할 컨텍스트 변수</li><li>sql_context 타입의 포인터로 미리 선언되어 있어야 하며, CONTEXT ALLOCATE를 통해 이미 할당되어 있어야 함</li></ul></td></tr></tbody></table>

* **예제**

다음은 CONTEXT FREE를 사용하는 예입니다.

```
EXEC SQL CONTEXT FREE :ctx1;
```

#### **CONTEXT USE**

**CONTEXT USE**는 여러 개의 컨텍스트 중에서 사용하려는 컨텍스트를 지정할 때 사용하는 문장입니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/YT7v5pc9fPv2coZCtK2R/image.png" alt="" width="470"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="165">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>context</td><td><ul><li>사용할 컨텍스트 변수를 명시</li><li>sql_context 타입의 포인터로 미리 선언되어 있어야 하며, CONTEXT ALLOCATE를 통해 이미 할당되어 있어야 함</li></ul></td></tr><tr><td>DEFAULT</td><td><ul><li>DEFAULT로 선언할 경우 디폴트 컨텍스트를 사용하게 됨</li><li>디폴트 컨텍스트는 할당과 해제를 할 필요 없이 그대로 사용할 수 있음</li></ul></td></tr></tbody></table>

* **예제**

다음은 CONTEXT USE를 사용하는 예입니다.

```
EXEC SQL CONTEXT USE :ctx1;
EXEC SQL CONTEXT USE DEFAULT;
```

#### **DEALLOCATE DESCRIPTOR**

**DEALLOCATE DESCRIPTOR**는 ALLOCATE DESCRIPTOR를 사용해 할당된 서술자의 메모리를 해제할 때 사용하는 문장입니다. 단, 이 문장은 ANSI 타입의 Dynamic SQL 문장에만 사용할 수 있습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/n4Eb8pJmQgtSciZqViC2/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="177">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>descriptor_name</td><td><ul><li>서술자의 이름이 저장된 호스트 변수 또는 문자열을 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등 문자열을 저장할 수 있는 타입으로 이미 선언되어 있어야 함</li><li>서술자는 ALLOCATE DESCRIPTOR를 통해 이미 할당되어 있어야 함</li><li>자세한 내용은 “<a href="#descriptor">DESCRIPTOR 이름</a>”을 참고</li></ul></td></tr></tbody></table>

* **예제**

다음은 DEALLOCATE DESCRIPTOR를 사용하는 예입니다.

```
EXEC SQL DEALLOCATE DESCRIPTOR 'input_descriptor';
```

#### **DECLARE CURSOR**

**DECLARE CURSOR**는 커서를 선언할 때 사용하는 문장입니다. 이 문장을 사용해 스크롤 가능 커서(Scrollable Cursor)를 선언할 수도 있습니다. 커서를 선언할 때는 커서의 이름을 반드시 명시하여야 하며, SELECT 문장과 연관시켜야 합니다.

Dynamic SQL 문장에 대한 커서인 경우에는 문장 이름(Statement Name)과 연관시킵니다. 이때 문장 이름은 PREPARE를 통해 준비되어 있어야 합니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/4LS9eOtirBk0JQ0gxWZR/image.png" alt="" width="557"><figcaption></figcaption></figure></div>

* 구성요소

**– declare\_cursor\_statement**

<table><thead><tr><th width="245">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>문장을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>” 을 참고</li></ul></td></tr><tr><td>cursor_name</td><td><ul><li>커서의 이름을 명시</li></ul></td></tr><tr><td>SCROLL</td><td><ul><li>스크롤 가능 커서로 선언</li></ul></td></tr><tr><td>cursor_specification</td><td><ul><li>커서로 수행할 문장을 명시</li></ul></td></tr><tr><td>statement_name</td><td><ul><li>준비된 문장의 이름을 명시</li><li>사용될 문장은 PREPARE를 통해 준비 되어 있어야 함</li></ul></td></tr></tbody></table>

**– cursor\_specification**

<table><thead><tr><th width="246">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>query_expression</td><td><ul><li>SELECT 문장을 명시</li><li>INTO 절을 포함할 수 없음</li></ul></td></tr></tbody></table>

* **예제**

다음은 DECLARE CURSOR를 사용한 예입니다.

```
EXEC SQL DECLARE emp_cursor1 CURSOR FOR 
    SELECT EMPNO, ENAME, SALARY FROM EMP;
    
EXEC SQL DECLARE emp_cursor2 SCROLL CURSOR FOR
    SELECT EMPNO, ENAME, SALARY FROM EMP;
    
EXEC SQL DECLARE dyn_cursor CURSOR FOR dyn_stmt;
```

#### **DECLARE DATABASE**

**DECLARE DATABASE**는 데이터베이스를 선언할 때 사용하는 문장입니다.

여러 개의 데이터베이스 접속을 사용할 때 각각의 접속은 데이터베이스의 이름으로 관리됩니다. DECLARE DATABASE로 선언한 데이터베이스의 이름을 CONNECT 문장이나 COMMIT 문장의 RELEASE를 통해 각각을 구분하여 관리할 수 있습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/3IbPYNgse8BEYiK7hhew/image.png" alt="" width="499"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="252">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>database_name</td><td>선언할 데이터베이스 이름을 명시</td></tr></tbody></table>

* **예제**

다음은 DECLARE DATABASE를 사용한 예입니다.

```
EXEC SQL DECLARE D1 DATABASE;
EXEC SQL CONNECT :user_pass AT D1;
```

#### **DECLARE STATEMENT**

**DECLARE STATEMENT**는 SQL 문장이나 PL/SQL 문장을 identifier로 지정하기 위해 사용하는 문장입니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/jP6Hb3CZN3yhhm1AjOxj/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="196">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>문장을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장 된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>statement_name</td><td><ul><li>준비된 문장의 이름을 명시</li><li>이 때의 이름은 identifier로 사용할 수 있음</li></ul></td></tr></tbody></table>

* **예제**

다음은 DECLARE STATEMENT를 사용한 예입니다.

```
EXEC SQL DECLARE exp_stmt STATEMENT;
EXEC SQL PREPARE exp_stmt FROM :query_stmt;
```

#### **DELETE**

**DELETE**는 테이블 또는 뷰에서 로우를 삭제할 때 사용하는 문장입니다.

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

* **문법**\
  DELETE의 문법에 대한 자세한 내용은 "[Tibero SQL 참조 안내서](/tibero-manuals/7.2.6.manuals/sql-reference-guide.md)"를 참고합니다.<br>
* **특권**\
  DELETE를 사용하려면, 대상이 되는 테이블 또는 뷰에 대한 DELETE 객체 특권을 갖고 있거나 DELETE ANY TABLE 시스템 특권을 갖고 있어야 합니다.<br>
* **구성요소**

<table><thead><tr><th width="159">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>FOR</td><td><ul><li>입력 배열 변수와 함께 사용될 경우 FOR 절을 이용하여 DELETE를 실행할 입력 배열 변수의 크기를 정할 수 있음</li><li>FOR 절이 포함되어 있지 않거나 실행할 배열의 크기가 입력 배열 변수의 크 기보다 크면, 배열 전체에 대하여 DELETE를 실행</li></ul></td></tr><tr><td>CURRENT OF</td><td><ul><li>DELETE를 커서와 함께 사용할 수도 있음</li><li>현재 커서가 가리키는 로우를 삭제하려면 WHERE 절에 CURRENT OF와 커서 이름을 포함시킴</li><li>이때 커서는 닫혀 있지 않아야 함</li></ul></td></tr></tbody></table>

* **예제**

다음은 DELETE를 사용하는 예입니다.

```
EXEC SQL DELETE FROM EMP;

EXEC SQL DELETE FROM EMP WHERE EMPNO = :empno; 

EXEC SQL FOR :count DELETE FROM EMP
    WHERE EMPNO = :empno_arr;
    
EXEC SQL DELETE FROM EMP
    WHERE CURRENT OF emp_cursor;
```

위의 예에서 알 수 있듯이 DELETE 문장은 EXEC SQL로 시작한다는 것을 제외하면, 일반적인 SQL 문장의 문법과 크게 다르지 않습니다.

#### **DESCRIBE**

**DESCRIBE**는 호스트 변수의 서술자를 초기화할 때 사용하는 문장입니다. 이 문장에는 Dynamic SQL 문장 이 사용되는데, 사용될 문장은 미리 PREPARE를 통해 준비해야 합니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/PB2g5j1Wd8gST0Usi8UE/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="199">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>BIND VARIABLES FOR</td><td><ul><li>입력으로 사용되는 호스트 변수의 서술자를 초기화하고, 바인드 변수를 바인딩하기 위해 사용</li><li>이 부분을 명시하지 않으면 SELECT LIST FOR가 디폴트</li></ul></td></tr><tr><td>SELECT LIST FOR</td><td><ul><li>SELECT 문장의 SELECT 리스트의 정보를 위한 서술자를 초기화</li><li>명시 하지 않을 경우 기본값</li></ul></td></tr><tr><td>statement_name</td><td><ul><li>사용될 문장의 이름을 명시</li><li>사용될 문장의 이름은 이미 PREPARE를 통해 준비되어 있어야 함</li></ul></td></tr><tr><td>descriptor_name</td><td><ul><li>서술자의 이름이 저장된 호스트 변수 또는 문자열을 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등 문자열을 저장할 수 있는 타입으로 이미 선언되어 있어야 함</li><li>서술자는 ALLOCATE DESCRIPTOR를 통해 이미 할당되어 있어야 함</li><li>자세한 내용은 “<a href="#descriptor">DESCRIPTOR 이름</a>”을 참고</li></ul></td></tr></tbody></table>

* **예제**

다음은 DESCRIBE를 사용하는 예입니다.

```
EXEC SQL PREPARE pstmt FROM :query_string;

EXEC SQL DECLARE emp_csr
    FOR SELECT empno, ename, sal, comm FROM emp 
    WHERE deptno = :dept_no;
    
EXEC SQL DESCRIBE BIND VARIABLES FOR pstmt
    INTO bind_descriptor;
    
EXEC SQL OPEN emp_csr
    USING bind_descriptor;
    
EXEC SQL DESCRIBE SELECT LIST FOR pstmt
    INTO select_descriptor;
    
EXEC SQL FETCH emp_csr
    INTO select_descriptor;
```

#### **DESCRIBE DESCRIPTOR**

**DESCRIBE DESCRIPTOR**는 서술자에 호스트 변수의 정보를 저장할 때 사용하는 문장입니다. 단, 이 문장은 ANSI 타입의 Dynamic SQL 문장에만 사용할 수 있습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/3jktF1XoCvc9G447m942/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="171">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>INPUT</td><td><ul><li>서술자가 입력과 출력 중에 어느 곳에 사용될지 지정</li><li>생략이 가능하며 기본값은 INPUT</li><li>사용자가 바인드 변수에 값을 직접 입력하여, tbESQL/C 라이브러리에서 사용될 수 있도록 함</li></ul></td></tr><tr><td>OUTPUT</td><td><ul><li>서술자가 입력과 출력 중에 어느 곳에 사용될지 지정합니다. 생략이 가능하며 기본값은 INPUT</li><li>사용자가 바인드 변수의 멤버를 통해 tbESQL/C 라이브러리가 동작하면서 저장된 결과 값의 메타데이터(metadata)를 확인하고, 적합한 대응을 할 수 있도록 해줌</li></ul></td></tr><tr><td>statement_name</td><td><ul><li>사용될 문장의 이름을 명시</li><li>사용될 문장의 이름은 이미 PREPARE를 통 해 준비되어 있어야 함</li></ul></td></tr><tr><td>SQL</td><td>기존 ESQL 프로그램과의 호환성을 위한 키워드로 특별한 의미는 없음</td></tr><tr><td>descriptor_name</td><td><ul><li>서술자의 이름이 저장된 호스트 변수 또는 문자열을 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등 문자열을 저장할 수 있는 타입으로 이미 선언되어 있어야 함</li><li>서술자는 ALLOCATE DESCRIPTOR를 통해 이미 할당되어 있어야 함</li><li>자세한 내용은 “<a href="#descriptor">DESCRIPTOR 이름</a>”을 참고</li></ul></td></tr></tbody></table>

* **예제**

다음은 DESCRIBE DESCRIPTOR를 사용하는 예입니다.

```
EXEC SQL DESCRIBE INPUT S USING DESCRIPTOR 'input_descriptor';
EXEC SQL DESCRIBE OUTPUT S USING DESCRIPTOR 'output_descriptor';
```

#### **ENABLE THREADS**

**ENABLE THREADS**는 멀티 스레드를 사용하기 전에 반드시 호출되어야 하는 문장입니다. 이 문장을 사용하지 않고 컨텍스트 관련 문장을 사용할 경우 에러가 발생합니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/qVCqYwsGMkUSRcdwku90/image.png" alt="" width="355"><figcaption></figcaption></figure></div>

* 예제

다음은 ENABLE THREADS를 사용하는 예입니다.

```
EXEC SQL ENABLE THREADS;
```

#### **EXECUTE**

**EXECUTE**는 Dynamic SQL 문장을 실행할 때 사용하는 문장입니다.

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

* 문법

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/ZvGMsDuyUXzPzzOXwcIP/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

**- execute\_statement**

<table><thead><tr><th width="253">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>for_clause</td><td><ul><li>for_clause를 사용해 EXECUTE를 수행할 횟수를 지정할 수 있음</li><li>자세한 내용은 “<a href="#for">FOR 절</a>”을 참고</li></ul></td></tr><tr><td>statement_name</td><td><ul><li>실행할 문장의 이름을 명시</li><li>실행할 문장의 이름은 PREPARE 문장을 통해 이미 준비되어 있어야 함</li></ul></td></tr><tr><td>USING using_param_clause</td><td><ul><li>USING 절을 이용하여 입력 변수를 지정</li><li>또는 입력 배열 변수를 사용할 수도 있음</li></ul></td></tr><tr><td>psm_statement</td><td>실행할 anonymous psm block 문장의 내용을 서술</td></tr></tbody></table>

**- using\_param\_clause**

<table><thead><tr><th width="259">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>identifier</td><td>입력 변수를 정의한 식별자</td></tr><tr><td>:host_variable</td><td><ul><li>입력 변수를 명시</li><li>입력 변수의 개수는 하나 이상이고, 준비된 문장 내에 포함된 입력 변수의 개수와 같아야 함</li></ul></td></tr><tr><td>indicator</td><td>지시자 변수를 명시할 때 사용</td></tr></tbody></table>

* **예제**

다음은 EXECUTE를 사용하는 예입니다.

```
EXEC SQL EXECUTE sql_stmt;

EXEC SQL EXECUTE sql_stmt USING :empno, :deptno;

EXEC SQL FOR :count EXECUTE sql_stmt
    USING :empno_arr INDICATOR :empno_arr_ind;
```

#### **EXECUTE DESCRIPTOR**

**EXECUTE DESCRIPTOR**는 Dynamic SQL 문장을 실행할 때 사용하는 문장입니다. 단, 이 문장은 ANSI 타입의 Dynamic SQL 문장에만 사용할 수 있습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/kud9CWH4Z5OBHmHu53Xb/image.png" alt="" width="524"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/NYQV5L2P9P5jOY7aOxqk/image.png" alt="" width="547"><figcaption></figcaption></figure></div>

* **구성요소**

**- ansi\_execute\_statement**

<table><thead><tr><th width="197">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>for_clause</td><td><ul><li>for_clause를 사용해 EXECUTE를 수행할 횟수를 지정할 수 있음</li><li>자세한 내용은 “<a href="#for">FOR 절</a>”을 참고</li></ul></td></tr><tr><td>statement_name</td><td><ul><li>서술자의 이름이 저장된 호스트 변수 또는 문자열을 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등 문자열을 저장할 수 있는 타입으로 서술자 이름을 문자열로 가지고 있어야 함</li></ul></td></tr></tbody></table>

**- ansi\_using\_and\_into\_clause**

<table><thead><tr><th width="201">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>USING</td><td>입력 호스트 변수의 정보를 가지고 있는 서술자를 사용해야 할 경우 명시</td></tr><tr><td>INTO</td><td>문장 수행 결과가 출력 값을 가지고 있을 경우 사용할 서술자를 명시</td></tr><tr><td>SQL</td><td>기존 ESQL 프로그램과의 호환성을 위한 키워드로 특별한 의미는 없음</td></tr><tr><td>descriptor_name</td><td><ul><li>서술자의 이름이 저장된 호스트 변수 또는 문자열을 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등 문자열을 저장할 수 있는 타입으로 이미 선언되어 있어야 함</li><li>서술자는 ALLOCATE DESCRIPTOR를 통해 이미 할당되어 있어야 함</li><li>자세한 내용은 “<a href="#descriptor">DESCRIPTOR 이름</a>”을 참고</li></ul></td></tr></tbody></table>

* **예제**

다음은 EXECUTE DESCRIPTOR를 사용하는 예입니다.

```
EXEC SQL EXECUTE S USING DESCRIPTOR 'input_desc'
         INTO DESCRIPTOR 'output_desc';
```

#### **EXECUTE ... END-EXEC**

**EXECUTE ... END-EXEC**는 PL/SQL 문장을 실행할 때 사용하는 문장입니다.

EXECUTE ... END-EXEC의 세부 내용은 다음과 같습니다.

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/3X6GVJ4GxgP1dHhj8Y3A/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* 구성요소

**- execute\_psm\_statement**

<table><thead><tr><th width="137">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>문장을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>pl_sql_block</td><td>사용자가 작성한 PL/SQL 블록을 사용</td></tr></tbody></table>

* 예제

다음은 EXECUTE ... END-EXEC를 사용하는 예입니다.

```
EXEC SQL EXECUTE 
    DECLARE
        empnum NUMBER(4); 
    BEGIN
        empnum := 1356;
        INSERT INTO EMP ( EMPNUM ) VALUES (empnum); 
    END;
END-EXEC;

EXEC SQL EXECUTE 
    BEGIN
        UPDATE EMP SET
            EMPNAME = :hv_empname; 
            SALARY = :hv_salary;
    WHERE
            EMPNUM = :hv_empnum;
    END;
END-EXEC;
```

#### **EXECUTE IMMEDIATE**

**EXECUTE IMMEDIATE**는 Dynamic SQL 문장을 준비하지 않고 바로 실행할 때 사용하는 문장입니다. 이 문장을 통해 실행할 SQL 문장은 입력 변수가 포함되지 않아야 합니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/yWWxymv4dW6d0sVQFElv/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="200">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>실행할 Dynamic SQL 문장을 호스트 변수를 사용해 명시</td></tr><tr><td>string literal</td><td>실행할 문장을 문자열 리터럴을 사용해 명시</td></tr><tr><td>'literal'</td><td>실행할 문장을 문자열을 사용해 명시</td></tr></tbody></table>

* **예제**

다음은 EXECUTE IMMEDIATE를 사용하는 예입니다.

```
EXEC SQL EXECUTE IMMEDIATE :sql_stmt;

EXEC SQL EXECUTE IMMEDIATE
    'SELECT EMPNO, ENAME, SALARY FROM EMP';
```

#### **FETCH**

**FETCH**는 커서가 현재 가리키고 있는 로우의 데이터를 읽어올 때 사용하는 문장입니다. 이 문장을 사용할 때 출력 변수로 배열 변수를 사용할 수 있습니다. 배열 변수를 사용할 경우 여러 개의 로우 데이터를 동시에 읽어 올 수 있습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/oB0GekbofDnntvlXIyO2/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

**- fetch\_statement**

<table><thead><tr><th width="234">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>for_clause</td><td><ul><li>입력 배열 변수를 사용할 때 for_clause를 사용해 동시에 읽을 로우의 개수를 지정할 수 있음</li><li>for_clause가 포함되어 있지 않거나, for_clause에 지정된 로우의 개수가 입력 배열 변수의 크기보다 크면, 배열 변수의 크기만큼 로우를 읽음</li><li>자세한 내용은 “<a href="#for">FOR 절</a>”을 참고</li></ul></td></tr><tr><td>fetch_type_clause</td><td>스크롤 커서일 경우 스크롤 타입을 명시</td></tr><tr><td>cursor_name</td><td>커서의 이름을 명시합니다. 사용될 커서는 열려있어야 함</td></tr><tr><td>fetch_target</td><td>결과 값을 저장할 호스트 변수를 명시</td></tr><tr><td>USING DESCRIPTOR</td><td>서술자의 이름을 명시할 경우 서술자의 이름 앞에 붙이는 키워드</td></tr><tr><td>descriptor_name</td><td><ul><li>서술자의 이름이 저장된 호스트 변수 또는 문자열을 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등 문자열을 저장할 수 있는 타입으로 이미 선언되어 있어야 함</li><li>서술자는 ALLOCATE DESCRIPTOR를 통해 이미 할당되어 있어야 함</li><li>자세한 내용은 “<a href="#descriptor">DESCRIPTOR 이름</a>”을 참고</li></ul></td></tr></tbody></table>

**- fetch\_type\_clause**

<table><thead><tr><th width="228">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>NEXT</td><td><ul><li>현재 커서가 가리키고 있는 로우의 다음 로우에 액세스</li><li>PRIOR 옵션과 반대 (생략 가능)</li></ul></td></tr><tr><td>PRIOR</td><td><ul><li>현재 커서가 가리키고 있는 로우의 이전 로우에 액세스</li><li>NEXT 옵션과 반대</li></ul></td></tr><tr><td>FIRST</td><td><ul><li>맨 처음에 위치한 로우에 액세스</li><li>LAST 옵션과 반대</li></ul></td></tr><tr><td>LAST</td><td><ul><li>맨 마지막에 위치한 로우에 액세스</li><li>FIRST 옵션과 반대</li></ul></td></tr><tr><td>CURRENT</td><td>현재 로우에 액세스 함</td></tr><tr><td>ABSOLUTE position_clause</td><td>전체 로우 중에서 position_clause번째 로우에 액세스</td></tr><tr><td>RELATIVE position_clause</td><td><ul><li>현재 커서가 가리키고 있는 로우의 다음 position_clause번째에 위치한 로우에 액세스</li><li>position_clause의 값이 음수라면 커서가 현재 위치에서 앞으로 이동</li><li>예를 들어 현재 커서가 8번째 로우를 가리키고 있는데, 'FETCH RELATIVE -3'을 실행한다면 커서는 5번째 로우를 가리키게 됨</li></ul></td></tr></tbody></table>

**- fetch\_target**

<table><thead><tr><th width="216">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>identifier</td><td>출력 변수를 정의한 식별자</td></tr><tr><td>:host_variable</td><td><ul><li>출력 변수를 명시</li><li>출력 변수의 개수는 하나 이상이고, 준비된 문장 의 결과로 출력될 SELECT 리스트의 컬럼 개수와 동일해야 함</li></ul></td></tr><tr><td>indicator</td><td>지시자 변수를 명시할 때 사용</td></tr></tbody></table>

* **예제**

다음은 FETCH를 사용하는 예입니다.

```
EXEC SQL FETCH emp_cursor INTO :empno, :ename, :salary;

EXEC SQL FETCH emp_cursor
    INTO :empno, :ename:ename_ind, :salary:salary_ind;

EXEC SQL FOR :count FETCH emp_cursor
    INTO :empno_arr, :ename_arr, :salary_arr;
```

#### **FETCH DESCRIPTOR**

**FETCH DESCRIPTOR**는 커서가 현재 가리키고 있는 로우 데이터를 읽어 올 때 사용하는 문장입니다.

FETCH와 거의 동일하게 동작합니다. 단, 이 문장은 ANSI 타입의 Dynamic SQL 문장에만 사용할 수 있습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/lsMbhA4G29NxCi23oRhH/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="208">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>for_clause</td><td><ul><li>입력 배열 변수를 사용할 때 for_clause를 사용해 동시에 읽을 로우의 개수를 지정할 수 있음</li><li>for_clause가 포함되어 있지 않거나, for_clause에 지정된 로우의 개수가 입력 배열 변수의 크기보다 크면, 배열 변수의 크기만큼 로우를 읽음</li><li>자세한 내용은 “<a href="#for">FOR 절</a>”을 참고</li></ul></td></tr><tr><td>fetch_type_clause</td><td>FETCH의 fetch_type_clause와 동일</td></tr><tr><td>cursor_name</td><td>커서의 이름을 명시합니다. 사용될 커서는 열려있는 커서이어야 함</td></tr><tr><td>SQL</td><td>기존 ESQL 프로그램과의 호환성을 위한 키워드로 특별한 의미는 없음</td></tr><tr><td>descriptor_name</td><td><ul><li>서술자의 이름이 저장된 호스트 변수 또는 문자열을 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등 문자열을 저장할 수 있는 타입으로 이미 선언되어 있어야 함</li><li>서술자는 ALLOCATE DESCRIPTOR를 통해 이미 할당되어 있어야 함</li><li>자세한 내용은 “<a href="#descriptor">DESCRIPTOR 이름</a>”을 참고</li></ul></td></tr></tbody></table>

* **예제**

다음은 FETCH DESCRIPTOR를 사용하는 예입니다.

```
EXEC SQL FETCH C1 INTO DESCRIPTOR 'output_descriptor';
```

#### **GET DESCRIPTOR**

**GET DESCRIPTOR**는 지정한 서술자에서 원하는 정보를 가져올 때 사용하는 문장입니다. 단, 이 문장은 ANSI 타입의 Dynamic SQL 문장에만 사용할 수 있습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/Jl4iaC5D7uoJjjSb6Nxi/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/hDXQhlANou1tEX1VgmjG/image.png" alt="" width="372"><figcaption></figcaption></figure></div>

* **구성요소**

**– get\_descriptor\_statement**

<table><thead><tr><th width="196">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>for_clause</td><td><ul><li>입력 배열 변수를 사용할 때 for_clause를 사용해 동시에 읽을 로우의 개수를 지정할 수 있음</li><li>for_clause가 포함되어 있지 않거나, for_clause에 지정된 로우의 개수가 입력 배열 변수의 크기보다 크면, 배열 변수의 크기만큼 로우를 읽음</li><li>자세한 내용은 “<a href="#for">FOR 절</a>”을 참고</li></ul></td></tr><tr><td>descriptor_name</td><td><ul><li>서술자의 이름이 저장된 호스트 변수 또는 문자열을 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등 문자열을 저장 할 수 있는 타입으로 이미 선언되어 있어야 함</li><li>서술자는 ALLOCATE DESCRIPTOR를 통해 이미 할당되어 있어야 함</li><li>자세한 내용은 “<a href="#descriptor">DESCRIPTOR 이름</a>”을 참고</li></ul></td></tr><tr><td>VALUE value</td><td>정보를 가져올 호스트 변수의 순서를 지정</td></tr><tr><td>get_item_clause</td><td>가져올 정보의 항목과 정보를 저장할 호스트 변수를 명시</td></tr><tr><td>count</td><td>사용된 호스트 변수의 개수를 알고자 할 경우 그 개수를 저장할 호스트 변수를 명시</td></tr></tbody></table>

**- value**

<table><thead><tr><th width="192">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>값이 들어 있는 호스트 변수를 사용할 때 명시</td></tr><tr><td>integer</td><td>값을 직접 정수로 입력할 때 사용</td></tr></tbody></table>

**- get\_item\_clause**

<table><thead><tr><th width="195">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>해당 항목을 가져올 호스트 변수를 명시</td></tr><tr><td>item_name</td><td>값을 가져올 구체적인 항목을 명시</td></tr></tbody></table>

**- item\_name**

<table><thead><tr><th width="278">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>TYPE</td><td>데이터의 타입을 가져오고자 할 때 사용</td></tr><tr><td>LENGTH</td><td>데이터의 최대 길이를 가져오고자 할 때 사용</td></tr><tr><td>INDICATOR</td><td>데이터 연관된 지시자 값을 가져오고자 할 때 사용</td></tr><tr><td>DATA</td><td>데이터 값을 가져오고자 할 때 사용</td></tr><tr><td>CHARACTER_SET_NAME</td><td>데이터가 저장된 컬럼의 문자 세트를 가져오고자 할 때 사용</td></tr><tr><td>OCTET_LENGTH</td><td>데이터 길이를 Byte 단위로 환산해 가져오고자 할 때 사용</td></tr><tr><td>RETURNED_LENGTH</td><td>FETCH를 할 때 실제로 받아올 데이터 길이를 가져오고자 할 때 사용</td></tr><tr><td>RETURNED_OCTET_LENGTH</td><td>FETCH를 할 때 실제로 받아올 데이터 길이를 Byte 단위로 환산해 가져오고자 할 때 사용</td></tr><tr><td>PRECISION</td><td>받아올 데이터의 정밀도를 가져오고자 할 때 사용</td></tr><tr><td>SCALE</td><td>받아올 데이터의 스케일을 가져오고자 할 때 사용</td></tr><tr><td>NULLABLE</td><td><p>해당 컬럼의 데이터가 NULL이 될 수 있는지 여부를 알고자 할 때 사용</p><ul><li>이 값이 1이면, 해당 컬럼은 NULL값을 가질 수 있음</li><li>이 값이 0이면, 해당 컬럼은 NULL값을 가질 수 없는 키이거나 NOT NULL 제약조건을 가지고 있는 컬럼</li></ul></td></tr><tr><td>NAME</td><td>해당 컬럼의 이름을 가져오고자 할 때 사용</td></tr></tbody></table>

* **예제**

다음은 GET DESCRIPTOR를 사용하는 예입니다.

```
EXEC SQL GET DESCRIPTOR 'input_descriptor' :input_count = COUNT;
```

#### **INSERT**

**INSERT**는 테이블 또는 뷰에 로우를 삽입할 때 사용하는 문장입니다. 전체 컬럼 또는 일부 컬럼에 데이터를 삽입할 수 있습니다. INSERT를 사용할 때, 입력 변수로 배열 변수를 사용할 수도 있으며, 지시자 변수를 함께 사용할 수 있습니다. 또한 입력할 데이터의 값을 사용자가 직접 지정할 수도 있고, 부질의를 통하여 지정할 수 도 있습니다. 부질의를 이용하는 경우 부질의의 결과 로우 모두가 테이블이나 뷰에 삽입됩니다.

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

* **문법**\
  INSERT의 문법에 대한 자세한 내용은 "[Tibero SQL 참조 안내서](/tibero-manuals/7.2.6.manuals/sql-reference-guide.md)"를 참고합니다.<br>
* **특권**\
  INSERT를 사용하려면, INSERT의 대상 테이블 또는 뷰에 대하여 INSERT 객체 특권을 갖거나 INSERT ANY TABLE 시스템 특권을 갖고 있어야 합니다.<br>
* **구성요소**

<table><thead><tr><th width="113">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>FOR</td><td><ul><li>입력 배열 변수와 함께 사용될 경우 FOR 절을 이용하여 삽입할 데이터의 개수를 지정할 수 있음</li><li>FOR 절이 포함되어 있지 않거나 FOR 절에서 지정한 크기가 입력 배열 변수의 크기보다 크면, 전체 배열 변수에 저장된 데이터가 테이블에 삽입</li></ul></td></tr></tbody></table>

* **예제**

다음은 INSERT를 사용하는 예입니다.

```
EXEC SQL INSERT INTO EMP VALUES (34, ‘James', 45000, ‘NewYork');

EXEC SQL INSERT INTO EMP (EMPNO, ENAME)
    VALUES (:empno, :ename);

EXEC SQL FOR :count INSERT INTO EMP (EMPNO, ENAME)
    VALUES (:empno_arr, :ename_arr :ename_arr_ind);

EXEC SQL INSERT INTO HIGH_EMP
    SELECT * FROM EMP WHERE SALARY > 50000;
```

위의 예에서 알 수 있듯이 INSERT 문장은 EXEC SQL로 시작한다는 것을 제외하면, 일반적인 SQL 문장의 문법과 크게 다르지 않습니다.

#### **LOB CLOSE**

**LOB CLOSE**는 OPEN 된 LOB 사용이 끝난 후 닫아주기 위해 사용하는 문장입니다. 이미 닫힌 LOB에 대해 또 다시 닫으려 할 경우 에러가 발생하고, 또한 사용자에 의해 닫히기 전에 COMMIT 이 발생할 경우에도 에러가 발생합니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/UTzotYNwsRTPZnEy3h3q/image.png" alt="" width="519"><figcaption></figcaption></figure></div>

* **구성요소**

**- lob\_close\_statement**

<table><thead><tr><th width="159">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>문장을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>lob_src</td><td>대상이 되는 대용량 객체형의 데이터의 LOB 지시자 변수</td></tr></tbody></table>

**- lob\_src**

<table><thead><tr><th width="167">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>사용할 LOB 지시자 변수를 명시</td></tr></tbody></table>

* **예제**

다음은 LOB CLOSE를 사용하는 예입니다.

```
EXEC SQL LOB CLOSE :lob_loc;
```

#### **LOB CREATE TEMPORARY**

**LOB CREATE TEMPORARY**는 temporary LOB을 생성하기 위해 사용하는 문장입니다.

LOB CREATE TEMPORARY의 세부 내용은 다음과 같습니다.

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/9bx3isFlLrQrd78DyZB9/image.png" alt="" width="513"><figcaption></figcaption></figure></div>

* **구성요소**

**- lob\_create\_temp\_statement**

<table><thead><tr><th width="182">구성요소소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>문장을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>lob_src</td><td>대상이 되는 대용량 객체형 데이터의 LOB 지시자 변수</td></tr></tbody></table>

**- lob\_src**

<table><thead><tr><th width="187">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>사용할 LOB 지시자 변수를 명시</td></tr></tbody></table>

* **예제**

다음은 LOB CREATE TEMPORARY를 사용하는 예입니다.

```
EXEC SQL LOB CREATE TEMPORARY :lob_loc;
```

#### **LOB DESCRIBE**

**LOB DESCRIBE**는 대용량 객체형의 데이터 타입의 속성을 받아올 때 사용하는 문장입니다. 이 문장은 LOB READ를 실행하기 전 버퍼를 마련하기 위해서 대용량 객체형의 데이터의 길이를 알아내는 등의 용도로 사용합니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/i3mfETJngoipyFvEp8oE/image.png" alt="" width="528"><figcaption></figcaption></figure></div>

* **구성요소**

**- lob\_describe\_statement**

<table><thead><tr><th width="161">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>문장을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>lob_src</td><td>속성을 받아올 대상이 되는 대용량 객체형의 데이터의 LOB 지시자 변수</td></tr><tr><td>lob_attribute</td><td>가져올 대용량 객체형의 데이터 타입의 속성을 지정</td></tr><tr><td>fetch_target</td><td>대용량 객체형의 데이터 타입의 속성이 저장될 변수</td></tr></tbody></table>

**- lob\_src**

<table><thead><tr><th width="205">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>::host_variable</td><td>사용할 LOB 지시자 변수를 명시</td></tr></tbody></table>

**- lob\_attribute**

<table><thead><tr><th width="210">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>LENGTH</td><td>LOB의 길이를 알고자 할 때 사용</td></tr></tbody></table>

**– fetch\_target**

<table><thead><tr><th width="206">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>identifier</td><td>길이 값을 받아올 호스트 변수를 콜론(:) 없이 사용할 수 있음</td></tr><tr><td>:host_variable</td><td>길이 값을 받아올 호스트 변수를 명시</td></tr><tr><td>indicator</td><td>지시자 변수를 명시할 때 사용</td></tr></tbody></table>

* **예제**

다음은 LOB DESCRIBE를 사용하는 예입니다.

```
ClobLocator *clob; 
unsigned int clob_len;

EXEC SQL ALLOCATE :clob;

EXEC SQL SELECT clob_col INTO :clob FROM CLOB_TABLE WHERE num_col = 1;

EXEC SQL LOB DESCRIBE :clob GET LENGTH INTO :clob_len;
```

#### **LOB FREE TEMPORARY**

**LOB FREE TEMPORARY**는 생성된 temporary LOB에 할당된 메모리를 해제하기 위해 사용하는 문장입니다.

LOB FREE TEMPORARY의 세부 내용은 다음과 같습니다.

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/lbmUExUjd07WhZKrdcsn/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**
* lob\_free\_temp\_statement

<table><thead><tr><th width="179">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td>문장을 실행할 데이터베이스를 명시</td></tr></tbody></table>

<table><thead><tr><th width="136">구성요소</th><th>설명</th></tr></thead><tbody><tr><td></td><td><ul><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>lob_src</td><td>대상이 되는 대용량 객체형 데이터의 LOB 지시자 변수</td></tr></tbody></table>

– lob\_src

<table><thead><tr><th width="176">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>사용할 LOB 지시자 변수를 명시</td></tr></tbody></table>

* 예제

다음은 LOB FREE TEMPORARY를 사용하는 예입니다.

```
EXEC SQL LOB FREE TEMPORARY :lob_loc;
```

#### **LOB OPEN**

**LOB OPEN**은 LOB이나 BFILE을 열기 위해 사용하는 문장입니다. LOB OPEN 문장 이후에 READ ONLY를 통해 읽기 모드를, WRITE ONLY를 통해 쓰기 모드를 사용할 수 있습니다. 지정하지 않으면 기본값으로 2가지 모드를 모두 사용할 수 있습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/0TiMZyhcuchnw1DSl0VE/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* 구성요소

**- lob\_open\_statement**

<table><thead><tr><th width="176">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>문장을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>lob_src</td><td>속성을 받아올 대상이 되는 대용량 객체형의 데이터의 LOB 지시자 변수</td></tr></tbody></table>

**– lob\_src**

<table><thead><tr><th width="179">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>::host_variable</td><td>사용할 LOB 지시자 변수를 명시</td></tr></tbody></table>

* 예제

다음은 LOB OPEN을 사용하는 예입니다.

```
EXEC SQL LOB OPEN :lob_src;
```

#### **LOB READ**

**LOB READ**는 LOB 지시자가 가리키고 있는 위치의 대용량 객체형의 데이터의 내용을 읽어 올 때 사용하는 문장입니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/3HZN0HpcOhmTvNZcyePh/image.png" alt="" width="545"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/oztObK1Sy3uesMpW7PAS/image.png" alt="" width="212"><figcaption></figcaption></figure></div>

* **구성요소**

**- lob\_read\_statement**

<table><thead><tr><th width="192">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>문장을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>lob_amount</td><td><ul><li>읽어올 대용량 객체형의 데이터의 길이를 명시</li><li>데이터를 읽어 온 후에는 실제로 읽어 온 길이가 기록됨(0~2GB)</li></ul></td></tr><tr><td>lob_src</td><td>속성을 받아올 대상이 되는 대용량 객체형의 데이터의 LOB 지시자 변수</td></tr><tr><td>lob_offset</td><td>대용량 객체형의 데이터를 읽기 시작할 위치를 명시</td></tr><tr><td>lob_buffer</td><td><ul><li>대용량 객체형의 데이터를 읽어 올 때 사용할 버퍼의 이름을 명시</li><li>버퍼로 사용될 메모리는 미리 할당되어 있어야 함</li></ul></td></tr><tr><td>lob_buflen</td><td><ul><li>대용량 객체형의 데이터를 읽어 올 버퍼의 길이를 명시</li><li>이곳에 명시된 길이 만큼만 읽음(0~2GB)</li></ul></td></tr></tbody></table>

**- lob\_amount**

<table><thead><tr><th width="164">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>대용량 객체형의 데이터의 길이를 값으로 갖는 호스트 변수를 명시</td></tr></tbody></table>

**- lob\_offset**

<table><thead><tr><th width="165">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>대용량 객체형의 데이터를 읽기 시작할 위치를 값으로 갖는 호스트 변수를 명시</td></tr></tbody></table>

**- lob\_buffer**

<table><thead><tr><th width="194">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>대용량 객체형의 데이터를 읽어 올 때 사용할 버퍼의 이름을 값으로 갖는 호스트 변수를 명시</td></tr></tbody></table>

**– lob\_buflen**

<table><thead><tr><th width="198">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>대용량 객체형의 데이터를 읽어 올 때 사용할 버퍼의 길이를 값으로 갖는 호스트 변수를 명시</td></tr></tbody></table>

* **예제**

다음은 LOB READ를 사용하는 예입니다.

```
ClobLocator *clob; 
unsigned int read_amt; 
unsigned char buffer[26];

EXEC SQL ALLOCATE :clob;

EXEC SQL SELECT clob_col INTO :clob FROM CLOB_TABLE WHERE num_col = 1; 

read_amt = 25;

EXEC SQL LOB READ :read_amt FROM :clob 
    INTO :buffer WITH LENGTH :read_amt;
```

#### **LOB WRITE**

**LOB WRITE**는 LOB 지시자가 가리키는 위치에 명시된 해당 내용에 쓰기를 실행할 때 사용하는 문장입니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/5wK5sY0ME3nKV7LOvltb/image.png" alt="" width="452"><figcaption></figcaption></figure></div>

* **구성요소**

**– lob\_write\_statement**

<table><thead><tr><th width="172">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>문장을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>APPEND</td><td><ul><li>쓰고자 하는 내용이 이미 있는 LOB 데이터의 가장 마지막에 더해짐</li><li>이 경우 에 별도의 offset이 입력될 경우 에러가 발생</li></ul></td></tr><tr><td>FIRST</td><td>대용량 객체형 데이터를 여러 번으로 나누어서 쓸 경우 맨 처음에 해당되는 조각을 쓰려고 할 때 명시</td></tr><tr><td>NEXT</td><td>대용량 객체형 데이터를 여러 번으로 나누어서 쓸 경우 쓰기 시작한 LOB에 계속 해서 쓰려고 할 때 명시</td></tr><tr><td>LAST</td><td>대용량 객체형 데이터를 여러 번으로 나누어서 쓸 경우 마지막으로 쓸 내용일 경우 명시</td></tr><tr><td>ONE</td><td><ul><li>입력 내용을 나누어 쓰지 않고 버퍼에 있는 내용이 쓰려고 하는 전체 내용일 경우</li><li>쓰기 옵션 중 어떤 내용도 지정하지 않을 경우 이 값이 기본값</li></ul></td></tr><tr><td>lob_amount</td><td><ul><li>대용량 객체형의 데이터의 길이를 명시</li><li>데이터 쓰기가 실행된 후에는, 실제로 쓰기가 실행된 데이터의 길이가 기록됨(0~2GB)</li></ul></td></tr><tr><td>lob_buffer</td><td>쓰기가 실행될 해당 내용이 들어 있는 버퍼를 명시</td></tr><tr><td>lob_buflen</td><td>쓰기가 실행될 해당 내용이 들어 있는 버퍼의 길이를 명시 (0~2GB)</td></tr><tr><td>lob_dest</td><td>쓰기가 실행될 LOB 지시자를 명시</td></tr><tr><td>lob_offset</td><td>쓰기가 실행될 시작 위치를 명시</td></tr></tbody></table>

**– lob\_dest**

<table><thead><tr><th width="172">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>:host_variable</td><td>LOB 지시자가 저장된 변수를 명시</td></tr></tbody></table>

* **예제**

다음은 LOB WRITE를 사용하는 예입니다.

```
BlobLocator *blob;
unsigned int blob_len, offset; 
unsigned char buffer[MAXBUFLEN]; 
FILE *fp;

EXEC SQL ALLOCATE :blob;

EXEC SQL INSERT INTO BLOB_TABLE VALUES (empty_blob())
    RETURNING blob_col INTO :blob;

fp = fopen((const char *)"test_blob.jpeg", (const char *)"r"); 
fseek(fp, 0L, SEEK_END);
blob_len = (unsigned int)ftell(fp);

fseek(fp, 0L, SEEK_SET); 
write_amt = MAXBUFLEN;
fread((void *)buffer, (size_t)write_amt, (size_t)1, fp); 
offset = 1;

EXEC SQL LOB WRITE FIRST :write_amt FROM :buffer 
    WITH LENGTH :write_amt INTO :blob AT :offset;
```

#### **OPEN**

**OPEN**은 커서를 열 때 사용하는 문장입니다. 이 문장을 사용해 열려고 하는 커서는 이미 선언되어 있어야 하며, SELECT 문장과 연관되어 있어야 합니다. 커서의 선언은 DECLARE CURSOR를 통하여 실행됩니다.

커서를 여는 것과 동시에 연관된 SELECT 문장이 실행되며, 커서는 질의 문장이 반환한 결과의 제일 처음에 위치한 로우를 가리킵니다. 커서는 SELECT 문장과 연관되기도 하지만 Dynamic SQL 문장과 연관되기도 합니다.

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

* 문법

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/aaUssacLcw84YwBElpN5/image.png" alt="" width="440"><figcaption></figcaption></figure></div>

* 구성요소

**- open\_statement**

<table><thead><tr><th width="213">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>for_clause</td><td><ul><li>실행 반복 횟수를 지정</li><li>자세한 내용은 “<a href="#for">FOR 절</a>”을 참고</li></ul></td></tr><tr><td>cursor_name</td><td>열려고 하는 커서의 이름을 명시</td></tr><tr><td>normal_using_clause</td><td>일반적으로 사용하는 OPEN 문장의 형태</td></tr><tr><td>ansi_using_and_into_clause</td><td><ul><li>이미 정의된 서술자를 이용</li><li>ANSI 타입의 Dynamic SQL 문장에만 사용됨</li></ul></td></tr></tbody></table>

**- normal\_using\_clause**

**- ansi\_using\_and\_into\_clause**

<table><thead><tr><th width="197">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>USING</td><td>입력 호스트 변수의 정보가 저장된 서술자 변수가 필요할 경우에 사용</td></tr><tr><td>INTO</td><td>출력 호스트 변수의 정보가 저장된 서술자 변수가 필요할 경우에 사용</td></tr><tr><td>SQL</td><td>기존 ESQL 프로그램과의 호환성을 위한 키워드로 특별한 의미는 없음</td></tr><tr><td>descriptor_name</td><td><ul><li>서술자의 이름이 저장된 호스트 변수 또는 문자열을 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등 문자열을 저장할 수 있는 타입으로 이미 선언되어 있어야 함</li><li>서술자는 ALLOCATE DESCRIPTOR를 통해 이미 할당되어 있어야 함</li><li>자세한 내용은 “<a href="#descriptor">DESCRIPTOR 이름</a>”을 참고</li></ul></td></tr></tbody></table>

* 예제

다음은 OPEN을 사용하는 예입니다.

```
EXEC SQL OPEN emp_cursor;

EXEC SQL OPEN emp_cursor USING :empno; 

EXEC SQL FOR :count OPEN emp_cursor
    USING :empno INDICATOR :empno_ind;
```

#### **PREPARE**

**PREPARE**는 Dynamic SQL 문장을 준비할 때 사용하는 문장입니다. 준비된 SQL 문장은 문장의 이름을 통해 서로 식별되며, 이후에 DECLARE CURSOR 또는 EXECUTE에서 참조됩니다.

SQL 문장을 준비합니다는 것은 단지 문장을 파싱(Parsing)합니다는 의미일 뿐이며, 문장이 실행된다는 의미는 아닙니다. 문장이 실제로 실행되는 것은 EXECUTE 문장을 통해서입니다. SQL 문장에는 하나 이상의 입력 변수가 포함될 수 있는데, 입력 변수가 포함될 때 입력 변수의 이름은 별다른 의미를 갖지 않으며, tbESQL 프로그램에 미리 선언되어 있을 필요도 없습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/c8LWn90BE6I8d9o2z0FD/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

<table><thead><tr><th width="230">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>statement_name</td><td>준비를 실행할 SQL 문장의 이름을 명시</td></tr><tr><td>FROM</td><td><ul><li>FROM 절 뒤에는 준비할 Dynamic SQL 문장이 옴</li><li>SQL 문장 자체가 올 수 도 있으며, SQL 문장의 문자열을 저장한 호스트 변수가 올 수도 있음</li><li>SELECT 문장이라면 문장 자체가 올 수 있음</li></ul></td></tr><tr><td>:host_variable</td><td>Dynamic SQL 문장을 저장한 호스트 변수를 명시</td></tr><tr><td>string literal</td><td>Dynamic SQL 문장을 나타내는 문자열을 명시</td></tr><tr><td>select_statement</td><td>SELECT 문장 자체를 명시</td></tr><tr><td>execute_dml_statement</td><td>실행할 INSERT, UPDATE, DELETE 문장 자체를 명시</td></tr></tbody></table>

* **예제**

다음은 PREPARE를 사용하는 예입니다.

```
EXEC SQL PREPARE emp_stmt FROM :sql_stmt;

EXEC SQL PREPARE emp_stmt
    FROM 'UPDATE EMP SET SALARY = SALARY * 1.05';
    
EXEC SQL PREPARE emp_stmt FROM
    SELECT EMPNO, ENAME, SALARY FROM EMP WHERE DEPTNO = :deptno;
```

#### **ROLLBACK**

**ROLLBACK**은 현재 진행 중인 트랜잭션을 롤백하고 갱신된 모든 내용을 취소할 때 사용하는 문장입니다.

롤백을 실행하는 것과 동시에 데이터베이스와의 접속을 끊을 수도 있으며, 미리 설정된 저장점까지 부분 롤백(Partial Rollback)을 수행할 수도 있습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/Pm68nFroHIes1JaE1mxF/image.png" alt="" width="536"><figcaption></figcaption></figure></div>

* **구성요소**

**- rollback\_statement**

<table><thead><tr><th width="188">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>문장을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>WORK</td><td>기존 ESQL 프로그램과의 호환성을 위한 키워드로 특별한 의미는 없음</td></tr><tr><td>RELEASE</td><td>모든 리소스를 반환하고 데이터베이스와의 접속을 종료</td></tr><tr><td>TO</td><td>특정 저장점까지 부분 롤백을 수행하고자 할 때 명시</td></tr><tr><td>SAVEPOINT</td><td><ul><li>단지 문법 호환을 위해 지원하는 부분</li><li>이 부분의 명시여부는 문장 실행에 어떤 영향도 없음</li></ul></td></tr><tr><td>savepoint_name</td><td><ul><li>부분 롤백을 수행할 저장점의 이름을 명시</li><li>저장점은 롤백을 실행하기 전에 프로그램 내에 이미 설정되어 있어야 함</li></ul></td></tr></tbody></table>

**- savepoint\_name**

<table><thead><tr><th width="190">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>identifier</td><td>저장점의 이름을 정의한 식별자</td></tr></tbody></table>

* **예제**

다음은 ROLLBACK을 사용하는 예입니다.

```
EXEC SQL ROLLBACK;
EXEC SQL ROLLBACK TO SAVEPOINT sp1; EXEC SQL ROLLBACK WORK RELEASE;
```

#### **SAVEPOINT**

**SAVEPOINT**는 저장점을 설정할 때 사용하는 문장입니다. 설정된 저장점은 특정 지점까지 부분 롤백을 하고자 할 때 사용됩니다.

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

* 문법

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/YcrreDmDM2rwb51rY0hQ/image.png" alt="" width="547"><figcaption></figcaption></figure></div>

* 구성요소

<table><thead><tr><th width="181">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>at_clause</td><td><ul><li>문장을 실행할 데이터베이스를 명시</li><li>데이터베이스의 이름을 직접 명시할 수도 있고, 데이터베이스의 이름이 저장 된 호스트 변수를 명시할 수도 있음</li><li>자세한 내용은 “<a href="#at">AT 절</a>”을 참고</li></ul></td></tr><tr><td>savepoint_name</td><td>설정할 저장점에 부여할 이름을 명시</td></tr></tbody></table>

* **예제**

다음은 SAVEPOINT를 사용하는 예입니다.

```
EXEC SQL SAVEPOINT sp1;
```

#### **SELECT**

**SELECT**는 테이블 또는 뷰에 대해 질의를 수행하고, 질의를 수행한 결과 로우의 각 데이터를 출력 변수에 저장할 때 사용하는 문장입니다.

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

* **문법**\
  SELECT의 문법에 대한 자세한 내용은 "[Tibero SQL 참조 안내서](/tibero-manuals/7.2.6.manuals/sql-reference-guide.md)"를 참고합니다.<br>
* **특권**\
  SELECT 문장을 사용해 질의를 수행하기 위해서는 대상 테이블에 대한 SELECT 객체 특권이 있거나 SELECT ANY TABLE 시스템 권한을 갖고 있어야 합니다.<br>
* **구성요소**

<table><thead><tr><th width="187">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>INTO</td><td><ul><li>질의 결과의 컬럼의 개수는 INTO 절에 포함된 출력 변수의 개수와 같아야 함</li><li>INTO 절에는 지시자 변수와 함께 출력 배열 변수를 사용할 수 있음</li><li>출력 변수는 모두 스칼라 변수이거나 또는 모두 배열 변수이어야 하며, 이 두 가지가 서로 섞여 있을 수 없음</li></ul></td></tr><tr><td>WHERE</td><td><ul><li>WHERE 절에는 입력 변수를 포함할 수 있음</li><li>이때 지시자 변수와 함께 사용될 수 있음</li><li>SELECT 문장 내에서는 입력 배열 변수를 사용할 수 없음</li></ul></td></tr><tr><td>HAVING</td><td><ul><li>HAVING 절에는 입력 변수를 포함할 수 있음</li><li>지시자 변수 및 입력 배열 변수와 관련된 내용은 WHERE 절과 동일</li></ul></td></tr></tbody></table>

* **예제**

다음은 SELECT를 사용하는 예입니다.

```
EXEC SQL SELECT EMPNO, ENAME, SALARY
    INTO :empno, :ename, :salary FROM EMP;
    
EXEC SQL SELECT EMPNO, ENAME, DNAME
    INTO :empno_arr, :ename_arr :ename_arr_ind, :dname_arr 
    FROM EMP E, DEPT D
    WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = :deptno;
```

위의 예에서 알 수 있듯이 SELECT 문장은 INTO 절을 제외하면, 일반적인 SQL 문장의 문법과 크게 다르지 않습니다.

#### **SET DESCRIPTOR**

**SET DESCRIPTOR**는 사용자가 입력해야 할 정보를 지정한 서술자에 기록하는 문장입니다. 사용자는 이 문 장을 통해 데이터 값이나 데이터 값의 길이 등을 지정할 수 있습니다. 단, 이 문장은 ANSI 타입의 Dynamic SQL 문장에만 사용할 수 있습니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/HCiVyujfTZgVfL1esYwJ/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/TqE7AqlbhTbhdtBLWKrw/image.png" alt="" width="444"><figcaption></figcaption></figure></div>

* **구성요소**

**- set\_descriptor\_statement**

<table><thead><tr><th width="207">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>for_clause</td><td><ul><li>반복 횟수를 지정</li><li>자세한 내용은 “<a href="#for">FOR 절</a>”을 참고</li></ul></td></tr><tr><td>descriptor_name</td><td><ul><li>서술자의 이름이 저장된 호스트 변수 또는 문자열을 명시</li><li>호스트 변수는 CHAR* 또는 CHAR ARRAY 타입 등 문자열을 저장할 수 있는 타입으로 이미 선언되어 있어야 함</li><li>서술자는 ALLOCATE DESCRIPTOR를 통해 이미 할당되어 있어야 함</li><li>자세한 내용은 “<a href="#descriptor">DESCRIPTOR 이름</a>”을 참고</li></ul></td></tr><tr><td>VALUE value</td><td>몇 번째 출력 호스트 변수인지 명시</td></tr><tr><td>set_item_clause</td><td>출력 호스트 변수의 정보를 입력하기 위해 서술</td></tr><tr><td>COUNT</td><td>출력 호스트 변수의 개수를 받아오기 위해 서술</td></tr><tr><td>count</td><td>출력 호스트 변수의 개수를 받아올 호스트 변수를 명시</td></tr></tbody></table>

**- set\_item\_clause**

<table><thead><tr><th width="204">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>REF</td><td><ul><li>INDICATOR, DATA, RETURNED_LENGTH 항목을 지정할 때만 사용할 수 있는 키워드로, 속도와 편리성을 위해 사용</li><li>호스트 변수의 값이 아닌 호스트 변수 자체를 지정하며, GET DESCRIP TOR 문장을 따로 실행하지 않아도 FETCH한 후 지정된 항목의 값이 지정된 호스트 변수에 들어감</li></ul></td></tr><tr><td>item_name</td><td>GET DESCRIPTOR와 동일</td></tr><tr><td>host_var</td><td>출력 호스트 변수의 각 정보를 받아올 호스트 변수를 지정</td></tr></tbody></table>

* **예제**

다음은 SET DESCRIPTOR를 사용하는 예입니다.

```
EXEC SQL SET DESCRIPTOR 'output_descriptor' VALUE :occurs 
    TYPE = :type, LENGTH = :len;
```

#### **TYPE**

**TYPE**은 사용자가 지정한 데이터 타입을 외부 데이터 타입으로 지정할 때 사용하는 문장입니다. TYPE 문장을 통해서 호스트 변수의 타입을 사용자가 지정한 타입으로 변경하여 사용할 수 있습니다. TYPE 문장을 사용하기 위해선 사용자가 지정한 데이터 타입이 TYPE 문장 전에 반드시 선언되어 있어야 합니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/dV9fX4cRBaTISPaDw0lS/image.png" alt="" width="563"><figcaption></figcaption></figure></div>

* **구성요소**

**- type\_statement**

<table><thead><tr><th width="198">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>type_name</td><td>사용자가 지정한 데이터 타입의 이름을 명시</td></tr><tr><td>ext_datatype</td><td>사용자가 지정할 데이터 타입을 명시</td></tr><tr><td>length</td><td>데이터의 크기를 명시</td></tr><tr><td>reference</td><td>포인터 타입으로 사용할 것인지 지정</td></tr></tbody></table>

**- type\_name**

<table><thead><tr><th width="198">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>identifier</td><td><ul><li>외부 데이터 타입을 지정하게 될 데이터 타입을 명시</li><li>반드시 TYPE 문장 이전에 사용자가 지정한 데이터 타입 이름을 사용해야 함</li></ul></td></tr></tbody></table>

**- ext\_datatype**

<table><thead><tr><th width="200">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>STRING</td><td>STRING 타입을 지정</td></tr><tr><td>VARRAW</td><td>VARRAW 타입을 지정</td></tr><tr><td>LONG VARRAW</td><td>LONG VARRAW 타입을 지정</td></tr><tr><td>VARCHAR</td><td>VARCHAR 타입을 지정</td></tr><tr><td>VARCHAR2</td><td>VARCHAR2 타입을 지정</td></tr><tr><td>RAW</td><td>RAW 타입을 지정</td></tr><tr><td>LONG VARCHAR</td><td>LONG VARCHAR 타입을 지정</td></tr><tr><td>LONG RAW</td><td>LONG RAW 타입을 지정</td></tr><tr><td>CHARZ</td><td>CHARZ 타입을 지정</td></tr></tbody></table>

* **예제**

다음은 타입을 사용하는 예입니다.

```
struct example_s { 
    short len;
    char data[2000];
};
typedef struct example_s example_t;
EXEC SQL TYPE example_t IS VARRAW(2000);
```

#### **UPDATE**

**UPDATE**는 테이블 또는 뷰의 컬럼 값을 갱신할 때 사용하는 문장입니다. 일부 컬럼 또는 전체 컬럼에 대해 갱신을 수행할 수 있습니다. 문장을 사용할 때 입력 변수로 배열 변수를 사용할 수도 있으며, 지시자 변수를 함께 사용할 수 있습니다.

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

* **문법**\
  UPDATE의 문법에 대한 자세한 내용은 "[Tibero SQL 참조 안내서](/tibero-manuals/7.2.6.manuals/sql-reference-guide.md)"를 참고합니다.<br>
* **특권**\
  UPDATE를 사용해 갱신을 수행하려면, 대상 테이블 또는 뷰에 대한 UPDATE 객체 특권을 갖거나 UP DATE ANY TABLE 시스템 특권을 가지고 있어야 합니다.<br>
* **구성요소**

<table><thead><tr><th width="123">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>SET</td><td>SET 절에 입력 배열 변수가 포함되어 있다면, WHERE 절에도 반드시 같은 크기의 입력 배열 변수가 포함되어야 함</td></tr><tr><td>WHERE</td><td><ul><li>WHERE 절에 입력 배열 변수가 포함되어 있다면, SET 절에도 반드시 같은 크기의 입력 배열 변수가 포함되어야 함</li><li>UPDATE 문장을 커서와 함께 사용할 수도 있음</li><li>현재 커서가 가리키는 로우의 컬럼 값을 갱신하려면 WHERE 절에 CURRENT OF와 커서 이름을 포함시킴</li><li>커서를 사용하려면 커서는 이미 열려있는 상태이어야 함</li></ul></td></tr><tr><td>FOR</td><td><ul><li>입력 배열 변수를 사용할 때 FOR 절을 이용하여 삽입할 데이터의 개수를 지정할 수 있음</li><li>FOR 절이 포함되어 있지 않거나 FOR 절에서 지정한 개수가 입력 배열 변수의 크기보다 크다면, 전체 배열 변수에 저장된 데이터에 대하여 갱신을 수행</li></ul></td></tr></tbody></table>

* **예제**

다음은 UPDATE를 사용하는 예입니다.

```
EXEC SQL UPDATE EMP SET SALARY = SALARY * 1.05;

EXEC SQL UPDATE EMP SET SALARY = SALARY * :ratio 
    WHERE DEPTNO = :deptno;
    
EXEC SQL FOR :count UPDATE EMP
    SET SALARY = SALARY * :ratio_arr
    WHERE DEPTNO = :deptno_arr;
    
EXEC SQL UPDATE EMP SET SALARY = SALARY * 1.05
    WHERE CURRENT OF emp_cursor;
```

위의 예에서 알 수 있듯이 UPDATE 문장은 EXEC SQL로 시작한다는 것을 제외하면, 일반적인 SQL 문장의 문법과 크게 다르지 않습니다.

#### **VAR**

**VAR**는 특정 호스트 변수의 데이터 타입을 사용자가 지정한 데이터 타입으로 지정할 때 사용하는 문장입니다. 지정하고자 하는 데이터가 호스트 변수로 반드시 선언되어 있어야 합니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/ZPSWqSc8CpauMWo6QcZV/image.png" alt="" width="479"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/auEPaih0Kr6wXXDMi6T9/image.png" alt="" width="407"><figcaption></figcaption></figure></div>

* **구성요소**

**– var\_statement**

<table><thead><tr><th width="190">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>var_name</td><td>데이터 타입을 지정하고자 하는 호스트 변수를 명시</td></tr><tr><td>ext_datatype</td><td>사용자가 지정할 데이터 타입을 명시</td></tr><tr><td>length</td><td>데이터의 크기를 명시</td></tr></tbody></table>

**- var\_name**

<table><thead><tr><th width="194">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>identifier</td><td><ul><li>데이터 타입을 지정하게 될 호스트 변수를 명시</li><li>반드시 VAR 문장 이전에 호스트 변수로 지정된 변수명을 사용해야 함</li></ul></td></tr></tbody></table>

**- ext\_datatype**

<table><thead><tr><th width="196">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>STRING</td><td>STRING 타입을 지정</td></tr><tr><td>VARRAW</td><td>VARRAW 타입을 지정</td></tr><tr><td>LONG VARRAW</td><td>LONG VARRAW 타입을 지정</td></tr><tr><td>VARCHAR</td><td>VARCHAR 타입을 지정</td></tr><tr><td>VARCHAR2</td><td>VARCHAR2 타입을 지정</td></tr><tr><td>RAW</td><td>RAW 타입을 지정</td></tr><tr><td>LONG VARCHAR</td><td>LONG VARCHAR 타입을 지정</td></tr><tr><td>LONG RAW</td><td>LONG RAW 타입을 지정</td></tr><tr><td>CHARZ</td><td>CHARZ 타입을 지정</td></tr></tbody></table>

**- length**

<table><thead><tr><th width="197">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>length_size</td><td>데이터 타입의 크기를 지정</td></tr></tbody></table>

* **예제**

다음은 VAR를 사용하는 예입니다.

```
EXEC SQL BEGIN DECLARE SECTION;
    char buffer[100];
    EXEC SQL VAR buffer IS RAW(100); 
EXEC SQL END DECLARE SECTION;
```

#### **WHENEVER**

**WHENEVER**는 tbESQL/C 프로그램을 실행하는 도중, 예외 상황이 발생했을 경우에 대비하여 수행할 작업을 선언할 때 사용하는 문장입니다. 발생 가능한 예외 상황에는 액세스할 로우가 없는 경우와 에러 또는 경고가 발생한 경우가 있습니다.

WHENEVER 문장의 효과 범위는 WHENEVER 문장이 명시된 위치부터 다음 WHENEVER 문장이 나타날 때까지입니다. 하지만 문장이 한 번만 명시되었다면 효과 범위는 WHENEVER 문장이 명시된 위치부터 프로그램의 마지막까지입니다.

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

* **문법**

<div align="left"><figure><img src="https://content.gitbook.com/content/vsuQoLlX5q3tCygE0z24/blobs/X8FqzDp5WXa3nkVRvuG5/image.png" alt="" width="401"><figcaption></figcaption></figure></div>

* 구성요소

**- whenever\_statement\_c**

<table><thead><tr><th width="219">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>condition</td><td>에러나 경고 또는 결과 로우가 없는 등의 예외 상황을 명시</td></tr><tr><td>condition_action_c</td><td>예외 상황이 발생했을 경우 그에 따른 대처 방법을 명시</td></tr></tbody></table>

**- condition**

<table><thead><tr><th width="217">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>SQLERROR</td><td>에러가 발생한 경우</td></tr><tr><td>SQLWARNING</td><td>경고가 발생한 경우</td></tr><tr><td><p>NOT FOUND 또는</p><p>NOTFOUND</p></td><td>질의 결과 로우가 없거나 커서를 사용해 읽을 로우가 더 이상 없는 경우</td></tr></tbody></table>

**- condition\_action\_c**

<table><thead><tr><th width="220">구성요소</th><th>설명</th></tr></thead><tbody><tr><td>CONTINUE</td><td>다음 라인부터 프로그램을 계속 진행</td></tr><tr><td>DO CONTINUE</td><td>루프 내에서 CONTINUE를 실행</td></tr><tr><td>DO BREAK</td><td>루프 내에서 BREAK를 실행</td></tr><tr><td>DO do_stmt</td><td>C 프로그래밍 언어로 작성한 에러 처리 문장을 수행</td></tr><tr><td>STOP</td><td>현재 트랜잭션을 롤백하고 프로그램을 정지</td></tr><tr><td>GOTO label</td><td>해당 label이 있는 곳으로 이동하여 프로그램을 진행</td></tr></tbody></table>

* **예제**

다음은 WHENEVER를 사용하는 예입니다.

```
EXEC SQL WHENEVER NOT FOUND DO BREAK;

EXEC SQL WHENEVER SQLERROR DO sql_error();

EXEC SQL WHENEVER SQLWARNING GOTO handle_warning;
```
