ORACLE中ORA-04098 触发器无效且未通过验证
createsequencepzl_drls_sequenceincrementby1startwith0minvalue0nomaxvaluenocache;creat...
create sequence pzl_drls_sequence
increment by 1
start with 0
minvalue 0
nomaxvalue
nocache;
create or replace trigger pzl_drls_id before insert
on PZL_DRLS
for each row
when(NEW.ID is null)
begin
select pzl_drls_sequence.nextval into :NEW.ID from dual;
end;
执行insert into pzl_drls 表操作时报错触发器无效 且未通过验证,PZL_DRLS第一列是ID
有没有大神给解答一下 展开
increment by 1
start with 0
minvalue 0
nomaxvalue
nocache;
create or replace trigger pzl_drls_id before insert
on PZL_DRLS
for each row
when(NEW.ID is null)
begin
select pzl_drls_sequence.nextval into :NEW.ID from dual;
end;
执行insert into pzl_drls 表操作时报错触发器无效 且未通过验证,PZL_DRLS第一列是ID
有没有大神给解答一下 展开
1个回答
2017-08-21 · 知道合伙人互联网行家
关注
展开全部
公司系统需要,临时需要我写一个触发器, 我简单的记录了一下我的第一个触发器的编写过程.
第一步,找部分参考资料,看懂大概的逻辑
第二步,参照资料写自己的触发器逻辑:
CREATE OR REPLACE TRIGGER update_bms_ord_recordAFTER UPDATE OF status ON oms.oms_orderFOR EACH ROW
BEGIN
CASE
WHEN UPDATING('status') THEN
IF :NEW.status='SIGN' THEN
UPDATE bms_ord_record ord SET ord.Be_Sign=1,ord.sign_time=:OLD.ACTUAL_RECEIVE_TIME WHERE ord.relatebill1=:old.relatebill1;ELSIF :OLD.status='SIGN'
UPDATE bms_ord_record ord SET ord.Be_Sign=0,ord.sign_time=NULL WHERE ord.relatebill1=:OLD.relatebill1;END IF;END CASE;
END;
写完上述逻辑后在sql窗口进行执行,未报任何异常;第三步:测试我写了一个update语句进行测试,
UPDATE oms_order o SET o.status='SIGN2' WHERE o.relatebill1='50010777';但是报错,我始终在我的plsql中查询不到我触发器,检查对应的oms_order表,表上确实是有触发器的.
切换用户后, 即可能看到自己的触发器, 如下图点击编辑,就可以在右边窗口下面看到相应的错误, 或者再次执行一下脚本, 错误出现的地方会有黄色光标行停留最终 根据错误提示,检查确实是在ELSIF 的表达式后少了一个结尾的 then 关键字, 加上后,再次进行编译,没有任何错误提示, 测试效果也是ok .
第一步,找部分参考资料,看懂大概的逻辑
第二步,参照资料写自己的触发器逻辑:
CREATE OR REPLACE TRIGGER update_bms_ord_recordAFTER UPDATE OF status ON oms.oms_orderFOR EACH ROW
BEGIN
CASE
WHEN UPDATING('status') THEN
IF :NEW.status='SIGN' THEN
UPDATE bms_ord_record ord SET ord.Be_Sign=1,ord.sign_time=:OLD.ACTUAL_RECEIVE_TIME WHERE ord.relatebill1=:old.relatebill1;ELSIF :OLD.status='SIGN'
UPDATE bms_ord_record ord SET ord.Be_Sign=0,ord.sign_time=NULL WHERE ord.relatebill1=:OLD.relatebill1;END IF;END CASE;
END;
写完上述逻辑后在sql窗口进行执行,未报任何异常;第三步:测试我写了一个update语句进行测试,
UPDATE oms_order o SET o.status='SIGN2' WHERE o.relatebill1='50010777';但是报错,我始终在我的plsql中查询不到我触发器,检查对应的oms_order表,表上确实是有触发器的.
切换用户后, 即可能看到自己的触发器, 如下图点击编辑,就可以在右边窗口下面看到相应的错误, 或者再次执行一下脚本, 错误出现的地方会有黄色光标行停留最终 根据错误提示,检查确实是在ELSIF 的表达式后少了一个结尾的 then 关键字, 加上后,再次进行编译,没有任何错误提示, 测试效果也是ok .
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询