int ret =editDao.syncOrder(oo.getOrder());//成功执行
int ret1 = editDao.syncExamAppoints(oo.getMaster());
Map<String,Object> skks= editDao.findData();//可以查询到刚刚插入插入的ExamAppoints的数据
for (int i = 0;i<oo.getItemList().size();i++){
ret2 = editDao.syncExamItems(oo.getItemList().get(i));
//此处报错, 'EXAM.EXAM_APPOINTS_INSERT' 执行过程中出错
//Cause: java.sql.SQLException: ORA-01403: 未找到任何数据
//回滚
}
事务是正常的,但是由于oracle数据库中,有一个触发器,会在插入exam_items表之后,触发去查询exam_appoint表中,是否有对应的数据,所以,在执行exam_items表插入时,报错。附部分触发器内容
create or replace trigger exam.exam_appoints_insert
after INSERT
ON EXAM_ITEMS
FOR EACH ROW
declare
v_patient_source exam_appoints.patient_source%type;
BEGIN
select a.patient_id,
a.visit_id,
a.patient_source,
decode(a.exam_class,
'超声',
'1',
'CT',
'0',
'放射',
'0',
'核磁',
'3',
'3'),
a.req_dept,
a.req_date_time,
a.doctor_user,
a.req_physician
into v_patient_id,
v_visit_id,
v_patient_source,
v_exam_class,
v_req_dept,
v_req_date_time,
v_doctor_user,
v_req_physician
from exam_appoints a
where a.exam_no = :new.exam_no;
/*exception
when no_data_found then*/
--住院开单插入中间表数据
--体检开单插入中间表数据
end if;
END;
1 个解决方案
#1
这两个表exam_items和exam_appoint,插入的时候顺序很重要,如果先插入的是表exam_items,然后触发器就响应了,去查询表exam_appoint,但这时候exam_appoint还没有插入数据,所以肯定会报错,你为什么不把触发器写在exam_appoint上呢
#1
这两个表exam_items和exam_appoint,插入的时候顺序很重要,如果先插入的是表exam_items,然后触发器就响应了,去查询表exam_appoint,但这时候exam_appoint还没有插入数据,所以肯定会报错,你为什么不把触发器写在exam_appoint上呢