私はOracle(10g.2)をPHPプログラマーとして3年近く使用していますが、課題を与えられたとき、refカーソルとコレクション型を初めて使用しようとしました。そして、問題に直面したときに Web を検索したところ、この ora-00932 エラーに本当に圧倒されました。古い手の助けが必要です。
これが私が取り組んできたことです。テーブルから行を選択して参照カーソルに入れ、レコードタイプを使用してそれらを連想配列内に集めたいと考えています。そして、この連想配列から、ref カーソルを作成します。理由は聞かないでください。より複雑な代入を行うために必要なため、このような複雑なコードを書いています。わかりにくいかもしれませんので、私のコードをお見せしましょう。
Toad の [タイプ] タブで 2 つのタイプを定義しています。それらの 1 つはオブジェクト型です。
CREATE OR REPLACE
TYPE R_TYPE AS OBJECT(sqn number,firstname VARCHAR2(30), lastname VARCHAR2(30));
もう 1 つは、上で作成したオブジェクト タイプを使用するコレクション タイプです。
CREATE OR REPLACE
TYPE tr_type AS TABLE OF r_type;
次に、パッケージを作成します。
CREATE OR REPLACE PACKAGE MYPACK_PKG IS
TYPE MY_REF_CURSOR IS REF CURSOR;
PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR);
END MYPACK_PKG;
パッケージ本体:
CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
rcur MYPACK_PKG.MY_REF_CURSOR;
sql_stmt VARCHAR2(1000);
l_rarray tr_type := tr_type();
l_rec r_type;
BEGIN
sql_stmt := 'SELECT 1,e.first_name,e.last_name FROM hr.employees e ';
OPEN rcur FOR sql_stmt;
LOOP
fetch rcur into l_rec;
exit when rcur%notfound;
l_rarray := tr_type( l_rec );
END LOOP;
CLOSE rcur;
--OPEN r_cursor FOR SELECT * FROM TABLE(cast(l_rarray as tr_type) );
END MY_PROC;
END MYPACK_PKG;
refカーソルを開く最後の行をコメントアウトしました。Toad の SQL Editor でこの手順を実行すると別のエラーが発生するため、2 番目に質問します。最後に、Toad でコードを実行します。
variable r refcursor
declare
r_out MYPACK_PKG.MY_REF_CURSOR;
begin
MYPACK_PKG.MY_PROC(r_out);
:r := r_out;
end;
print :r
そこで ora-00932 エラーが発生します。