2016-11-16 7 views
2

FROM句で使用できるオブジェクトを返す関数を作成しようとしています。オラクルのドキュメントに関する調査によると、私はPIPELINED関数が必要であることを発見しました。Oracleパイプライン関数

私はこのコードを持っている:

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; 
/

意図した結果が包括的の両方、「NB」から「NA」からレコードを持つテーブルです。

機能をコンパイルするとき、私はこのエラーを取得するしかし:

ORAは、UDTを期待00932一貫性のないデータ型は数

+0

内部割り当て名がパラメータ名と一致しないため、コードがコンパイルされません。公開用にコードを編集する場合は、コードが正しいことを確認してください。 – APC

+0

気づいていただきありがとうございます!編集が完了しました! –

答えて

3

ORA 00932 inconsistent datatypes expected udt got number

あなたはこれを取得しまったので、あなたのコードはスカラーを出力に割り当てますタイプ。代入先と一致するように変数をキャストする必要があります。したがって:

SELECT type_struct(counter) 
    INTO rec 
    FROM dual; 

必ずしもパイプライン機能は必要ありません。 table()にはコレクションを返す関数を使用できます。

ここでは、はるかに単純な実装であり、1つの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

このようなパイプライン関数の使用に関する詳細については、plzを参照してくださいhttp://develop-plsql.blogspot.in/ –

関連する問題