【发布时间】: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 的最佳实践 - 从不 将对象名称括在双引号中。