如何在过程中返回一个oracle表

Posted

技术标签:

【中文标题】如何在过程中返回一个oracle表【英文标题】:how to return a oracle table in a procedure 【发布时间】:2016-04-20 10:03:00 【问题描述】:

我有一个调用函数的过程。此函数返回一个表,现在在程序中我要选择整个表。我正在做这个 atm,我得到了未初始化的集合。

 procedure check_all (
      p_period IN RPT_EXT.PERIOD%type default rptsum_time - 1/24/12,
      p_days IN NUMBER default 1/24/12,
      p_data_ext IN VARCHAR2 default DATA_EXT_DE2,
      p_ext_no IN TWS_DIMENSION_DEFINES.EXT_NO%type default null,
      p_record_id IN RPT_EXT.RECORD_ID%type default null
  )
  as
  sql_statement varchar2(200);
  tab extraction_count_tab;
  begin
  tab := extraction_counts( p_period , p_days, p_data_ext, p_ext_no, p_record_id);
   sql_statement := 'select* from tab';
   execute immediate sql_statement; -- need to chacnge this
   dbms_output.put_line(chr(10));
   performance_check(p_period, p_days, p_data_ext);
  end check_all;

【问题讨论】:

然后选择什么? 你想遍历那个表吗? 【参考方案1】:

不知道你想实现什么... 你喜欢使用来自select * from tab 的所有记录来调用过程performance_check 吗?

那么你应该考虑使用这样的for循环:

for rec in (
  select * from tab
           )
loop
   performance_check(rec.columnA, rec.columnB, ...)
end loop;

或者performance_check 应该返回一张您喜欢使用的表格吗? 在这种情况下,您必须从过程切换到表函数,无论是普通函数还是流水线函数。

有关文档或 f.e.,请参阅 https://docs.oracle.com/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm。 https://oracle-base.com/articles/misc/pipelined-table-functions 一些样品。

【讨论】:

【参考方案2】:

实际上它非常不清楚你想尝试什么,但我试图复制这个场景。希望能帮助到你。我没有工作区,如果有任何语法错误请见谅。

PROCEDURE check_all(
    p_period    IN RPT_EXT.PERIOD%type DEFAULT rptsum_time - '1/24/12',
    p_days      IN NUMBER DEFAULT '1/24/12',
    p_data_ext  IN VARCHAR2 DEFAULT DATA_EXT_DE2,
    p_ext_no    IN TWS_DIMENSION_DEFINES.EXT_NO%type DEFAULT NULL,
    p_record_id IN RPT_EXT.RECORD_ID%type DEFAULT NULL )
AS
  sql_statement VARCHAR2(200);
  tab extraction_count_tab;
BEGIN
  tab           := extraction_counts( p_period , p_days, p_data_ext, p_ext_no, p_record_id);
  sql_statement := 'select * from TABLE(tab)';
  EXECUTE immediate sql_statement BULK COLLECT INTO tab; -- need to chacnge this
  dbms_output.put_line(chr(10));
  performance_check(p_period, p_days, p_data_ext);
END check_all;

【讨论】:

以上是关于如何在过程中返回一个oracle表的主要内容,如果未能解决你的问题,请参考以下文章

oracle 存储过程返回结果集怎么实现?用java如何调用这个存储过程?比如表scott下的emp表

如何使Oracle过程返回结果集

SQL 过程可以返回一个表吗?

MYSQL 存储过程如何取得一个表的查询结果?

如何在存储过程中动态传递表名 - ORACLE [重复]

如何从存储过程返回的游标将数据插入临时表