> 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/external-procedure-guide/c-external-procedures/creating-c-external-procedures.md).

# C External Procedure 생성

C External Procedure를 생성하는 절차를 기본 환경 설정과 생성 절차 단계로 나누어 설명합니다.

## 기본 환경 설정

C External Procedure는 이전 장에서도 언급했듯이 tbEPA 프로세스에 의해 수행됩니다. tbEPA 프로세스를 실행하는 바이너리 파일은 $TB\_HOME/client/bin 디렉터리에 존재합니다.

본 절에서는 C External Procedure를 생성하기에 앞서 먼저 tbEPA 프로세스를 실행하기 위한 기본 환경을 설정하는 방법을 설명합니다.

### 초기화 파라미터

tbEPA 프로세스는 처음 실행될 때 사용자가 설정한 초기화 파라미터를 먼저 확인합니다. 초기화 파라미터는 $TB\_HOME/client/tbepa 디렉터리의 tbepa.cfg 파일에서 설정할 수 있으며, 만약 설정한 초기화 파라미터가 없으면 디폴트로 정의된 속성을 따르게 됩니다.

tbEPA 프로세스의 실행과 관련하여 사용자가 설정할 수 있는 초기화 파라미터는 다음과 같습니다.

<\<tbepa.cfg>>

```
LOG_DIR=/tmp/epa_log 
LOG_LVL=2 
MAX_LOG_SIZE=20k
```

<table><thead><tr><th width="243">초기화 파라미터</th><th>설명</th></tr></thead><tbody><tr><td>LOG_DIR</td><td>tbEPA 로그 파일을 저장할 경로<br>(기본값: $TB_HOME/client/tbepa)</td></tr><tr><td>LOG_LVL</td><td>로그 파일에 남길 로그의 레벨(기본값: 2)</td></tr><tr><td>MAX_LOG_SIZE</td><td><p>로그 파일의 최대 크기 (기본값: 0, 단위: Byte)</p><ul><li>값이 0인 경우: 로그 파일의 최대 크기를 설정하는 데 제한 없음</li><li>값을 명시한 경우: 로그 파일이 설정된 최대 크기를 초과하면 로그 파일을 백업</li></ul></td></tr><tr><td>MAX_LOG_BACKUP_SIZE</td><td><p>백업 디렉터리의 로그 파일들의 최대 크기<br>(기본값: 0, 단위: Byte)</p><ul><li>값이 0인 경우: 백업 디렉터리에 있는 로그 파일들의 크기의 합을 설정하는 데 제한이 없음</li><li>값을 명시한 경우: 백업 디렉터리에 있는 로그 파일들의 크기의 합이 설정된 최대 크기를 초과하는 경우, 가장 오래된 로그 파일 1/3을 삭제</li></ul></td></tr></tbody></table>

tbepa.cfg 파일에서 초기화 파라미터 LOG\_LVL은 1부터 5 사이의 로그 레벨의 값을 설정할 수 있습니다. 각 로그 레벨에 대한 설명은 다음과 같습니다.

<table><thead><tr><th width="149">로그 레벨</th><th width="154">로그 레벨명</th><th>설명</th></tr></thead><tbody><tr><td>1</td><td>ERROR</td><td>에러와 관련된 이벤트</td></tr><tr><td>2</td><td>WARNING</td><td>경고와 관련된 이벤트</td></tr><tr><td>3</td><td>INFO</td><td>함수 호출 등과 관련된 기본적인 트레이스 이벤트</td></tr><tr><td>4</td><td>DEBUG</td><td>디버깅을 위한 구체적인 트레이스 이벤트</td></tr><tr><td>5</td><td>TRACE</td><td>매우 자세한 트레이스 이벤트</td></tr></tbody></table>

## 생성 절차

C External Procedure를 생성하기 위해서는 다음과 같은 세부 절차를 수행해야 합니다.

1. 사용자 공유 라이브러리 생성
2. Library Object 등록
3. 사용자 함수를 PSM에 대응
4. 사용자 함수 실행

### 사용자 공유 라이브러리 생성

C 프로그래밍 언어에서 동적으로 호출할 수 있는 사용자 공유 라이브러리를 생성합니다. 생성하는 순서는 다음과 같습니다.

1. C 함수를 작성합니다.

<\<extproc.c>>

```
long find_max(long x, long y)
{
    if (x >= y) return x;
    else return y;
}
```

2. 컴파일을 수행합니다.

다음은 UNIX 계열(Linux 포함)에서 컴파일을 수행하는 예입니다.

```
cc -g -fpic -shared -o libextproc.so extproc.c
```

3. 컴파일이 완료되면, libextproc.so라는 사용자 공유 라이브러리가 생성됩니다.

### Library Object 등록

Library Object는 사용자 공유 라이브러리 파일을 Tibero에 대응시키는 것으로 일종의 스키마 객체를 의미합니다.

Library Object를 등록하는 문법은 다음과 같습니다.

```
CREATE LIBRARY [schema_name.]library_name
{IS | AS} 'file_path';
```

<table><thead><tr><th width="194">항목</th><th>설명</th></tr></thead><tbody><tr><td>schema_name</td><td>스키마 객체의 이름</td></tr><tr><td>library_name</td><td>Library Object의 이름</td></tr><tr><td>file_path</td><td>사용자 공유 라이브러리 파일이 존재하는 절대 경로</td></tr></tbody></table>

{% hint style="info" %}
**참고**\
CREATE LIBRARY 문을 실행하려면, CREATE LIBRARY라는 권한이 필요합니다.
{% endhint %}

다음은 생성한 사용자 공유 라이브러리 파일을 이용하여 'extproc'이라는 Library Object를 Tibero에 등록하는 예입니다.

```
CREATE LIBRARY extproc
IS '/usr/mylib/libextproc.so';
/
```

### 사용자 함수를 **PSM**에 대응

Library Object를 등록한 후 해당 Library Object 내의 특정 함수를 PSM 개체로 등록하면 C External Procedure를 생성할 수 있습니다. 사용자는 일반적인 PSM을 사용하는 인터페이스 그대로 함수를 호출할 수 있습니다.

다음은 일반적인 PSM을 선언하는 문법입니다.

```
CREATE OR REPLACE {FUNCTION | PROCEDURE | PACKAGE}
…
{IS | AS}
LANGUAGE C
LIBRARY library_name
[NAME c_string_literal_name] 
[WITH CONTEXT]
[PARAMETERS (external_parameter[, external_parameter]...)];
```

<table><thead><tr><th width="223">항목</th><th>설명</th></tr></thead><tbody><tr><td><em>library_name</em></td><td>Library Object의 이름</td></tr><tr><td><em>c_string_literal_name</em></td><td>현재 PSM과 대응할 사용자 함수명</td></tr><tr><td>WITH CONTEXT</td><td><ul><li>C External Procedure 유틸리티를 사용하고 있음을 명시할 때 사용</li><li>자세한 내용은 “<a href="/tibero-manuals/7.2.6.manuals/external-procedure-guide/c-external-procedures/c-external-procedure-utility.md">C External Procedure 유틸리티</a>”, “<a href="/pages/TQYU5HfE3yP1kgAnJvOb#id-4.2.-callback-service">Callback Service</a>”를 참고</li></ul></td></tr><tr><td>PARAMETERS (external_parameter)</td><td><ul><li>사용자 함수의 파라미터를 PSM 파라미터와 대응시킬 때 사용</li><li>external_parameter에 대한 내용은 “<a href="/tibero-manuals/7.2.6.manuals/external-procedure-guide/c-external-procedures/executing-c-external-procedures.md#undefined">파라미터 매핑</a>”을 참고</li></ul></td></tr></tbody></table>

다음은 Library Object 내의 특정 함수(find\_max)를 PSM에 대응하는 예입니다.

```
CREATE OR REPLACE FUNCTION ext_find_max(num1 BINARY_INTEGER, num2 BINARY_INTEGER)
  RETURN BINARY_INTEGER 
  AS LANGUAGE C
  LIBRARY extproc
  NAME "find_max"
  PARAMETERS(num1 int, num2 int);
/
```

### 사용자 함수 실행

사용자 함수는 Tibero 상의 하나의 PSM에 대응되므로, PSM의 문법을 사용할 수 있습니다. 다음은 PSM의 문법을 이용하여 C External Procedure를 실행하는 예입니다.

```
SQL> CREATE TABLE TBL (COL1 NUMBER, COL2 NUMBER);
Table 'TBL' created.

SQL> INSERT INTO TBL VALUES(1, 2);
1 row inserted.

SQL> INSERT INTO TBL VALUES(5, 3);
1 row inserted.

SQL> INSERT INTO TBL VALUES(7, 9);
1 row inserted.

SQL> select col1, col2, ext_find_max(col1, col2) as max from tbl; 
      col1	  col2	       max
-----------  ---------- -----------
         1           2           2
         5           3           5
         7           9           9 
```
