C External Procedure 유틸리티
사용자 공유 라이브러리 함수를 작성하는 데 유용한 C External Procedure 유틸리티를 설명 합니다.
C External Procedure에서는 사용자가 공유 라이브러리 함수를 구현하는 데 도움이 되는 몇 가지 API를 제공하고 있습니다. 이러한 API를 C External Procedure 유틸리티라고 합니다.
C External Procedure 유틸리티에 포함된 함수는 아래와 같습니다.
SQLExtProcAllocMemory
SQLExtProcRaiseError
SQLExtProcRaiseErrorWithMsg
이러한 함수를 사용하기 위해서는 Tibero에서 제공하는 ExtProcContext 구조체를 알아야 하며, 사용자가 공유 라이브러리를 작성할 때와 PSM으로 등록할 때 특별한 처리가 필요합니다.
C External Procedure 유틸리티 사용
C External Procedure 유틸리티를 사용하려면 tbEPA 프로세스에 이 유틸리티를 사용하겠다는 내용을 명시하고, 사용자 공유 라이브러리 또한 이 점을 감안하여 작성해야 합니다.
tbEPA 프로세스에 이러한 정보를 전달하기 위해서는 해당 사용자 공유 라이브러리 함수를 PSM으로 등록시킬 때 WITH CONTEXT 문법을 명시해야 하며, 사용자 공유 라이브러리 함수의 첫 번째 파라미터는 무조건 ExtProcContext *로 해야 합니다. ExtProcContext는 extproc.h 파일에 정의되어 있으며, tbEPA 프로세스에서 해당 C External Procedure 유틸리티 내의 함수를 처리해주는 채널로 사용합니다.
사용자 공유 라이브러리 함수 작성 시 유의 사항
Tibero는 사용자 공유 라이브러리 함수를 작성할 때 C External Procedure 유틸리티를 사용하는 경우를 대비하여 $TB_HOME/client/include 디렉터리에 있는 extproc.h 파일을 제공합니다. 만약 사용자가 작성할 공유 라이브러리 함수가 C External Procedure 유틸리티 내의 함수를 사용할 예정이라면 반드시 extproc.h 파일을 포함해야 합니다.
예를 들면 아래와 같습니다.
사용자 공유 라이브러리 함수를 PSM으로 등록 시 유의 사항
“사용자 함수를 PSM에 대응”을 보면 [WITH CONTEXT] 문법을 볼 수 있습니다. 이것이 바로 C External Procedure 유틸리티를 사용하고 있음을 DBMS에 알려주는 것이고, 이렇게 생성된 PSM을 수행할 경우에는 해당 정보를 tbEPA 프로세스에게 전달합니다.
그러면 tbEPA 프로세스는 해당 라이브러리를 로드하여 사용자 함수로 파라미터를 보낼 때 첫 번째 파라미터로 ExtProcContext의 포인터를 전달합니다.
위의 예처럼 PARAMETERS 문법을 명시할 경우 반드시 첫 번째 파라미터는 CONTEXT로 해야 합니다.
WITH CONTEXT 문법만 명시하고 PARAMETERS 문법을 생략하는 경우, 첫 번째 파라미터는 CONTEXT가 되고 두 번째 파라미터부터 해당 PSM 파라미터가 전달된다는 점에 주의합니다.
C External Procedure 유틸리티
본 절에서는 C External Procedure 유틸리티에서 제공하는 함수를 설명합니다.
SQLExtProcAllocMemory 함수
사용자가 작성한 공유 라이브러리 함수에서 동적으로 메모리 할당이 필요한 경우가 있습니다. 일반적으로 malloc, calloc 등의 함수를 사용하여 런타임 시 메모리를 할당받을 수 있으나, 만약 이 값을 반환 값 등으 로 사용할 경우 할당된 메모리를 해제하는 시점이 애매한 경우가 발생합니다.
이러한 문제를 해결하기 위해 C External Procedure 유틸리티에서는 SQLExtProcAllocMemory 함수를 제공합니다. 이 함수를 사용하면 사용자가 메모리를 동적으로 할당할 수 있으며, 할당된 메모리를 별도로 해제할 필요가 없습니다. 할당된 메모리는 해당 함수가 실행된 이후에 자동으로 해제됩니다.
SQLExtProcAllocMemory 함수의 세부 내용은 아래와 같습니다.
문법
파라미터
파라미터
설명
ExtProcContext *
ExtProcContext 구조체의 포인터입니다.
size
할당받을 메모리의 크기입니다.
반환 값
성공여부
설명
성공
동적으로 할당한 메모리의 시작 주소를 반환합니다.
실패
NULL을 반환합니다.
예제
SQLExtProcRaiseError 함수
사용자 공유 라이브러리 함수를 수행하는 중에 에러가 발생하거나 에러를 발생시켜야 하는 경우 그 반환 값을 이용하여 PSM 내에서 에러 핸들링 과정을 구현할 수 있습니다. 단, 사용자가 원하는 로직을 구현하기 위 해서는 사용자 공유 라이브러리 함수뿐만 아니라 그 함수와 대응되는 PSM이 사용되는 모든 곳에 에러 핸들링 과정이 필요하다는 단점이 있습니다.
C External Procedure 유틸리티에서는 사용자 공유 라이브러리 함수에서 직접 DBMS 에러를 발생시켜 앞에서 언급한 단점을 해결할 수 있는 함수를 제공합니다.
이 함수를 이용하면 사용자 공유 라이브러리 함수 내에서 DIVIDE BY ZERO, NUMBER EXCEEDS PRECISION 등의 에러를 발생시킬 수 있습니다. 이러한 기능을 수행하는 함수가 바로 SQLExtProcRaiseError입니다.
이 함수는 Callback Service 에서도 사용할 수 있습니다.
SQLExtProcRaiseError 함수의 세부 내용은 아래와 같습니다.
문법
파라미터
파라미터
설명
ExtProcContext *
ExtProcContext 구조체의 포인터입니다.
errcode
에러를 발생시킬 에러 코드의 번호입니다.
(에러 코드에 대한 자세한 내용은 "Tibero 에러 참조 안내서"를 참고)
예제
SQLExtProcRaiseErrorWithMsg 함수
SQLExtProcRaiseError 함수와 같이 에러를 발생시키는 함수입니다. 또한 사용자가 정의한 에러도 발생 시킬 수 있습니다.
SQLExtProcRaiseErrorWithMsg 함수의 세부 내용은 아래와 같습니다.
문법
파라미터
파라미터
설명
ExtProcContext *
ExtProcContext 구조체의 포인터입니다.
errcode
사용자가 정의한 에러 코드(20000 ~ 20999)입니다.
*errmsg
사용자가 정의한 에러 메시지입니다.
예제
Last updated

