C External Procedure 생성

Tibero DBMS에서 제공하는 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

초기화 파라미터
설명

LOG_DIR

tbEPA 로그 파일을 저장할 경로입니다. (기본값: $TB_HOME/client/tbepa)

LOG_LVL

로그 파일에 남길 로그의 레벨입니다. (기본값: 2)

MAX_LOG_SIZE

로그 파일의 최대 크기입니다. (기본값: 0, 단위: Byte)

  • 값이 0인 경우 : 로그 파일의 최대 크기를 설정하는 데 제한없음

  • 값을 명시한 경우 : 로그 파일이 설정된 최대 크기를 초과하면 로그 파일을 백업

MAX_LOG_BACKUP_SIZE

백업 디렉터리의 로그 파일들의 최대 크기입니다. (기본값: 0, 단위: Byte)

  • 값이 0인 경우 : 백업 디렉터리에 있는 로그 파일들의 크기의 합을 설정 하는 데 제한이 없음

  • 값을 명시한 경우 : 백업 디렉터리에 있는 로그 파일들의 크기의 합이 설 정된 최대 크기를 초과하는 경우, 가장 오래된 로그파일 1/3을 삭제

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

로그 레벨

로그 레벨명

설명

1

ERROR

에러와 관련된 이벤트입니다.

2

WARNING

경고와 관련된 이벤트입니다.

3

INFO

함수 호출 등과 관련된 기본적인 트레이스 이벤트입니다.

4

DEBUG

디버깅을 위한 구체적인 트레이스 이벤트입니다.

5

TRACE

매우 자세한 트레이스 이벤트입니다.


생성 절차

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

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

2. Library Object 등록

3. PSM에 사용자 함수 대응

4. 사용자 함수 실행

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

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

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

2. Library Object 등록

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

Library Object를 등록하는 문법은 아래와 같습니다.

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

항목

설명

schema_name

스키마 객체의 이름입니다.

library_name

Library Object의 이름입니다.

file_path

사용자 공유 라이브러리 파일이 존재하는 절대 경로입니다.

CREATE LIBRARY 문을 실행하려면, CREATE LIBRARY라는 권한이 필요합니다.

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

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

3. PSM에 사용자 함수 대응

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

아래는 일반적인 PSM를 선언하는 문법입니다.

CREATE OR REPLACE {FUCTION | PROCEDURE | PACKAGE}

{IS | AS} LANGUAGE C
LIBRARY library_name
[NAME c_string_literal_name] 
[WITH CONTEXT]
[PARAMETERS (external_parameter[, external_parameter]...)];

항목

설명

library_name

Library Object의 이름입니다.

c_string_literal_name

현재 PSM과 대응할 사용자 함수명입니다.

WITH CONTEXT

C External Procedure 유틸리티를 사용하고 있음을 명시할 때 사용합니다.

(자세한 내용은 “C External Procedure 유틸리티”, “Callback Service” 참고)

PARAMETERS (external_parameter)

사용자 함수의 파라미터를 PSM 파라미터와 대응시킬 때 사용 합니다.

(자세한 내용은 “파라미터 매핑” 참고)

아래는 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);

4. 사용자 함수 실행

사용자 함수는 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 

Last updated