Stored-Procedures
如果儲存過程不存在,則使用 db2 中的 ddl 創建儲存過程
我的要求是,
我想創建一個 ddl 腳本,它將檢查數據庫上是否存在儲存過程,如果是,則刪除它並重新創建它。
我嘗試的是,
IF EXISTS (select procname into Migration_procname from sysibm.sysprocedures where procname like 'GIAM_PRIVILEGE_MIGRATION') THEN DROP PROCEDURE ITIMUSER.GIAM_PRIVILEGE_MIGRATION; ELSE CREATE PROCEDURE ITIMUSER.GIAM_PRIVILEGE_MIGRATION() SPECIFIC ITIMUSER.GIAM_PRIVILEGE_MIGRATION LANGUAGE SQL BEGIN ...... ...... update/select statements ...... END @
這沒有用。所以我什至嘗試創建另一個執行相同任務的程序仍然沒有成功。
錯誤消息是
DB21034E 該命令被作為 SQL 語句處理,因為它不是有效的命令行處理器命令。在 SQL 處理期間,它返回:SQL0104N 在“BEGIN-OF-STATEMENT”之後發現了意外的標記“IF EXISTS(選擇 procname”。預期的標記可能包括:“”。SQLSTATE=42601
任何指針都會有所幫助。
注意:我使用的是 DB2/LUW 9.5
IBM在 7.1 版中添加了OR REPLACE選項
所以你的程式碼應該像這樣工作:
CREATE OR REPLACE PROCEDURE ITIMUSER.GIAM_PRIVILEGE_MIGRATION() SPECIFIC ITIMUSER.GIAM_PRIVILEGE_MIGRATION LANGUAGE SQL BEGIN ...... ...... update/select statements ...... END
在 DB2 9.5 for LUW 中,創建或替換不起作用。它是在 9.7 中添加的。對於我的商店仍然需要維護的 9.5+ 兼容性,我創建了以下方法。本質上,我創建了一個實用程序儲存過程,它將確定另一個儲存過程是否存在,然後有條件地刪除它,這樣就不會出現錯誤消息。然後,我呼叫它來刪除我想要刪除的儲存過程。然後,我自己清理,因為我們無法可靠地跟踪創建或未創建的位置。
注意:我目前正在改進這個。它是匆忙完成的,顯然可以簡化為使用更少的變數。我還想以 SYSCAT.PROCEDURES 為基礎,如下面的查詢所示:
SELECT * FROM SYSCAT.PROCEDURES WHERE PROCSCHEMA = CURRENT_SCHEMA AND PROCNAME = 'MYPROC'
所以,這裡是實際的 SP:
--#SET TERMINATOR ! CREATE PROCEDURE SP_Drop_Proc_If_Exists (IN v_ProcName varchar(255)) Drop_Proc_If_Exists: BEGIN DECLARE V_EXISTENCE CHAR(1) DEFAULT 'N'; DECLARE V_FOUND_COUNT INT DEFAULT 0; DECLARE V_DROP_STMT VARCHAR(255); SELECT COUNT(*) INTO V_FOUND_COUNT FROM SYSIBM.SYSROUTINES WHERE ROUTINENAME = v_ProcName; IF (V_FOUND_COUNT > 0) THEN SET V_DROP_STMT = 'DROP PROCEDURE ' || v_ProcName; EXECUTE IMMEDIATE V_DROP_STMT; END IF; END Drop_Proc_If_Exists ! CALL SP_Drop_Proc_If_Exists ('DROP_FK_CONSTRAINTS') ! DROP PROCEDURE SP_Drop_Proc_If_Exists ! --#SET TERMINATOR ;