同一个spring 事务中,向oracle两张表分别插入数据,一条数据插入时会有触发器去验证另一条是否存在

时间:2022-10-16 00:48:25
int ret2 =1;
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上呢