db2 alter auto increment query存储过程

时间:2014-09-26 09:30:51

标签: stored-procedures db2

我尝试使用DB2存储过程更改表。以下是我的代码。我在alter query中发现了这个问题。但是同样的查询在DB2命令行编辑器中执行得很好。我想使用存储过程运行相同的查询。请帮助我。

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

错误: 在“NTITY(从69开始”)后发现意外的“END-OF-STATEMENT”。预期的令牌可能包括:“)”.. SQLCODE = -104,SQLSTATE = 42601,DRIVER = 3.58.81

2 个答案:

答案 0 :(得分:0)

动态SQL语句不得包含语句终止符。从stmt1删除尾随分号。

答案 1 :(得分:0)

程序本身不是问题,所有语法都是正确的(如果您在Linux,UNIX或Windows上讨论当前版本的DB2)并且它将被编译。

然而,还有许多其他潜在的错误:

  1. 您查询表格ESTORE.APPLICATION_LABELS,然后更改APTR.APPLICATION_LABELS

  2. 当您更改表格时,您应该使用ALTER TABLE ... ALTER COLUMN ... RESTART WITH X而不是尝试更改整个GENERATED条款。

  3. 当您在存储过程中使用游标时,不确定为什么要使用return来声明cursor1。就此而言,当你只能SELECT max(label_id) INTO v_max FROM ...

  4. 时,不确定你为什么甚至首先使用光标?
  5. 如果您要PREPARE,则无需EXECUTE IMMEDIATE您的陈述。只需EXECUTE IMMEDIATE stmt1;