Подтвердить что ты не робот

Проблемы с созданием триггера в Oracle 11g

Я получаю странную ошибку при попытке создать триггер в моей базе данных Oracle 11g с помощью SQL Developer. Вот что я сделал:

Моя таблица:

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 );

Последовательность:

CREATE SEQUENCE COUNTRY_CODE_ID_SEQ START WITH 1 INCREMENT BY 1;

Триггер:

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;

Создание таблицы и последовательности работает очень хорошо, но когда я пытаюсь создать свой триггер, я получаю эту ошибку:

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

Кто-нибудь знает об этой ошибке?

Спасибо

4b9b3361

Ответ 1

Наконец-то я нашел ответ на свою проблему:

Добавьте это:

ALTER SESSION SET PLSCOPE_SETTINGS = 'IDENTIFIERS:NONE';

Или в Oracle SQL Developer:

  • Перейдите в раздел Инструменты | Предпочтения
  • Выберите базу данных | Компилятор PL/SQL
  • Измените идентификаторы PLScope от All до None
  • Нажмите Ok

Это устраняет проблему...

Ответ 2

Здесь может быть решение для .

Ответ 3

У меня нет другого решения (и у меня нет репутации, чтобы просто прокомментировать), но вот некоторая информация, которая может помочь кому-то на правильном пути решить эту проблему при использовании PL/Scope.

У меня была аналогичная проблема, и просмотр функции PL/Scope помог мне понять, где может возникнуть проблема. Для моей проблемы я попытался создать триггер и возникла одна и та же ошибка. Я изменил тело триггера безрезультатно, но изменение названия работало нормально.

Кажется, PL/Scope держал информацию о первом экземпляре триггера, прежде чем отбросить его. Запрос на триггеры показал, что мой триггер был явно сброшен, но запрос на идентификаторы (PL/Scope) ( "all_identifiers" ) показал, что он все еще существует.

Некоторая информация о PL/Scope приведена здесь: http://www.oracle.com/technetwork/testcontent/o67asktom-101004.html

Глава 8 здесь (документация 11g) содержит дополнительную информацию: http://docs.oracle.com/cd/B28359_01/appdev.111/b28424.pdf