簡體   English   中英

oracle刪除表(如果不存在)(一行)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM