微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在表函数中插入表集合类型,而无需在PL / SQL中使用显式游标

如何解决在表函数中插入表集合类型,而无需在PL / SQL中使用显式游标

我在PL / sql中编写了以下代码,并且可以正常工作:

declare 
type deliveryStat_o IS record  (
       warehouseName varchar2(20),shipMode char(30),thirty_days number,sixty_days number,ninety_days number,oneTwenty_days number,veryLate number
   );
type deliveryStat_t is TABLE OF deliveryStat_o;

statTable deliveryStat_t;

begin

        SELECT w_warehouse_name,sm_type,1 AS thirty_days,1 AS sixty_days,1 AS ninety_days,1 AS oneTwenty_days,1 AS veryLateDelivery
        bulk collect into statTable
        FROM   catalog_sales,warehouse,ship_mode,date_dim 
        WHERE   cs_ship_date_sk = d_date_sk 
               AND cs_warehouse_sk = w_warehouse_sk 
               AND cs_ship_mode_sk = sm_ship_mode_sk 
        GROUP  BY w_warehouse_name,sm_type ;
end;

如何在返回嵌套集合statTable的表函数执行此操作。我知道可以使用显式游标来实现;但是,是否可以在不使用光标的情况下做到这一点?

解决方法

对于上下文,我将从此作为基础

formatted_name: 'east_java'

要将其转换为允许使用表函数,则这些类型必须为SQL类型,因此

SQL> set serverout on
SQL> declare
  2    type deliveryStat_o IS record  (
  3           empno number,ename varchar2(20)
  4       );
  5    type deliveryStat_t is TABLE OF deliveryStat_o;
  6
  7    statTable deliveryStat_t;
  8
  9  begin
 10
 11          SELECT empno,ename
 12          bulk collect into statTable
 13          FROM   emp;
 14    dbms_output.put_line('recs='||statTable.count);
 15  end;
 16  /
recs=14

PL/SQL procedure successfully completed.

现在完成了,查询必须返回一个对象表,所以

SQL> create or replace
  2  type deliveryStat_o as object (
  3  empno number,ename varchar2(20)
  4       );
  5  /

Type created.

SQL> create or replace
  2  type deliveryStat_t as table of deliveryStat_o
  3  /

Type created.

现在可以轻松将其转换为表函数

SQL> set serverout on
SQL> declare
  2    statTable deliveryStat_t;
  3  begin
  4
  5          SELECT deliveryStat_o(empno,ename)
  6          bulk collect into statTable
  7          FROM   emp;
  8    dbms_output.put_line('recs='||statTable.count);
  9  end;
 10  /
recs=14

PL/SQL procedure successfully completed.

如果要返回很多行,请考虑使用流水线函数,以避免将所有行收集到嵌套表中的内存开销

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。