2013-06-06 7 views
16

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

Мой стол:

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 

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

Благодаря

+0

После устранения проблемы PLScope, вы собираетесь получить мутирует инициировать исключение. Триггер уровня на 'COUNTRY_CODE' не может запрашивать таблицу' COUNTRY_CODE'.Хотя можно обойти эту проблему с помощью дополнительного триггера на уровне инструкций, похоже, вам не нужно проверять каждый раз, когда вставлена ​​строка, нужно ли восстановить последовательность. Кажется гораздо более вероятным, что вы просто хотите установить последовательность в большее значение в тех редких случаях, что что-то вызывает создание этого условия ошибки. –

ответ

39

я, наконец, нашел ответ на мой вопрос:

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

ALTER SESSION SET PLSCOPE_SETTINGS = 'IDENTIFIERS:NONE'; 

Или в Oracle SQL Developer:

  1. Перейти к Инструменты | Предпочтения
  2. Выбрать базу данных | PL/SQL компилятор
  3. Измените PLScope идентификаторы из всех в None
  4. Нажмите на Ok

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

+0

Это исправило мою проблему. Но почему это произошло? Какова была проблема? – Dariusz

3

Там может быть решение этой here.

+0

Спасибо, Тони, я ценю это! –

+0

@TonyAndrews Старайтесь избегать ответов только с гиперссылками. Если связь нарушается, этот ответ становится бесполезным. Вы можете пересмотреть свой ответ, чтобы опубликовать резюме того, что узнали, а затем ссылку на ссылку. – vapcguy

+0

@ vapcguy Точка взята, однако, поскольку этот ответ 3 года, а не принятый ответ, я, вероятно, не буду! –

2

У меня нет другого решения (и не имеют репутацию просто комментировать), но вот некоторая информация, которая может помочь кому-то найти правильный путь для решения этой проблемы при использовании 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

Смежные вопросы