2013-08-21 20 views
7

を削除する方法を次のクエリは、ユーザーのデータベース・オブジェクトをリストするために使用することができます。OracleのLOB

select object_name, object_type from user_objects; 

はOBJECT_TYPEがLOBであるエントリがいくつかあります。

これらのLOBオブジェクトはどのようにOracleで削除できますか?

答えて

16

LOBがuser_objectsにありますが、user_lobsへの結合では、テーブルがすでに破棄されている場合は何も見つかりませんが、is in the recycle binのシナリオがあります。

create table t42 (my_clob clob); 

table T42 created. 

予想したように、ジャスティンのクエリはあなたの列を示しています。

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 NDあなたはごみ箱でそれを見ることができます:

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; 

、エントリがdropuser_objectsから行ってきました。

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_LOBS、またはUSER_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

user_lobsの代わりにall_lobsを照会するときも0行です。 "ORA-00942:表またはビューが存在しません" – byneri

関連する問題