PL / SQL - 从函数返回表

时间:2014-10-06 22:02:17

标签: sql oracle plsql

我正在创建一个返回表格的函数。该函数基本上是在两个表之间进行比较,并返回如果两个表包含不同数据的数据集 P_min_id p_max_id 是可以忽略的,一旦此功能起作用,将来会实施。
我修改了http://www.adp-gmbh.ch/ora/plsql/coll/return_table.html的原始代码。错误消息在以下代码中进行了注释。

create or replace function return_objects(
  p_min_id in number,
  p_max_id in number
)
return t_nested_table as
  v_ret   t_nested_table;
begin
  select *              // Error(8,7): PL/SQL: SQL Statement ignored
  into
    v_ret
  from 
  (
    select 
    *
    from 
    (
      select * from 
      (
        select * from SCHEMA.TEST            
        minus
        select * from SCHEMA.TEST_1
      )
      union all
      select * from
      (
        select * from SCHEMA.TEST_1
        minus
        select * from SCHEMA.TEST
      )
    )
  )
return v_ret;           

end return_objects;

如果您可以修复我的代码,我将不胜感激,但我想知道为什么这段代码不起作用。请给我一些关键词,以便我可以研究。或者相关网站也将受到赞赏。

1 个答案:

答案 0 :(得分:4)

在SQL语句结束后添加分号,并使用bulk collect填充嵌套表。这是一个有效的例子:

create or replace type t_nested_table is table of varchar2(100);

create or replace function return_objects(
  p_min_id in number,
  p_max_id in number
)
return t_nested_table as
  v_ret   t_nested_table;
begin
  select *
  bulk collect into v_ret
  from 
  (
    select 'A' from dual union all
    select 'B' from dual
  );

  return v_ret;

end;
/

select return_objects(1,2) from dual;

<强>更新

根据问题编辑,还有一个特权问题。您的用户可能通过角色访问表,但要创建功能,应该直接向您的用户授予这些权限。