Oracle: ошибка "синтаксический анализ" при создании триггера auto_increment

Я пытаюсь сделать триггер auto_increment для идентификаторов базы данных Oracle.
После некоторых исследований я нашел способ написать один с использованием последовательности и триггера перед вставкой.

Проблема в том, что когда я запускаю триггер, у меня возникает следующая ошибка:

Сбой при разборе:

СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ТРИГГЕР AUTO_INC_PDE_ITINERAIRE
ДО ВСТАВКИ
ON PDE_ITINERAIRE
ДЛЯ КАЖДОГО РЯДА
НАЧАТЬ
ВЫБЕРИТЕ PDE_ITINERAIRE_ID_SEQUENCE.NEXTVAL
В


Если я использую следующую команду:

select * from SYS.USER_ERRORS where name = 'AUTO_INC_PDE_ITINERAIRE';

Возвращает следующий вывод:

Линия 3 | Поз 10 | PLS-00201: должен быть объявлен идентификатор 'NEW.PDE_ITINERAIRE'
Линия 2 | Поз. 03 | PL/SQL: оператор SQL игнорируется
Линия 4 | Поз. 03 | PL/SQL: неверный идентификатор ORA-00904


Вот полный запрос для триггера:

CREATE OR REPLACE TRIGGER AUTO_INC_PDE_ITINERAIRE
BEFORE INSERT 
ON PDE_ITINERAIRE
FOR EACH ROW
BEGIN
SELECT PDE_ITINERAIRE_ID_SEQUENCE.NEXTVAL
INTO   :NEW.PDE_ITINERAIRE.ID_PDE_ITINERAIRE
FROM   dual;
END;
/

Я на самом деле не привык к триггерам Oracle, поэтому кто-нибудь может помочь мне выяснить, что не так в моем триггере?

Спасибо за ваше время


РЕДАКТИРОВАТЬ

Я изменил курок от вашего совета

CREATE OR REPLACE TRIGGER AUTO_INC_PDE_ITINERAIRE
BEFORE INSERT 
ON PDE_ITINERAIRE
FOR EACH ROW
BEGIN
    :NEW.ID_PDE_ITINERAIRE := PDE_ITINERAIRE_ID_SEQUENCE.NEXTVAL;
END;
/


У меня все еще есть та же ошибка вывода, хотя.

Больше информации:
- Оракул v11.
--TOra 3 используется в качестве IDE.

РЕДАКТИРОВАТЬ 2

Вот как DDL спросил:

СОЗДАТЬ ТАБЛИЦУ "GEOMAP". "PDE_ITINERAIRE"
("ID_PDE_ITINERAIRE" NUMBER (11,0) НЕ РАЗРЕШАЕТСЯ, NULL,
"NOM_ITINERAIRE" VARCHAR2 (255) НЕ РАЗРЕШАЕТСЯ,
НОМЕР "ДЛИННЫЙ" (15,4),
"INSEE_DEPART" VARCHAR2 (5),
"INSEE_ARRIVEE" VARCHAR2 (5),
"TYPE_ITINERAIRE" VARCHAR2 (30),
"TYPE_BALISAGE" VARCHAR2 (30),
"COULEUR_BALISAGE" VARCHAR2 (55),
"NOM_TOPO_GUIDE" VARCHAR2 (255),
"ANNEE_TOPO_GUIDE" VARCHAR2 (4),
"DATE_DERNIER_ENTRETIEN" DATE,
"PERIODICITE_PREVUE" VARCHAR2 (30),
"DATE_PROCHAIN_ENTRETIEN" DATE,
"ORGANISME_ENTRETIEN" VARCHAR2 (60),
"OBSERVATIONS_ENTRETIEN" VARCHAR2 (30),
"CREATEUR" VARCHAR2 (55),
"COUT_TOTAL" VARCHAR2 (50),
"DATE_DECISION_CP" DATE,
НОМЕР "SUBVENTION_ITINERAIRE" (8,2),
НОМЕР "SUBVENTION_TOPO" (8,2),
"OBSERVATIONS_ADMIN" VARCHAR2 (255),
"HEBERGEMENT" VARCHAR2 (30),
"ПАМЯТНИКИ" VARCHAR2 (30),
"OBSERVATIONS_TOURISTIQUES" VARCHAR2 (30),
"GEOMETRIE", "MDSYS". "SDO_GEOMETRY",
"COMMUNE_DEPART" VARCHAR2 (55),
"COMMUNE_ARRIVEE" VARCHAR2 (55),
"FICHIER_TOPO_GUIDE" VARCHAR2 (255)
)

2 ответа

Решение

Это исправлено! Наконец, я скачал Oracle SQL Developer, чтобы проверить мой триггер в другой IDE, и он предложил мне связать значение (NEW), когда я его выполнил. Этот последний трюк сделал свою работу.

Я предполагаю, что либо Tora не выполняет pl / sql должным образом, либо, возможно, я пропустил объявление для:NEW и SQL Developer исправил его.

Спасибо за помощь.

:new это запись, содержащая все столбцы таблицы триггера, поэтому вы не можете включить имя таблицы при обращении к ней:

:NEW.PDE_ITINERAIRE.ID_PDE_ITINERAIRE должно быть :NEW.ID_PDE_ITINERAIRE

Кроме того, вам не нужно selectВы можете просто присвоить значение (по крайней мере, для любой поддерживаемой версии Oracle):

CREATE OR REPLACE TRIGGER AUTO_INC_PDE_ITINERAIRE
BEFORE INSERT 
ON PDE_ITINERAIRE
FOR EACH ROW
BEGIN
   :NEW.ID_PDE_ITINERAIRE := PDE_ITINERAIRE_ID_SEQUENCE.NEXTVAL;
END;
/
Другие вопросы по тегам