oracle drop table如果不存在(在一行中)

时间:2017-04-24 15:38:59

标签: oracle plsql

我正在尝试在Oracle上做一些在Sql Server上完成的事情,如下所示:

IF EXISTS(SELECT * FROM   dbo.Scores) DROP TABLE dbo.Scores

请注意,我想避免多行pl sql,因为这可以在一个脚本中重复多次。

最初将其写为proc,但后来在Oracle中实现了proc属于模式,并且该模式需要提升权限,这是不可取的。

作为计划B我试图像这样执行函数调用的输出

execute immediate FN_DROP_TABLE_IF_EXISTS('mySchema','myTable');

我的目标是再次在一条线上做到这一点。如果表不存在,上面应该返回一个表drop语句,或者一些void type语句?

2 个答案:

答案 0 :(得分:2)

您可以使用invoker's rights创建您的函数 - 或者更恰当地,在此上下文中创建一个过程 - 这意味着其中的命令将作为调用用户以其权限运行 - 而不是作为过程所有者。然后,您不需要传递架构。

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)以查看它是否存在,然后只删除它,而不是尝试删除并处理异常。

您还需要了解区分大小写的表名和参照完整性,这需要按特定顺序删除表。

答案 1 :(得分:0)

如果没有这样的表,你必须处理异常:

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;
相关问题