2010-10-11 12 views
6

Następująca kwerenda usuwa tabelę, jeśli tabela istnieje, ale nie wydaje się działać dla IBM Db2.Składnia, jeśli istnieje w IBM Db2

rozpoczęciem atomowy

if (istnieje (

SELECT 1 z SYSIBM.SYSTABLES GDZIE NAZWA = 'e-mail' I RODZAJ = 'T' i twórca = 'schema1' )), a następnie upuść tabelę EMAIL; koniec if; Koniec

Podczas gdy ta sama składnia istnieje, jeśli mam instrukcję DML zamiast instrukcji drop tabeli. Każda pomoc w tym zakresie jest ceniona.

Aktualizacja 1: Czytam, że nie można uruchomić instrukcji DDL w obrębie bloku atomowego, stąd moja pierwsza instrukcja kończy się niepowodzeniem, ale druga dobrze.

+0

Czy wyświetla się komunikat o błędzie? Jeśli tak, możesz to opublikować? –

Odpowiedz

7

The Way I zrobił to w sposób następujący

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 

Moja customStoredProc ma tylko jeden stmt wykonać natychmiastową @dynsql;

1

Masz rację, że DB2 zabrania DDL w bloku atomowym SQL. IBM wydał bezpłatną procedurę dodatkową o nazwie db2perf_quiet_drop, która działa tak, jak chcesz.