2012-02-03 53 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文件中有些不同尋常的定義。這些沒有什麼意義,但它們非常有用。