ストアド プロシージャから返される配列パラメーター

重要

この機能は、Windows の将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに、Oracle によって提供される ODBC ドライバーを使用してください。

Oracle 7.3 では、PL/SQL プログラム以外に PL/SQL レコードタイプにアクセスする方法はありません。 パッケージ化されたプロシージャまたは関数に PL/SQL Record Type として定義された仮引数がある場合、その仮引数をパラメーターとしてバインドすることはできません。 Microsoft ODBC Driver for Oracle の PL/SQL TABLE 型を使用して、正しいエスケープ シーケンスを含むプロシージャから配列パラメーターを呼び出します。

プロシージャを呼び出すには、次の構文を使用します。

{call  <package-name>.<proc-or-func>;  
(..., {resultset <max-records-requested> ,<formal-array-param_1>,;  
 <formal-array-param_2>,...,<formal-array-param_n> }, ... ) }  

注意

max-records-requested> パラメーターは<、結果セットに存在する行数以上である必要があります。 それ以外の場合、Oracle は、ドライバーによってユーザーに渡されるエラーを返します。

PL/SQL レコードは配列パラメーターとして使用できません。 各配列パラメーターは、データベース テーブルの 1 つの列のみを表すことができます。

次の例では、異なる結果セットを返す 2 つのプロシージャを含むパッケージを定義し、パッケージから結果セットを返す 2 つの方法を提供します。

パッケージ定義:

CREATE OR REPLACE PACKAGE SimplePackage AS  
  
TYPE t_id is TABLE of  NUMBER(5)  
    INDEX BY BINARY_INTEGER;  
  
TYPE t_Course is TABLE of VARCHAR2(10)  
    INDEX BY BINARY_INTEGER;  
  
TYPE t_Dept is TABLE of VARCHAR2(5)  
    INDEX BY BINARY_INTEGER;  
  
PROCEDURE proc1  
   (  
   o_id             OUT    t_id,  
   ao_course       OUT    t_Course,  
   ao_dept         OUT    t_Dept  
   );  
  
TYPE t_pk1Type1 IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;  
TYPE t_pk1Type2 IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;  
PROCEDURE proc2  
   (  
   i_Arg1         IN    NUMBER,  
   ao_Arg2         OUT   t_pk1Type1,  
   ao_Arg3         OUT   t_pk1Type2  
   );  
  
END SimplePackage;  
  
CREATE OR REPLACE PACKAGE BODY SimplePackage AS  
    PROCEDURE  proc1 ( o_id OUT t_id,  
    ao_course OUT t_Course, ao_dept OUT t_Dept   ) AS  
    BEGIN  
          o_id(1):= 200;  
          ao_course(1) :=  'M101';  
          ao_dept(1) :=  'EEE' ;  
  
          o_id(2) := 201;  
          ao_course(2) :=  'PHY320';  
          ao_dept(2) :=  'ECE' ;  
  
     END proc1;  
PROCEDURE proc2  
   (  
   i_Arg1         IN    NUMBER,  
   ao_Arg2         OUT   t_pk1Type1,  
   ao_Arg3         OUT   t_pk1Type2  
   )  
AS  
   i   NUMBER;  
BEGIN  
   FOR i IN 1 .. i_Arg1 LOOP  
      ao_Arg2(i) := 'Row Number ' || to_char(i);  
   END LOOP;  
   FOR i IN 1 .. i_Arg1 LOOP  
      ao_Arg3(i) := i;  
   END LOOP;  
END proc2;  
END SimplePackage;  

プロシージャ PROC1 を呼び出すには

  1. 1 つの結果セット内のすべての列を返します。

    {call SimplePackage.Proc1( {resultset  3, o_id , ao_course, ao_dept  } ) }  
    
  2. 各列を 1 つの結果セットとして返します。

    {call SimplePackage.Proc1( {resultset 3, o_id},  {resultset 3, ao_course}, {resultset 3, ao_dept} ) }  
    

    これにより、列ごとに 1 つずつ、3 つの結果セットが返されます。

プロシージャ PROC2 を呼び出すには

  1. 1 つの結果セット内のすべての列を返します。

    {call SimplePackage.Proc2( 5 , {resultset  5, ao_Arg2, ao_Arg3} ) }  
    
  2. 各列を 1 つの結果セットとして返します。

    {call SimplePackage.Proc2( 5 , {resultset 5, ao_Arg2}, {resultset 5, ao_Arg3} ) }  
    

アプリケーションが SQLMoreResults API を使用してすべての結果セットをフェッチすることを確認します。 詳細については、「 ODBC プログラマー リファレンス」を参照してください

注意

ODBC Driver for Oracle バージョン 2.0 では、PL/SQL 配列を返す Oracle 関数を使用して結果セットを返すことはできません。