当前位置: 首页 > 知识库问答 >
问题:

DB2更改自动增量查询存储过程

王才英
2023-03-14

我尝试使用 DB2 存储过程更改表。以下是我的代码。我在更改查询中发现了问题。但是同样的查询在 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 开头)”之后发现意外的标记“语句结尾”。预期的令牌可能包括:“)”...SQLCODE=-104,SQL 状态=42601,驱动程序=3.58.81

共有2个答案

皇甫文乐
2023-03-14

这个过程本身没有问题,所有的语法都是正确的(如果您谈论的是Linux、UNIX或Windows上的DB2的当前版本),并且它可以编译

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

> < li>

您查询表< code>ESTORE。APPLICATION_LABELS,但随后您更改了< code>APTR。应用程序标签。

当您更改表时,您应该只使用<code>alter table…alter COLUMN…用X

当您在存储过程中使用光标时,不知道为什么要用return声明< code>cursor1。就这一点而言,我甚至不知道为什么首先要使用光标,因为您可以将max(label_id)从...

如果要执行IMMEDIATE,则不需要准备语句。只需EXECUTE IMMEDIATE stmt1;

袁桐
2023-03-14

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

 类似资料:
  • 我正在尝试运行以下存储过程: 我得到这个错误: SQL错误[42601]:在“E_ENTRIES_LOG”之后发现意外的标记“ALTER”。预期的令牌可能包括: “.SQLCODE=-104,SQLSTATE=42601,DRIVER=4.26.14 注意:如果我在不使用存储过程的情况下运行alter查询,它运行正常。

  • 如果你有什么建议,我很想听听! 谢谢:)

  • 问题内容: 我想在sql查询中更改表的动态名称。例如,我有下一个存储过程: 我需要在运行时更改 tableName ,我可以这样做吗?谢谢。 问题答案: 您必须使用动态SQL来准备和执行SQL字符串,以实现您所描述的内容。 在准备之前,必须将动态表名称(或列名称或SQL关键字等)内插到SQL字符串中。您不能将查询参数用于这些动态元素。 当您将表名称插入到SQL查询中时,请小心避免SQL注入漏洞。例

  • 问题内容: 我在存储过程中创建一个动态查询。我的存储过程如下: 当我尝试通过以下调用运行它时: 我收到以下错误消息: 错误代码:1054。“ where子句”中的未知列“ SPA” 我在没有where条件的情况下进行了测试,并且工作正常,但是在where条件不起作用的情况下,我尝试使用@和变量名一起使用,但仍然无法正常工作。 谢谢你的帮助。 问题答案: 您错过了条款中的引号。 尝试这样: 说明 :

  • 我试图使用RazorSQL客户端在DB2数据库中创建一个存储过程,但遇到了以下错误: 块引用错误:字符、标记或子句无效或丢失。DB2SQL错误:SQLCODE=-104, SQLSTATE=42601, SQLERRMC=SELECT 存储过程代码为:

  • 我正在使用 db2 和 S 松鼠 SQL 我试图创建一个存储过程,其中包含一个简单的select语句。当我省略下面的select语句并运行代码时,过程就创建好了。这个过程也可以被删除和调用。 当我添加select语句时,我得到错误:DB2 SQL错误:SQLCODE=-102,SQLSTATE=42601,... 如果你去IBM iseries信息中心,它会说: SQL0104 SQLCODE-1