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变量之间的区别
答案 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;