2013-03-22 86 views
3

我由這個SQL * Plus腳本,根據對方的建議,從當前用戶刪除的所有對象:丟棄的過程說明了在USER_OBJECTS

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代替:

不能在回收站

當前版本試圖避免發出DELETE TABLE報表BIN$...表在對象執行DDL/DML。爲此,我使用用戶回收站加入用戶對象並省略匹配項。我再也沒有BIN$...表的問題。不過,現在我在3次得到這樣的1此錯誤消息:

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. 我該如何解決?
+0

爲什麼不直接使用原來的查詢並添加「AND object_name不是'BIN $%'」而是? – 2013-03-22 13:33:10

+0

@FrankSchmitt我不是Oracle專家,所以我不知道是否所有的bin項目都以'BIN $'開頭,所有以'BIN $'開頭的項目都是bin項目。 USER_RECYCLEBIN視圖看起來像是一條更安全的路徑。無論如何,我的ORA-04043似乎與此無關,是嗎? – 2013-03-22 13:36:56

+0

不,你的錯誤與此無關。我只是好奇而已:-) – 2013-03-23 06:51:53

回答

2

首先,在您的腳本中,您正在運行光標兩次,因爲您有;/

ORDER BY UO.OBJECT_TYPE, UO.OBJECT_NAME; 
/

SQL: the semicolon or the slash?

在SQL的巨大差異* Plus中的意義和/ 之間;因爲他們工作不同。

The;結束一條SQL語句,而/執行當前「緩衝區」中的任何內容。所以當你使用一個;和一個/聲明是 實際執行兩次。

+0

是的......這裏不需要'/',是嗎? (剛查過文件歷史,以前的版本沒有';'。)感謝指針。 – 2013-03-22 13:30:00

+1

@ÁlvaroG.Vicario正確。對於dml語句來說''''或'/'就足夠了。 – DazzaL 2013-03-22 13:33:36

+1

@ÁlvaroG.Vicario:請參閱http://stackoverflow.com/a/10207695/330315 – 2013-03-22 13:41:14