Oracle:创建 auto_increment 触发器时出现 "parsing failed" 错误

Oracle : "parsing failed" error when creating an auto_increment trigger

我正在尝试为 Oracle 数据库的 ID 创建 auto_increment 触发器
经过一些研究,我找到了一种使用 sequencebefore insert trigger.

来编写的方法

问题是,当我执行触发器时,出现以下错误:

Parsing failed for:

CREATE OR REPLACE TRIGGER AUTO_INC_PDE_ITINERAIRE
BEFORE INSERT
ON PDE_ITINERAIRE
FOR EACH ROW
BEGIN
SELECT PDE_ITINERAIRE_ID_SEQUENCE.NEXTVAL
INTO


如果我使用以下命令:

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

它returns输出如下:

Line 3 | Pos 10 | PLS-00201: identifier 'NEW.PDE_ITINERAIRE' must be declared
Line 2 | Pos 03 | PL/SQL: SQL statement ignored
Line 4 | Pos 03 | PL/SQL: ORA-00904 invalid identifier


这是触发器的完整查询:

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


我仍然有相同的错误输出。

更多信息:
--Oracle 是 v11.
--TOra 3 用作 IDE.

编辑 2

这是要求的 DDL :

CREATE TABLE "GEOMAP"."PDE_ITINERAIRE"
( "ID_PDE_ITINERAIRE" NUMBER(11,0) NOT NULL ENABLE,
"NOM_ITINERAIRE" VARCHAR2(255) NOT NULL ENABLE,
"LONGUEUR" NUMBER(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" NUMBER(8,2),
"SUBVENTION_TOPO" NUMBER(8,2),
"OBSERVATIONS_ADMIN" VARCHAR2(255),
"HEBERGEMENT" VARCHAR2(30),
"MONUMENTS" VARCHAR2(30),
"OBSERVATIONS_TOURISTIQUES" VARCHAR2(30),
"GEOMETRIE" "MDSYS"."SDO_GEOMETRY" ,
"COMMUNE_DEPART" VARCHAR2(55),
"COMMUNE_ARRIVEE" VARCHAR2(55),
"FICHIER_TOPO_GUIDE" VARCHAR2(255)
)

:new 是包含触发器的 table 的所有列的记录,因此在引用它时不能包含 table 名称:

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

已修复! 我终于下载了 Oracle SQL Developer 来检查我在另一个 IDE 中的触发器,当我执行它时它建议我 link 一个值(新)。 最后这个技巧完成了工作。

我假设要么 Tora 没有正确执行 pl/sql,要么我错过了 :NEW 的声明并且 SQL 开发人员修复了它。

感谢您的帮助。