Oracle:创建auto_increment触发器时出现“解析失败”错误

时间:2016-06-17 13:45:52

标签: oracle plsql auto-increment database-trigger database-sequence

我正在尝试为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。

编辑2

这是要求的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)
     )

2 个答案:

答案 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修复它。

感谢您的帮助。