2013-06-06 12 views
16

Otrzymuję dziwny błąd podczas próby utworzenia wyzwalacza w mojej bazie danych Oracle 11g za pomocą SQL Developer. Oto co zrobiłem:Problemy z tworzeniem wyzwalacza w Oracle 11g

Moja tabela:

CREATE TABLE COUNTRY_CODE(
    ID NUMBER(19,0)  PRIMARY KEY NOT NULL, 
    Code    VARCHAR2(2) NOT NULL, 
    Description VARCHAR2(50), 
    created     TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    created_by     VARCHAR2(40) DEFAULT USER, 
    last_updated     TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    last_updated_by   VARCHAR2(40) DEFAULT USER, 
    archived CHAR(1) DEFAULT '0' NOT NULL); 

Sekwencja:

CREATE SEQUENCE COUNTRY_CODE_ID_SEQ START WITH 1 INCREMENT BY 1; 

Spust:

CREATE OR REPLACE TRIGGER COUNTRY_CODE_TRIGGER 
BEFORE INSERT ON COUNTRY_CODE 
FOR EACH ROW 
DECLARE 
    max_id number; 
    cur_seq number; 
BEGIN 
    IF :new.id IS NULL THEN 
    SELECT COUNTRY_CODE_ID_SEQ.nextval 
    INTO :new.id 
    FROM dual; 
ELSE 
    SELECT GREATEST(NVL(MAX(id),0), :new.id) 
    INTO max_id 
    FROM COUNTRY_CODE; 

    SELECT COUNTRY_CODE_ID_SEQ.nextval 
    INTO cur_seq 
    FROM dual; 

    WHILE cur_seq < max_id 
    LOOP 
     SELECT COUNTRY_CODE_ID_SEQ.nextval 
     INTO cur_seq 
     FROM dual; 
    END LOOP; 
END IF; 
END; 

Tworzenie tabeli i sekwencja działa bardzo dobrze, ale gdy próbuję utworzyć swój wyzwalacz, pojawia się ten błąd:

Error report: 
ORA-00603: ORACLE server session terminated by fatal error 
ORA-00600: internal error code, arguments: [kqlidchg0], [], [], [], [], [], [], [], [], [], [], [] 
ORA-00604: error occurred at recursive SQL level 1 
ORA-00001: unique constraint (SYS.I_PLSCOPE_SIG_IDENTIFIER$) violated 
00603. 00000 - "ORACLE server session terminated by fatal error" 
*Cause: An ORACLE server session is in an unrecoverable state. 
*Action: Login to ORACLE again so a new server session will be created 

Czy ktoś wie o tym błędzie?

Dzięki

+0

Po rozwiązać problem PLScope, masz zamiar dostać mutowania wywołaj wyjątek. Wyzwalacz na poziomie wiersza w kodzie "COUNTRY_CODE" nie może wysyłać zapytania do tabeli "COUNTRY_CODE".Chociaż można obejść ten problem z dodatkowym wyzwalaczem poziomu instrukcji, nie wydaje się prawdopodobne, aby naprawdę trzeba było sprawdzać za każdym razem, gdy wstawiany jest wiersz, niezależnie od tego, czy sekwencja musi zostać zresetowana. Wydaje się bardziej prawdopodobne, że po prostu chcesz ustawić sekwencję na większą wartość w rzadkich przypadkach, gdy coś powoduje powstanie tego błędu. –

Odpowiedz

39

końcu znalazłem odpowiedzi na mój problem:

dodać to:

ALTER SESSION SET PLSCOPE_SETTINGS = 'IDENTIFIERS:NONE'; 

albo w Oracle SQL Developer:

  1. Przejdź do Narzędzia | Preferencje
  2. Wybierz bazę danych | PL/SQL Compiler
  3. Zmień identyfikatory PLScope od wszystkie do Żaden
  4. kliknij OK

To rozwiązuje problem ...

+0

To naprawiło mój problem. Ale dlaczego do tego doszło? W czym właściwie był problem? – Dariusz

3

Nie może być rozwiązanie tego here.

+0

Dzięki Tony, doceniam to! –

+0

@TonyAndrews Staraj się unikać odpowiedzi tylko za pomocą hiperłączy. Jeśli link się zepsuje, ta odpowiedź stanie się bezużyteczna. Możesz poprawić swoją odpowiedź, aby opublikować podsumowanie tego, czego się nauczyłeś, a następnie odwołać się do linku. – vapcguy

+0

@vapcguy Punkt wzięty, jednak ponieważ ta odpowiedź ma 3 lata, a nie zaakceptowana odpowiedź, prawdopodobnie nie będę! –

2

nie mam innego rozwiązania (i nie mają reputacja, aby jedynie komentować), ale oto niektóre informacje, które mogą pomóc znaleźć właściwą drogę do rozwiązania tego problemu, nadal korzystając z PL/Scope.

Po prostu miałem podobny problem, a zaglądanie do funkcji PL/Scope pomogło mi zrozumieć, gdzie może pojawić się problem. W moim problemie próbowałem stworzyć wyzwalacz i pojawił się ten sam dokładny błąd. Zmieniłem korpus spustu bezskutecznie, ale zmiana nazwy działała dobrze.

Wygląda na to, że PL/Scope zatrzymywał informacje o pierwszym wyzwalaczu, zanim go upuścił. Zapytanie na temat wyzwalaczy ujawniło, że mój wyzwalacz został z pewnością usunięty, ale zapytanie o identyfikatory (PL/zakres) ("all_identifiers") pokazało, że wciąż tam był.

Niektóre informacje na PL/zakres jest tutaj: http://www.oracle.com/technetwork/testcontent/o67asktom-101004.html

Rozdział 8 tutaj (dokumentacja 11g) zawiera więcej informacji: http://docs.oracle.com/cd/B28359_01/appdev.111/b28424.pdf