Oracle ORA-00932:不一致的数据类型:应为-已为-
作为一名PHP程序员,我已经使用Oracle10g.2将近3年了,但是当我分配任务时,我第一次尝试使用ref游标和集合类型。而我 当我面临问题时,我已经搜索过网络,这个ora-00932错误真的让我不知所措。我需要一个老手的帮助 这就是我一直在解决的问题, 我想从表中选择行并将它们放在ref游标中,然后使用记录类型将它们收集到关联数组中。再次从这个关联数组中创建一个ref光标。不要问我为什么,我正在写这么复杂的代码,因为我需要它来完成更复杂的任务。我可能听起来让你困惑,所以让我给你看看我的代码 我在Toad中的types选项卡下定义了两种类型。其中之一是对象类型:Oracle ORA-00932:不一致的数据类型:应为-已为-,oracle,plsql,toad,database-cursor,ora-00932,Oracle,Plsql,Toad,Database Cursor,Ora 00932,作为一名PHP程序员,我已经使用Oracle10g.2将近3年了,但是当我分配任务时,我第一次尝试使用ref游标和集合类型。而我 当我面临问题时,我已经搜索过网络,这个ora-00932错误真的让我不知所措。我需要一个老手的帮助 这就是我一直在解决的问题, 我想从表中选择行并将它们放在ref游标中,然后使用记录类型将它们收集到关联数组中。再次从这个关联数组中创建一个ref光标。不要问我为什么,我正在写这么复杂的代码,因为我需要它来完成更复杂的任务。我可能听起来让你困惑,所以让我给你看看我的代码
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;
我注释掉了打开ref cursor的最后一行。因为当我在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错误。使用REF光标的方式是不常见的。这将是使用它们的标准方式:
SQL> CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
2 PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
3 BEGIN
4 OPEN r_cursor FOR SELECT e.empno,e.ENAME,null FROM scott.emp e;
5 END MY_PROC;
6 END MYPACK_PKG;
7 /
Corps de package crÚÚ.
SQL> VARIABLE r REFCURSOR
SQL> BEGIN
2 MYPACK_PKG.MY_PROC(:r);
3 END;
4 /
ProcÚdure PL/SQL terminÚe avec succÞs.
SQL> PRINT :r
EMPNO ENAME N
---------- ---------- -
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
[...]
14 ligne(s) sÚlectionnÚe(s).
我不确定您在这里想要完成什么,您正在获取过程中的ref游标,然后返回另一个具有相同数据的ref游标。我认为在这个过程中根本没有必要获取游标。让调用应用程序在此处执行抓取。抓取由打印完成
更新:为什么您会收到无用的错误消息?
您正在使用一个动态打开的光标,我认为这是您收到无用错误消息的部分原因。如果使用固定SQL,则错误消息不同:
SQL> CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
2 PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
3 TYPE type_rec IS RECORD (qn number,
4 firstname VARCHAR2(30),
5 lastname VARCHAR2(30));
6 lt_record type_rec; /* Record type */
7 lt_object r_type; /* SQL Object type */
8 BEGIN
9 OPEN r_cursor FOR SELECT e.empno,e.ENAME,null FROM scott.emp e;
10 FETCH r_cursor INTO lt_record; /* This will work */
11 FETCH r_cursor INTO lt_object; /* This won't work in 10.2 */
12 END MY_PROC;
13 END MYPACK_PKG;
14 /
Package body created
SQL> VARIABLE r REFCURSOR
SQL> BEGIN
2 MYPACK_PKG.MY_PROC(:r);
3 END;
4 /
BEGIN
*
ERREUR Ó la ligne 1 :
ORA-06504: PL/SQL: Return types of Result Set variables or query do not match
ORA-06512: at "APPS.MYPACK_PKG", line 11
ORA-06512: at line 2
我概述了目前在10.2中可以将光标提取到PLSQL记录中,但不能提取到SQL对象中
更新:关于PLS-00306:参数的数量或类型错误
l_rarray是一个嵌套表,需要对其进行初始化,然后进行扩展,以便能够存储元素。例如:
SQL> CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
2 PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
3 lr_array tr_type := tr_type(); /* SQL Array */
4 BEGIN
5 FOR cc IN (SELECT e.empno, e.ENAME, NULL lastname
6 FROM scott.emp e) LOOP
7 lr_array.extend;
8 lr_array(lr_array.count) := r_type(cc.empno,
9 cc.ename,
10 cc.lastname);
11 /* Here you can do additional procedural work on lr_array */
12 END LOOP;
13 /* then return the result set */
14 OPEN r_cursor FOR SELECT * FROM TABLE (lr_array);
15 END MY_PROC;
16 END MYPACK_PKG;
17 /
Corps de package crÚÚ.
SQL> print r
SQN FIRSTNAME LASTNAME
---------- ------------------------------ -----------
7369 SMITH
7499 ALLEN
7521 WARD
[...]
14 ligne(s) sÚlectionnÚe(s).
要进一步阅读,您可以浏览以下文档: 谢谢你的回复,但正如我之前提到的,这只是一个简单的例子,真正的问题更复杂,在过程的声明部分中标识的refcursor和返回结果的out参数(另一个ref cursor)在实际情况中不会包含相同的数据。非常感谢您的回答。在代码的帮助下,我在过程中声明了我的记录类型,这是我在代码中所做的唯一更改,错误消失了。虽然它帮助我纠正了错误,但我已经开始收到另一个错误。它位于我用类型记录l_rarray:=tr_type l_rec;,标识关联数组的行上;,错误是PLS-00306:调用“TR_TYPE”时参数的数量或类型错误。你知道为什么会出错吗?非常感谢。我现在意识到,不需要将ref游标提取到记录类型中,我按照您在上一篇文章中描述的方式解决了这个错误。再次感谢您。我想再问您一个问题,我希望这是最后一个问题。在您的上一篇文章中,如果您使用动态sql,如“sql\u stmt:=SELECT e.empno,e.ENAME,NULL lastname FROM scott.emp e”,然后在cc In中选择sql\u stmt FROM dual,然后尝试通过编写cc.empno来访问光标的元素,您将收到PLS-00302错误。您如何处理它?有没有办法,因为我必须使用动态sql。@duygu:如果使用动态sql,则必须使用显式游标,例如:DECLARE lc SYS\u REFCURSOR;ldummy VARCHAR21;开始开立“从双重选择*的信用证”;把信用证拿到ldummy;关闭信用证;终止