我必須編寫一個UDF來返回表。我用靜態SQL完成了它。UDTF使用動態SQL返回DB2 V5R4上的表格
我已經創建了準備動態和複雜SQL句子並返回遊標的過程。
但現在我必須創建一個動態SQL的UDF並返回一個表與其他select中的IN子句一起使用。
DB2 V5R4上有可能嗎?你有一個例子嗎?
在此先感謝...
我必須編寫一個UDF來返回表。我用靜態SQL完成了它。UDTF使用動態SQL返回DB2 V5R4上的表格
我已經創建了準備動態和複雜SQL句子並返回遊標的過程。
但現在我必須創建一個動態SQL的UDF並返回一個表與其他select中的IN子句一起使用。
DB2 V5R4上有可能嗎?你有一個例子嗎?
在此先感謝...
我沒有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.TCUSTCDT
的GLOBAL TEMPORARY TABLE
。臨時表在函數中定義。 (由開發人員)保證臨時列定義與表函數的「RETURNS TABLE」列匹配,因爲不能對這些元素中的任何元素進行動態更改。這使SQL可以可靠地處理從函數返回的列,並且可以編譯該函數。
RETURN
語句只是在動態語句完成後返回臨時表中的所有行。
各種字段定義考慮到QCUSTCDT文件中有些不同尋常的定義。這些沒有什麼意義,但它們非常有用。
你能給我們多一點嗎?也許可以告訴我們你會如何靜態地做這件事,並且需要動態地做這件事? – 2012-02-03 14:19:40
佩德羅,它聽起來像你需要一個用戶定義表函數(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
是的,我嘗試創建一個UDTF。我必須提供一個參數來檢索一些記錄。在UDTF中檢索這些記錄的條件存儲在表TREE_CATEGORY中。
即:'TREE_CATEGORY.SQL_CONDITION =「代碼輸入('0080','0380')和類型<>'ED1'」' – 2012-02-06 10:07:49