2010-10-11 9 views
6

La requête suivante supprime une table si la table existe mais qu'elle ne semble pas fonctionner pour IBM Db2.Syntaxe de si existe dans IBM Db2

Begin atomique

si (existe (

CHOISIR 1 À PARTIR SYSIBM.SYSTABLES OU NOM = 'EMAIL' ET TYPE = 'T' et créateur = 'schema1' )) puis drop table EMAIL; fin si; Fin

Considérant que la même syntaxe si exisits fonctionne si j'ai une instruction DML au lieu de table drop instruction.

Mise à jour 1: J'ai lu que vous ne pouvez pas exécuter l'instruction DDL dans begin atomic block, d'où ma première instruction échoue mais la seconde va bien.

+0

Un message d'erreur s'affiche-t-il? Si oui, pouvez-vous poster cela? –

Répondre

7

La façon dont je l'ai fait comme suit

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 

Mon customStoredProc a juste un stmt exécuter @dynsql immédiate;

1

Vous avez raison de dire que DB2 interdit DDL dans un bloc SQL atomique. IBM a publié une procédure complémentaire gratuite appelée db2perf_quiet_drop qui fonctionne comme vous le souhaitez.