Oracle-仅在正常模式下运行存储过程时出错

时间:2018-11-26 11:58:50

标签: sql database oracle stored-procedures plsql

我对Oracle DB中的存储过程有疑问。 当我尝试在Job中运行此过程时,或者尝试通过exec从sql窗口调用它时,它返回错误:

ORA-02291: integrity constraint violated-parent key not found

因此,所有内容都应该清除-我尝试添加一个子行,而不添加父行。 问题是,当我在调试模式下运行相同的功能时(恰好在我通过“ exec”运行它时收到错误),然后一步一步地通过它,一切都很好...

身体片段,正在生成错误:

 if length(v_plik_kursu_a)>0 or length(v_plik_kursu_c)>0 then
  --sprawdź, czy istnieje wpis dla bieżacego dnia
  select count(*) 
  into v_licznik
  from tabele_kursow_walut tkw
  where 
     tkw.id_tabeli_kursow='NBP'
     and to_char(tkw.data,'yyyy-mm-dd')=to_char(v_data,'yyyy-mm-dd');

  if v_licznik=0 then
     insert into tabele_kursow_walut tkw
     (id_tabeli_kursow,data,urzedowy_numer_tabeli,blokada)
     values
     ('NBP',trunc(v_data),'NBP','N');
  else
     select data
     into v_data   
     from tabele_kursow_walut
     where
        id_tabeli_kursow='NBP'
        and trunc(data)=trunc(v_data);
  end if;

  for i in '1' .. v_liczba_walut 
  loop

     select count(*) 
     into v_licznik
     from kursy_walut tkw
     where 
        tkw.id_tabeli_kursow='NBP'
        and to_char(tkw.data,'yyyy-mm-dd')=to_char(v_data,'yyyy-mm-dd')
        and tkw.kod_waluty=currency_array(i).name;

     --raise_application_error(-20000,v_data||' - '||currency_array(i).name||' - '||currency_array(i).average_rate||' - '||currency_array(i).purchase_rate||' - '||currency_array(i).selling_rate);

     if v_licznik=0 then
        insert into kursy_walut kw
        (id_tabeli_kursow,data,kod_waluty,kurs_sredni,kurs_kupna,kurs_sprzedazy)
        values
        ('NBP',v_data,currency_array(i).name,currency_array(i).average_rate,currency_array(i).purchase_rate,currency_array(i).selling_rate);
     else
        update kursy_walut kw
        set kurs_sredni=currency_array(i).average_rate,kurs_kupna=currency_array(i).purchase_rate,kurs_sprzedazy=currency_array(i).selling_rate
        where 
           id_tabeli_kursow='NBP' and data=v_data and kod_waluty=currency_array(i).name;
     end if;

  end loop;
  commit; 
 end if;

存储过程未定义为AUTONOMOUS_TRANSACTION。 错误出现在:

insert into kursy_walut kw
    (id_tabeli_kursow,data,kod_waluty,kurs_sredni,kurs_kupna,kurs_sprzedazy)
    values
    ('NBP',v_data,currency_array(i).name,currency_array(i).average_rate,currency_array(i).purchase_rate,currency_array(i).selling_rate);

Kursy_walut是tabele_kursow_walut的子表。

在表kursy_walut上创建产生错误的约束

约束名称为:KWL_TKW_FK

引用的表是:TABELE_KURSOW_WALUT

引用的列为:ID_TABELI_KURSOWDATA

数据库中的错误如下:ORA-02291: integrity constraint violated (my_schema_name.KWL_TKW_FK) - no parent key found

提醒大家一个问题,当我调试此过程时,一切正常,这样就不会出错,但是当运行它时,例如作业,我看到ORA-02291错误。

2 个答案:

答案 0 :(得分:1)

问题出在日期参数(v_data)上。 当我运行像procedure_name(sysdate-5)这样的过程时,它每次都会失败,但是当我像procedure_name(trunc(sysdate-5))那样运行时,它就会成功。这就是为什么当我尝试调试时,每次都会成功,因为参数窗口不会将小时和分钟放入数据参数中。

日期为:'18 / 11/26 15:32:00'的父行将永远不存在,因为在插入tabele_kursow_walut时会截断此数据。 不幸的是,当我在不使用trunc函数的情况下对子表进行插入时。

感谢@Jåcob的帮助

答案 1 :(得分:0)

尝试在PLSQL块中捕获异常,进行必要的更改,如下所示是伪代码

  DECLARE
   l_parent_not_found   EXCEPTION;
   PRAGMA EXCEPTION_INIT (l_parent_not_found, -2259);
BEGIN
   INSERT INTO kursy_walut kw (id_tabeli_kursow,
                               data,
                               kod_waluty,
                               kurs_sredni,
                               kurs_kupna,
                               kurs_sprzedazy)
        VALUES ('NBP',
                v_data,
                currency_array (i).name,
                currency_array (i).average_rate,
                currency_array (i).purchase_rate,
                currency_array (i).selling_rate);
EXCEPTION
   WHEN l_parent_not_found
   THEN
      -- try printing the values which are on the insert statements
END;