2012-02-03 51 views
0

我必须编写一个UDF来返回表。我用静态SQL完成了它。UDTF使用动态SQL返回DB2 V5R4上的表格

我已经创建了准备动态和复杂SQL句子并返回游标的过程。

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

DB2 V5R4上有可能吗?你有一个例子吗?

在此先感谢...

+0

你能给我们多一点吗?也许可以告诉我们你会如何静态地做这件事,并且需要动态地做这件事? – 2012-02-03 14:19:40

+2

佩德罗,它听起来像你需要一个用户定义表函数(UDTF)。这是一个可以返回表而不是标量值的UDF。存储过程可以返回一个游标,但不能将它们嵌入到SELECT语句中。 [本文档](http://www-03.ibm.com/systems/resources/systems_i_software_db2_pdf_ExternalUDTF.pdf)看起来好像解释了UDTF。 – dmc 2012-02-03 14:43:34

+0

是的,我尝试创建一个UDTF。我必须提供一个参数来检索一些记录。在UDTF中检索这些记录的条件存储在表TREE_CATEGORY中。
即:'TREE_CATEGORY.SQL_CONDITION =“代码输入('0080','0380')和类型<>'ED1'”' – 2012-02-06 10:07:49

回答

1

我没有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表。大多数系统都有该表格。表函数直接通过表函数的两列CUSTNBR和CUSTBALDUE,从两个QCUSCDT列CUSNUM和BALDUE中返回值。第三个表函数列CUSTFULLNAME通过来自QCUSTCDT的INIT和LSTNAM的串联来获取它的值。

但是,显然与问题相关的部分是函数的参数SELECTBY。该用法示例显示WHERE clause已传入并用于帮助构建动态的“INSERT INTO ... SELECT ... statement. The example shows that rows containing STATE ='TX'`将被返回。可以传入更复杂的子句,或者可以从其他地方(例如,从另一个表中)检索所需的条件。

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

RETURN语句只是在动态语句完成后返回临时表中的所有行。

各种字段定义考虑到QCUSTCDT文件中有些不同寻常的定义。这些没有什么意义,但它们非常有用。