0

我正在尝试制作一个简单的脚本来处理可以正常失败的语句中的错误。这适用于 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

4

1 回答 1

1

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

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

于 2014-11-24T18:53:50.817 回答