【问题标题】:Drop table only if it exists, or ignore drop error仅当表存在时才删除表,或忽略删除错误
【发布时间】:2019-07-28 03:33:08
【问题描述】:

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

【问题讨论】:

  • 每当 sqlerror 继续/退出?

标签: sql db2 drop-table


【解决方案1】:

通过使用此查询

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

检查架构中的那个表

如果存在则

drop table myschema.MYLOG

然后创建

【讨论】:

  • myschema 在 SQL 脚本中是未知的
【解决方案2】:

这是一个常见问题解答

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

如果找不到表,您可以在脚本中使用复合 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 选项。

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2020-12-07
    相关资源
    最近更新 更多