删除的过程显示在USER_OBJECTS中

时间:2013-03-22 12:54:54

标签: oracle plsql

我根据其他人的建议编写了这个SQL * Plus脚本,从当前用户中删除所有对象:

SET ECHO OFF
SET HEADING OFF
SET PAGESIZE 0
SET FEEDBACK OFF
SET TIMING OFF
SET TIME OFF
SET TRIMSPOOL ON
SET TRIMOUT ON
SET LINESIZE 100

SET TERMOUT OFF
SPOOL eliminar-todo
/*
 * Descartamos objetos en la papelera ya que intentar eliminarlos directamente genera
 * «ORA-38301: no se puede realizar DDL/DML en objetos de la papelera de reciclaje»
 */
SELECT 'DROP ' || UO.OBJECT_TYPE || ' "' || UO.OBJECT_NAME || '"' ||
    DECODE(UO.OBJECT_TYPE,
        'CLUSTER', ' INCLUDING TABLES CASCADE CONSTRAINTS',
        'OPERATOR', ' FORCE',
        'TABLE', ' CASCADE CONSTRAINTS',
        'TYPE',  ' FORCE',
        'VIEW', ' CASCADE CONSTRAINTS',
    '') || ';'
FROM USER_OBJECTS UO
LEFT JOIN USER_RECYCLEBIN UR ON UO.OBJECT_NAME=UR.OBJECT_NAME
WHERE UO.OBJECT_TYPE IN (
    'CLUSTER', 'CONTEXT', 'DATABASE LINK', 'DIMENSION', 'DIRECTORY', 'FUNCTION', 'INDEX TYPE',
    'JAVA', 'LIBRARY', 'MATERIALIZED VIEW', 'OPERATOR', 'OUTLINE', 'PACKAGE', 'PROCEDURE',
    'SEQUENCE', 'SYNONYM', 'TABLE', 'TYPE', 'VIEW'
)
AND UR.OBJECT_NAME IS NULL
ORDER BY UO.OBJECT_TYPE, UO.OBJECT_NAME;
/
SPOOL OFF
SET TERMOUT ON

@eliminar-todo.lst

PURGE RECYCLEBIN;

我有一个较旧的简单版本,一直都很好用:

select 'drop '||object_type||' '||object_name||
       decode(object_type,'CLUSTER',' including tables cascade constraints',
                          'OPERATOR', ' force',
                          'TABLE',' cascade constraints',
                          'TYPE', ' force',
                          'VIEW',' cascade constraints',
                          '')||';'
from user_objects
where object_type in ('CLUSTER', 'CONTEXT', 'DATABASE LINK', 'DIMENSION',
                      'DIRECTORY', 'FUNCTION', 'INDEX TYPE', 'JAVA',
                      'LIBRARY', 'MATERIALIZED VIEW', 'OPERATOR',
                      'OUTLINE', 'PACKAGE', 'PROCEDURE', 'SEQUENCE',
                      'SYNONYM', 'TABLE', 'TYPE', 'VIEW')
order by object_type, object_name

...但是当用户有BIN$...个表格时会触发语法错误。

我尝试使用双引号标识符,但改为使用ORA-38301

  

无法在回收站中执行DDL / DML Over Object

当前版本尝试避免为DELETE TABLE表发出BIN$...语句。为此,我将用户对象与用户回收站连接并省略匹配。我再也没有遇到BIN$...表的问题。但是,现在我收到此错误消息,如3次中的错误消息:

DROP PROCEDURE "RESET_SEQUENCE"
*
ERROR en línea 1:
ORA-04043: el objeto RESET_SEQUENCE no existe

显然,程序RESET_SEQUENCE显示在USER_OBJECTS中,但在DROP PROCEDURE "RESET_SEQUENCE"运行时不再存在。

  1. 怎么可能?
  2. 我该如何解决?

1 个答案:

答案 0 :(得分:2)

首先,在您的脚本中,您运行了两次游标,因为您有;/

ORDER BY UO.OBJECT_TYPE, UO.OBJECT_NAME;
/

来自SQL: the semicolon or the slash?

  

在/和的含义之间SQL * Plus有很大的不同   一个 ;因为他们的工作方式不同。

     

;结束一个SQL语句,而/执行中的任何内容   目前的“缓冲区”。所以当你使用;和/声明是   实际执行了两次。