转载 ORACLE中实现表变量的方法

源文地址:http://blog.itpub.net/750077/viewspace-2134222/

经常看到SQLSERVER 中用表变量类型的方式就能做到缓存一个比较大的中间结果,
然后再对这个表变量做处理,非常方便,那么ORACLE有这种表变量的方式处理中间结果么
实验后发下你用如下方法可以起到SQL SERVER里表变量的作用

1 创建基础数据表    

create table T_TEST_PIP(
       ID VARCHAR(10),
       TT DATE,
       DATA_ VARCHAR2(60)
 ) 

 

 SELECT *
    FROM T_TEST_PIP      

2 创建记录行类型

create or replace type row_data as object (      id number,
     time date,
     data varchar2(60)
    );

 3 创建行集合类型

create or replace type rows_array as table of row_data;    

4 封装查询结果到行集合类型里    

create or replace function f_test_array
                                       (
                                           n in number default null
                                       )
    return rows_array as --RETURN out_rec_set PIPELINED IS
    t_array rows_array := rows_array();
    --id1 number;
    --time1 date;
    --data1 varchar2(60);
    BEGIN
        FOR i in 1..3
        LOOP
            t_array.extend();
            --把一个相对复杂SQL查询出的结果,放入行集合类型
            SELECT
                     ROW_DATA (T.ID ,T.TT ,CASE
                              WHEN T.DATA_ IS NULL
                                       THEN '111'
                                       ELSE T.DATA_
                     END)
            INTO
                     t_array(i)
            FROM
                     T_TEST_PIP T
            WHERE
                     id = i
            GROUP BY
                     T.ID
                   , T.TT
                   , T.DATA_
            ;
        
        END LOOP;
        dbms_output.put_line('test '
        ||t_array(1).ID);
        return t_array;
    END;

5 从行集合类型里取数据

 select * from table(f_test_array());

6 应用行集合类型和其他表联合 

 SELECT *
 FROM table(f_test_array()) T1
  ,table(f_test_array()) T2
  ,T_TEST_PIP T3
 WHERE T1.ID = T2.ID
 AND   T1.ID = T3.ID ; 

 

转载于:https://www.cnblogs.com/champaign/p/9717010.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值