Create Or Replace Trigger Trigger_TOS_D_PATIENT_PAST
 After Insert Or Update On TOS_D_PATIENT_PAST For Each RowBegin
  If Inserting Then
     DECLARE RNT INT := 0;     BEGIN
          SELECT COUNT(1) INTO rnt from tos_d_patient_info_summary t where t.patient_id = :new.patient_id;
          if(rnt>0) then
              update tos_d_patient_info_summary t 
              set 
              t.knj_kiorrk = TOS_SP_PATIENTINFOMNGDATA.FILL_KNJKIORRK(:new.patient_id) where t.patient_id = :new.patient_id;
          else 
              Insert Into tos_d_patient_info_summary(patient_id,knj_kiorrk) Values(:new.patient_id,TOS_SP_PATIENTINFOMNGDATA.FILL_KNJKIORRK(:new.patient_id));
          end if;
     END;  Elsif Updating Then
      update tos_d_patient_info_summary T 
      set 
      T.KNJ_KIORRK=TOS_SP_PATIENTINFOMNGDATA.FILL_KNJKIORRK(:old.PATIENT_ID),
      t.knj_allergy =TOS_SP_PATIENTINFOMNGDATA.FILL_KNJALLERGY(:old.PATIENT_ID),
      t.knj_kansen =TOS_SP_PATIENTINFOMNGDATA.FILL_KNJKANSEN(:old.PATIENT_ID)
      where t.patient_id=:old.PATIENT_ID;
  End If;End;
当我向表tos_d_patient_past插入值的时候, 提示错误,,请问怎么错了啊
如果没有触发器,是可以插入的,
报:ORA-04091  0RA-06512  ORA-06512  ORA-04088错误

解决方案 »

  1.   

    你的
    Create Or Replace Trigger Trigger_TOS_D_PATIENT_PAST
     After Insert Or Update On TOS_D_PATIENT_PAST For Each Row

    For Each Row
    去掉吧...
      

  2.   

     Create Or Replace Trigger update_TOS_D_PATIENT_PAST
     after Update On TOS_D_PATIENT_PAST For Each Row
    begin
         DECLARE RNT INT := 0;
         BEGIN
              SELECT COUNT(1) INTO rnt from tos_d_patient_info_summary t where t.patient_id = :old.patient_id;
              if(rnt>0) then
                  update tos_d_patient_info_summary t 
                  set 
                  t.knj_kiorrk = TOS_SP_PATIENTINFOMNGDATA.FILL_KNJKIORRK(:old.patient_id) where t.patient_id = :old.patient_id;
              else 
                  Insert Into tos_d_patient_info_summary(patient_id,knj_kiorrk) Values(:new.patient_id,TOS_SP_PATIENTINFOMNGDATA.FILL_KNJKIORRK(:old.patient_id));
              end if;
         END;
    end;
    下面这段话单独抽出来   报同样的错误
      

  3.   

    因为你有For Each Row关键字...每当有一行数据被update的时候都会触发这个触发器...但是之前的update没有提交.....所以会报这个错..
      

  4.   

     Create Or Replace Trigger Insert_TOS_D_PATIENT_PAST
     before Insert On TOS_D_PATIENT_PAST For Each Row
    Begin
         DECLARE RNT INT := 0;
         BEGIN
              SELECT COUNT(1) INTO rnt from tos_d_patient_info_summary t where t.patient_id = :new.patient_id;
              if(rnt>0) then
                  update tos_d_patient_info_summary t 
                  set 
                  t.knj_kiorrk = TOS_SP_PATIENTINFOMNGDATA.FILL_KNJKIORRK(:new.patient_id) where t.patient_id = :new.patient_id;
              else 
                  Insert Into tos_d_patient_info_summary(patient_id,knj_kiorrk) Values(:new.patient_id,TOS_SP_PATIENTINFOMNGDATA.FILL_KNJKIORRK(:new.patient_id));
              end if;
         END;
    End;上面这样就不报错    把insert触发器改成update就报错,,,我像改成update怎么改啊
      

  5.   

    :new.patient_id 我看了,,有很多条 都是相同的id 是不是前一条没有提交,,,所以报错,,,应该怎么改啊
    For Each Row 去掉报错
      

  6.   

    TOS_SP_PATIENTINFOMNGDATA.FILL_KNJKIORRK(:new.patient_id)
    这是个啥,函数? 又操作本身依附的表了吧。