我在尝试将数据从一个集合复制到另一个集合时遇到错误。
Error(17,8): PL/SQL: ORA-00904: "COLUMN_VALUE": invalid identifier
请帮我提供一个更好的方法。
create or replace type type_record as object(employee_id NUMBER(6),
first_name VARCHAR2(20));
create or replace type type_tbl as table of type_record;
create or replace function scrub_final_2 return sys_refcursor IS
x type_tbl;
test1 type_tbl;
y sys_refcursor;
z sys_refcursor;
begin
x:=type_tbl();
z:=scrub_final_1; /*This is a function which returns a refcursor*/
loop
fetch z bulk collect into test1;
exit when z%NOTFOUND;
select column_value bulk collect into x from table(test1);
end loop;
open y for select employee_id,first_name from employees a where not exists
(select employee_id from table(x) where a.employee_id=employee_id);
return y;
end;
答案 0 :(得分:1)
首先,使用x
,y
,z
和test1
作为变量名称会使您理解代码变得相对困难,因为它在任何时候都不明显变量表示游标,表示集合。调用object
type_record
也令人困惑,因为它实际上不是record
,它是一个非常类似于SQL对象的PL / SQL结构。此外,您的标题相当混乱,因为您的集合都不是实际的关联数组。
其次,你当前构建的循环没有任何意义。如果您要进行循环播放,则需要使用bulk collect
进行limit
。如果您不打算在limit
中使用bulk collect
,那么循环是没有意义的,因为您只会进行一次循环迭代。
第三,似乎没有理由将数据从一个集合复制到另一个集合。您可以使用test1
中的数据打开y
,而不是在查询中使用x
。使用第二个集合只意味着您在PGA中浪费了宝贵的空间。
第四,如果你真的想将数据从一个集合复制到另一个集合,你可以做一个简单的任务
x := test1;
第五,如果您要针对在对象类型上定义的集合编写select
,则结果中的列将是对象类型属性的名称。 column_value
只是内置类型集合的列名。如果你真的真的想通过select
声明努力完成任务,你就可以做类似的事情
SELECT type_record( employee_id, first_name )
BULK COLLECT INTO x
FROM TABLE( test1 );