2013-06-06 9 views
16

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

+0

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

Antwort

39

eine Lösung für dieses sein kann, endlich die Antwort auf mein Problem:

diese

hinzufügen:

ALTER SESSION SET PLSCOPE_SETTINGS = 'IDENTIFIERS:NONE'; 

oder in Oracle SQL Developer:

  1. Gehen Sie zu Extras | Einstellungen
  2. Datenbank auswählen | PL/SQL-Compiler
  3. Ändern Sie die PLScope Kennungen von All auf None
  4. Klicken Sie auf Ok

Dies behebt das Problem ...

+0

Das hat mein Problem behoben. Aber warum ist es passiert? Was war eigentlich das Problem? – Dariusz

3

Es fand ich here.

+0

Danke Tony, ich weiß es zu schätzen! –

+0

@TonyAndrews Versuchen Sie, Antworten mit nur Hyperlinks zu vermeiden. Wenn die Verbindung unterbrochen wird, wird diese Antwort nutzlos. Vielleicht möchten Sie Ihre Antwort überarbeiten, um eine Zusammenfassung dessen, was Sie gelernt haben, zu posten, und dann auf den Link verweisen. – vapcguy

+0

@vapcguy Punkt genommen, aber wie diese Antwort ist 3 Jahre alt und nicht die angenommene Antwort werde ich wahrscheinlich nicht! –

2

Ich habe keine andere Lösung (und nicht über die Reputation, um nur zu kommentieren), aber hier sind einige Informationen, die helfen könnten, jemanden auf die richtige Spur zu bringen, dieses Problem zu lösen, während noch PL/Scope benutzt wird.

Ich hatte gerade ein ähnliches Problem, und die PL/Scope-Funktion hat mir geholfen zu verstehen, wo das Problem herankommt. Für mein Problem habe ich versucht, einen Trigger zu erstellen, und genau derselbe Fehler ist aufgetreten. Ich änderte den Auslöser ohne Erfolg, aber die Änderung des Namens funktionierte gut.

Es scheint, dass der PL/Scope Informationen über den ersten instanziierten Trigger festhielt, bevor er ihn löschte. Eine Abfrage der Trigger ergab, dass mein Trigger sicher gelöscht wurde, aber eine Abfrage der (PL/Scope) Kennungen ("all_identifiers") zeigte, dass sie immer noch da war.

Einige Informationen über PL/Scope ist hier: http://www.oracle.com/technetwork/testcontent/o67asktom-101004.html

Kapitel 8 hier (11g Dokumentation) hat weitere Informationen: http://docs.oracle.com/cd/B28359_01/appdev.111/b28424.pdf