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))