Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie wird man eine leere, aber riesige LOB-Spalte los?

Als Alternative zum Löschen und erneuten Hinzufügen der Spalte können Sie das shrink space Klausel :

ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE);

db<>fiddle , was 18c ist, aber auch in 11g funktionieren sollte. (Später:ja, in 11gR2 mit retention none sowieso weggelassen; SQL Fiddle mag es aber nicht.)

Ich habe dieses Detail verpasst, aber es funktioniert immer noch; Sie brauchen nur einen zusätzlichen Schritt, um die versteckte BLOB-Spalte zu finden, die die XMLType-Spalte unterstützt, wie hier gezeigt . Ich habe den alter gemacht dynamic, nur um das schnell aufzugreifen, aber wenn Sie es manuell finden können, können Sie es natürlich selbst in die Anweisung einfügen:

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;
/

db<>fiddle

Erwähnenswert ist wahrscheinlich, dass dies mit basicfile funktioniert Speicher, wie in Ihrer minimalen Demo gezeigt, funktioniert aber möglicherweise nicht mit securefile Speicher - zumindest manchmal, was ORA-10635 auslöst:Ungültiger Segment- oder Tablespace-Typ.