2013-08-21 53 views
7

下面的查詢可以用來列出用戶的數據庫對象:如何下降的Oracle LOB

select object_name, object_type from user_objects; 

有幾個條目,其中object_type爲LOB。

這些LOB對象如何在Oracle中刪除?

回答

16

一種情況下,您可以在user_objects中看到LOB,但加入到user_lobs找不到任何東西,如果該表已被刪除,但是is in the recycle bin

create table t42 (my_clob clob); 

table T42 created. 

正如預期的那樣,Justin的查詢顯示你列:

select l.table_name, 
     l.column_name, 
     l.segment_name lob_name 
    from user_lobs l 
     join user_objects o 
     on(o.object_name = l.segment_name); 

TABLE_NAME COLUMN_NAME LOB_NAME      
----------- ----------- ------------------------------ 
T42   MY_CLOB  SYS_LOB0000133310C00001$$  

drop table t42; 

table T42 dropped. 

現在,賈斯汀的查詢沒有找到任何東西:

select l.table_name, 
     l.column_name, 
     l.segment_name lob_name 
    from user_lobs l 
     join user_objects o 
     on(o.object_name = l.segment_name); 

no rows selected 

但它仍然在user_objects

select object_name, object_type, status from user_objects 
where object_type like 'LOB%'; 

OBJECT_NAME     OBJECT_TYPE   STATUS 
------------------------------ ------------------- ------- 
SYS_LOB0000133328C00001$$  LOB     VALID 

A第二,你可以看到它在回收站:

select * from user_recyclebin; 

OBJECT_NAME     ORIGINAL_NAME     OPERATION TYPE      TS_NAME      CREATETIME   DROPTIME    DROPSCN PARTITION_NAME     CAN_UNDROP CAN_PURGE RELATED BASE_OBJECT PURGE_OBJECT  SPACE 
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ---------- 
SYS_IL0000133310C00001$$  SYS_IL0000133310C00001$$   DROP  LOB INDEX     USERS       2013-08-22:08:33:21 2013-08-22:08:33:21 1.0E+13         NO   NO   133310  133310  133310   0 
SYS_LOB0000133310C00001$$  SYS_LOB0000133310C00001$$  DROP  LOB      USERS       2013-08-22:08:33:21 2013-08-22:08:33:21 1.0E+13         NO   NO   133310  133310  133310   0 
BIN$5IUNXtWkUXLgQwEAAH9TlQ==$0 T42        DROP  TABLE      USERS       2013-08-22:08:33:21 2013-08-22:08:33:21 1.0E+13         YES  YES   133310  133310  133310   0 

的LOB仍然存在於磁盤上,並且使用的存儲,我的猜測是你很在意。因此,要排序的回答你的問題,要真正放下LOB並釋放它的存儲,你需要清除整個表:

purge table t42; 

table purged. 

select object_name, object_type, status from user_objects 
where object_type like 'LOB%'; 

no rows selected 

有趣的是看不到這樣的效果,如果你的名字LOB段:

create table t42 (my_clob clob) 
lob (my_clob) store as my_clob_segment; 

重複上面的步驟,該條目已經從user_objectsdrop後消失。

drop table t42; 

table T42 dropped. 

select object_name, object_type, status from user_objects 
where object_type like 'LOB%'; 

no rows selected 

select * from user_recyclebin; 

OBJECT_NAME     ORIGINAL_NAME     OPERATION TYPE      TS_NAME      CREATETIME   DROPTIME    DROPSCN PARTITION_NAME     CAN_UNDROP CAN_PURGE RELATED BASE_OBJECT PURGE_OBJECT  SPACE 
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ---------- 
BIN$5IUNXtWnUXLgQwEAAH9TlQ==$0 MY_CLOB_SEGMENT     DROP  LOB      USERS       2013-08-22:08:36:41 2013-08-22:08:36:41 1.0E+13         NO   NO   133316  133316  133316   0 
BIN$5IUNXtWoUXLgQwEAAH9TlQ==$0 T42        DROP  TABLE      USERS       2013-08-22:08:36:41 2013-08-22:08:36:41 1.0E+13         YES  YES   133316  133316  133316   0 
SYS_IL0000133316C00001$$  SYS_IL0000133316C00001$$   DROP  LOB INDEX     USERS       2013-08-22:08:36:41 2013-08-22:08:36:41 1.0E+13         NO   NO   133316  133316  133316   0 

存儲仍在使用,當然,你仍然需要清除釋放它,它只是看起來比較一致的一點在數據字典中。所以這看起來像一個(非常小的)錯誤,或許最多。這可能與支持說明394442.1中提到的行爲有關。

+0

感謝您的詳細解釋和示例查詢 – byneri

+1

+1。非常好。感謝您的簡潔(可讀)答案! – spencer7593

3

如果刪除包含關聯的LOB列的表或從該表中刪除LOB列,則會刪除該LOB對象。根據您的權限,您可以通過查詢DBA_LOBSALL_LOBSUSER_LOBS來查看特定LOB對象支持的列。

例如

SELECT l.table_name, 
     l.column_name, 
     l.segment_name lob_name 
    FROM user_lobs l 
     JOIN user_objects o 
     ON(o.object_name = l.segment_name) 

會告訴你什麼表,什麼列各LOB對象的架構中的支持。

+1

以上查詢爲我的用戶返回了0行。 – byneri

+1

查詢all_lobs(而不是user_lobs)時也是0行。無法查詢dba_lobs:「ORA-00942:表或視圖不存在」 – byneri