2014-09-26 101 views
1

我嘗試使用DB2存儲過程來更改表。以下是我的代碼。我在alter query中發現了這個問題。但是同樣的查詢在DB2命令行編輯器中完美執行。我想使用存儲過程運行相同的查詢。請幫助我。db2 alter auto increment查詢存儲過程

CREATE PROCEDURE MODIFYAUTOINCRE() 
    SPECIFIC TEST 
    RESULT SETS 1 
    MODIFIES SQL DATA 
    LANGUAGE SQL 
------------------------------------------------------------------------ 
-- SQL Stored Procedure 
------------------------------------------------------------------------ 
P1: BEGIN 
    DECLARE v_max INTEGER DEFAULT 0;-- 
    DECLARE stmt1 VARCHAR(100); 
    DECLARE stmt2 VARCHAR(100); 
    DECLARE name1 VARCHAR(100); 

    -- Declare cursor 
    DECLARE cursor1 CURSOR WITH RETURN FOR 

     SELECT MAX(LABEL_ID) FROM ESTORE.APPLICATION_LABELS; 


    -- Cursor left open for client application 
    OPEN cursor1; 

     FETCH cursor1 INTO v_max; 
    IF (v_max > 0) THEN 

    SET v_max=v_max+1; 

     SET stmt1= 'ALTER TABLE APTR.APPLICATION_LABELS ALTER COLUMN LABEL_ID SET GENERATED AS IDENTITY (START WITH '||v_max||' INCREMENT BY 1 NO CACHE);'; 

     PREPARE name1 FROM stmt1; 

     EXECUTE IMMEDIATE name1; 

     commit; 
    END IF; 


END P1 

ERROR: 意外的標記 「END-OF-STATEMENT」 之後發現 「NTITY(START WITH 69」 預期標記可能包括: 「)」 .. SQLCODE = -104,SQLSTATE = 42601, DRIVER = 3.58.81

回答

0

動態SQL語句不得包含語句結束符。從stmt1中刪除尾隨分號。

+0

我刪除了分號。它顯示相同的錯誤.. – 2014-09-26 12:32:20

0

程序本身並不是問題,所有的語法都是正確的(如果您正在討論Linux,UNIX或Windows上的當前版本的DB2)並且它將被編譯。

但也有其他一些潛在的錯誤:

  1. 您查詢表ESTORE.APPLICATION_LABELS,但你改變APTR.APPLICATION_LABELS

  2. 當您更改表格時,應該只使用ALTER TABLE ... ALTER COLUMN ... RESTART WITH X而不是試圖更改整個GENERATED子句。

  3. 不確定爲什麼當您在存儲過程中使用遊標時聲明cursor1並返回。對於這個問題,不知道爲什麼你甚至使用光標在首位,當你可以SELECT max(label_id) INTO v_max FROM ...

  4. 你不需要PREPARE你的說法,如果你要EXECUTE IMMEDIATE。只是EXECUTE IMMEDIATE stmt1;