Oracle 删除的过程显示在用户对象中

Oracle 删除的过程显示在用户对象中,oracle,plsql,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 pap

我根据其他人的建议编写了此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

当前版本试图避免为
BIN$…
表发出
DELETE TABLE
语句。为此,我将用户对象与用户回收站连接起来,并省略匹配项。我不再对
BIN$…
表有任何问题。但是,现在我3次收到1条这样的错误消息:

DROP PROCEDURE "RESET_SEQUENCE"
*
ERROR en línea 1:
ORA-04043: el objeto RESET_SEQUENCE no existe
显然,过程
RESET\u SEQUENCE
显示在
USER\u OBJECTS
中,但当
删除过程“RESET\u SEQUENCE”
运行时,该过程不再存在

  • 怎么可能呢
  • 我怎样才能修好它

  • 首先,在脚本中运行光标两次,因为您有
    /

    ORDER BY UO.OBJECT_TYPE, UO.OBJECT_NAME;
    /
    
    发件人:

    在SQL*Plus中,a/和a/的含义存在巨大差异 A.因为他们的工作方式不同

    第二;结束SQL语句,而/执行 当前“缓冲区”。所以当你使用;声明是 实际上执行了两次


    对这里不需要
    /
    ,是吗?(刚刚检查了文件历史记录,以前的版本没有
    )谢谢您的指针。@lvaroG.Vicario更正。要么<代码>
    /
    对于dml语句就足够了。@一个没有名字的马-这个链接完美地解释了我的问题。现在,我比我的伪
    有100%的把握/是罪魁祸首。(我已经冒昧地把它添加到了答案中。)你为什么不直接使用原始查询并添加“和对象名称不象‘BIN$%’”?@FrankSchmitt我不是oracle专家,所以我不知道是否所有BIN项都以
    BIN$
    开头,而所有以
    BIN$
    开头的项都是BIN项。对我来说,
    USER\u RECYCLEBIN
    视图看起来更安全。不管怎样,我的
    ORA-04043
    似乎与此无关,是吗?不,您的错误与此无关。我只是好奇:-)