/* The database samplaix is an alias for the SAMPLE database on AIX */
connect to samplaix
Database Connection Information
Database server = DB2/6000 8.1.2
SQL authorization ID = DB2INST1
Local database alias = SAMPLAIX
/* execute the host_name UDF against the remote database 鈥?
it returns the name of the computer of the clIEnt connection */
values host_name()
1
------------------------------------------------
mycomputer
通過觸發器或用戶定義函數調用存儲過程的 UDF
當遷移到 DB2 時,碰到的另一個普遍問題就是其他 RDBMS 可以通過觸發器或函數調用存儲過程。雖然 DB2 已經承諾在未來版本中包含該功能,但是我們將展示如何使用 DB2 的當前版本來實現該功能,即通過創建一個將對存儲過程發出調用的 UDF 來實現。
清單 5 中展示了用於該目的的用戶定義函數 CALL_PROCEDURE 的簽名。
清單 5. 用戶定義函數 CALL_PROCEDURE 的簽名
>>--CALL_PROCEDURE--(--procedure_name--,--parameter_list--,----->
>-----database_name--,--user_name--,--passWord--)-------------><
VARCHAR(257) 類型的參數 procedure_name 指定要被調用的存儲過程的全限定名 —— 在傳遞多個參數時,要用逗號進行分隔。該字符串將被粘貼到用於調用過程的 CALL 語句中,因此其語法需要符合 SQL CALL 語句的要求。 VARCHAR(8) 類型的參數 database_name 指定要執行該存儲過程的數據庫的別名。存儲過程不一定要駐留在同一數據庫中。 VARCHAR(128) 類型的參數 user_name 和 VARCHAR(200) 類型的參數 passWord 用於確定連接數據庫以及執行該過程時所使用的注冊信息。
該函數調用當前數據庫中的存儲過程。它建立新的連接之後就通過過程名和作為輸入參數而提供的參數來執行 CALL 語句。該 UDF 返回 0(零)表明 CALL 語句(以及相應的 CONNECT 和 CONNECT RESET 語句)執行成功。否則,將返回 DB2 命令行處理器(Command Line Processor,CLP)的返回碼和一條提供了更多信息的出錯消息。清單 6 演示了函數 CREATE_PROCEDURE 的執行。可以在“下載”小節中找到該腳本( trig_calls_proc.db2)的源代碼。
清單6. 測試函數 CREATE_PROCEDURE( )
下面這個例子測試演示了從觸發器調用包含一個參數的存儲過程。
在該示例中,我們創建 t1 和 t2 這兩個表,帶有一個輸入參數(p)
的過程(abc)以及一個觸發器(ins)。在執行觸發器時,它將調用該過程。
然後,過程將會將 num 列的新值(NEW.coll)插入到表 t1 中。
這可以通過以下操作來測試:在表 t2 上執行插入後對 t1 發出 select
來檢驗該表內容 —— 進而檢驗該過程是否成功執行。