我正在尝试为Oracle数据库的ID创建一个 auto_increment trigger .
经过一些研究,我发现了一种使用 sequence 和 before insert trigger 编写一种方法的方法 .
问题是,当我执行触发器时,我有以下错误:
解析失败:创建或替换TRIGGER AUTO_INC_PDE_ITINERAIRE在插入PDE_ITINERAIRE之前为每行开始选择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'必须声明为Line 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 .
编辑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”日期,“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))
2 回答
它是固定的!我终于下载了Oracle SQL Developer来检查另一个IDE中的触发器,它建议我在执行时链接一个值(NEW) . 最后一招完成了这项工作 .
我假设Tora没有正确执行pl / sql,或者我错过了一个声明:NEW和SQL Developer修复它 .
谢谢您的帮助 .
:new
是包含触发器的所有列的记录's table, so you can' t在引用时包括表名::NEW.PDE_ITINERAIRE.ID_PDE_ITINERAIRE
应为:NEW.ID_PDE_ITINERAIRE
此外,您不需要
select
,您只需分配值(至少使用任何受支持的Oracle版本):