Altibase Stored Procedure Manual

Similar documents
금오공대 컴퓨터공학전공 강의자료

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

Altibase Starting User's Manual

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Altibase Installation Manual

PowerPoint Presentation

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

13주-14주proc.PDF

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - additional01.ppt [호환 모드]

ALTIBASE HDB Patch Notes

강의 개요

C++ Programming

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint Template

C++ Programming

11장 포인터

Microsoft PowerPoint - chap10-함수의활용.pptx

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

문서 템플릿

금오공대 컴퓨터공학전공 강의자료

C# Programming Guide - Types

17장 클래스와 메소드

chap 5: Trees

ALTIBASE 사용자가이드 Templete

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

UI TASK & KEY EVENT

Microsoft PowerPoint - C++ 5 .pptx

슬라이드 1

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Microsoft Word - 05_SUBPROGRAM.doc

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - chap06-1Array.ppt

DBMS & SQL Server Installation Database Laboratory

PowerPoint Presentation

Microsoft PowerPoint - e pptx

쉽게

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

MySQL-.. 1

설계란 무엇인가?

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

PowerPoint Presentation

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

OCW_C언어 기초

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

Visual Basic 반복문

PowerPoint 프레젠테이션

슬라이드 1

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

Microsoft PowerPoint - 10Àå.ppt

컴파일러

로거 자료실

K&R2 Reference Manual 번역본

PowerPoint 프레젠테이션

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - CSharp-10-예외처리

11장 포인터

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

PowerPoint Presentation

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

02장.배열과 클래스

6장. SQL

The Pocket Guide to TCP/IP Sockets: C Version

Altibase Stored Procedure Manual

Microsoft PowerPoint - [2009] 02.pptx

untitled

4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona

Windows 8에서 BioStar 1 설치하기

PowerPoint 프레젠테이션

Microsoft PowerPoint 세션.ppt

Microsoft PowerPoint - chap03-변수와데이터형.pptx

게시판 스팸 실시간 차단 시스템

설계란 무엇인가?

vi 사용법

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 08.다형성

PowerPoint 프레젠테이션

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

ISP and CodeVisionAVR C Compiler.hwp

Microsoft PowerPoint - chap01-C언어개요.pptx


Microsoft PowerPoint - chap06-5 [호환 모드]

제1장 Unix란 무엇인가?

untitled

2009년 상반기 사업계획

Transcription:

ALTIBASE HDB Application Development C/C++ External Procedures Manual Release 6.3.1 (April 16, 2015)

----------------------------------------------------------- ALTIBASE Application Development C/C++ External Stored Procedures Manual Release 6.3.1 Copyright c 2001~2015 ALTIBASE Corp. All Rights Reserved. 본문서의저작권은 알티베이스에있습니다. 이문서에대하여당사의동의없이무단으로복제또는전용할수없습니다. 알티베이스 152-790 서울시구로구구로동 182-13 대륭포스트타워 Ⅱ 10 층전화 : 02-2082-1114 팩스 : 02-2082-1099 고객서비스포털 : http://support.altibase.com homepage: http://www.altibase.com -----------------------------------------------------------

목차 서문 5 이매뉴얼에대하여 6 1. C/C++ 외부프로시저소개 11 C/C++ 외부프로시저란? 12 2. 외부프로시저사용법 15 자료형과데이터베이스객체 16 기본사용법 18 관련메타테이블과성능뷰 26 관련프로퍼티 27 3. 외부프로시저용 SQL문 29 CREATE LIBRARY statement 30 ALTER LIBRARY statement 31 DROP LIBRARY statement 32 CREATE PROCEDURE statement 33 DROP PROCEDURE statement 37 CREATE FUNCTION 38 DROP FUNCTION 41 EXECUTE 42 찾아보기 43 목차 3

서문 서문 5

이매뉴얼에대하여 이매뉴얼은 C/C++ 외부프로시저및함수 ( 이하 C/C++ 외부 프로시저또는외부프로시저 ) 의개념및사용방법에대해설명한다. 대상사용자 이매뉴얼은다음과같은 ALTIBASE HDB 사용자를대상으로작성되었다. 데이터베이스관리자 성능관리자 데이터베이스사용자 응용프로그램개발자다음과같은배경지식을가지고이매뉴얼을읽는것이좋다. 컴퓨터, 운영체제및운영체제유틸리티운용에필요한기본지식 관계형데이터베이스사용경험또는데이터베이스개념에대한이해 컴퓨터프로그래밍경험 소프트웨어환경 이매뉴얼은데이터베이스서버로 ALTIBASE HDB 버전 6.3.1 을 사용한다는가정하에작성되었다. 이매뉴얼의구성 이매뉴얼은다음과같이구성되어있다. 제 1 장 C/C++ 외부프로시저소개이장에서는 C/C++ 외부프로시저를소개한다. 외부프로시저가필요한경우를소개하고, ALTIBASE HDB 외부프로시저의특징에대해살펴본다. 제 2 장외부프로시저사용법이장에서는 C/C++ 외부프로시저를작성하는방법을설명한다. 6 C/C++ External Procedures Manual

제 3 장외부프로시저용 SQL 문 이장은 ALTIBASE HDB 에서외부프로시저를사용하기위해 지원하는 SQL 문을설명한다. 문서화규칙 이절에서는이매뉴얼에서사용하는규칙에대해설명한다. 이규칙을이해하면이매뉴얼과설명서세트의다른매뉴얼에서정보를쉽게찾을수있다. 여기서설명하는규칙은다음과같다. 구문다이어그램 샘플코드규칙 구문다이어그램 이매뉴얼에서는다음구성요소로구축된다이어그램을사용하여, 명령문의구문을설명한다. 구성요소 예약어 의미명령문이시작한다. 완전한명령문이아닌구문요소는화살표로시작한다. 명령문이다음라인에계속된다. 완전한명령문이아닌구문요소는이기호로종료한다. 명령문이이전라인으로부터계속된다. 완전한명령문이아닌구문요소는이기호로시작한다. ; 명령문이종료한다. SELECT 필수항목 선택적항목 NOT ADD 선택사항이있는필수항목. 한항목만제공해야한다. DROP 선택사항이있는선택적항목. ASC DESC 서문 7

ASC 선택적항목. 여러항목이허용된다. 각반복앞부분에 콤마가와야한다. DESC, 샘플코드규칙 코드예제는 SQL, Stored Procedure, isql, 또는다른명령라인 구문들을예를들어설명한다. 아래테이블은코드예제에서사용된인쇄규칙에대해설명한다. 규칙 의미 예제 [ ] 선택항목을표시 VARCHAR [(size)] [[FIXED ] VARIABLE] 필수항목표시. 반드시하나이상을선택해야되는표시 ENABLE DISABLE COMPILE 선택또는필수항목표시의인자구분표시 ENABLE DISABLE COMPILE [ ENABLE DISABLE COMPILE ]... 그이전인자의반복표시예제코드들의생략되는것을표시 SQL> SELECT ename FROM employee; ENAME ------------------------ SWNO HJNO HSCHOI... 20 rows selected. 그밖에기호 위에서보여진기호이외에기호들 EXEC :p1 := 1; acc NUMBER(11,2); 기울임꼴 구문요소에서사용자가지정해야하는변수, 특수한값을제공해야만하는위치지정자 SELECT * FROM table_name; CONNECT userid/password; 8 C/C++ External Procedures Manual

소문자사용자가제공하는프로그램의요소들, 예를들어테이블이름, 칼럼이름, 파일이름등대문자시스템에서제공하는요소들또는구문에나타나는키워드 SELECT ename FROM employee; DESC SYSTEM_.SYS_INDICES_; 샘플스키마 이매뉴얼내의예제중의일부는 employees, departments 및 orders 테이블같은샘플테이블에기반하여작성되었다. 이들테이블은 $ALTIBASE_HOME/sample/APRE/schema 디렉터리의 schema.sql 을사용하여생성할수있다. 샘플스키마에대한온전한정보는 General Reference 를참고하기바란다. 관련자료 자세한정보를위하여다음문서목록을참조하기바란다. Installation Guide Getting Started Guide SQL Reference isql User s Manual Error Message Reference 온라인매뉴얼 Altibase 고객서비스포털 (http://support.altibase.com) 에서국문및영문매뉴얼 (PDF, HTML) 을받을수있다. Altibase 는여러분의의견을환영합니다. 이매뉴얼에대한여러분의의견을보내주시기바랍니다. 사용자의의견은다음버전의매뉴얼을작성하는데많은도움이됩니다. 보내실때에는아래내용과함께고객서비스포털 (http://support.altibase.com/kr/) 로보내주시기바랍니다. 서문 9

사용중인매뉴얼의이름과버전 매뉴얼에대한의견 사용자의성함, 주소, 전화번호이외에도 Altibase 기술지원설명서의오류와누락된부분및기타기술적인문제들에대해서이주소로보내주시면정성껏처리하겠습니다. 또한, 기술적인부분과관련하여즉각적인도움이필요한경우에도고객서비스포털을통해서비스를요청하시기바랍니다. 여러분의의견에항상감사드립니다. 10 C/C++ External Procedures Manual

1. C/C++ 외부프로시저소개 이장에서는 C/C++ 외부프로시저및함수 ( 이하 C/C++ 외부프로시저또는외부프로시저 ) 를소개한다. 외부프로시저가필요한경우를소개하고, ALTIBASE HDB 외부프로시저의특징에대해살펴본다. C/C++ 외부프로시저소개 11

C/C++ 외부프로시저란? C/C++ 외부프로시저 (external procedures) 란 C 또는 C++ 언어로작성되고컴파일되어동적링크라이브러리 (Dynamic Link Library, DLL) 에저장된함수이다. 외부프로시저는 HDB 의외부프로시저객체를통해실행될수있으며, 실행방법은 SQL 문또는응용프로그램내에서저장프로시저를호출하는것과동일하다. 특징 ALTIBASE HDB 가제공하는외부프로시저는아래와같은특징및장점이있다. C/C++ 외부프로시저바디의구현과프로시저호출스펙이서로연관이없으므로, C/C++ 외부프로시저바디를수정해도프로시저를호출하는프로그램은수정할필요가없다. C/C++ 외부프로시저의실행과 HDB 서버프로세스가분리되어있기때문에, 사용자가작성한 C/C++ 외부프로시저에문제가있어도데이터베이스에영향을주지않는다. 기존의 PSM( 저장프로시저 ) 이지원하지않는 C/C++ 언어만의기능을사용할수있다. 일부연산집약적인작업은 C 언어와같은저수준프로그래밍언어로작성할때가장효율적으로실행된다. 기존에작성되어있는 C/C++ 함수를외부프로시저화하는것만으로 PSM 에서직접호출할수있다. 즉, 한번작성한 C/C++ 함수의재사용이가능하여개발비용을줄일수있다. 외부프로시저호출흐름 외부프로시저는저장프로시저 (Stored Procedure, PSM) 와마찬가지로클라이언트세션에서호출할수있다. 아래는외부프로시저생성에서호출까지의전반적인흐름이다. 사용자가 C 또는 C++ 언어로작성한함수 (ALTIBASE HDB 가지원하는외부프로시저형식 ) 를동적라이브러리로만들어 ALTIBASE HDB 가식별할수있는위치에저장한다음, SQL 구문을이용해서외부프로시저객체 ( 외부프로시저를등록하는저장프로시저 ) 를생성한다. 12 C/C++ External Procedures Manual

다음으로클라이언트세션에서외부프로시저를등록한저장프로시저를호출하면, ALTIBASE HDB 서버는에이전트프로세스를시작한다. 에이전트프로세스는외부프로시저와관련된동적라이브러리파일을로딩하고라이브러리내의관련 C/C++ 함수를실행하여결과를 HDB 서버로전달하면 HDB 서버가클라이언트에그결과를반환한다. 아래는클라이언트가호출한외부프로시저가에이전트프로세스를통해실행되는흐름을도식화한그림이다. [ 그림 1-1] 외부프로시저호출및수행흐름도 에이전트프로세스 에이전트프로세스는외부프로시저용 C/C++ 함수가저장된 DLL 파일을불러오고그안의함수를실행하기위해서 ALTIBASE HDB 서버가별도로생성하는프로세스이다. 클라이언트세션에서외부프로시저를등록한저장프로시저를호출하면 ALTIBASE HDB 서버가외부프로시저용에이전트프로세스 (Agent Process) 를시작한다. 그리고외부프로시저의수행이완료되면, ALTIBASE HDB 서버는잠시대기한후다른외부프로시저의수행이없다면에이전트프로세스를종료한다. 에이전트프로세스는 HDB 서버의서비스세션에종속되어있기때문에, n 개의클라이언트세션에서외부프로시저를호출하는경우 C/C++ 외부프로시저소개 13

n 개의에이전트프로세스가생성된다. 그리고세션이종료하면해당 세션이생성한에이전트프로세스도종료한다. 14 C/C++ External Procedures Manual

2. 외부프로시저사용법 이장에서는 ALTIBASE HDB 에서외부프로시저를사용하는방법을설명한다. 먼저, 외부프로시저를위해지원되는 C/C++ 자료형과데이터베이스객체에대해알아보고, ALTIBASE HDB 서버가인식할수있는동적라이브러리를작성하고생성하는방법을설명한다. 외부프로시저용사용법 15

자료형과데이터베이스객체 이절은외부프로시저작성을위해지원하는자료형과외부프로시저사용을위해제공하는외부라이브러리객체와외부프로시저객체를소개한다. 자료형 아래는외부프로시저객체생성시인자에사용할수있는 PSM 자료형과사용자정의 C/C++ 함수의인자에사용할수있는자료형을연결한표이다. 인자의입 / 출력모드에따라사용자정의 C/C++ 함수에서는포인터형을써야할수있으므로주의해서살펴보기바란다. PSM 자료형 IN INOUT/OUT RETURN 비고 BIGINT long long long long * long long BOOLEAN char char * char SMALLINT INTEGER int int * int REAL float float * float DOUBLE double double * double CHAR VARCHAR NCHAR char * char * char * NVARCHAR NUMERIC DECIMAL NUMBER double double * double FLOAT DATE SQL_TIME SQL_TIMESTA SQL_TIMESTAM STAMP_S MP_STRUCT P_STRUCT * TRUCT BOOLEAN의경우에는아래두가지값을허용한다. 0: FALSE 1: TRUE Precision이높은인자는 double 형으로변환하는과정에서데이터손실이발생할수있다. 16 C/C++ External Procedures Manual

INTERVAL SQL_TIMESTA MP_STRUCT SQL_TIMESTAM P_STRUCT * SQL_TIME STAMP_S TRUCT 외부라이브러리객체 사용자정의함수, 즉외부프로시저를포함하는동적라이브러리파일을 ALTIBASE HDB 서버가식별할수있도록해주어야한다. 이를위해 ALTIBASE HDB 는외부라이브러리객체라는데이터베이스객체를제공하며, 객체관리를위한 SQL 구문도함께제공한다. 외부프로시저를저장프로시저처럼사용하기위해사용자는먼저외부라이브러리객체를생성해야하며, 관련된동적라이브러리파일을 $ALTIBASE_HOME/lib 디렉토리에두어야한다. 동적라이브러리파일없이외부프로시저객체를생성하는것이가능하지만, 외부프로시저를실행할때에는반드시관련동적라이브러리파일이존재해야한다. 외부프로시저 / 함수객체 ALTIBASE HDB 는외부프로시저를등록한저장프로시저를일반적인저장프로시저와구별해서외부프로시저객체라고한다. 외부프로시저객체는사용자정의함수와일대일로대응하는데이터베이스객체이다. 외부프로시저인사용자정의함수는외부프로시저객체를통해실행된다. 외부프로시저객체를생성할때에는관련된라이브러리객체와사용자정의함수에대한모든정보를명시해야한다. ALTIBASE HDB 는외부프로시저객체의관리를위한 SQL 구문을제공한다. 외부프로시저용사용법 17

기본사용법 외부프로시저를사용하는일반적인단계는다음과같다. 사용자정의함수작성 진입함수작성 외부라이브러리객체생성 외부프로시저 / 함수객체생성 동적라이브러리생성 외부프로시저호출이절에서는위의각단계에대해서예제와함께설명한다. 사용자정의함수작성 사용자는일반적인 C 또는 C++ 함수를만드는것과동일한 방식으로외부프로시저용 C/C++ 함수를작성할수있다. 이절에서는아래와같은인자유형과반환유형을갖는저장 프로시저와함수에대응하는사용자함수를각각작성해보겠다. procedure str_uppercase_proc( a1 in char(30), a2 out char(30) ) function str_uppercase_func_int( a1 in char(30), a2 out char(30) ) return int function str_uppercase_func_char( a1 in char(30), a2 out char(30) ) return char(30) str_uppercase_proc 에대응하는 str_uppercase 라는사용자정의 C/C++ 함수는 3 개의인자를필요로하며, 함수프로토타입은아래와같다. extern "C" void str_uppercase( char* str1, int str1_len, char* str2 ); 여기에서두번째인자는첫번째인자에입력될문자열의길이를사용자함수로전달하기위해사용된다. str_uppercase_func_int 및 str_uppercase_func_char 에대응하는사용자정의 C/C++ 함수프로토타입은아래와같다. extern "C" int str_uppercase_count( char* str1, int str1_len, char* str2 ); extern "C" char* str_uppercase_return( char* str1, int str1_len, char* str2 ); 아래는사용자정의함수의코드예제이다. 18 C/C++ External Procedures Manual

void str_uppercase(char *str1, int str1_len, char * str2) for( int i=0; i < str1_len; i++ ) str2[i] = toupper(str1[i]); int str_uppercase_count(char *str1, int str1_len, char * str2) int capcount = 0; int i = 0; while( i < str1_len ) if( str1[i] >= 'A' && str1[i] <= 'Z' ) capcount++; i++; return capcount; char* str_uppercase_return(char *str1, int str1_len, char * str2) for( int i=0; i < str1_len; i++ ) str2[i] = toupper(str1[i]); return str2; 주의 : 사용자정의함수선언부에반드시 extern "C" 키워드를써야한다. 진입함수작성 사용자정의함수외에도, 사용자정의함수를실행할정형화된함수가필요하다. 이함수를진입함수 (Entry Function) 라고한다. 에이전트프로세스가진입함수를호출하면진입함수가사용자정의함수를호출하고그결과를반환한다. 따라서동적라이브러리내에진입함수가반드시있어야한다. 진입함수내부에는실제사용자정의함수를호출하는루틴이포함되어야한다. 아래는위의 str_uppercase, str_uppercase_count 와 외부프로시저용사용법 19

str_uppercase_return 사용자정의함수를호출하는진입함수의 예제이다. extern "C" void entryfunction(char* func_name, int arg_count, void ** args, void ** returnarg); void entryfunction(char* func_name, int arg_count, void ** args, void ** returnarg) // 사용자정의부분 if(strcmp(func_name, "str_uppercase") == 0) str_uppercase((char*)args[0], *((int*)args[1]), (char*)args[2]); else if(strcmp(func_name, "str_uppercase_count") == 0) if( *returnarg!= NULL ) // int 타입반환 **(int**)returnarg = str_uppercase_count ((char*)args[0], *((int*)args[1]), (char*)args[2]); else if(strcmp(func_name, "str_uppercase_return") == 0) if( returnarg!= NULL ) // char* 타입반환 *(char**)returnarg = str_uppercase_return ((char*)args[0], *((int*)args[1]), (char*)args[2]); 아래는진입함수의각인자에대한설명이다. func_name: 함수의이름을나타내는문자열 arg_count: 인자의개수 args: 인자들의배열. 외부프로시저에서명시한순서를따라야한다. 인자의입출력모드와 PSM 자료형에따라각각맵핑되는 C 자료형이다르므로주의해야한다. returnarg: 반환값을위한인자. 반환값이없는외부프로시저의경우에는이인자에항상 NULL 이반환되며, 외부함수의경우에는반환값을가리키는포인터가반환된다. 주의사항 동적라이브러리내에서진입함수의이름 entryfunction 과인자의자료형은사용자가임의로변경해서는안된다. 20 C/C++ External Procedures Manual

한개의라이브러리내에사용자정의함수가두개이상포함된 경우, 하나의진입함수내에사용자정의함수를각각 호출하도록소스코드를작성해야한다. 외부함수가아닌외부프로시저의사용자정의함수를호출한후 반환값을 returnarg 변수에대입하면에이전트프로세스가 비정상종료할수있다. 즉, 외부함수의경우에는 returnarg 가 NULL 이아닌지반드시검사한후함수반환타입에맞게타입 캐스팅하여반환해야한다. 사용자정의함수와마찬가지로진입함수선언부에도반드시 extern "C" 키워드를써야한다. 위예제의사용자정의함수를처리하는부분에서반환값을 대입할 returnarg 변수 ( 진입함수의마지막인자 ) 의 NULL 여부를 검사하는코드가함수반환타입에따라다른점을주의해서 살펴보기바란다. if( *returnarg!= NULL ) // int 타입을반환하는경우... if( returnarg!= NULL ) // char* 타입을반환하는경우 반환값의타입캐스팅 외부함수에대응하는사용자정의함수를호출한후, 함수의 반환형에따라적절한타입으로캐스팅이필요하다. 반환타입 코드상의타입캐스팅 char **(char**)returnarg =... int **( int**)returnarg =... long long **( long long**)returnarg =... float **( float**)returnarg =... double **( double**)returnarg =... char * *(char**)returnarg =... SQL_TIMESTAMP_STRUCT **( SQL_TIMESTAMP_STRUCT**)returnArg =... 외부라이브러리객체생성 ALTIBASE HDB 서버가동적라이브러리파일을식별할수있도록데이터베이스에라이브러리객체를생성해야한다. 예를들어, 사용자가 shlib.so 라는이름의동적라이브러리파일을사용하고자하는경우, 데이터베이스에아래와같이외부라이브러리객체를생성할수있다. 외부프로시저용사용법 21

CREATE OR REPLACE LIBRARY lib1 AS 'shlib.so'; 이제 ALTIBASE HDB 는 shlib.so 동적라이브러리파일을 lib1 이라는 외부라이브러리객체로식별한다. 외부프로시저 / 함수객체생성 외부프로시저 ( 사용자정의 C/C++ 함수 ) 를실행하기위해서는먼저 데이터베이스에사용자정의함수를등록하는외부프로시저객체를 생성해야한다. 아래와같은 SQL 구문으로외부프로시저객체를생성할수있다. create or replace procedure str_uppercase_proc( a1 in char(30), a2 out char(30) ) as language c library lib1 name "str_uppercase" parameters( a1, a1 LENGTH, a2 ) ; / 외부함수의경우반환형을명시해야한다. 아래예제는 int 타입과 char 배열을반환하는외부함수를생성하는 SQL 구문이다. create or replace function str_uppercase_func_int( a1 in char(30), a2 out char(30) ) return int as language c library lib1 name "str_uppercase_count" parameters( a1, a1 LENGTH, a2 ) ; / create or replace function str_uppercase_func_char( a1 in char(30), a2 out char(30) ) return char(30) as language c library lib1 name "str_uppercase_return" parameters( a1, a1 LENGTH, a2 ) ; / 동적라이브러리생성 한개이상의사용자정의함수와진입함수가작성된소스파일이준비되면, 컴파일해서동적라이브러리파일을만들수있다. 유닉스 22 C/C++ External Procedures Manual

계열에서는 *.so 파일이, 윈도우에서는 *.dll 파일이동적라이브러리 파일이다. 아래예제는유닉스계열에서소스파일을컴파일해서동적 라이브러리를만드는것을보여준다. $ g++ -g -fpic -shared -o shlib.so extproc.cpp 사용자정의함수들과진입함수가여러파일로이루어져있다면, 아래와같이각소스파일을컴파일한후링크하면된다. $ g++ -fpic -c extproc.cpp $ g++ -fpic -c entry.cpp $ g++ -shared -o shlib.so entry.o extproc.o 생성된동적라이브러리파일은 ALTIBASE HDB 서버가인식할수있는위치로이동해야한다. 그위치는 $ALTIBASE_HOME/lib 이며, 이위치는사용자가임의로변경할수없다. $ mv shlib.so $ALTIBASE_HOME/lib/ 외부프로시저호출 다음은 isql 에서외부프로시저를실행하는것을보여주는예제이다. var var1 char(30); var var2 char(30); exec :var1 := 'hello world'; exec str_uppercase_proc( :var1, :var2 ); isql> print var; [ HOST VARIABLE ] ---------------------------------------------------- --- NAME TYPE VALUE ---------------------------------------------------- --- VAR1 CHAR(30) hello world VAR2 CHAR(30) HELLO WORLD extproc.cpp 다음은위의절에서예로든사용자정의함수를작성한소스파일 extproc.cpp 이다. #include <string.h> #include <ctype.h> extern "C" void str_uppercase( char* str1, int str1_len, char* str2 ); extern "C" int str_uppercase_count( char* str1, int str1_len, char* str2 ); 외부프로시저용사용법 23

extern "C" char* str_uppercase_return( char* str1, int str1_len, char* str2 ); extern "C" void entryfunction(char* func_name, int arg_count, void ** args, void ** returnarg); void entryfunction(char* func_name, int arg_count, void ** args, void ** returnarg) if(strcmp(func_name, "str_uppercase") == 0) str_uppercase((char*)args[0], *((int*)args[1]), (char*)args[2]); else if(strcmp(func_name, "str_uppercase_count") == 0) if( *returnarg!= NULL ) // int 타입을반환 **(int**)returnarg = str_uppercase_count ((char*)args[0], *((int*)args[1]), (char*)args[2]); else if(strcmp(func_name, "str_uppercase_return") == 0) if( returnarg!= NULL ) // char* 타입을반환 *(char**)returnarg = str_uppercase_return ((char*)args[0], *((int*)args[1]), (char*)args[2]); void str_uppercase(char *str1, int str1_len, char * str2) for( int i=0; i < str1_len; i++ ) str2[i] = toupper(str1[i]); int str_uppercase_count(char *str1, int str1_len, char * str2) int capcount = 0; int i = 0; while( i < str1_len ) if( str1[i] >= 'A' && str1[i] <= 'Z' ) capcount++; i++; 24 C/C++ External Procedures Manual

return capcount; char* str_uppercase_return(char *str1, int str1_len, char * str2) for( int i=0; i < str1_len; i++ ) str2[i] = toupper(str1[i]); return str2; 외부프로시저용사용법 25

관련메타테이블과성능뷰 현재데이터베이스에생성된외부라이브러리객체에대한정보를아래의메타테이블에서확인할수있다. SYS_LIBRARIES_ 외부프로시저실행을위해현재생성되어있는에이전트프로세스 (agent process) 의정보를아래의성능뷰에서확인할수있다. V$EXTPROC_AGENT 각메타테이블과성능뷰에대한상세한설명은 General Reference 를참고하도록한다. 26 C/C++ External Procedures Manual

관련프로퍼티 아래는외부프로시저를위한에이전트의동작에관련된프로퍼티이다. EXTPROC_AGENT_CONNECT_TIMEOUT EXTPROC_AGENT_IDLE_TIMEOUT 각프로퍼티에대한상세한설명은 General Reference 를참고하도록한다. 외부프로시저용사용법 27

3. 외부프로시저용 SQL 문 이장은 ALTIBASE HDB 에서외부프로시저를사용하기위해 지원하는 SQL 문을설명한다. 외부프로시저용 SQL 문 29

CREATE LIBRARY statement 구문 create_library_statement::= CREATE LIBRARY library_name OR REPLACE user_name. AS IS file_name ; 설명 외부라이브러리객체를새로생성하거나이미생성되어있는외부 라이브러리를새로운외부라이브러리로변경한다. library_name 라이브러리객체의이름을명시한다. file_name 동적라이브러리파일이름을명시한다. 이파일은 $ALTIBASE_HOME/lib 에위치해야한다. 단, 해당디렉토리에사용자가명시한파일이없더라도라이브러리객체는생성된다. 동적라이브러리파일의존재유무는외부프로시저가실행될때검사되며, 만약존재하지않을경우해당외부프로시저객체는 'INVALID' 상태로전이한다. 예제 CREATE OR REPLACE LIBRARY lib1 AS 'shlib.so'; 30 C/C++ External Procedures Manual

ALTER LIBRARY statement 구문 alter_library_statement ::= ALTER LIBRARY library_name user_name. COMPILE ; 설명 라이브러리객체를컴파일한다. 외부프로시저용언어로 C 또는 C++ 만지원하는현재로서는, 이 구문을실행하여도서버에서아무런동작이일어나지않는다. 추후 다른언어지원을위해예약된구문이다. 예제 ALTER LIBRARY lib1 COMPILE; 외부프로시저용 SQL 문 31

DROP LIBRARY statement 구문 drop_library_statement ::= DROP LIBRARY library_name user_name. ; 설명 데이터베이스에서외부라이브러리객체를삭제한다. 삭제하려는라이브러리객체에포함된외부프로시저가실행중이어도, 해당라이브러리객체는삭제된다. 단, 데이터베이스에서라이브러리객체만삭제될뿐, 연관된동적라이브러리파일이삭제되지는않는다. 예제 DROP LIBRARY lib1; 32 C/C++ External Procedures Manual

CREATE PROCEDURE statement 구문 create_procedure ::= CREATE OR PROCEDURE REPLACE user_name. procedure_name argument_list AS call_spec ; argument_list ::= ( argument_declaration ), argument_declaration ::= argument_name IN OUT data_type IN OUT call_spec ::= LANGUAGE C NAME LIBRARY func_name lib_name parameter_list parameter_list ::= 외부프로시저용 SQL 문 33

( parameter_declaration ), parameter_declaration::= parameter_name INDICATOR LENGTH MAXLEN 설명 외부프로시저를새로생성하거나, 이미생성되어있는외부 프로시저를새로운외부프로시저로변경한다. procedure_name 외부프로시저객체의이름을명시한다. argument_list 인자는생략할수있으며, 인자를명시할경우엔인자의명칭, 데이터타입및입출력구분을명시해야한다. 사용가능한입출력유형은다음세가지중의하나이고생략시에 IN 이기본값이된다. IN: 프로시저호출시입력값이주어지는입력인자 OUT: 프로시저실행후출력값을반환하는인자 INOUT: 입출력공용인자로프로시저호출시입력값이주어지고, 실행후에출력값을반환한다. 외부프로시저가실행될때, IN 인자를사용해서프로시저에값을전달하고, 프로시저는 OUT 인자를사용해서호출한루틴에값을반환한다. call_spec 사용자함수이름과라이브러리객체의이름, 파라미터들을지정한다. 34 C/C++ External Procedures Manual

사용자함수이름과라이브러리객체를명시하는순서는상관없으나, 각각한번씩만명시해야한다 fun_name 해당외부프로시저에대응하는사용자정의함수이름을명시한다. lib_name 해당외부프로시저에대응하는사용자함수를포함하는외부 라이브러리객체의이름을명시한다. parameter_list 외부프로시저객체의인자들을이에대응하는사용자정의함수의 인자들로할당하기위해명시하는절이다. 이절의인자이름은 argument_list 의인자이름을그대로사용하는것이일반적이다. 아래의속성을이용하여각파라미터에대해추가적인정보를사용자 정의함수로전달할수있다. 속성과함께명시되는속성파라미터는 실제파라미터를보조하는역할을할뿐, 외부프로시저객체의 인자와는관계가없다. INOUT/ 속성이름 경우자료형 IN 경우 OUT/ 자료형 RETURN 설명 INDICATOR short short * 해당파라미터의값이 NULL인지아닌지를나타낸다. 다음의값중하나를가질수있다. ALTIBASE_EXTPROC_IND_NULL ALTIBASE_EXTPROC_IND_NOTNULL LENGTH int int * 해당파라미터값의길이를바이트단위로나타낸다. 문자열의경우문자의개수가아니라바이트개수임에주의하라. 문자열이아닌경우, 해당자료형의크기를나타낸다. MAXLEN - int 해당파라미터의버퍼크기를나타낸다. IN 모드파라미터의경우이속성파라미터를명시할수없다. 아래예제에서 PARAMETERS 절은사용자정의함수로전달되는 외부프로시저용 SQL 문 35

인자들과인자들의속성을지정한다. CREATE OR REPLACE PROCEDURE proc1( a1 IN CHAR(30), a2 OUT CHAR(30) ) AS LANGUAGE C LIBRARY lib1 NAME "str_uppercase" PARAMETERS( a1, a1 LENGTH, a2 ); / 위프로시저에서 PARAMETER 절의인자들로보아, str_uppercase 함수의프로토타입은아래와같을것이다. extern "C" void str_uppercase( char* str1, int str1_len, char* str2 ); 예제 create or replace procedure proc1( a1 in char(30), a2 out char(30) ) as language c library lib1 name "str_uppercase" parameters( a1, a1 LENGTH, a2 ) ; / 36 C/C++ External Procedures Manual

DROP PROCEDURE statement 구문 drop_procedure_statement ::= DROP PROCEDURE procedure_name user_name. ; 설명 데이터베이스에서외부프로시저객체를삭제한다. 삭제하고자하는외부프로시저가실행중이라면, 삭제되지않고 오류가발생한다. 예제 DROP PROCEDURE proc1; 외부프로시저용 SQL 문 37

CREATE FUNCTION 구문 create_function ::= CREATE OR FUNCTION REPLACE user_name. function_name argument_list RETURN return_type AS call_spec ; argument_list ::= ( argument_declaration ), argument_declaration ::= argument_name IN OUT data_type IN OUT 38 C/C++ External Procedures Manual

call_spec ::= LANGUAGE C NAME LIBRARY func_name lib_name parameter_list return_parameter parameter_list ::= ( parameter_declaration ), parameter_declaration::= parameter_name INDICATOR LENGTH MAXLEN return_parameter ::= ( RETURN ) parameter_properties, 설명 외부함수를새로생성하거나이미생성되어있는외부함수를새로운외부함수로변경한다. 외부프로시저용 SQL 문 39

func_name 외부함수객체의이름을명시한다. argument_list CREATE PROCEDURE statement 절을참고하라. call_spec 사용자함수이름과라이브러리객체의이름, 및파라미터들과 반환값을지정한다. 사용자함수이름과라이브러리객체를명시하는 순서는상관없으나, 각각한번씩만명시해야한다. fun_name 해당외부프로시저에대응하는사용자정의함수이름을명시한다. lib_name 해당외부프로시저에대응하는사용자함수를포함하는외부 라이브러리객체의이름을명시한다. parameter_list CREATE PROCEDURE statement 절을참고하라. RETURN 외부함수의반환값을가져오는파라미터임을명시하는키워드이다. RETURN 뒤에함수파라미터와마찬가지로속성파라미터를추가로명시할수있다. 속성파라미터에대해서는 CREATE PROCEDURE 구문의설명을참고하기바란다. 제약사항 : RETURN 절은함수의인자에대한파라미터를모두명시한다음마지막에명시해야한다. 그렇지않으면오류가발생한다. RETURN 뒤에속성파라미터를명시하지않으면, RETURN 자체를명시하지않은것과차이가없다. 즉, (a, b, RETURN) 과 (a, b) 는동일하다. 40 C/C++ External Procedures Manual

DROP FUNCTION 구문 drop_function_statement ::= DROP FUNCTION function_name user_name. ; 설명 데이터베이스에서외부함수객체를삭제한다. 삭제하려는외부함수가실행중이라면, 삭제되지않고오류가 발생한다. 예제 DROP FUNCTION func1; 외부프로시저용 SQL 문 41

EXECUTE 구문 execute_procedure_statement ::= EXEC(UTE) procedure_name ; user_name. execute_function_statement ::= ( ) expression, EXEC(UTE) variable := function_name ; user_name. ( ) expression, 설명 외부프로시저또는외부함수를실행한다. 예제 var var1 char(30); var var2 char(30); exec :var1 := 'hello world'; exec proc1( var1, var2 ); print var2; 42 C/C++ External Procedures Manual

찾아보기 A Agent Process 13 ALTER LIBRARY statement 31 C C/C++ 외부프로시저 12 CREATE FUNCTION statement 38 CREATE LIBRARY statement 30 CREATE PROCEDURE statement 33 D DROP FUNCTION statement 41 DROP LIBRARY statement 32 DROP PROCEDURE statement 37 E Entry Function 19 EXECUTE statement 42 I IN 34 INOUT 34 O OUT 34 ㄷ 동적라이브러리 22 ㅁ 메타테이블 26 ㅅ 사용자정의함수 18 성능뷰 26 ㅇ 에이전트프로세스 13 외부라이브러리객체 17, 21 외부프로시저 12 외부프로시저객체 17, 22 외부함수객체 17, 22 ㅈ 자료형 16 진입함수 19 ㅌ 타입캐스팅 21 ㅍ 프로퍼티 27 찾아보기 43