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
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. –