UDTF使用动态SQL在DB2V5R4上返回表

UDTF使用动态SQL在DB2V5R4上返回表,db2,ibm-midrange,Db2,Ibm Midrange,我必须写一个UDF返回一个表。我已经用静态SQL完成了 我创建了准备动态复杂SQL语句并返回游标的过程 但现在我必须使用动态SQL创建一个UDF,并返回一个表,以便与其他select中的IN子句一起使用 这在DB2V5R4上是可能的吗?你有一个例子吗 提前感谢…我没有V5R4,但我有6.1和V5R3。我有一个6.1的例子,我在V5R3中找到了如何使相同的例子在那里工作。我不能保证V5R4,但这应该非常接近。将工作的V5R3代码生成为“运行SQL脚本”将提供: DROP SPECIFIC FUNC

我必须写一个UDF返回一个表。我已经用静态SQL完成了

我创建了准备动态复杂SQL语句并返回游标的过程

但现在我必须使用动态SQL创建一个UDF,并返回一个表,以便与其他select中的IN子句一起使用

这在DB2V5R4上是可能的吗?你有一个例子吗


提前感谢…

我没有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
该示例旨在处理库QIWS中IBM的示例QCUSCDT表。大多数系统都会提供该表。table函数直接通过table函数的两个列CUSTNBR和CUSTBALDUE从两个QCUSCDT列CUSNUM和BALDUE返回值。第三个表函数列CUSTFULLNAME通过从QCUSTCDT串联INIT和LSTNAM来获取其值

但是,显然与问题相关的部分是函数的
SELECTBY
参数。用法示例显示传入一个
WHERE子句
,并用于帮助构建一个动态的“INSERT-INTO…”。。。选择…
语句。该示例显示将返回包含
STATE='TX'`的行。可以传入更复杂的子句,或者可以从其他地方(例如,从另一个表)检索所需的条件

动态语句将行插入名为
SESSION.TCUSTCDT
全局临时表中。临时表在函数中定义。临时列定义(由开发人员)保证与表函数的“RETURNS TABLE”列匹配,因为不能对这些元素中的任何一个进行动态更改。这允许SQL可靠地处理从函数返回的列,并允许它编译函数

RETURN
语句只返回动态语句完成后临时表中的任何行


各种字段定义考虑了QCUSTCDT文件中有些不寻常的定义。这些没有多大意义,但它们已经足够有用了。

你能再给我们一些吗?也许可以告诉我们,你将如何静态地做这件事,以及它需要什么样的动态性?佩德罗,听起来你需要一个用户定义的表函数(UDTF)。这是一个可以返回表而不是标量值的UDF。存储的进程可以返回游标,但不能将其嵌入
SELECT
语句中。看起来它很好地解释了UDTF。是的,我尝试创建一个UDTF。我必须提供一个参数来检索一些记录。在UDTF中检索此记录的条件存储在表树目录中。
即:
TREE\u CATEGORY.SQL\u condition=“code in('0080','0380')并键入'ED1'