我对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_KURSOW
,DATA
。
数据库中的错误如下:ORA-02291: integrity constraint violated (my_schema_name.KWL_TKW_FK) - no parent key found
提醒大家一个问题,当我调试此过程时,一切正常,这样就不会出错,但是当运行它时,例如作业,我看到ORA-02291
错误。
答案 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;