我知道这个问题可能会问很多次,但我找不到一行SQL语句。 我记得我之前做过但现在我不记得我是怎么做的了
我想删除名称以“EXT_”开头的所有表。是否有可能通过一行SQL语句实现它。
答案 0 :(得分:31)
您可以使用简短的匿名阻止来执行此操作。
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;
答案 1 :(得分:7)
只有一个声明是不可能的。通常,我编写一个sql来获取所有表,然后执行结果:
select 'drop table ' || table_name || ';'
from user_tables
where table_name like 'EXT_%';
答案 2 :(得分:2)
此代码不仅会对EXT_%表进行DROP,而且还会充当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;
为了达到预期的效果,您应该按照以下方式更改代码
BEGIN
FOR c IN ( SELECT table_name FROM user_tables WHERE table_name LIKE 'EXT\_%' ESCAPE '\')
LOOP
EXECUTE IMMEDIATE 'DROP TABLE ' || c.table_name;
END LOOP;
END;
它转义下划线字符以便按字面意义进行交易, ESCAPE' \' 修饰符表示转义字符&#39 ; \'
答案 3 :(得分:1)
在大多数情况下,您会发现违规行为。在这种情况下,此脚本可以帮助您:
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;