2017-02-09 27 views
0

とDB2のSQL関数は、私がダイナミック戻り値

CREATE OR REPLACE FUNCTION selector (param VARCHAR(3)) 
RETURNS TABLE (id INT, CMD VARCHAR(1024), ATTR CHAR(10)) 
LANGUAGE SQL 
DETERMINISTIC 
NO EXTERNAL ACTION 
RETURN 
    SELECT id, cmd, attr 
     FROM test.commandtbl c 
     WHERE c.attr=param; 

次の作業DB2のSQL機能を持つようにそれを呼び出す:

select * from table (selector('c'))!  

問題は、私はリターンテーブルのサイズがダイナミックになりたいということですタイプします。 多くのリターンフィールドを持つ関数を使いたいのですが、テスト中に返すテーブルを常にチェックしたくない場合は、それでもすべてが一致します。

Test1を5つの戻り列である:例えば

INT、INT、INT、CHAR(10)、VARCHAR(100)

Test2を20の戻り列である:10 VARCHAR(100)と10 INT

など。

これを行う方法はありますか?

+0

どのDB2バージョン/プラットフォームですか? – mustaccio

+0

Windows 7、DB2 v10 – Thevagabond

+0

Windows上にDB2 v10はありません - 10.1と10.5がありますのでどちらですか? – mustaccio

答えて

0

SQLでは、実行時に変数(列など)やオブジェクト(結果セットなど)のデータ型を検出する能力がほとんどないため、静的型付き言語と見なすことができます。文のコンパイル時に型を宣言する必要があります。つまり、達成したいことはできません。

あなたは一部結果セットを返すJavaベースのUDFを定義することができますgeneric table functionの概念があります:

CREATE FUNCTION selector (param VARCHAR(3)) 
RETURNS GENERIC TABLE 
EXTERNAL NAME... 

は、しかし、あなたはまだ受けて、結果セットの構造を宣言する必要がありますが、終了:

SELECT t.* FROM TABLE (selector('c')) AS t (foo INT, bar INT, baz VARCHAR(10)...) 
+0

SQLCODE = -628を使用すると、SQLSTATE = 42613 – Thevagabond

+0

何を使用するのですか?マニュアルの例に正確に従ってください。 – mustaccio

+0

'関数セレクターを作成するか、またはREPLACE(PARAMのVARCHAR(3))GENERICテーブルを返し EXTERNAL NAME 'セレクタ' DETERMINISTIC NO EXTERNAL ACTION RETURN SELECT ID、CMD、 ATTR test.commandtbl Cからの WHERE c).attr = param; ' ' SELECT t。* FROM TABLE(セレクタ( 'c'))AS t(ID INT、cmd VARCHAR(1024)、attr VARCHAR(10))! ' – Thevagabond