UDTF возвращает таблицу в DB2 V5R4 с динамическим SQL - PullRequest
0 голосов
/ 03 февраля 2012

Я должен написать UDF, возвращающий таблицу.Я сделал это с помощью статического SQL.

Я создал процедуры, готовящие предложение динамического и сложного SQL и возвращающие курсор.

Но теперь я должен создать UDF с динамическим SQL ивернуть таблицу, которая будет использоваться с предложением IN, в другом select.

Это возможно в DB2 v5R4?У вас есть пример?

Заранее спасибо ...

1 Ответ

1 голос
/ 27 марта 2014

У меня нет V5R4, но у меня есть 6.1 и V5R3.У меня есть пример 6.1, и я покопался в V5R3, чтобы найти, как заставить этот же пример работать там.Я не могу гарантировать V5R4, но это должно быть очень близко.Генерация рабочего кода V5R3 в «Выполнение сценариев SQL» дает следующее:

DROP SPECIFIC FUNCTION SQLEXAMPLE.DYNTABLE ; 

SET PATH "QSYS","QSYS2","SYSPROC","SYSIBMADM","SQLEXAMPLE" ; 

CREATE FUNCTION SQLEXAMPLE.DYNTABLE ( 
              SELECTBY VARCHAR( 64 ) ) 
   RETURNS TABLE ( 
              CUSTNBR DECIMAL( 6, 0 ) , 
              CUSTFULLNAME VARCHAR( 12 ) , 
              CUSTBALDUE DECIMAL( 6, 0 ) )   
   LANGUAGE SQL
   NO EXTERNAL ACTION 
   MODIFIES SQL DATA 
   NOT FENCED 
   DISALLOW PARALLEL
   CARDINALITY 100 

   BEGIN 

DECLARE DYNSTMT VARCHAR ( 512 ) ; 
DECLARE GLOBAL TEMPORARY TABLE SESSION.TCUSTCDT 
   ( CUSTNBR DECIMAL ( 6 , 0 ) NOT NULL , 
     CUSTNAME VARCHAR ( 12 ) , 
     CUSTBALDUE DECIMAL ( 6 , 2 ) ) 
WITH REPLACE ; 

SET DYNSTMT = 'INSERT INTO Session.TCustCDt SELECT t2.CUSNUM , (t2.INIT CONCAT '' '' CONCAT t2.LSTNAM) as FullName , t2.BALDUE FROM QIWS.QCUSTCDT t2 ' CONCAT CASE WHEN SELECTBY = '' THEN '' ELSE SELECTBY END ; 

EXECUTE IMMEDIATE DYNSTMT ; 

RETURN SELECT * FROM SESSION . TCUSTCDT ; 

END  ; 

COMMENT ON SPECIFIC FUNCTION SQLEXAMPLE.DYNTABLE 
    IS 'UDTF returning dynamic table' ;

А в «Выполнении сценариев SQL» функцию можно вызывать так:

SELECT t1.* FROM TABLE(sqlexample.dyntable('WHERE STATE = ''TX''')) t1

Примерпредназначен для работы над образцом таблицы IBM QCUSCDT в библиотеке QIWS.В большинстве систем эта таблица будет доступна.Табличная функция возвращает значения из двух столбцов QCUSCDT, CUSNUM и BALDUE, напрямую через два столбца табличной функции, CUSTNBR и CUSTBALDUE.Третий столбец табличной функции, CUSTFULLNAME, получает свое значение путем объединения INIT и LSTNAM из QCUSTCDT.

Однако часть, которая, по-видимому, относится к вопросу, является параметром SELECTBY функции.Пример использования показывает, что WHERE clause передается и используется для помощи в построении динамического INSERT INTO ... SELECT ... statement. The example shows that rows containing STATE = 'TX'`.Может быть передано более сложное предложение или необходимые условия могут быть получены из другого места, например, из другой таблицы.

Динамический оператор вставляет строки в GLOBAL TEMPORARY TABLE с именем SESSION.TCUSTCDT.Временная таблица определяется в функции.Временные определения столбцов гарантируются (разработчиком) тем, что они соответствуют столбцам 'RETURNS TABLE` табличной функции, поскольку никакие из этих элементов не могут быть динамически изменены.Это позволяет SQL надежно обрабатывать столбцы, возвращаемые функцией, и позволяет компилировать функцию.

Оператор RETURN просто возвращает все строки во временной таблице после завершения динамического оператора.

Различные определения полей учитывают несколько необычные определения в файле QCUSTCDT.Это не имеет большого смысла, но они достаточно полезны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...