스토어드 프로시저 호출

execute, open 또는 get 문을 사용하여 SQL 스토어드 프로시저를 호출할 수 있습니다. 각각의 경우에 사용자는 #sql 지시문을 사용합니다.

스토어드 프로시저는 EGL의 함수와 같은, 데이터베이스에 대한 명령의 세트입니다. 스토어드 프로시저는 데이터베이스 자체에 영구히 보존되지만 준비된 명령문은 사용자의 프로그램 또는 로직 파트에 대해 로컬이며 일시적으로만 데이터베이스에 의해 캐시되므로 스토어드 프로시저는 준비된 명령문과는 다릅니다. 또한 스토어드 프로시저는 여러 SQL문으로 구성될 수 있지만 준비된 명령문은 하나의 SQL문으로만 구성될 수 있습니다. 하지만 근본적으로는 준비된 명령문을 사용해도 스토어드 프로시저로 실행할 수 있는 명령과 같은 명령을 실행할 수 있습니다.

전제조건

  • EGL 프로젝트 및 프로그램 또는 기타 로직 파트
  • 스토어드 프로시저가 있는 SQL 데이터베이스

execute를 사용한 스토어드 프로시저 호출

execute 키워드는 결과 세트를 리턴하지 않는 스토어드 프로시저를 호출하는 데 적합합니다. 하나 이상의 결과 세트를 리턴하는 스토어드 프로시저에 대해 execute를 사용할 수도 있으나 이 경우에는 결과 세트가 무시됩니다.

execute를 사용하여 스토어드 프로시저를 호출하려면 #sql 지시문을 사용하여 명시 SQL에 스토어드 프로시저의 이름을 지정하십시오.
execute #sql{
    CALL MYSTOREDPROCEDURE
};
이 스토어드 프로시저에서 매개변수를 수락하는 경우에는 EGL 변수를 호스트 변수로 전달하십시오(호스트 변수 참조).
myParameter int = 5;
execute #sql{
    CALL MYSTOREDPROCEDURE(:myParameter)
};
다음 예제에서는 준비된 명령문을 execute 문과 조합하여 사용합니다.
prepare p1 from "CALL MYSTOREDPROCEDURE(?)";
execute p1 using myParameter;

open을 사용한 스토어드 프로시저 호출

정확히 하나의 결과 세트를 리턴하는 스토어드 프로시저만을 호출하는 경우에는 open 키워드를 사용할 수 있습니다. 결과 세트를 리턴하지 않거나 둘 이상의 결과 세트를 리턴하는 스토어드 프로시저를 호출하려면 execute를 사용하십시오.

open을 사용하여 스토어드 프로시저를 호출하려면 #sql 지시문을 사용하여 명시 SQL에 스토어드 프로시저의 이름을 지정하십시오.
open myResultSet with #sql{
    CALL GETCUSTOMERS
};
이렇게 하면 다음 예제(MyCustomerPart라는 Record 파트(스테레오타입 SQLRecord)를 사용함)에 표시되어 있는 바와 같이 myResultSet 식별자를 통해 결과 세트에 액세스할 수 있습니다.
myCustomers MyCustomerPart;
get next from myResultSet into myCustomers;
이 스토어드 프로시저에서 매개변수를 수락하는 경우에는 EGL 변수를 호스트 변수로 전달하십시오.
myParameter int = 5;
open myResultSet with #sql{
    CALL GETCUSTOMERS(:myParameter)
};
다음 예제에서는 준비된 명령문을 open 문과 조합하여 사용합니다.
prepare p1 from "CALL GETCUSTOMERS(?)";
open myResultSet with p1 using myParameter;

get을 사용한 스토어드 프로시저 호출

정확히 하나의 결과 세트를 리턴하는 스토어드 프로시저만을 호출하는 경우에는 get 키워드를 동적 배열과 함께 사용할 수 있습니다. 결과 세트를 리턴하지 않거나 둘 이상의 결과 세트를 리턴하는 스토어드 프로시저를 호출하려면 execute를 사용하십시오.

get을 사용하여 스토어드 프로시저를 호출하려면 #sql 지시문을 사용하여 명시 SQL에 스토어드 프로시저의 이름을 지정하십시오.
myCustomers MyCustomerPart[]{};
get myArray with #sql{
    CALL GETCUSTOMERS
};
이 스토어드 프로시저에서 매개변수를 수락하는 경우에는 EGL 변수를 호스트 변수로 전달하십시오.
myCustomers MyCustomerPart[]{};
myParameter int = 5;
get myArray with #sql{
    CALL GETCUSTOMERS(:myParameter)
};
다음 예제에서는 준비된 명령문을 get 문과 조합하여 사용합니다.
myCustomers MyCustomerPart[]{};
myParameter int = 5;
prepare p1 from "CALL GETCUSTOMERS(?)";
get myCustomers with p1 using myParameter;

Oracle DBMS에 대한 특수 고려사항

Oracle 데이터베이스에 대해 작업할 때는 스토어드 프로시저 또는 저장된 함수를 호출할 수 있습니다.

Oracle 데이터베이스를 사용할 때 스토어드 프로시저를 호출하기 위해 open 또는 get 문을 사용하는 데는 특정 규칙이 적용됩니다.
  • 해당 프로시저에는 하나 이상의 매개변수가 있어야 합니다.
  • 첫 번째 매개변수는 out 또는 inOut 수정자여야 하며 REF CURSOR 유형이어야 합니다(이 유형을 정의하는 방법은 뒤에 설명되어 있음). 이 유형을 기반으로 하는 변수는 커서 변수라고 하며 프로그램의 파트 간에 결과 세트를 전달할 수 있습니다.
  • 뒤에 제시된 예제와 같이 프로시저의 첫 번째 매개변수를 물음표로 표시하십시오.
  • 프로시저 호출이 준비된 명령문에 있는 경우에는 첫 번째 매개변수의 using 절에 아무 항목도 포함시키지 마십시오. 그 외의 매개변수가 없는 경우에는 using 절을 생략하십시오.
#sql 지시문을 사용하는 첫 번째 예제에서 프로시저에는 커서 변수를 제외한 다른 매개변수가 없습니다.
open rs1 with #sql { call p1( ? ) };
마찬가지로 #sql을 사용하는 두 번째 예제에서 프로시저에는 커서 변수 외에 두 개의 매개변수가 있습니다.
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;
다음 예제는 Oracle에 REF CURSOR 유형을 정의하는 한 가지 방법을 보여줍니다. (다른 방법은 사용자의 Oracle 문서를 참조하십시오.)
execute #sql{ CREATE OR REPLACE PACKAGE MYPKG
   AS
      TYPE RC12 IS REF CURSOR;
   END; };
앞서 나온 코드는 조회의 결과를 저장하는 매개변수의 유형으로 사용할 수 있는, 이름이 MYPKG.RC12인 새 유형을 작성합니다. 다음 EGL 코드는 EGL open 문을 사용하여 호출할 수 있는 스토어드 프로시저를 정의합니다.
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은 조회의 결과를 리턴하는 Oracle 저장된 함수를 호출할 수 있습니다. 여기에는 다음 규칙이 적용됩니다.
  • EGL open 또는 get 문을 사용하여 함수를 호출하십시오.
  • 함수는 REF CURSOR 유형을 리턴해야 합니다.
  • open 문이 실행하는 SQL 코드는 함수가 리턴하는 값을 표시하기 위한 물음표를 포함해야 합니다.
  • 함수 호출이 준비된 명령문에 있는 경우에는 첫 번째 물음표의 using 절에 아무 항목도 포함시키지 마십시오. 함수에 매개변수가 없는 경우에는 using 절을 생략하십시오.
#sql 지시문을 사용하는 첫 번째 예제에서 함수에는 커서 변수를 제외한 다른 매개변수가 없습니다.
open rs5 with #sql { call ? := f5() };
마찬가지로 #sql을 사용하는 두 번째 예제에서 함수에는 커서 변수 외에 두 개의 매개변수가 있습니다.
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에서 호출할 수 없음