--?測試表數據。
select?*?from?test_main;
ID?VALUE
----------?--------------------
1?ONE 3?THREE 2?TWO--?返回結果集的函數.
CREATE?OR?REPLACE?FUNCTION?Get_Test_Main_All
RETURN?SYS_REFCURSOR
IS
return_cursor?SYS_REFCURSOR;BEGIN
OPEN?return_cursor?FOR?'SELECT?*?FROM?test_main'; RETURN?return_cursor;END;
/
--?普通的查詢,來查看結果.
SELECT?Get_Test_Main_All()?FROM?dual;
GET_TEST_MAIN_ALL()
--------------------
CURSOR?STATEMENT?:?1
CURSOR?STATEMENT?:?1
ID?VALUE
----------?--------------------
1?ONE 3?THREE 2?TWO--?存儲過程調用,?來獲取結果.
DECLARE?
--?調用函數的返回值. testCursor?SYS_REFCURSOR; --?存儲單行數據. testRec?test_main%ROWTYPE;BEGIN
--?調用返回結果集的函數. testCursor?:=?Get_Test_Main_All(); --?循環,遍歷結果. LOOP--?遊標向前.
FETCH?testCursor?INTO?testRec;
--?無數據的情況下,退出循環.
EXIT?WHEN?testCursor%NOTFOUND;--?輸出調試信息.
dbms_output.put_line(?TO_CHAR(testRec.id)?||?'?'?||?testRec.value);
END?LOOP;END;
/
1?ONE
3?THREE
2?TWO
PL/SQL?過程已成功完成。
--------------------------------------------------------------------------------
上面的是使用動態SQL處理的。
下面是正常SQL處理的。
CREATE?OR?REPLACE?FUNCTION?Get_Test_Main?
RETURN?SYS_REFCURSOR
IS
return_cursor?SYS_REFCURSOR;BEGIN
OPEN?return_cursor?FOR?SELECT?*?FROM?test_main; RETURN?return_cursor;END;
/
SQL>?SELECT?Get_Test_Main()?FROM?dual;
GET_TEST_MAIN()
--------------------
CURSOR?STATEMENT?:?1
CURSOR?STATEMENT?:?1
ID?VALUE
----------?--------------------
2?TWO--------------------------------------------------------------------------------
上面的是沒有參數的
下面是有參數的
CREATE?OR?REPLACE?FUNCTION?Get_Test_Main?(
p_id?INT)
RETURN?SYS_REFCURSOR
IS
return_cursor?SYS_REFCURSOR;BEGIN
OPEN?return_cursor?FOR?SELECT?*?FROM?test_main?WHERE?id?=?p_id; RETURN?return_cursor;END;
/
SQL>?SELECT?Get_Test_Main(2)?FROM?dual;
GET_TEST_MAIN(2)
--------------------
CURSOR?STATEMENT?:?1
CURSOR?STATEMENT?:?1
ID?VALUE
----------?--------------------
2?TWO返回遊標的函數,不是?“表值函數”
SQL>?SELECT?*?FROM?Get_Test_Main(2);
SELECT?*?FROM?Get_Test_Main(2)
*
ERROR?位於第?1?行:
ORA-00933:?SQL?命令未正確結束