DB2 - 如何创建忽略错误的存储过程?

时间:2014-01-15 17:42:52

标签: stored-procedures error-handling db2

我正在尝试在DB2中创建一个执行以下操作的简单存储过程:

  1. 删除表“DELETE_ME”
  2. 创建表“DELETE_ME”
  3. 插入表格“DELETE_ME”
  4. 基本上,如果表DELETE_ME已经存在,则存储过程执行正常。如果它不存在,则存储过程失败,并显示以下错误:

    Lookup Error - DB2 Database Error: ERROR [42704] [IBM][DB2/LINUXX8664] SQL0204N  "SARTS02T.DELETE_ME" is an undefined name.
    

    我完全明白这一点。但是,我希望设置该过程以忽略此错误(以及所有错误),这样该过程也可以作为部署脚本工作。在第一次部署时,它将忽略drop table行并向右跳转到构建表。

    我发现了一个名为CONTINUE AFTER FAILURE的CREATE PROCEDURE选项但是我收到了一个错误。请在下面查看我的代码和错误。谢谢你的帮助!!!

    CODE:

    CREATE OR REPLACE PROCEDURE TEST_PROC LANGUAGE SQL CONTINUE AFTER FAILURE
    BEGIN
      DROP TABLE DELETE_ME;
    
      CREATE TABLE DELETE_ME (
      COLUMN_A DECIMAL(5)
      );
    
      INSERT INTO DELETE_ME (COLUMN_A) VALUES (69);
    
      COMMIT;
    
    END;
    

    ERROR:

    Lookup Error - DB2 Database Error: ERROR [42601] [IBM][DB2/LINUXX8664] SQL0104N  An unexpected token "CONTINUE AFTER FAILURE" was found following "ST_PROC LANGUAGE SQL".  Expected tokens may include:  "<space>".
    

1 个答案:

答案 0 :(得分:0)

BEGIN ... END部分称为compound statement,它允许将各种声明和其他声明(包括其他复合语句)包含在其中。

您需要声明条件处理程序。你可以这样做。

CREATE OR REPLACE PROCEDURE TEST_PROC
      LANGUAGE SQL
      COMMIT ON RETURN YES
  BEGIN
    DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'  -- or SQLEXCEPTION
      BEGIN
          -- insert any code here when DROP fails
      END;

    DROP TABLE DELETE_ME;

    CREATE TABLE DELETE_ME 
    (  COLUMN_A DECIMAL(5)
    );

    INSERT INTO DELETE_ME (COLUMN_A)
                   VALUES (69);

  END;