在 FETCH 游标和 INTO 变量之间的'EMPTYPE'处发现类型不匹配


create or replace type emp_obj as object(empno varchar2(500));
create or replace type  emp_table as table of emp_obj ;

程序

create or replace procedure getempid(emptype out emp_table)
is
cursor c1 is select empno from emp ; 
begin 
open c1;
fetch c1 bulk collect into  emptype;
close c1;
end;

我无法理解为什么我要在以下错误:

错误(6,17):pls-00386:在fetch光标和变量中发现的" emptype"键入不匹配

您的光标查询正在选择标量值 empno,但要散布将其放入对象表中。您希望Oracle弄清楚如何将标量值转换为对象。

对于可能看起来并不完全不合理的单属对象,但要考虑多属性对象的并发症,或者如果您希望光标可以选择对象和标量值的混合物。(顺便说一句,您的empno真的是500-CHAR字符串,不是数字吗?)

您可以修改光标查询以解释构造对象:

select emp_obj(empno) from emp

所以此版本编译:

create or replace procedure getempid (emptype out emp_table)
is
  cursor c1 is select emp_obj(empno) from emp;
begin 
  open c1;
  fetch c1 bulk collect into  emptype;
  close c1;
end;
/

显然您不能直接使用bulk collect into从光标获取收集对象,尽管两者将包含兼容数据类型元素。

来自Oracle文档,

pls-00386 :在fetch Cursor和 变量

原因:提取语句列表中的分配目标确实 在数据类型中与选择列表中的相应列不匹配 光标声明,目前尚不清楚哪种隐式转换 需要纠正不匹配。

使用中间集合使用元素的分配。

CREATE OR replace PROCEDURE Getempid(emptype OUT EMP_TABLE)
IS
  CURSOR c1 IS
    SELECT empno
    FROM   emp;
  TYPE c_rowtype
    IS TABLE OF c1%ROWTYPE;
  crow C_ROWTYPE;
BEGIN
    OPEN c1;
    FETCH c1 bulk collect INTO crow;
    CLOSE c1;
    FOR i IN 1..crow.count LOOP
        emptype(i).empno := crow(i).empno;
    END LOOP;
END;  

最新更新