Sebagai alternatif untuk menghapus dan menambahkan kembali kolom, Anda dapat menggunakan shrink space
klausa
:
ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);
db<>biola
, yang 18c tetapi harus bekerja di 11g juga. (Kemudian:ya, dalam 11gR2 dengan retention none
dihilangkan pula; SQL Fiddle tidak menyukainya.)
Melewatkan detail itu, tetapi masih berfungsi; Anda hanya perlu langkah ekstra untuk menemukan kolom BLOB tersembunyi yang mencadangkan kolom XMLType, seperti yang ditunjukkan di sini . Saya telah membuat alter
dinamis hanya untuk mengambilnya dengan cepat, tetapi jika Anda dapat menemukannya secara manual maka Anda dapat memasukkannya ke dalam pernyataan sendiri dengan jelas:
DECLARE
l_name USER_TAB_COLUMNS.COLUMN_NAME%TYPE;
l_stmt VARCHAR2(100);
BEGIN
select column_name
into l_name
from user_tab_cols
where
table_name = 'T' and hidden_column = 'YES'
and
column_id = (
select column_id
from user_tab_cols
where table_name = 'T' and column_name = 'X'
);
l_stmt := 'ALTER TABLE t MODIFY LOB ("' || l_name || '") (SHRINK SPACE)';
dbms_output.put_line(l_stmt);
execute immediate l_stmt;
END;
/
Mungkin perlu dicatat bahwa ini bekerja dengan basicfile
penyimpanan, seperti yang ditunjukkan dalam demo minimal Anda, tetapi mungkin tidak berfungsi dengan securefile
penyimpanan - setidaknya beberapa waktu yang memunculkan ORA-10635:Segmen atau jenis tablespace tidak valid.