我想在一个表空间中删除某些表,这些表的名称都有共同的后缀,例如:
TABLE1_NAME1_COMMON
TABLE2_NAME2_COMMON
TABLE3_NAME3_COMMON
我听说过Oracle函数,但并不太熟悉,所以希望得到一些帮助。
谢谢。
set serveroutput on size 1000000
begin
for r in (
select table_name
from user_tables
where table_name like '%\_COMMON' escape '\')
loop
execute immediate 'drop table ' || r.table_name;
end loop;
exception when others then
dbms_output.put_line(sqlerrm);
end;
/
编辑:
user_tables
而不是dba_tables
,因为这样似乎更安全。set serveroutput on
,以便打印dbms_output.put_line
。begin .. exception .. end
以显示错误。你可以在一个过程中完成这个操作,但最好的方法是仅选择那些DROP
语句,审核它们并手动执行:
SELECT 'DROP TABLE ' || table_name || ';'
FROM user_tables
WHERE table_name LIKE '%\_COMMON' ESCAPE '\';
将返回
DROP TABLE TABLE1_NAME1_COMMON;
DROP TABLE TABLE2_NAME2_COMMON;
DROP TABLE TABLE3_NAME3_COMMON;
要识别它们,你可以使用以下方法:
SELECT * FROM user_tables WHERE tablespace_name='MySpace' AND table_name like '%COMMON';
你可以使用SELECT语句来派生DROP语句。或者,你可以编写一个PL/SQL函数来循环遍历“公共表”,并使用EXECUTE IMMEDIATE命令将它们删除。
但是,在进行选择之前,请确保你已经百分之百确定了。
execute immediate...
结构,那么这是一种 "PL/SQL 东西",它允许调用动态 PL/SQL。 - René Nyffenegger