Ich bekomme einen seltsamen Fehler beim Versuch, einen Trigger in meiner Oracle 11g-Datenbank mit SQL Developer zu erstellen. Hier ist, was ich getan habe:Probleme beim Erstellen eines Triggers in Oracle 11g
Meine Tabelle:
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);
Die Sequenz:
CREATE SEQUENCE COUNTRY_CODE_ID_SEQ START WITH 1 INCREMENT BY 1;
Der Auslöser:
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;
Erstellen der Tabelle und die Sequenz funktioniert sehr gut, aber wenn ich versuche, meinen Trigger zu erstellen, erhalte ich diesen Fehler:
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
Weiß jemand über diesen Fehler?
Dank
Sobald Sie die PLScope Problem zu beheben, Sie gehen einen mutierenden bekommen Ausnahme auslösen. Ein Trigger auf Zeilenebene für 'COUNTRY_CODE' darf die Tabelle 'COUNTRY_CODE' nicht abfragen.Es ist zwar möglich, dieses Problem mit einem zusätzlichen Trigger auf Anweisungsebene zu umgehen, es ist jedoch unwahrscheinlich, dass Sie wirklich jedes Mal, wenn eine Zeile eingefügt wird, überprüfen müssen, ob die Sequenz zurückgesetzt werden muss. Es scheint sehr viel wahrscheinlicher, dass Sie die Sequenz einfach auf einen größeren Wert setzen möchten, wenn diese seltenen Fehler etwas verursachen. –