在DB2 PL / SQL中,匿名块声明局部变量并声明继续处理程序结果错误?

时间:2014-11-17 21:09:17

标签: db2 handler sql-pl

我正在尝试创建一个简单的脚本来处理可以正常失败的语句中的错误。这适用于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行,在开始之前添加一个declare语句会失败(注意我这里没有使用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

1 个答案:

答案 0 :(得分:1)

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

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