2017-02-09 4 views
0

Ich habe die folgenden Arbeits DB2 SQL-FunktionDB2 SQL-Funktion mit dynamischem Rückgabewert

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; 

Nennt es mag:

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

Das Problem ist, dass ich die Rückgabetabelle in der Größe dynamisch sein soll und tippen Sie ein. Ich möchte die Funktion mit vielen Return-Feldern verwenden und während des Testens möchte ich nicht immer die Return-Tabelle überprüfen, es passt immer noch alles.

Zum Beispiel:

Test1 wird mit 5 return Spalten: INT, INT, INT, CHAR (10), VARCHAR (100)

Test2 wird mit 20 return Spalten: 10 VARCHAR (100) und 10 INT

und so weiter.

Gibt es eine Möglichkeit, das zu tun?

+0

Welche DB2 Version/Plattform? – mustaccio

+0

Windows 7, DB2 v10 – Thevagabond

+0

Es gibt kein DB2 v10 unter Windows - es gibt 10.1 und 10.5, also welches? – mustaccio

Antwort

0

Sie können SQL als statisch typisierte Sprache betrachten, da es nur geringe Möglichkeiten hat, die Datentypen Variable (z. B. Spalte) und Objekt (z. B. Ergebnismenge) zur Laufzeit zu ermitteln. Sie müssen Typen bei der Kompilierungszeit der Anweisung deklarieren. Mit anderen Worten, was Sie erreichen wollen, ist nicht möglich.

Es gibt ein Konzept eines generic table function ist mit dem Sie eine Java-basierte UDF definieren können, die einige Ergebnismenge zurückgibt:

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

Sie jedoch noch die Ergebnismenge Struktur auf der Empfangs erklären, müssen Ende:

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

Wenn ich das verwende, bekomme ich SQLCODE = -628, SQLSTATE = 42613 – Thevagabond

+0

Wenn Sie was verwenden? Befolgen Sie das Beispiel im Handbuch genau. – mustaccio

+0

CREATE OR REPLACE FUNCTION Selektor (param VARCHAR (3)) GENERIC TABLE EXTERNAL NAME 'Selektor' DETERMINISTIC NO EXTERNAL ACTION RETURN RÜCKKEHR SELECT ID, cmd, attr FROM test.commandtbl c WHERE c.attr = param; ' ' SELECT t. * FROM TABELLE (selector ('c')) AS t (id INT, cmd VARCHAR (1024), attr VARCHAR (10))! ' – Thevagabond