ORACLE中實現表變數的方法

flzhang發表於2017-02-24

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750077/viewspace-2134222/,如需轉載,請註明出處,否則將追究法律責任。

相關文章