【发布时间】:2016-10-19 09:23:33
【问题描述】:
我正在尝试为 Oracle 数据库的 ID 创建一个 auto_increment 触发器。
经过一番研究,我找到了一种使用 sequence 和 before insert trigger 的方法。
问题是,当我执行触发器时,出现以下错误:
解析失败:
创建或替换触发器 AUTO_INC_PDE_ITINERAIRE
插入前
在 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;
/
我仍然有相同的错误输出。
更多信息:
--Oracle 是 v11。
--TOra 3 用作 IDE。
编辑 2
这是所要求的 DDL:
创建表“GEOMAP”。“PDE_ITINERAIRE”
( "ID_PDE_ITINERAIRE" NUMBER(11,0) NOT NULL ENABLE,
"NOM_ITINERAIRE" VARCHAR2(255) NOT NULL ENABLE,
“长欧元”号码 (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”日期,
"ORGANISME_ENTRETIEN" VARCHAR2(60),
"OBSERVATIONS_ENTRETIEN" VARCHAR2(30),
"创造者" VARCHAR2(55),
“COUT_TOTAL”VARCHAR2(50),
“DATE_DECISION_CP”日期,
“SUBVENTION_ITINERAIRE”号码(8,2),
“SUBVENTION_TOPO” NUMBER(8,2),
"OBSERVATIONS_ADMIN" VARCHAR2(255),
"赫贝格门" 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)
)
【问题讨论】:
-
尝试:从双重选择PDE_ITINERAIRE_ID_SEQUENCE.NEXTVAL到:NEW.ID_PDE_ITINERAIRE;如果这不起作用,请发布确切的错误消息
-
这是我已经做过的,就像我在第一个编辑部分上面写的那样。确切的错误是第一个引号。
-
不,您的代码中实际上有 :NEW.PDE_ITINERAIRE.ID_PDE_ITINERAIRE ,我刚刚删除了对 PDE_ITINERAIRE 的引用并有 :NEW.ID_PDE_ITINERAIRE 。该错误表明它无法解析标识符 PDE_ITINERAIRE(必须声明标识符'NEW.PDE_ITINERAIRE')。很容易尝试,看看它是否能解决问题。
标签: oracle plsql auto-increment database-trigger database-sequence