Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để thoát khỏi cột LOB trống nhưng rất lớn?

Để thay thế cho việc giảm và thêm lại cột, bạn có thể sử dụng shrink space mệnh đề :

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

db <> fiddle , là 18c nhưng cũng phải hoạt động trong 11g. (Sau đó:vâng, nó thực hiện trong 11gR2 với retention none bỏ qua dù sao; SQL Fiddle không thích nó.)

Đã bỏ lỡ chi tiết đó, nhưng nó vẫn hoạt động; bạn chỉ cần thêm một bước để tìm cột BLOB ẩn sao lưu cột XMLType, như được hiển thị ở đây . Tôi đã thực hiện alter động chỉ để chọn nó một cách nhanh chóng, nhưng nếu bạn có thể tìm thấy nó theo cách thủ công thì bạn có thể tự mình cắm nó vào câu lệnh rõ ràng:

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

Có lẽ cần lưu ý rằng điều này hoạt động với basicfile bộ nhớ, như được hiển thị trong bản trình diễn tối thiểu của bạn, nhưng có thể không hoạt động với securefile lưu trữ - ít nhất một thời gian ném ORA-10635:Loại phân đoạn hoặc vùng bảng không hợp lệ.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn nhiều hàng vào Oracle

  2. Làm thế nào để tìm thấy sự khác biệt giữa tem thời gian trong oracle?

  3. tại sao sql này được sử dụng union tất cả đều không trả về dữ liệu

  4. Nối hai bảng với một cột có nhiều mục nhập cho bảng khác

  5. Các thủ tục được lưu trữ của Oracle, SYS_REFCURSOR và NHibernate