尝试将数据从预先填充的集合复制到函数中的关联数组

时间:2014-04-13 05:38:57

标签: oracle

我在尝试将数据从一个集合复制到另一个集合时遇到错误。

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;

1 个答案:

答案 0 :(得分:1)

首先,使用xyztest1作为变量名称会使您理解代码变得相对困难,因为它在任何时候都不明显变量表示游标,表示集合。调用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 );