【问题标题】:PL/SQL - Returning a table from a functionPL/SQL - 从函数返回表
【发布时间】:2014-10-06 22:02:17
【问题描述】:

我正在创建一个返回表格的函数。该函数基本上是在两个表之间进行比较,如果两个表包含不同的数据,则返回数据集。
P_min_idp_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;

如果您能修复我的代码,我们将不胜感激,但我想知道为什么这段代码不起作用。请给我一些关键字,以便我研究。或相关网站供参考也将不胜感激。

【问题讨论】:

  • @Glenn - 我假设您的意思是分号,而不是逗号。您还缺少into 中的bulk collect

标签: sql oracle plsql


【解决方案1】:

在 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;

更新

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

【讨论】:

  • 再次感谢您的回答!我在编辑后才意识到权限问题,所以我删除了它:) 还是谢谢你!
猜你喜欢
  • 2013-05-06
  • 2018-04-10
  • 2014-06-20
  • 1970-01-01
  • 2021-08-30
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多