[파워빌더 Tip] Declare문을 사용하지 않고 오라클 Procedure/Function 실행하기

Author : 금봉이 / Date : 2007.10.04 17:55 / Category : 관심꺼리.log/정신노동.dat

파워빌더로 DB프로그램을 개발할때 많은 프로시져와 함수가 사용된다.
일반적으로 파워빌더에서 오라클의 Procedure나 Fuction을 실행할때 Declare문을 사용한다. 다음 예제는 도움말의 Example이다.

-- Given this procedure:

CREATE OR REPLACE PROCEDURE spu_edt_object(

o_id_object OUT NUMBER,
o_message OUT VARCHAR2,
a_id_object NUMBER,
a_param VARCHAR2 := NULL,
a_value VARCHAR2 := NULL
) as
begin
o_id_object := 12345;
o_message := 'Hello World';
end;

-- The DECLARE statement must use named notation because output parameters are defined to the left of input parameters:

dec{0} o_id_object, id_obiect = 54321

string o_message, param = 'Test'

DECLARE proc_update PROCEDURE FOR spu_edt_object (
a_id_object => :id_object,
a_param => :param
)
USING SQLCA;

EXECUTE proc_update;
if SQLCA.SqlCode 0 then
SQLCA.f_out_error()
RETURN -1
end if

FETCH proc_update INTO :o_id_object, :o_message;
if SQLCA.SqlCode 0 then
SQLCA.f_out_error()
CLOSE proc_update;
RETURN -1
end if

오라클의 spu_edt_object 프로시져를 호출하기 위해서 파워빌더 스크립트에서 DECLARE, FETCH를 이용하는 예제이다.
이렇게 복잡한 방법보다 다음과 같이 한라인으로 호출하도록 설정하는 방법을 알아보자.

SQLCA.spu_edt_object(o_id_object, o_message, a_id_object, a_param, a_value)

파워빌더의 SQLCA라는 변수는 시스템 글로벌변수로 파워빌더에서 DB transaction object로 정의되어 있는 변수이다. 이 변수를 사용자 정의 transaction object로 변경해서, 그 UserObject의 Local External Functions에 함수로 정의 하는 것이다.
우선 New > PB Object > Standard Class를 선택하여 transaction을 상속받은 UserObject를 생성하자.

새로 만든 UserObject를 저장한다. 예제에서는 uo_transaction으로 저장하였다. 그럼 SQLCA를 정의한 곳에서 transaction 대신에 지금 만든 uo_transaction 오브젝트로 재정의 해 준다.
이제 SQLCA를 uo_transaction으로 재정의 해줘야한다. SQLCA가 정의된 곳은 Application 오브젝트에 있다.
Application 페이터를 열고, Properties의 General탭 제일 아래에 보면 "Additional Properties"가 있다. 이 버튼을 클릭하면 Variable Types탭에 SQLCA를 정의하는 부분이 있다. 디폴트로 transaction으로 되어 있는 부분을 새로 만든 transaction 오브젝트인 uo_transaction으로 변경해 준다.
 
이제 기본적인 설정은 끝이 났고, 오라클의 프로시져나 함수를 uo_transaction 오브젝트의 Local External Fuction으로 정의만 하면 된다.
프로시져/함수를 등록하는 Syntax는 외부 DLL함수를 등록하는 방식도 대동소이하다. DLL 등록시 사용되는 Library 키워드 대신에 RPCFUNC라는 키워드가 사용된다. 그리고 프로시져에서 OUT변수는 REF키워드를 사용하여 정의하면 된다.
FUNCTION rtndatatype functionname ( { { REF } datatype1 arg1, ...,    { REF } datatypen argn } ) 
RPCFUNC { ALIAS FOR "spname" }
SUBROUTINE functionname ( { { REF } datatype1 arg1 , ...,    { REF } datatypen argn } ) 
RPCFUNC { ALIAS FOR "spname" }

procedure는 SUBROUTINE으로 등록하면 된다.
그럼 위 예제의 프로시져는 다음과 같이 등록하면 될것이다.

SUBROUTINE spu_edt_object(REF long o_id_object, REF string o_message, long a_id_object, string a_param, string a_value) RPCFUNC ALIAS FOR "spu_edt_object"

이렇게 정의해둔 프로시져나 함수는 SQLCA.<함수명>({변수}) 와 같은 식으로 한라인으로 처리가 가능하다.
알고 나면 쉽지만... 모르면 Example의 예처럼 많은 삽질을 해야한다. ^^;

신고

Tags : , , , ,

Trackbacks 0 / Comments 0

Blog Information

금봉이

Calendar

«   2017/11   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
Copyright © 관심꺼리.log All Rights Reserved
Designed by CMSFactory.NET