Stored-Procedures

如果儲存過程不存在,則使用 db2 中的 ddl 創建儲存過程

  • August 15, 2014

我的要求是,

我想創建一個 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 ;

引用自:https://dba.stackexchange.com/questions/66631