2009-06-22 21 views
32

Tôi đang cố gắng để điền vào cho một đồng nghiệp trong việc làm một số công việc Oracle, và chạy vào một snag. Khi cố gắng viết kịch bản để sửa đổi cột thành giá trị rỗng, tôi gặp phải lỗi ORA-01451 đáng yêu:MODIFY COLUMN trong oracle - Làm thế nào để kiểm tra xem một cột là nullable trước khi thiết lập để nullable?

ORA-01451: column to be modified to NULL cannot be modified to NULL 

Điều này xảy ra vì cột đã là NULL. Chúng tôi có một số cơ sở dữ liệu cần phải được nâng cấp, vì vậy trong giả định bị lỗi của tôi, tôi đã thiết lập nó thành NULL sẽ hoạt động trên bảng để đảm bảo mọi người được cập nhật, bất kể họ đã đặt cột này thành giá trị có thể vô hiệu hay không. Tuy nhiên, điều này dường như gây ra lỗi cho một số người đã có cột là nullable.

Làm cách nào để kiểm tra xem cột có được vô hiệu hóa để tránh lỗi không? Cái gì đó sẽ thực hiện ý tưởng này:

IF(MyTable.MyColumn IS NOT NULLABLE) 
    ALTER TABLE MyTable MODIFY(MyColumn NULL); 

Trả lời

41

Bạn có thể làm điều này trong PL/SQL:

declare 
    l_nullable varchar2(1); 
begin 
    select nullable into l_nullable 
    from user_tab_columns 
    where table_name = 'MYTABLE' 
    and column_name = 'MYCOLUMN'; 

    if l_nullable = 'N' then 
    execute immediate 'alter table mytable modify (mycolumn null)'; 
    end if; 
end; 
+0

Cảm ơn bạn Tony! Tôi đã làm việc này (với một sửa chữa nhỏ để đóng báo giá trên thực hiện ngay lập tức) và chúng tôi bây giờ trong kinh doanh! –

+0

Tôi khuyên bạn nên truy vấn từ điển dữ liệu mỗi khi bạn chạy ALTER TABLE này sẽ khá kém hiệu quả, so với chỉ xử lý ngoại lệ nếu nó xảy ra. –

+0

Jeffrey, bạn có thể là chính xác, nhưng điều này là cho một kịch bản thay đổi giản đồ vì vậy nó là một tình huống chạy một lần cho mỗi cơ sở dữ liệu. Khi thay đổi đã được thực hiện, nó sẽ không chạy lại. –

19

chỉ làm thay đổi bảng và bắt ngoại lệ.

DECLARE 
    allready_null EXCEPTION; 
    PRAGMA EXCEPTION_INIT(allready_null, -1451); 
BEGIN 
    execute immediate 'ALTER TABLE TAB MODIFY(COL NULL)'; 
EXCEPTION 
    WHEN allready_null THEN 
     null; -- handle the error 
END; 
/

nếu bạn không muốn sử dụng PL/SQL

set feedback off 
    set echo off 
    set feedback off 
    set pages 0 
    set head off 

    spool to_null.sql 

    select 'alter table TAB modify (COL NULL);' 
    from user_tab_columns 
    where table_name = 'TAB' 
    and column_name = 'COL' 
    and nullable = 'N'; 

    spool off 
    set feedback on 
    set echo on 
    set termout on 
    @@to_null.sql 
    host rm -f to_null.sql 

hoặc chỉ làm thay đổi bảng và bỏ qua những sai sót.

+0

+1 cho phương pháp "bắt ngoại lệ nếu không thành công", điều này hiệu quả hơn việc truy vấn từ điển dữ liệu mỗi lần –

+1

Chỉ muốn thêm rằng phương pháp này được sử dụng rộng rãi trong PLSQL – Rene

+1

Thêm 'host rm -f to_null.sql' (* nix) hoặc 'host del/f to_null.sql' để tránh xả rác thư mục bằng các tệp tạm thời. –

Các vấn đề liên quan