스토어드 프로시저 호출
execute, open 또는 get 문을 사용하여 SQL 스토어드 프로시저를 호출할 수 있습니다. 각각의 경우에 사용자는 #sql 지시문을 사용합니다.
스토어드 프로시저는 EGL의 함수와 같은, 데이터베이스에 대한 명령의 세트입니다. 스토어드 프로시저는 데이터베이스 자체에 영구히 보존되지만 준비된 명령문은 사용자의 프로그램 또는 로직 파트에 대해 로컬이며 일시적으로만 데이터베이스에 의해 캐시되므로 스토어드 프로시저는 준비된 명령문과는 다릅니다. 또한 스토어드 프로시저는 여러 SQL문으로 구성될 수 있지만 준비된 명령문은 하나의 SQL문으로만 구성될 수 있습니다. 하지만 근본적으로는 준비된 명령문을 사용해도 스토어드 프로시저로 실행할 수 있는 명령과 같은 명령을 실행할 수 있습니다.
전제조건
- EGL 프로젝트 및 프로그램 또는 기타 로직 파트
- 스토어드 프로시저가 있는 SQL 데이터베이스
execute를 사용한 스토어드 프로시저 호출
execute 키워드는 결과 세트를 리턴하지 않는 스토어드 프로시저를 호출하는 데 적합합니다. 하나 이상의 결과 세트를 리턴하는 스토어드 프로시저에 대해 execute를 사용할 수도 있으나 이 경우에는 결과 세트가 무시됩니다.
execute #sql{
CALL MYSTOREDPROCEDURE
};
myParameter int = 5;
execute #sql{
CALL MYSTOREDPROCEDURE(:myParameter)
};
prepare p1 from "CALL MYSTOREDPROCEDURE(?)";
execute p1 using myParameter;
open을 사용한 스토어드 프로시저 호출
정확히 하나의 결과 세트를 리턴하는 스토어드 프로시저만을 호출하는 경우에는 open 키워드를 사용할 수 있습니다. 결과 세트를 리턴하지 않거나 둘 이상의 결과 세트를 리턴하는 스토어드 프로시저를 호출하려면 execute를 사용하십시오.
open myResultSet with #sql{
CALL GETCUSTOMERS
};
이렇게 하면 다음 예제(MyCustomerPart라는 Record 파트(스테레오타입 SQLRecord)를 사용함)에 표시되어 있는 바와 같이
myResultSet 식별자를 통해 결과 세트에 액세스할 수 있습니다.
myCustomers MyCustomerPart;
get next from myResultSet into myCustomers;
myParameter int = 5;
open myResultSet with #sql{
CALL GETCUSTOMERS(:myParameter)
};
prepare p1 from "CALL GETCUSTOMERS(?)";
open myResultSet with p1 using myParameter;
get을 사용한 스토어드 프로시저 호출
정확히 하나의 결과 세트를 리턴하는 스토어드 프로시저만을 호출하는 경우에는 get 키워드를 동적 배열과 함께 사용할 수 있습니다. 결과 세트를 리턴하지 않거나 둘 이상의 결과 세트를 리턴하는 스토어드 프로시저를 호출하려면 execute를 사용하십시오.
myCustomers MyCustomerPart[]{};
get myArray with #sql{
CALL GETCUSTOMERS
};
myCustomers MyCustomerPart[]{};
myParameter int = 5;
get myArray with #sql{
CALL GETCUSTOMERS(:myParameter)
};
myCustomers MyCustomerPart[]{};
myParameter int = 5;
prepare p1 from "CALL GETCUSTOMERS(?)";
get myCustomers with p1 using myParameter;
Oracle DBMS에 대한 특수 고려사항
Oracle 데이터베이스에 대해 작업할 때는 스토어드 프로시저 또는 저장된 함수를 호출할 수 있습니다.
- 해당 프로시저에는 하나 이상의 매개변수가 있어야 합니다.
- 첫 번째 매개변수는 out 또는 inOut 수정자여야 하며 REF CURSOR 유형이어야 합니다(이 유형을 정의하는 방법은 뒤에 설명되어 있음). 이 유형을 기반으로 하는 변수는 커서 변수라고 하며 프로그램의 파트 간에 결과 세트를 전달할 수 있습니다.
- 뒤에 제시된 예제와 같이 프로시저의 첫 번째 매개변수를 물음표로 표시하십시오.
- 프로시저 호출이 준비된 명령문에 있는 경우에는 첫 번째 매개변수의 using 절에 아무 항목도 포함시키지 마십시오. 그 외의 매개변수가 없는 경우에는 using 절을 생략하십시오.
open rs1 with #sql { call p1( ? ) };
x int = 10;
y int = 1000;
open rs2 with #sql { call p2( ?, :x, :y ) };
prepare pstmt3 from "call p1( ? )";
open rs3 with pstmt3;
prepare pstmt4 from "call p2( ?, ?, ? )";
open rs4 with pstmt4 using x, y;
execute #sql{ CREATE OR REPLACE PACKAGE MYPKG
AS
TYPE RC12 IS REF CURSOR;
END; };
execute #sql{ CREATE PROCEDURE ZPQPRM2( c IN OUT MYPKG.RC12, x IN CHAR )
AS
BEGIN
OPEN c FOR SELECT firstnme, empno FROM empx WHERE empno > x ORDER BY empno;
END; };
또한, Oracle에 저장된 함수를 작성할 수도 있습니다. 저장된 함수는 값을 리턴한다는 점을 제외하고 스토어드 프로시저와 동일합니다(Oracle의 스토어드 프로시저는 값을 리턴할 수 없음). 사용자는 스토어드 프로시저 호출과 약간 다른 SQL 구문을 사용함으로써 EGL로 작성된 Oracle 스토어드 프로시저를 호출할 수 있습니다.
x int;
y string = "hello";
execute #sql{ call :x := func1( :y ) };
writeStdout( "The function returned " :: x );
prepare q from "call ? := func1( ? )";
execute q using x, y;
writeStdout( "The function returned " :: x );
- EGL open 또는 get 문을 사용하여 함수를 호출하십시오.
- 함수는 REF CURSOR 유형을 리턴해야 합니다.
- open 문이 실행하는 SQL 코드는 함수가 리턴하는 값을 표시하기 위한 물음표를 포함해야 합니다.
- 함수 호출이 준비된 명령문에 있는 경우에는 첫 번째 물음표의 using 절에 아무 항목도 포함시키지 마십시오. 함수에 매개변수가 없는 경우에는 using 절을 생략하십시오.
open rs5 with #sql { call ? := f5() };
x int = 10;
y int = 1000;
open rs6 with #sql { call ? := f6( :x, :y ) };
prepare pstmt7 from "call ? := f5()";
open rs7 with pstmt7;
prepare pstmt8 from "call ? := f6( ?, ? )";
open rs8 with pstmt8 using x, y;
제한사항
EGL로 작성된 스토어드 프로시저를 사용하는 데는 다음 제한사항이 적용됩니다.
- 스토어드 프로시저에서 정확히 하나의 결과 세트를 리턴하는 경우에만 open 또는 get을 사용하여 해당 스토어드 프로시저를 호출할 수 있음
- 스토어드 프로시저에 out 매개변수가 포함되어 있는 경우에는 해당 스토어드 프로시저를 Microsoft SQL Server DBMS에서 호출할 수 없음