源文地址: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 ;