2017-02-09 20 views
0

У меня есть следующий рабочий DB2 функции SQLDB2 Функция 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; 

Вызов нравится:

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

Проблема заключается в том, что я хочу возвращение таблица быть динамичным по размеру и тип. Я хочу использовать функцию с большим количеством полей возврата, и во время тестирования я не хочу, чтобы всегда проверять таблицу возврата, все это соответствует.

Например:

Тест1 находится с 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 статически типизированный язык, поскольку он не имеет возможности обнаруживать его типы данных (например, столбец) и объект (например, набор результатов) во время выполнения; вы должны объявлять типы во время компиляции инструкции. Другими словами, то, чего вы хотите достичь, невозможно.

Существует понятие о generic table function, который позволяет определить Java на основе UDF, которая возвращает некоторый результирующего набора:

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

'CREATE OR REPLACE FUNCTION (селектор парам VARCHAR (3)) ВОЗВРАТ Generic ТАБЛИЦА ВНЕШНЕЕ ИМЯ 'селектор' DETERMINISTIC внешнего действия ВОЗВРАТ ВЫБОР ID, CMD, атр ОТ test.commandtbl с ГДЕ c.attr = param; ' ' SELECT t. * FROM TABLE (селектор ('c')) AS t (id INT, cmd VARCHAR (1024), attr VARCHAR (10))! ' – Thevagabond