【问题标题】:Oracle : "parsing failed" error when creating an auto_increment triggerOracle:创建 auto_increment 触发器时出现“解析失败”错误
【发布时间】:2016-10-19 09:23:33
【问题描述】:

我正在尝试为 Oracle 数据库的 ID 创建一个 auto_increment 触发器
经过一番研究,我找到了一种使用 sequencebefore 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


【解决方案1】:

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

【讨论】:

  • 感谢您的早日回复,我刚刚按照您建议的方式更新了查询。我仍然有相同的错误输出。顺便说一句,我的 Oracle 是 11 版。
  • 错误提示表中没有该列,可能是错字?能否请您也添加表格 DDL。
【解决方案2】:

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

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

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2021-11-25
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多