【问题标题】:Why is my trigger not working on my Oracle database?为什么我的触发器在我的 Oracle 数据库上不起作用?
【发布时间】:2020-04-06 22:39:15
【问题描述】:

我有一个 SQL/PSM 触发器,我必须将其应用于我的 Oracle 数据库,但它不起作用,我真的不明白为什么......

这是我的 MySQL 触发器:

CREATE TRIGGER "trigger_ACTIVITE_COMPL"
BEFORE INSERT ON "ACTIVITE_COMPL"
FOR EACH ROW
BEGIN
    SELECT "auto_ACTIVITE_COMPL".nextval INTO :NEW."AC_NUM" 
    FROM dual;
END;

CREATE TRIGGER "trigger_RAPPORT_VISITE"
BEFORE INSERT ON "RAPPORT_VISITE" 
FOR EACH ROW
BEGIN
    SELECT "auto_RAPPORT_VISITE".nextval INTO :NEW."RAP_NUM" 
    FROM dual;
END;

这是我的 Oracle 触发器:

CREATE OR REPLACE TRIGGER "trigger_ACTIVITE_COMPL" 
BEFORE INSERT ON "ACTIVITE_COMPL" 
FOR EACH ROW
BEGIN
    SELECT "auto_ACTIVITE_COMPL".nextval 
    INTO :NEW."AC_NUM" 
    FROM dual;
END;

CREATE OR REPLACE TRIGGER "trigger_RAPPORT_VISITE" 
BEFORE INSERT ON "RAPPORT_VISITE" 
FOR EACH ROW
BEGIN
    SELECT "auto_RAPPORT_VISITE".nextval 
    INTO :NEW."RAP_NUM" 
    FROM dual;
END;

当我执行这条语句时,控制台说:

[警告,错误代码 17110,SQLState 99999] 警告:执行 终止 avec avertissement

[1:1] 在 0,318 秒内成功执行。没有行受到影响。

[8:1] 0 秒内失败。 [异常,错误代码 900,SQLState 42000] ORA-00900: 指令 SQL 无效

第 8 行,第 1 列

[警告,错误代码 17110,SQLState 99999] 警告:执行 终止 avec avertissement

[10:1] 在 0,037 秒内成功执行。没有行受到影响。

[17:1] 0 秒后失败。 [异常,错误代码 900,SQLState 42000] ORA-00900: 指令 SQL 无效

第 17 行,第 1 列

0,445 秒后执行完成,出现 2 个错误。

所以从为什么我知道有语法错误但我找不到问题所在,我只知道错误位于第 5 行和第 13 行,因为当我执行 SQL SELECT "auto_ACTIVITE_COMPL".nextval FROM dual; 时,它确实有效。

我认为您不需要数据库结构来识别问题,因为它显然是语法错误,但我不知道究竟是什么。

如果您知道问题所在,请帮助我。

谢谢。

PS:我不太擅长 PL/SQL,尤其是涉及 Oracle

【问题讨论】:

  • 你试过用/结束触发代码吗?在END; 之后在下一行输入/ 并尝试
  • 嘿,谢谢你的回答,实际上我的脚本一开始确实包含/,但它不起作用,我有4个错误而不是2个没有它们的错误......所以我删除了它们我真的不知道我还能做什么,我的脚本对你来说是否正确?
  • 是的,看起来不错。你能创建单个触发器吗?您尝试在哪个客户端编译触发器?
  • 我正在使用 Netbeans,并且以 c##user 身份连接到数据库。单行 CREATE OR REPLACE TRIGGER... 显然已执行,但其余行不起作用并显示错误。
  • 作为旁注,当您通过指定用双引号括起来的名称来创建对象时,它的名称将完全按照您指定的情况保存在数据字典中。因此,当您将来引用它时,您还必须将引用括在双引号中,并指定与您创建它时完全相同的(混合)大小写。不是什么好事。 oracle 的最佳实践 - 从不 将对象名称括在双引号中。

标签: sql oracle triggers


【解决方案1】:

对于您正在做的事情,无需使用 select 语句。试试这个:

 :NEW."AC_NUM" := "auto_ACTIVITE_COMPL".nextval;

另外,@EdStevens 上面所说的:最佳做法是永远不要用双引号将对象名称括起来!

 :NEW.AC_NUM := auto_ACTIVITE_COMPL.nextval;

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2021-09-23
    • 2017-10-04
    • 2023-04-05
    • 2021-08-30
    相关资源
    最近更新 更多