在 DB2 PL/SQL 匿名块中声明局部变量和声明继续处理程序会导致错误?

Posted

技术标签:

【中文标题】在 DB2 PL/SQL 匿名块中声明局部变量和声明继续处理程序会导致错误?【英文标题】:In DB2 PL/SQL anonymous block declare local variables and declare continue handler results in error? 【发布时间】:2014-11-17 21:09:16 【问题描述】:

我正在尝试制作一个简单的脚本来处理可以正常失败的语句中的错误。这是针对 DB2 v10.5 (Linux)

示例创建表并在表已存在时处理

begin 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '42710' BEGIN END; 
    EXECUTE IMMEDIATE 'CREATE TABLE T(c1 INT)'; 
end
/

这个没问题

现在我有一个稍微复杂的块,它最初使用局部变量,我试图添加 DECLARE CONTINUE HANDLER,但我无法编译它。简化问题我发现,如果我有 Handler 行,则在开始之前添加声明语句会失败(请注意,我在这里没有使用 localVariable,但仅通过添加该语句就会失败。如果我在没有 DECLARE CONTINUE HANDLER 的情况下运行相同的语句,它也运行正常

declare 
  localVariable  INT;
begin 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '42710' BEGIN END; 
    EXECUTE IMMEDIATE 'CREATE TABLE T(c1 INT)'; 
end
/

产生的错误代码

错误报告:DB2 SQL 错误:SQLCODE=-104,SQLSTATE=42601, SQLERRMC=end;end;BEGIN, DRIVER=3.68.61

【问题讨论】:

不要混合使用 PL/SQL 和 DB2 SQL PL 语法。选择其中一个并始终如一地使用它。 什么是正确的 DB2 SQL 语法?如果我尝试 BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '42710' BEGIN END;声明变量 1 INT;立即执行'创建表 T(c1 INT)'; END / - 这也会导致 42601 错误。 你试过手册了吗?变量声明必须在处理程序声明之前。 www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/… 谢谢,您想发布您的 cmets 作为答案吗? 【参考方案1】:

您似乎混淆了 PL/SQL 和 DB2 SQL PL 语法。 PL/SQL 块在BEGIN...END 之前有DECLARE 部分,如第二个示例中所示。如果你使用它,你的所有声明都必须在 DECLARE 部分。

当您使用 SQL PL 复合 SQL 语法时,没有单独的 DECLARE 部分,而是所有 DECLARE 语句必须出现在 BEGIN...END 块中之前 任何可执行语句。请注意,DECLARE 语句的顺序也很重要。例如,条件处理程序声明必须出现在变量声明之后。您可以找到确切的compound SQL syntax in the manual。

【讨论】:

以上是关于在 DB2 PL/SQL 匿名块中声明局部变量和声明继续处理程序会导致错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在匿名 PL/SQL 块中没有立即引发异常?

我可以在调用同一过程后将 PL/SQL 过程放在匿名块中吗?

如何在匿名 PL/SQL 块中自动显示所有 SQL 语句的输出

Oracle 匿名 PL/SQL 块中缺少关键字错误

在 PL/SQL 中动态声明变量

是否可以在 PL/SQL 开发人员测试窗口的“声明”块中声明子过程?