Удалить таблицу, только если она существует, или игнорировать ошибку удаления - PullRequest
0 голосов
/ 06 марта 2019

У меня есть таблица MYLOG, и я хотел бы попробовать удалить ее перед созданием, используя приведенный ниже сценарий SQL.Если таблица еще не существует, ошибка ниже - throw.Как можно обойти эту ошибку, если таблица не существует?

Схема устанавливается в более раннем сценарии, который недоступен в сценарии 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 ]

1 голос
/ 06 марта 2019

Это FAQ

Существует более одного способа сделать это.

Вы можете использовать составной 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(... )@

Вы также можете изменить логику abort-on-first-error (если вы используете + s при запуске вашего скрипта через командную строку). Вы можете изменить параметры Db2 CLP на лету внутри вашего скрипта с помощью update command options using s off (чтобы продолжить при ошибке) или update command options using s on, чтобы отменить при ошибке.

0 голосов
/ 06 марта 2019

с помощью этого запроса

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

проверьте эту таблицу в вашей схеме

если существует, то

drop table myschema.MYLOG

затем создайте

...