ストアド プロシージャから返される配列パラメーター
重要
この機能は、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 つの結果セット内のすべての列を返します。
{call SimplePackage.Proc1( {resultset 3, o_id , ao_course, ao_dept } ) }
各列を 1 つの結果セットとして返します。
{call SimplePackage.Proc1( {resultset 3, o_id}, {resultset 3, ao_course}, {resultset 3, ao_dept} ) }
これにより、列ごとに 1 つずつ、3 つの結果セットが返されます。
プロシージャ PROC2 を呼び出すには
1 つの結果セット内のすべての列を返します。
{call SimplePackage.Proc2( 5 , {resultset 5, ao_Arg2, ao_Arg3} ) }
各列を 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 関数を使用して結果セットを返すことはできません。