2012-06-26 9 views
6

Współpracuję z Oracle 11g.
Mam jedną tabelę:Wyjątki w klauzuli nie działa podczas tworzenia ograniczenia

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

Istnieją 2 rzędy:

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

Teraz tworzę tabelę wyjątkami:

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

Teraz chcę utworzyć klucz podstawowy dla testu :

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

Oczywiście pojawia się następujący błąd: ORA-01449

Ale wiersz, który spowodował wyjątek, nie znajduje się w tabeli wyjątków?

Czy ktoś może mi pomóc. Dzięki z góry

Wolfgang

+1

bash Nici Oracle to najwyraźniej szybki sposób na zdobycie punktów ... jak to jest +2 bez jednego komentarza? Otrzymany błąd mówi, że pola klucza głównego nie mogą zawierać wartości null. Nie oznacza to, że wyjątki Oracle nie działają. Spójrz na swój stół, czy widzisz jakieś ograniczenia? – tbone

+2

@tbone, nie chodzi o obsługę wyjątków. Chodzi o klauzulę "wyjątki w". To, co opisuje OP, jest dokładnie takie, i jest uzasadnionym pytaniem, ponieważ dokumentacja nie podaje tych informacji. Problem polega na tym, że nie można utworzyć ograniczenia I zgłaszać wyjątków w jednym kroku. Jak to jest "walenie" Oracle? – DCookie

+1

@DCookie Rozumiem, że chodzi o klauzulę "wyjątki w", ale tytuł to "Wyjątki oracle nie działają". Nie jest to kwestia Oracle (w jaki sposób wyjątki dziennika ograniczeń mogą być tworzone nawet wtedy, gdy nie można ich utworzyć, należy je najpierw utworzyć przed załadowaniem wartości zerowych lub wykonać zgodnie z sugestią, aby ją wyłączyć). Po utworzeniu może wykonać swoją pracę. Po prostu wydaje mi się to zabawne, że natknąłem się na kilka wątków "dlaczego Oracle ssą", które natychmiast zdobywają punkty w oparciu o, cóż, nie wiem. Na przykład zobacz http://stackoverflow.com/questions/11191299/why-is-there-a-maksimum-length-for-stored-procedure-names. – tbone

Odpowiedz

8

Aby to zrobić, należy najpierw utworzyć ograniczenie wyłączone:

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

Następnie umożliwić wiązanie z wyjątkami:

ALTER TABLE TEST ENABLE CONSTRAINT test_pk EXCEPTIONS INTO exceptions; 

Wtedy można wybrać wyniki:

SQL> SELECT * FROM EXCEPTIONS; 

ROW_ID    OWNER TABLE_NAME CONSTRAINT 
------------------ ----- ---------- ---------- 
AAHpV4AAHAAApliAAB XXX TEST  TEST_PK 
Powiązane problemy