我作为 PHP 程序员使用 Oracle(10g.2) 已经快 3 年了,但是当我分配作业时,我第一次尝试使用引用游标和集合类型。当我遇到问题时,我已经在网上搜索过,这个 ora-00932 错误真的让我不知所措。我需要一位老手的帮助。
这是我一直在处理的问题,我想从表中选择行并将它们放在引用游标中,然后使用记录类型,将它们收集到关联数组中。再次从这个关联数组中,创建一个引用光标。不要问我为什么,我在写这么复杂的代码,因为我需要它来完成更复杂的赋值。我可能会让您感到困惑,因此让我向您展示我的代码。
我在 Toad 的类型选项卡下定义了 2 种类型。其中之一是对象类型:
CREATE OR REPLACE
TYPE R_TYPE AS OBJECT(sqn number,firstname VARCHAR2(30), lastname VARCHAR2(30));
另一种是使用上面创建的对象类型的集合类型:
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;
我注释掉了打开参考光标的最后一行。因为当我在 Toad 的 SQL 编辑器中运行该过程时,它会导致另一个错误,这是我要问的第二个问题。最后我在 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 错误。