2012年8月10日 星期五

Oracle - Function return list

莫名其妙的開始要看 Oracle 的東西,
第一個遇到的難題就是要幫別人看 PL/SQL ,
但是我根本不會寫呀!
自從二技那堂 Oracle 的學分之後我就再也沒有摸過了,
連書都送別人了!可見我多麼有自信不會再摸到 Oracle 呀!
可是上天是愛捉弄人的!

anyway, 現在要弄得就是寫一個STORE PROCEDURE\FUNCTION 回傳一個 TABLE,
本來覺得這根本是天殺的簡單呀!
沒想到小朋友寫出來的卻是回傳一個 CURSOR !!!這是甚麼東!
結果才發現這邊的人居然沒有寫過這樣的東西,
還質疑說 Oracle 可以這樣子嗎?這問倒我了,我哪知道呀~~~
所以我就東查西查的,還問了阿輝仔!
原來 Oracle 真的不能直接回傳 SELECT * FROM xxx_table 這樣!
不過可以用間接的方式,往下看吧!

首先要先宣告你要回傳的 List Array 的 OBJECT:

CREATE TYPE O_GROUP AS OBJECT
(GROUP_ID VARCHAR2(8),
GROUP_NAME VARCHAR2(30));

然後接下來在將這個 OBJECT 轉成 TABLE:


GREATE TYPE GROUP_LIST AS TABLE OF O_GROUP;


然後就可以開始寫 Function 啦!如下:




CREATE OR REPLACE FUNCTION GET_GROUP_LIST
RETURN GROUP_LIST AS
v_ResultSet GROUP_LIST := GROUP_LIST();

CURSOR c_GROUP_TABLE IS
SELECT GROUP_ID, GROUP_NAME
    FROM GROUP_TABLE
   ORDER BY GROUP_ID;
  
BEGIN

FOR v_Rec IN c_GROUP_TABLE LOOP

v_ResultSet.EXTEND;
v_ResultSet(v_ResultSet.LAST) := O_GROUP(v_Rec.GROUP_ID, v_Rec.GROUP_NAME);

END LOOP;

RETURN v_ResultSet;

END GET_GROUP_LIST;


簡單的說就是回傳我們定義的 Table ,
然後用 cursor 的方式把資料塞進去。

最後就可以直接使用啦!


SELECT * FROM TABLE(GET_GROUP_LIST());


沒想到在 MS SQL SERVER 中那麼簡單的事情來到了 Oracle 一切都變得不簡單了!
最後感謝阿輝伯在放假中還回答我問題!

2 則留言: