Проблемы с созданием триггера в 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
Кто-нибудь знает об этой ошибке?
Спасибо
Ответы
Ответ 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