Oralce 提供一種叫 Pipelining 的技術, 讓在下 SQL 時可以'做'一個虛擬 Table.

舉個例子 : 單使用 SQL 指令, 想要整理一個統計學生考試成績的分佈表, 這一個分佈表要呈現 0~100分區間的各數, 不存在的區間數量也須顯示0, 有一個很簡單的問題就是, 一定會有某些分數區間是0, 如果單存以 Group By 會得到下列結果, 而不是想要的.

SCORE COUNT
80 2
83 1
89 17
92 2

這個時候如果有一個 Table, 內容具有0~100, 那拿來 Outer Join 不就可以了, 以下就是 oracle 所提供的一個方法, 可以'做'一個虛擬 Table, 內容0~100.

--先定義 function 要傳回的型態
CREATE TYPE TYPE_SCORE_ROW AS OBJECT ( SCORE int); 
CREATE TYPE TYPE_SCORE_TABLE AS TABLE OF TYPE_SCORE_ROW;
--實做 function 傳回一個 table.
CREATE OR REPLACE FUNCTION SCORE_TABLE(iStart IN INT, iEnd IN INT, iIncrement IN INT)
    RETURN TYPE_SCORE_TABLE PIPELINED
IS
    i INT := iStart;
    str VARCHAR2 (4000);
BEGIN
    WHILE i <= iEnd
    LOOP
      PIPE ROW (TYPE_SCORE_ROW(i));
      i:=i+iIncrement;
    END LOOP;
    RETURN;
END SEQ_TABLE;
/
--取得的方式
select * from table(SCORE_TABLE(0,100,1))

全站熱搜
創作者介紹
創作者 py3939 的頭像
py3939

老爹寫程式

py3939 發表在 痞客邦 留言(1) 人氣()