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