0
DECLARE
TYPE WordList IS TABLE OF VARCHAR2(50);
FUNCTION getWordList
RETURN WordList
IS
words WordList := WordList();
BEGIN
words.EXTEND;
words(1) := 'aardvark';
RETURN words;
END;
BEGIN
SELECT * FROM TABLE(getWordList);
END;
/
當我嘗試從sqlplus中我得到這個運行此一個DECLARE塊...
ERROR at line 15:
ORA-06550: line 15, column 23:
PLS-00231: function 'GETWORDLIST' may not be used in SQL
ORA-06550: line 15, column 23:
PL/SQL: ORA-00904: "GETWORDLIST": invalid identifier
ORA-06550: line 15, column 3:
PL/SQL: SQL Statement ignored
看來,如果我要在匿名塊外定義函數,那麼它會工作正常,但我試圖避免這種情況,因爲我想針對實時數據庫運行一些函數,而且我不希望在腳本運行時在現場創建和刪除功能。如果我只用匿名函數來定義事物,那麼我沒有任何清理工作要做。
我想要做的是編寫一個函數,它將返回結果列表(無論採用何種形式,集合,光標,我都不挑剔),然後我可以將其傳遞給另一個函數進行進一步處理。這些函數可能是任意複雜的,我將來會重用它們,因此編寫函數而不是將所有內容寫入單個SQL語句中。
我是甲骨文的新手,所以試圖找到與穀物相關的成語和工作方式,而不是反對它。
它這就是我試圖避免這樣做。這可能是在這種情況下不可能的,在這種情況下,我正在尋找替代策略來做我想做的事情。 – 2014-10-09 09:15:26
是的,我明白你在找什麼。由於SQL需要全局定義,因此這是不可能的。你可以嘗試把所有的'FUNCTION'和'TYPE'聲明放在一個腳本中。同時也是來電模塊。它顯示爲單個本地聲明。但是Oracle 12c引入了一些很好的功能。但我不確定。 – 2014-10-09 09:18:17