2012-06-26 27 views
6

Tôi làm việc với Oracle 11g.
Tôi có một bảng:Điều khoản ngoại lệ vào không hoạt động khi tạo một ràng buộc

create table test (one number(2), two number(2)); 

Có 2 hàng:

insert into test (one, two) values (1, 1); 
insert into test (one, two) values (2, null); 
commit; 

Bây giờ tôi có thể tạo một bảng ngoại lệ:

create table exceptions(row_id rowid, 
         owner varchar2(30), 
         table_name varchar2(30), 
         constraint varchar2(30)); 

Bây giờ tôi muốn tạo khóa chính cho thử nghiệm :

alter table test add constraint test_pk primary key (one, two) exceptions into exceptions; 

Tất nhiên tôi nhận được lỗi sau: ORA-01449

Nhưng hàng gây ra ngoại lệ không nằm trong bảng ngoại lệ?

Ai cũng có thể giúp tôi. Cảm ơn trước

Wolfgang

+1

bash Oracle chủ đề rõ ràng là một cách nhanh chóng để có được điểm ... làm thế nào là +2 này không phải là một bình luận duy nhất? Lỗi bạn nhận được là cho bạn biết các trường khóa chính không thể chứa các giá trị rỗng. Nó không có nghĩa là ngoại lệ của Oracle không hoạt động. Nhìn vào bàn của bạn, bạn có thấy bất kỳ mâu thuẫn nào không? – tbone

+2

@tbone, đây không phải là về xử lý ngoại lệ. Đây là về mệnh đề "ngoại lệ vào". Những gì OP mô tả chính xác là trường hợp, và là một câu hỏi hợp pháp vì tài liệu không cho bạn biết thông tin này. Vấn đề là bạn không thể tạo ra ràng buộc và báo cáo ngoại lệ trong một bước. Làm thế nào là "bashing" Oracle? – DCookie

+1

@DCookie Tôi hiểu về mệnh đề "ngoại lệ vào", nhưng tiêu đề là "ngoại lệ oracle không hoạt động". Nó không phải là một vấn đề Oracle (làm thế nào có thể các ràng buộc log ngoại lệ khi nó thậm chí không thể được tạo ra, bạn phải tạo ra nó trước khi tải null hoặc làm như bạn đề nghị khi tạo nó bị vô hiệu hóa). Sau khi tạo, nó có thể thực hiện công việc của mình. Tôi chỉ tìm thấy nó buồn cười mà tôi chạy vào một số "tại sao Oracle hút" chủ đề mà ngay lập tức đạt được điểm dựa trên, tốt, tôi không biết. Ví dụ: xem http://stackoverflow.com/questions/11191299/why-is-there-a-maximum-length-for-stored-procedure-names. – tbone

Trả lời

8

Để làm được điều này, trước tiên bạn phải tạo ra các hạn chế bị vô hiệu hóa:

ALTER TABLE test ADD CONSTRAINT test_pk PRIMARY KEY (one, two) DISABLE; 

Sau đó, bật các hạn chế với những ngoại lệ:

ALTER TABLE TEST ENABLE CONSTRAINT test_pk EXCEPTIONS INTO exceptions; 

Sau đó, bạn có thể chọn kết quả:

SQL> SELECT * FROM EXCEPTIONS; 

ROW_ID    OWNER TABLE_NAME CONSTRAINT 
------------------ ----- ---------- ---------- 
AAHpV4AAHAAApliAAB XXX TEST  TEST_PK 
Các vấn đề liên quan