仅在存在删除表的情况下,否则忽略删除错误

时间:2019-03-06 12:53:34

标签: sql db2 drop-table

我有一个表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

2 个答案:

答案 0 :(得分:1)

这是一个常见问题解答

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

您可以在脚本中使用带有SQL的continue-handler的复合SQL,以应对与未找到表时得到的错误相对应的SQLSTATE,但这要求您还使用如下所示的替代语句定界符

--#SET TERMINATOR @

set current schema myschema@

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

CREATE TABLE MYLOG(... )@

您还可以更改第一次出错中止逻辑(如果通过命令行运行脚本时使用+ s,则可以)。您可以通过update command options using s off(继续执行错误操作)或update command options using s on终止执行错误操作来在脚本中即时审核Db2 CLP选项。

答案 1 :(得分:0)

通过使用此查询

select tabname from syscat.tables where 
tabschema='myschema' and tabname='MYLOG'

检查架构中的表

如果存在则

drop table myschema.MYLOG

然后创建