Синтаксис if существует в IBM Db2

Следующий запрос удаляет таблицу, если она существует, но не работает для IBM Db2.

Begin atomic

if( exists(

SELECT 1 FROM SYSIBM.SYSTABLES 
            WHERE NAME='EMAIL' AND TYPE='T' AND creator = 'schema1'
)) then
drop table EMAIL;
end if;
End

Принимая во внимание, что тот же синтаксис, если существует, работает, если у меня есть оператор DML вместо оператора удаления таблицы. Любая помощь в этом приветствуется

Обновление 1: я читал, что вы не можете запустить оператор DDL в блоке begin atomic, поэтому мой первый оператор терпит неудачу, но второй работает нормально.


person Cshah    schedule 11.10.2010    source источник
comment
Вы получаете сообщение об ошибке? Если да, то можете ли вы опубликовать это?   -  person Mike Wills    schedule 11.10.2010


Ответы (2)


Я сделал это следующим образом

Begin atomic

  if( exists( SELECT 1 
              FROM SYSIBM.SYSTABLES 
              WHERE NAME='EMAIL' AND TYPE='T' AND creator = 'schema1' 
            )
    ) 
    then customStoredproc('drop table EMAIL'); 

  end if;

End

У моего customStoredProc есть только один stmt, выполняющий немедленно @dynsql;

person Cshah    schedule 20.10.2010

Вы правы в том, что DB2 запрещает DDL в атомарном блоке SQL. IBM выпустила бесплатную дополнительную процедуру под названием db2perf_quiet_drop, которая работает так, как вам нужно.

person Fred Sobotka    schedule 20.10.2010