我知道这个问题可能会问很多次,但我找不到一行SQL语句。 我记得我之前做过,但现在我不记得我是怎么做的删除Oracle SQL中以“EXT_”开头的所有表格
我想删除名称以“EXT_”开头的所有表格。一行SQL语句可能会发生吗?
我知道这个问题可能会问很多次,但我找不到一行SQL语句。 我记得我之前做过,但现在我不记得我是怎么做的删除Oracle SQL中以“EXT_”开头的所有表格
我想删除名称以“EXT_”开头的所有表格。一行SQL语句可能会发生吗?
您可以使用短的匿名块来完成此操作。
BEGIN
FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT_%')
LOOP
EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
END LOOP;
END;
只有一条语句是不可能的。通常,我写一个sql来获取所有表格,然后执行结果:
select 'drop table ' || table_name || ';'
from user_tables
where table_name like 'EXT_%';
复制全部并执行它们可以很容易与这一个。选择'drop table'|| table_name || '; 'from user_tables where table_name like'EXT_%'; –
是的,这就是我的意思。执行此查询,复制/粘贴结果并执行语句。 –
该代码不仅会删除EXT_%表,还会作为DROP EXT%。 下划线是作为特殊的通配符,充当'%',但对于单个字符。
BEGIN
FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT_%')
LOOP
EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
END LOOP;
END;
为了达到预期的效果,你应该改变方式如下
它逃脱下划线字符,以便您的代码从字面上trated,ESCAPE“\”修饰符指示转义字符是'\'
在大多数情况下,您会发现违反约束。在这种情况下,这个脚本可以帮助你:
DECLARE
c_action CONSTANT VARCHAR2(10) := 'DROP';
BEGIN
FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'STARTINGTEXT_%')
LOOP
FOR reg IN (SELECT uc.table_name,
uc.constraint_name
FROM user_constraints uc
WHERE uc.table_name IN (c.table_name)) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE ' || reg.table_name || ' ' || c_action ||
' CONSTRAINT ' || reg.constraint_name ;
END LOOP;
END LOOP;
COMMIT;
FOR c IN (SELECT table_name FROM user_tables WHERE table_name LIKE 'STARTINGTEXT_%')
LOOP
EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || c.table_name;
EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
END LOOP;
END;
还包括“级联约束”,以便在涉及外键时删除这些表的顺序不会成为问题。 – talek