我尝试使用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
答案 0 :(得分:0)
动态SQL语句不得包含语句终止符。从stmt1
删除尾随分号。
答案 1 :(得分:0)
程序本身不是问题,所有语法都是正确的(如果您在Linux,UNIX或Windows上讨论当前版本的DB2)并且它将被编译。
然而,还有许多其他潜在的错误:
您查询表格ESTORE.APPLICATION_LABELS
,然后更改APTR.APPLICATION_LABELS
。
当您更改表格时,您应该使用ALTER TABLE ... ALTER COLUMN ... RESTART WITH X
而不是尝试更改整个GENERATED
条款。
当您在存储过程中使用游标时,不确定为什么要使用return来声明cursor1
。就此而言,当你只能SELECT max(label_id) INTO v_max FROM ...
如果您要PREPARE
,则无需EXECUTE IMMEDIATE
您的陈述。只需EXECUTE IMMEDIATE stmt1;