2014-10-08 33 views
0

我有這樣的從Oracle功能,一個匿名塊內定義返回一個表

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語句中。

我是甲骨文的新手,所以試圖找到與穀物相關的成語和工作方式,而不是反對它。

回答

1

FunctionType必須是在甲骨文全球上市,在SQL使用..

任何SELECT將實際發送的背景下的SQL引擎和在那裏執行查詢。把結果發回給PL/SQL引擎..

對於剛剛PL/SQL呼叫如:普通邏輯不SQL S,你的方法將工作..

所以下面需要做的事情..

將類型創建爲SQL對象。

CREATE TYPE WordList IS TABLE OF VARCHAR2(50); 

聲明函數

CREATE FUNCTION getWordList 
    RETURN WordList 
    IS 
    words WordList := WordList(); 
    BEGIN 
    words.EXTEND; 
    words(1) := 'aardvark'; 
    RETURN words; 
    END; 
/

呼叫然後

BEGIN 
    SELECT * INTO SOMERECORD FROM TABLE(getWordList); 
END; 
/
+0

它這就是我試圖避免這樣做。這可能是在這種情況下不可能的,在這種情況下,我正在尋找替代策略來做我想做的事情。 – 2014-10-09 09:15:26

+1

是的,我明白你在找什麼。由於SQL需要全局定義,因此這是不可能的。你可以嘗試把所有的'FUNCTION'和'TYPE'聲明放在一個腳本中。同時也是來電模塊。它顯示爲單個本地聲明。但是Oracle 12c引入了一些很好的功能。但我不確定。 – 2014-10-09 09:18:17