我是靠谱客的博主 拼搏石头,最近开发中收集的这篇文章主要介绍oracle数据库触发器怎么查询后插入,[求助][Oracle][ORA-00604][ORA-02067]触发器被触发时向远程数据库插入数据...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

环境:

数据库:Oracle 12c;数据库A(本地),数据库B(远程),在A中创建DBLink连接到B

工具:sqldevloper

问题:

数据库A中的Change表中创建了触发器T,After insert,当T被触发时,查询I表和B表,并将查到的数据插入到数据库B中对应的表中,Change表中一条记录可对应0或多条I表中的数据,I表中的一条记录可对应0或多条B表中的数据,通过创建游标来实现,

简而言之,触发器被触发,先查询再向远程数据库插入数据。

会出现下面的错误:

java.sql.SQLException:ORA-00604:递归SQL级别1出现错误

​ ORA-02067:要求事务处理或保存点回退

原因:

?

解决方案:

?

触发器代码:create or replace

trigger plm_mapping_mid_trg

after insert on change

for each row

declare

-- 通用变量

trg_ato_number change.ato_number%type;

-- mfr游标

cursor vrows_mfr(trg_pid in item.pid%type) is select mfr_name trg_imak002

-- into trg_flag_mfr, trg_mfr_name

from mfr where pid = trg_pid;

-- item游标

cursor vrows_item(ato_number in change.ato_number%type) is select pid trg_pid, item_number trg_imat001, item_type trg_imat002, substr(item_number, 1, 2) trg_imat003, item_description trg_imat004,

unit trg_imat005, lifecycle_phase trg_imat007, business_unit trg_imat026

from jx_itf_item where ato_number = trg_ato_number;

-- BOM游标

cursor vrows_bom(trg_pid in item.pid%type) is select assembly_item trg_bmat001, component_item trg_bmat002, unit_consumption trg_bmat003

from jx_itf_bom where pid = trg_pid;

-- assembly游标

cursor vrows_assembly(trg_pid in item.pid%type) is select assembly_item

from jx_itf_bom_assembly_header where pid = trg_pid;

begin

trg_ato_number := :new.ato_number;

-- 根据ato_number查询item

for r_item in vrows_item(trg_ato_number) loop

-- 插入远程数据库的item表

insert into plm_imatuc_t@plm_mapping_mid_dblink(plm_pk, imat001, imat002, imat003,imat004,imat005,imat007, imat026)

values(r_item.trg_pid, r_item.trg_imat001, r_item.trg_imat002, r_item.trg_imat003,r_item.trg_imat004,r_item.trg_imat005,r_item.trg_imat007, r_item.trg_imat026);

-- 根据pid查询mgr表中的对应的信息

for r_mfr in vrows_mfr(r_item.trg_pid) loop

-- 插入远程数据库的mfr表

insert into plm_imakuc_t@plm_mapping_mid_dblink(plm_pk, imak001, imak002) values(r_item.trg_pid, r_item.trg_imat001, r_mfr.trg_imak002);

end loop;

-- 根据pid查询Assembly表中的对应的信息

for r_assembly in vrows_assembly(r_item.trg_pid) loop

-- 根据pid查询BOM表

for r_bom in vrows_bom(r_item.trg_pid) loop

-- 插入远程数据库的bom表

insert into plm_bmatuc_t@plm_mapping_mid_dblink(plm_pk, bmat001, bmat002, bmat003)

values(r_item.trg_pid, r_bom.trg_bmat001, r_bom.trg_bmat002, r_bom.trg_bmat003);

end loop;

end loop;

end loop;

end;

最后

以上就是拼搏石头为你收集整理的oracle数据库触发器怎么查询后插入,[求助][Oracle][ORA-00604][ORA-02067]触发器被触发时向远程数据库插入数据...的全部内容,希望文章能够帮你解决oracle数据库触发器怎么查询后插入,[求助][Oracle][ORA-00604][ORA-02067]触发器被触发时向远程数据库插入数据...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部