Oracle - ошибка при запуске хранимой процедуры, только в обычном режиме - PullRequest
0 голосов
/ 26 ноября 2018

У меня проблема с хранимой процедурой в БД Oracle.Когда я пытаюсь запустить эту процедуру в Job, или пытаюсь вызвать ее из окна sql с помощью exec, она возвращает ошибку:

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

И чтобы напомнить о проблеме, все работает нормально, когда я отлаживаю эту процедуру, я не получаю ошибок таким образом, но когда она выполняется: например, job, я вижу ORA-02291 error.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Проблема была с параметром даты (v_data).Когда я запускал процедуру как: procedure_name(sysdate-5), она каждый раз терпела неудачу, но когда я запускал ее как procedure_name(trunc(sysdate-5)), это успешно.Вот почему, когда я пытался отладить, он всегда был успешным, потому что окно параметров не помещает часы и минуты в параметр данных.

Родительская строка с датой, например: '18 / 11/26 15:32:00 ', никогда не будет существовать, потому что при вставке в tabele_kursow_walut я усекаю эти данные.К сожалению, когда я делаю вставку в дочернюю таблицу, я не использую функцию усечения.

Спасибо за помощь @ Jåcob

0 голосов
/ 26 ноября 2018

Попробуйте перехватить исключение в блоке 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...