2016-11-16 125 views
2

我想創建一個函數,它返回一個可以在FROM子句中使用的對象。根據對oracle文檔的研究,我發現一個PIPELINED函數是我需要的。甲骨文管道功能

我有這樣的代碼:

CREATE TYPE type_struct AS OBJECT 
(
    i NUMBER 
); 

CREATE TYPE tp_struct AS TABLE OF type_struct; 

CREATE OR REPLACE FUNCTION gen_nums (na NUMBER, nb NUMBER) 
RETURN tp_struct PIPELINED 
IS 
    rec type_struct; 
    counter NUMBER; 
BEGIN 
    counter := na; 

    WHILE (counter <= nb) 
    LOOP 
     SELECT counter 
     INTO rec 
     FROM dual; 

     counter := counter + 1; 

     PIPE ROW (rec); 
    END LOOP; 

    RETURN; 
END gen_nums; 
/

預期的結果是從「NA」到「NB」,既包括記錄的表。

但是我編譯功能時出現此錯誤:

ORA 00932不一致的數據類型預期UDT了數

+0

由於內部分配名稱與參數名稱不匹配,您的代碼將無法編譯。如果您要編輯您的代碼進行發佈,請確保它仍然正確。 – APC

+0

謝謝你注意!編輯完成! –

回答

3

ORA 00932 inconsistent datatypes expected udt got number

你得到這個,因爲您的代碼會爲輸出分配一個標量類型。您需要轉換變量以匹配分配目標。因此:

SELECT type_struct(counter) 
    INTO rec 
    FROM dual; 

您不一定需要流水線功能。我們可以使用table()和任何返回集合的函數。

這是一個簡單得多的實現,它只需要一個UDT。

CREATE TYPE tp_numbers AS TABLE OF number; 
/
CREATE OR REPLACE FUNCTION gen_nums (na NUMBER, nb NUMBER) 
RETURN tp_numbers 
IS 
    return_value tp_numbers ; 
BEGIN 
    SELECT (na + level) - 1 
    bulk collect INTO return_value 
    FROM dual 
    connect by level <= nb; 

    RETURN return_value ; 
END gen_nums; 
/
+1

謝謝!很好的回覆,並幫助我更好地瞭解如何實現這一點! –

0
CREATE OR REPLACE FUNCTION gen_nums (na NUMBER, nb NUMBER) 
RETURN sys.DBMS_DEBUG_VC2COLL PIPELINED --sys.DBMS_DEBUG_VC2COLL an oracle provided collection type. 
IS 
    counter NUMBER; 
BEGIN 
    counter := na; 
    WHILE (counter <= nb) 
    LOOP 
     PIPE ROW (counter); 
     counter := counter + 1; 
    END LOOP; 
    RETURN; 
END gen_nums; 
+0

有關這種流水線功能使用的更多細節,請參閱http://develop-plsql.blogspot.in/ –