我正在尝试为Oracle数据库的ID创建 auto_increment trigger 。
经过一些研究,我找到了一种方法,在插入触发器之前使用序列和编写一个。
问题是,当我执行触发器时,出现以下错误:
解析失败:
创建或替换TRIGGER AUTO_INC_PDE_ITINERAIRE
在插入之前
ON PDE_ITINERAIRE
对于每一行
开始
SELECT PDE_ITINERAIRE_ID_SEQUENCE.NEXTVAL
INTO
如果我使用以下命令:
select * from SYS.USER_ERRORS where name = 'AUTO_INC_PDE_ITINERAIRE';
返回以下输出:
第3行| Pos 10 | PLS-00201:必须声明标识符'NEW.PDE_ITINERAIRE' 第2行| Pos 03 | PL / SQL:忽略SQL语句
第4行| Pos 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。
这是要求的DDL:
CREATE TABLE“GEOMAP”。“PDE_ITINERAIRE”
(“ID_PDE_ITINERAIRE”NUMBER(11,0)NOT NULL ENABLE,
“NOM_ITINERAIRE”VARCHAR2(255)NOT NULL ENABLE,
“LONGUEUR”号码(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),
“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)
)
答案 0 :(得分: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;
/
答案 1 :(得分:0)
它是固定的! 我终于下载了Oracle SQL Developer来检查另一个IDE中的触发器,它建议我在执行时链接一个值(NEW)。 这最后一招完成了这项工作。
我认为Tora没有正确执行pl / sql,或者我错过了一个声明:NEW和SQL Developer修复它。
感谢您的帮助。