首页 > 解决方案 > 仅当表存在时才删除表,或忽略删除错误

问题描述

我有一个表MYLOG,想在使用下面的 SQL 脚本创建它之前尝试删除它。如果该表尚不存在,则抛出以下错误。如果表不存在,我怎么能绕过这个错误?

架构在较早的脚本中设置,在 SQL 脚本中不可用:

set current schema MYSCHEMA

SQL脚本:

DROP TABLE MYLOG;
CREATE TABLE MYLOG (
  TIME_STARTED TIMESTAMP NOT NULL,
  USER_EMAIL VARCHAR(254) NOT NULL,
  CONSTRAINT PK_TIME_STARTED_USER_EMAIL    PRIMARY KEY (TIME_STARTED, USER_EMAIL))  ORGANIZE BY ROW;
COMMIT;

错误:

DROP TABLE MYLOG
SQLError: rc = 0 (SQL_SUCCESS) 
SQLGetDiagRec: SQLState     : S0002
          fNativeError : -204
          szErrorMsg   : [IBM][CLI Driver][DB2/6000] SQL0204N  "MYSCHEMA.MYLOG" is an undefined name.  SQLSTATE=42704

标签: sqldb2drop-table

解决方案


这是一个常见问题解答

有不止一种方法可以做到这一点。

如果找不到表,您可以在脚本中使用复合 SQL 与 SQLSTATE 的 continue-handler 对应的错误,但这要求您还使用替代语句分隔符,如下所示

--#SET TERMINATOR @

set current schema myschema@

BEGIN
 DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
   BEGIN end;
 EXECUTE IMMEDIATE 'DROP TABLE MYLOG';
END @

CREATE TABLE MYLOG(... )@

您还可以更改 abort-on-first-error 逻辑(如果您在通过命令行运行脚本时使用 +s)。update command options using s off您可以通过(在出错时继续)或update command options using s on在出错时中止来动态更新脚本中的 Db2 CLP 选项。


推荐阅读