【问题标题】:How to write a procedure to test if object exists and drop it?如何编写一个程序来测试对象是否存在并删除它?
【发布时间】:2016-02-18 08:06:03
【问题描述】:

在 Oracle 中,我正在尝试创建用于删除任何命名对象(如果存在)的过程。我想执行这个查询,select * from dba_objects where owner = 'TEST'。但是当我创建程序时出现错误:-

 create or replace PROCEDURE DROPDATABASEOBJECT11(ObjName varchar2,ObjType varchar2,schemaName varchar2)
-----PROCEDURE FOR DROP ALL DATABASE OBJECTS-----
IS
 v_counter number := 0;   
begin    
  if ObjType = 'TABLE' then
    select count(*) into v_counter select * from dba_objects where object_name = upper(ObjName);
    if v_counter > 0 then          
      execute immediate 'drop table ' || ObjName || ' cascade constraints';        
    end if;   
  end if;
  end;

我收到错误:-

Error(8,5): PL/SQL: SQL Statement ignored
Error(8,41): PL/SQL: ORA-00942: table or view does not exist

那么如何在程序中使用该查询?

【问题讨论】:

  • drop语句是由哪个用户执行的?我敢打赌它不是 TEST 用户。您必须在 drop 语句中包含对象的架构。
  • 用架构名称限定对象名称。
  • select count(*) into v_counter select * from dba_objects where object_name = upper(ObjName) and owner = 'TEST';
  • 我也尝试过使用上述查询,但我得到了同样的错误。
  • @shree 运行您显示的内容将得到 ORA-00923,因为中间有额外的 select *,而不是 ORA-00942。

标签: oracle database-schema


【解决方案1】:

我怀疑问题在于对 DBA_OBJECTS 的访问。普通用户对 DBA 视图没有权限。即使他们确实可以访问 DBA 视图,但通常是通过角色进行的,我们无法针对通过角色授予的依赖对象构建 PL/SQL 程序(或视图)。

解决方案是:

  1. 改用 ALL_OBJECTS
  2. 让授权用户 (DBA) 将 DBA_OBJECTS 的权限直接授予您的用户。

另一个潜在问题是您没有使用模式命名空间限制查询和动态 SQL。因此,您的代码应如下所示:

select count(*) into v_counter
from dba_objects 
where object_type = ObjType
and owner = upper(SchemaName)
and object_name = upper(ObjName);

if v_counter > 0 then          
  execute immediate 'drop table ' || SchemaName || '.' || ObjName
            || ' cascade constraints';        
end if;   

【讨论】:

  • 错误(6,1):PLS-00103:在预期以下情况之一时遇到符号“SELECT”:begin function pragma procedure subtype type 当前光标删除之前存在符号“开始”被替换为“选择”继续。
  • 你确实把上面所有的代码都放到了一个适当的过程中,对吧?
  • 是的,我已将代码放入程序并出现错误。
  • @shree - 您似乎已经用 APC 显示的代码替换了 begin。这应该只替换您在if ObjType = 'TABLE' then ... end if; 部分中的四行。 (或者,如果您想删除其他对象类型,也可以删除外部 if,但动态 SQL 应将 table 替换为 objType)。
  • 我只替换了过程中的查询。
猜你喜欢
  • 2014-09-19
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 2020-10-04
相关资源
最近更新 更多