2014-06-05 116 views
0

我的要求是使用DDL,創建一個存儲過程,如果犯規存在,在DB2

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

,沒有工作。 所以我甚至嘗試創建另一個做同樣的任務仍然沒有成功的程序。

任何指針都會有幫助。

注:我使用的DB2/LUW 9.5

回答

0

東西像一個過程你降聲明:

create procedure drop_procedure (procschema varchar(128), 
           procname varchar(128)) 
LANGUAGE SQL 
BEGIN 
    DECLARE tmpstmt VARCHAR(100); 
    SET tmpstmt = 'drop procedure ' || procschema || '.' || procname; 

    A: BEGIN 
     -- Do nothing if drop procedure fails 
     DECLARE CONTINUE HANDLER FOR SQLSTATE '42704' 
      BEGIN 
      END; 

     EXECUTE IMMEDIATE tmpstmt; 
    END; 
END @ 

然後,你可以調用,不管是否存在一個過程或不

CALL DROP_PROCEDURE('ITIMUSER', 'GIAM_PRIVILEGE_MIGRATION') @ 
CREATE PROCEDURE ITIMUSER.GIAM_PRIVILEGE_MIGRATION() ... 
+0

感謝Lennart,我還有一個疑問。有什麼方法可以使用DDL腳本執行DCL命令(授權)? –

+0

你可以更具體地說明你正在嘗試做什麼,只要你有認證,afaik就沒有問題。 – Lennart

+0

其實我正在用ADMIN用戶執行DDL腳本,所以在默認情況下,不會有創建的程序對像ITIMUSER這樣的其他用戶的執行權限。所以我想通過相同的DDL文件授予他們權限。我嘗試過運行,但沒有取得成功。得到低於錯誤 –

0

你可以嘗試創建或更換 這是Oracle的語法,並根據該網站應該在DB2工作以及: http://iprodeveloper.com/database/use-sql-create-or-replace-improve-db2-i-object-management

祝你好運

+0

也就是說目前從DB2 9.7沒有9.5,感謝反正 –

+0

您可以嘗試的解決方案:如果程序存在,它可以幫助你檢查: http://stackoverflow.com/questions/355687/how-to-check-a-procedure-view-table-exists-or-not-before-dropping-it-in-db2-9-1 – gomuli

+0

我已經看到,那只是刪除不再創建它的過程。我正在使用相同的腳本重新創建過程時遇到問題。 –