[英]oracle drop table if doesn't exist (in one line)
我正在嘗試在Oracle上做一些在Sql Server上完成的事情,如下所示:
IF EXISTS(SELECT * FROM dbo.Scores) DROP TABLE dbo.Scores
請注意,我要避免使用多行pl sql,因為可以在單個腳本中將其重復多次。
最初將其寫為proc,但隨后在Oracle中意識到proc屬於模式,該模式需要提升權限,這是不希望的。
正如計划BI試圖執行這樣的函數調用的輸出
execute immediate FN_DROP_TABLE_IF_EXISTS('mySchema','myTable');
再次,我的目標是要有一種方法可以做到這一點。 上面應該返回一個表drop語句,或者如果表不存在,則返回一些void類型的語句?
您可以使用調用者的權限來創建函數(或更恰當的說,在這種情況下為過程),即調用者的權限 ,這意味着其中的命令將以具有特權的調用用戶(而不是過程所有者)的身份運行。 然后,您無需傳遞架構。
create procedure drop_table_if_exists(p_table_name varchar2)
authid current_user
as
e_does_not_exist exception;
pragma exception_init(e_does_not_exist, -942);
begin
execute immediate 'drop table ' || p_table_name;
exception
when e_does_not_exist then
null; -- could report if you want
end drop_table_if_exists;
/
當您可以將其稱為:
exec drop_table_if_exists('my_table');
例如,如果創建一個表然后嘗試將其刪除兩次,則第二次嘗試不會出現異常:
create table my_table (id number);
Table MY_TABLE created.
exec drop_table_if_exists('my_table');
PL/SQL procedure successfully completed.
exec drop_table_if_exists('my_table');
PL/SQL procedure successfully completed.
您的過程還可以查詢數據字典( user_tables
)以查看其是否存在,然后僅在存在的情況下才將其刪除,而不是嘗試刪除並處理該異常。
您還需要注意區分大小寫的表名和引用完整性,這將需要按特定順序刪除表。
沒有這樣的表時,您必須處理異常:
create or replace procedure drop_it(pv_name in varchar2)
is
begin
execute immediate 'drop table schema.' || pv_name ||' purge';
exception when others then null; end;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.