# 在oracle中建置一個回傳select的function
###### tags: `oracle`
在mssql中,要弄一個回傳select的function或stored procedure好像是一件非常簡單的事,只要在文末下一個select就回傳了。
不過在oracle好像不是這麼一回事,需要不少步驟,這邊僅記錄個人能夠成功的步驟,但是已經有點忘了當初參考的出處,如有雷同部份再請告知,讓在下可以標註參考來源。
首先,建立一個參照的物件
```sql
-- 建立一個參照物件
CREATE OR REPLACE TYPE NOTES_OBJ_EOD_MLIST AS OBJECT (
MATNR VARCHAR2(54),
MTIDX VARCHAR2(54),
IDNRK VARCHAR2(54),
FERTH_LBR VARCHAR2(54),
FERTH_LED VARCHAR2(54)
);
```
接下來,建立一個暫存表,命名習慣上我會直接在參照物件後面加上一個TEMP,看個人喜好
```sql
CREATE TYPE NOTES_OBJ_EOD_MLIST_TEMP AS TABLE OF NOTES_OBJ_EOD_MLIST;
```
然後建立你的function
```sql
-- 建立FUNCTION
create or replace function NOTES_FUNC_EOD_MLIST(YOUR_PARAMETERS) return NOTES_OBJ_EOD_MLIST_TEMP pipelined AS
BEGIN
FOR cur IN (
SELECT MATNR, MTIDX, IDNRK, FERTH_LBR, FERTH_LED FROM YOUR_TABLE
) -- END cur
LOOP -- return date
PIPE ROW(NOTES_OBJ_EOD_MLIST(cur.MATNR,
cur.MTIDX,
cur.IDNRK,
cur.FERTH_LBR,
cur.FERTH_LED
)
);
END LOOP;
RETURN;
END;
```
第1行:要特別注意到,最後的return是你的暫存表,並且加上`pipelined`
第3行:把你的select用一個`for cur in`包住,其中`cur`你可以自己用你自己的命名
第6行:用`loop end loop`包住預計回傳的資料
第7行:用`pipe row(你建立的參照物件(欄位))`來處理要回傳的資料
最後只要再return,就可以成功弄一個可以回傳select的function
使用方法也很簡單,見下範例:
```sql
select * from table(your_function(parameter, if have))
```