删除 table 如果存在 DB2/400 SQL
Drop table if it exists with DB2/400 SQL
我的目标非常简单 - 如果 table 有行,则将其删除。
尽管目前有几个类似的答案 none 对我有用。
- DB2 Drop table if exists equivalent
建议的解决方案:
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
- Drop DB2 table if exists
建议的解决方案:
--#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 EXISTS
source.
结果:
Message: [SQL0104] Token ONLY was not invalid. Valid tokens: RESTRICT CASCADE
所以,我想知道是否存在替代解决方案。 CL
解决方案也很有趣。
这是对这个问题的 CL 回答:
PGM PARM(&FILENAME)
DCL VAR(&FILENAME) TYPE(*CHAR) LEN(10)
DCL VAR(&NUMRECS) TYPE(*DEC) LEN(10 0)
RTVMBRD FILE(&FILENAME) NBRCURRCD(&NUMRECS)
IF COND(&NUMRECS > 0) THEN(DLTF +
FILE(&FILENAME))
OUT: ENDPGM
如果物理文件具有索引或逻辑文件等依赖项,则此解决方案会出现问题。必须先删除这些依赖项。
另一方面,@danny117 的解决方案并不适用于所有环境。例如,我无法强制它在 SQuirreL 客户端中工作。但它在 i Navigator 中确实有效。它也适用于 RUNSQLSTM
,但我无法确定如何使其与不合格的 table 引用一起使用。如果 table 不合格,RUNSQLSTM
使用 DFTRDBCOL
中的默认集合。 CURRENT_SCHEMA
特殊寄存器不 return 来自 DFTRDBCOL
的值。
这里是 if table has rows drop it 解决方案,使用复合语句:
begin
if( exists(
select 1 from qsys2.systables
where table_schema = 'MYLIB'
and table_name = 'MYTABLE'
)) then
if( exists(
select 1 from mylib.mytable
)) then
drop table mylib.mytable;
end if;
end if;
end;
我猜你想这样做的原因,但如果它允许创建一个新的 table,那么最好的方法可能是 CREATE OR REPLACE TABLE
如果你在IBM i v7.2 或更高版本。
如果您只想确保有一个空的 table,TRUNCATE
(v7.2+) 或 DELETE
可能是更好的选择。
如果存在使用原子语句,则删除 table。
BEGIN ATOMIC
IF( EXISTS(
SELECT 1 FROM TABLES
WHERE TABLE_SCHEMA = 'MYLIB'
AND TABLE_NAME = 'MYTABLE'
)) THEN
DROP TABLE MYLIB/MYTABLE;
END IF;
END;
试试这个:
BEGIN
IF EXISTS (SELECT NAME FROM QSYS2.SYSTABLES WHERE TABLE_SCHEMA = 'YOURLIBINUPPER' AND TABLE_NAME = 'YOURTABLEINUPPER') THEN
DROP TABLE YOURLIB.YOURTABLE;
END IF;
END ;
我假设您可能想多次执行此操作,因此可能需要一个程序。
CREATE or replace PROCEDURE DROP_LIVE_TABLE
(in @table varchar(10)
,in @library varchar(10)
)
BEGIN
declare @stmt varchar(100);
declare @cnt int;
IF exists( select * from systables
where sys_dname = @library
and sys_tname = @table
and table_type in ('P','T')
) THEN
SELECT int(sum(number_rows))
INTO @cnt
from SYSTABLESTAT
where sys_dname = @library
and sys_tname = @table
;
IF @cnt > 0 THEN
set @stmt = 'DROP TABLE '||@library||'.'||@table||' CASCADE';
execute immediate @stmt;
END IF;
END IF;
RETURN;
END;
CASCADE
关键字会导致任何相关对象(如索引、逻辑文件、视图等)也被删除。
我的目标非常简单 - 如果 table 有行,则将其删除。 尽管目前有几个类似的答案 none 对我有用。
- DB2 Drop table if exists equivalent
建议的解决方案:
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
- Drop DB2 table if exists
建议的解决方案:
--#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 EXISTS
source.
结果:
Message: [SQL0104] Token ONLY was not invalid. Valid tokens: RESTRICT CASCADE
所以,我想知道是否存在替代解决方案。 CL
解决方案也很有趣。
这是对这个问题的 CL 回答:
PGM PARM(&FILENAME)
DCL VAR(&FILENAME) TYPE(*CHAR) LEN(10)
DCL VAR(&NUMRECS) TYPE(*DEC) LEN(10 0)
RTVMBRD FILE(&FILENAME) NBRCURRCD(&NUMRECS)
IF COND(&NUMRECS > 0) THEN(DLTF +
FILE(&FILENAME))
OUT: ENDPGM
如果物理文件具有索引或逻辑文件等依赖项,则此解决方案会出现问题。必须先删除这些依赖项。
另一方面,@danny117 的解决方案并不适用于所有环境。例如,我无法强制它在 SQuirreL 客户端中工作。但它在 i Navigator 中确实有效。它也适用于 RUNSQLSTM
,但我无法确定如何使其与不合格的 table 引用一起使用。如果 table 不合格,RUNSQLSTM
使用 DFTRDBCOL
中的默认集合。 CURRENT_SCHEMA
特殊寄存器不 return 来自 DFTRDBCOL
的值。
这里是 if table has rows drop it 解决方案,使用复合语句:
begin
if( exists(
select 1 from qsys2.systables
where table_schema = 'MYLIB'
and table_name = 'MYTABLE'
)) then
if( exists(
select 1 from mylib.mytable
)) then
drop table mylib.mytable;
end if;
end if;
end;
我猜你想这样做的原因,但如果它允许创建一个新的 table,那么最好的方法可能是 CREATE OR REPLACE TABLE
如果你在IBM i v7.2 或更高版本。
如果您只想确保有一个空的 table,TRUNCATE
(v7.2+) 或 DELETE
可能是更好的选择。
如果存在使用原子语句,则删除 table。
BEGIN ATOMIC
IF( EXISTS(
SELECT 1 FROM TABLES
WHERE TABLE_SCHEMA = 'MYLIB'
AND TABLE_NAME = 'MYTABLE'
)) THEN
DROP TABLE MYLIB/MYTABLE;
END IF;
END;
试试这个:
BEGIN
IF EXISTS (SELECT NAME FROM QSYS2.SYSTABLES WHERE TABLE_SCHEMA = 'YOURLIBINUPPER' AND TABLE_NAME = 'YOURTABLEINUPPER') THEN
DROP TABLE YOURLIB.YOURTABLE;
END IF;
END ;
我假设您可能想多次执行此操作,因此可能需要一个程序。
CREATE or replace PROCEDURE DROP_LIVE_TABLE
(in @table varchar(10)
,in @library varchar(10)
)
BEGIN
declare @stmt varchar(100);
declare @cnt int;
IF exists( select * from systables
where sys_dname = @library
and sys_tname = @table
and table_type in ('P','T')
) THEN
SELECT int(sum(number_rows))
INTO @cnt
from SYSTABLESTAT
where sys_dname = @library
and sys_tname = @table
;
IF @cnt > 0 THEN
set @stmt = 'DROP TABLE '||@library||'.'||@table||' CASCADE';
execute immediate @stmt;
END IF;
END IF;
RETURN;
END;
CASCADE
关键字会导致任何相关对象(如索引、逻辑文件、视图等)也被删除。