oracle 使用临时表返回数据表

 找了很多关于存储过程返回数据表的文章,发现oracle和sqlserver有很大的区别,sqlserver可以直接在存储过程返回数据表,而oracle的存储过程不能直接返回数据表,最多就返回数据表指针,如果你想在sql里看到返回的内容,还需要写一个循环去读取里面的内容。这里我写了一个管道表函数去返回我想要的内容。

备注:DWXXTreeNode:单位信息树节点(相当于一行)

DWXXTree:单位信息树(相当于表)

dwxx:单位信息表(数据表)

这里用到了 存储过程返回数据表管道表函数的内容,网上很多,这里就不介绍了。 需要注意的是,oracle是区分大小写的,所以DWXXTreeNode 、DWXXTree使用的时候必须大小写一致。

 写这篇东西只是想将存储过程返回数据表的内容补充完整,因为有时候我只是想在pl/sql里面看内容,不是输出到外面的。写完package之后,我觉得package像java的类一样,有属性、方法,body里面进行实现。

调用:select * from table(PG_dwxxTree.getTree(0));

--树节点,用于函数返回
create or replace type DWXXTreeNode is object
(
  dwdm varchar2(15),--单位代码
  dmd number(2)--层数
);
create or replace type DWXXTree is table of DWXXTreeNode;

--包定义
CREATE OR REPLACE PACKAGE PG_dwxxTree IS
  type DataTable IS REF CURSOR ;
  type TreeNode is record
  (
    dwdm varchar2(15),
    dmd number(2)
  );
  procedure createTree(dt OUT DataTable,fz in number);--条件:dt:数据表指针,fz:分组
  function getTree(fz in number) return DWXXTree pipelined;
END PG_dwxxTree;

--包体,用于生成单位树
CREATE OR REPLACE PACKAGE BODY PG_dwxxTree IS

      procedure createTree(dt OUT DataTable,fz in number)
      IS
      BEGIN
          --具体实现可以在这里写,也可以使用临时表
          OPEN dt FOR
          SELECT dwdm,dmd FROM dwxx where rownum < 5;
      END createTree;

      --调用存储过程返回结果
     function getTree(fz in number) return dwxxTree pipelined
      is
          obj_dwxxTreeNode DWXXTreeNode;
          tb_cursor PG_dwxxTree.DataTable;
          item PG_dwxxTree.TreeNode;
      begin
          createTree(tb_cursor,fz);
          loop
               fetch tb_cursor into item;
               exit when tb_cursor%notfound;
               dbms_output.put_line(item.dwdm || ' ' ||item.dmd || ' ');
               obj_dwxxTreeNode :=  dwxxTreeNode(item.dwdm,item.dmd);
               pipe   row(obj_dwxxTreeNode);
           end loop;

           return;
      end getTree;    
end PG_dwxxTree;

pl/sql代码如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值