经常看到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 ;