IBM Db2中if exists的语法

6

如果表存在,则以下查询将删除该表,但似乎对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语句而不是表删除语句,那么相同的if exists语法将起作用。任何对此的帮助都将不胜感激。

更新1:我读到在begin atomic块内无法运行DDL语句,因此我的第一条语句失败了,但第二条语句可以正常运行。


你有收到错误信息吗?如果是的话,你能把它发布出来吗? - Mike Wills
3个回答

9
我是这样做的:

以下是具体步骤:

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只有一个语句执行动态SQL:@dynsql;


1

您说得对,DB2 禁止在原子 SQL 块中执行 DDL。IBM 已经发布了一个免费的附加存储过程,名为 db2perf_quiet_drop,它可以按照您的要求工作。


-3
In case if you looking for embedded SQL:
Exec SQL                                   
  update Table1 set TabCol1 ='New Value' 
   where Table1KeyField1 =:Table1KeyValue1               
     and Table1KeyField2 =:Table1KeyValue2               
     and Exists (                          
       select '1' from Table2               
        where Table2KeyField1 =:Table2KeyValue1          
          and Table2KeyField2 =:Table2KeyValue2        
    ) ;                                    

1
这似乎并没有回答 OP 的问题。 - Ilario
脚本基于where子句,如果Table2中存在记录,则更新Table1。我将其嵌入我的RPG代码中并且它运行良好。您可以运行下面的脚本并相应调整您的脚本,或者将您的脚本发送给我,我会帮您修复: 从SYSIBM / SYSDUMMY1选择“1”作为真值 其中存在(从SYSIBM / SYSTYPINFO选择*,其中type_name ='INTEGER')的选择 - Noor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接