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;