【发布时间】:2011-03-16 11:24:55
【问题描述】:
例如,我想将某些表放在一个表空间中,该表空间的每个表末尾都附加了公用名:
TABLE1_NAME1_COMMON
TABLE2_NAME2_COMMON
TABLE3_NAME3_COMMON
我听说过 Oracle 函数,但我对这些函数不太熟悉,所以我期待一些帮助。
谢谢。
【问题讨论】:
例如,我想将某些表放在一个表空间中,该表空间的每个表末尾都附加了公用名:
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,以便显示错误。【讨论】:
execute immediate ... 构造,那么这是一个允许调用动态PL/SQL 的“PL/SQL 事物”。
您可以在程序中执行此操作,但最好只选择那些 DROP-statements,查看它们并手动执行它们:
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 删除它们。
不过,我会确保您首先 100% 确定选择。
【讨论】: