【发布时间】:2017-04-24 08:47:11
【问题描述】:
我的目标非常简单 - 如果表有行,则删除它。 尽管目前有几个类似的答案,但没有一个对我有用。
建议的解决方案:
IF EXISTS (SELECT name FROM sysibm.systables WHERE name = 'mylib.mytable') THEN
DROP TABLE mylib.mytable;END IF;
结果:
SQL State: 42601 Vendor Code: -199 Message: [SQL0199] Keyword IF not expected.
Valid tokens: ( CL END GET SET CALL DROP FREE HOLD LOCK OPEN WITH ALTER BEGIN
建议的解决方案:
--#SET TERMINATOR @
begin
declare statement varchar(128);
declare continue handle for sqlstate '42710' BEGIN END;
SET STATEMENT = 'DROP TABLE MYLIB.MYTABLE';
EXECUTE IMMEDIATE STATEMENT;
end @
结果:
Message: [SQL0104] Token HANDLE was not invalid. Valid tokens: HANDLER 或者,如果将 handle 替换为 handler:
Message: [SQL0199] Keyword STATEMENT not expected. Valid tokens: SQL PATH RESULT SCHEMA CURRENT CONNECTION DESCRIPTOR.
- 来自answer关于观看次数
建议的解决方案:
DROP TABLE MY_TABLE ONLY IF EXISTSsource.
结果:
Message: [SQL0104] Token ONLY was not invalid. Valid tokens: RESTRICT CASCADE
所以,我想知道是否存在替代解决方案。 CL 解决方案也很有趣。
【问题讨论】:
-
您的问题说您只想删除包含记录的表,但您的示例尝试删除该表(如果存在)。如果该表存在但有零行,您要删除它吗? DDS 定义的可能包含多个成员(类似于分区)的物理文件呢?
-
@WarrenT 不错。事实上,我的目标是删除包含行的文件,但删除文件成员为空(即 0 行)的文件的解决方案也很有趣。
-
顺便说一句,在 #1 上,您需要将其包装在 BEGIN END 块中。在 #2 上,您拼错了 HANDLER。在 #3 上,ONLY IF EXISTS 语法在 DB2 for i 上无效。
-
@WarrenT 我同意,可能会有错误,但所有这些方法只是我对答案的汇编,所以我希望它们能解决问题。无论如何,即使使用 BEGIN END 块,#1 的任何答案都对我不起作用。
-
使用临时 BEGIN END 块是一项功能,如果您使用的是过去几年未应用任何 TR 的旧版本,您可能无法使用该功能。
标签: sql db2 ibm-midrange db2-400