在'EMPTYPE'中找到的类型不匹配FETCH游标和INTO变量之间的关系

时间:2017-12-09 15:45:17

标签: oracle plsql

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:在' EMPTYPE'中找到的类型不匹配FETCH游标和INTO变量之间的区别

2 个答案:

答案 0 :(得分:4)

您的游标查询正在选择标量值empno,但要将其批量获取到对象表中。您期望Oracle弄清楚如何将标量值转换为对象。

对于可能看起来不完全不合理的单属性对象,但要考虑多属性对象的复杂性,或者您希望光标选择对象和标量值的混合。 (顺便说一句,你的empno真的是一个500字符的字符串,而不是数字吗?)

您可以修改游标查询以显式构造对象:

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;
/

答案 1 :(得分:0)

显然,您无法使用游标中的bulk collect into提取直接分配集合对象,尽管这两者将包含兼容的数据类型元素。

来自oracle文档,

  

PLS-00386 :在'字符串'中找到类型不匹配在FETCH游标和。之间   INTO变量

     

原因:FETCH语句的INTO列表中的赋值目标   数据类型与选择列表中的相应列不匹配   游标声明,并不清楚哪个隐式转换   需要纠正不匹配。

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

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;