背景介绍:
原来做xxl-job定时任务时,代码都可以正常跑,数据也可以正常插入,项目日志也没有报错。
久而久之,问题出现了,xxl-job本身捕捉的日志不断的打印项目输出的错误,项目中并没有任何报错。
报错信息:
ORA-06512: at "HDYYXYWEB.ZX_CHL_CALLMSG_DOC_TRI", line 5\nORA-04088: error during execution of trigger 'HDYYXYWEB.ZX_CHL_CALLMSG_DOC_TRI'
分析:
报错提示触发器错误,可是我写代码时并没有涉及到触发器(不太会~)呀,然后就开始去数据库中找触发器,虽然我看不太懂,但是我会搜索,~
下面是触发器示例:
CREATE OR REPLACE trigger HDYYXYWEB.ZX_CHL_CALLMSG_DOC_TRI
before insert on zx_chl_callmsg_doc
for each row
Declare
-- local variables here
Begin
If :new.msgid Is Null Then
Select hdyyxy.zx_chl_callmsgseq.nextval Into :new.msgid From dual;
End If;
End zx_chl_callmsg_doc_tri;
代码解释:
这是一个 Oracle 数据库中的触发器(trigger),名为 ZX_CHL_CALLMSG_DOC_TRI,用于在向表 ZX_CHL_CALLMSG_DOC 插入新记录之前执行一些操作。让我们逐行解释这段触发器的代码:
CREATE OR REPLACE TRIGGER HDYYXYWEB.ZX_CHL_CALLMSG_DOC_TRI: 这是创建或替换触发器的语法,HDYYXYWEB 是该触发器所属的模式(schema)名。
BEFORE INSERT ON ZX_CHL_CALLMSG_DOC: 触发器的触发时机是在向表 ZX_CHL_CALLMSG_DOC 中插入新记录之前执行。
FOR EACH ROW: 这表示该触发器是行级触发器,将为每个插入操作的行执行一次。
Declare: 这是一个可选部分,在这里可以定义局部变量。在这段代码中,没有定义局部变量。
BEGIN: 触发器代码的开始标记。
If :new.msgid Is Null Then: 这是一个条件判断语句,检查被插入的新行的 msgid 字段是否为空(Null)。
Select hdyyxy.zx_chl_callmsgseq.nextval Into :new.msgid From dual;: 如果 msgid 为空,则执行这条 SQL 语句。它从名为 hdyyxy.zx_chl_callmsgseq 的序列中获取下一个值,并将其赋值给触发器中的 :new.msgid。:new.msgid 是一个特殊的引用,表示新插入行的 msgid 字段。
End zx_chl_callmsg_doc_tri;: 触发器代码的结束标记。
该触发器的目的是在向 ZX_CHL_CALLMSG_DOC 表插入新记录时,如果新记录的 msgid 字段为空,就从序列 hdyyxy.zx_chl_callmsgseq 中获取下一个值,并填充到 msgid 字段中,以保证该字段的唯一性和自增特性。
注意:
这时,我注意到了FOR EACH ROW: 这表示该触发器是行级触发器,将为每个插入操作的行执行一次。 这句话。
我开始怀疑时我的插入语句为批量插入导致触发器报错。
解决方案:
由于不太会触发器,我就把批量插入,改为了单条记录插入,因为数据量不多,故采用了这种方案。
评论前必须登录!
注册