0

我正在尝试为 Oracle 数据库的 ID 创建一个auto_increment 触发器
经过一番研究,我找到了一种使用序列插入前触发器的方法。

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

解析失败:

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

它返回以下输出:

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


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

更多信息:--
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”日期,
“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”日期、
“SUBVENTION_ITINERAIRE”编号(8,2)、
“SUBVENTION_TOPO”编号(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)
)

4

2 回答 2

2

: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;
/
于 2016-06-17T13:50:22.473 回答
0

它是固定的!我终于下载了 Oracle SQL Developer 以在另一个 IDE 中检查我的触发器,它建议我在执行它时链接一个值(新)。最后一个技巧完成了这项工作。

我假设 Tora 没有正确执行 pl/sql,或者我错过了 :NEW 的声明,SQL Developer 修复了它。

感谢您的帮助。

于 2016-06-20T07:19:08.013 回答