Hello,
I have problem using ODAC. I have view with instead of update trigger. If I'm trying update view then ODAC give me ORA-3113 error (in DBMonitor ORA-3114 error is visible) SQL query look like:
UPDATE U_EKS.V_LISTY SET
LS_LSR_ID = :LS_LSR_ID
WHERE
LS_ID = :Old_LS_ID
and is correct - this is autogenerated query.
So I made some small test application. In this application I have only ToraSession and ToraQuery object with problematic query - test also failed. Test code is just:
orsn1.StartTransaction;
try
q1.ParamByName('ls_lsr_id').AsInteger := 2;
q1.ParamByName('old_ls_id').AsInteger := 223396;
q1.Execute;
orsn1.Commit;
except
orsn1.Rollback;
raise;
end;
But I'm trying to run the same query in PL-SQL Developer - it works correctly. So I have add to my test application AnyDAC components (connection and query) - and when I'm usnig AD components everything works correctly - value in table is changed and transaction is commited. Here is test code for AD components:
adc1.StartTransaction;
try
adq1.ParamByName('ls_lsr_id').AsInteger := 3;
adq1.ParamByName('old_ls_id').AsInteger := 223396;
adq1.Execute;
adc1.Commit;
except
adc1.Rollback;
raise;
end;
So, there is the problem with ODAC? I'm using Delphi 2007 pro, ODAC 6.50.0.39 and Oracle 10g XE.
If you wish I can send you test application.
best regards
Adam Siwon
ORA-3113/ORA-3114 error problem
Hello,
this is not easy. View looks like:
create or replace view u_eks.v_listy as
select
ls.rowid as ls_rowid,
ls.ls_id,
ls.ls_pwz_pwz_id,
ls.ls_lsr_id,
ls.ls_zalacznik,
ls.ls_nad_st_st_id,
ls.ls_przesylka_id,
lsps.lsps_zlecenie_dodatkowe,
stn.st_numer as stn_numer,
stn.st_nazwa as stn_nazwa,
ls.ls_numer_nad,
ls.ls_data_nad,
ls.ls_prz_st_st_id,
stp.st_numer as stp_numer,
stp.st_nazwa as stp_nazwa,
ls.ls_numer_prz,
ls.ls_data_prz,
lsr.lsr_symbol,
pwz.pwz_symbol,
pwz.pwz_nazwa,
pwz.pwz_symbol_cyfr,
pwz.pwz_symbol_liter,
pwz.pwz_tara_z_belki,
pwz.pwz_netto_tara_belki,
ls.ls_iw_id,
iw.iw_symbol,
iw.iw_uzyta,
ls.ls_tw_id,
ls.ls_kn_kn_id,
ls.ls_ub_ub_id,
ls.ls_czas_sporzadz,
ls.ls_ilosc_wagonow,
lsnd.lsnd_ilosc_wagonow_wycof as ls_ilosc_wagonow_wycof,
lsnd.lsnd_ilosc_wagonow_zamien as ls_ilosc_wagonow_zamien,
-- Rodzaj tary i sposób ustalenia masy netto
ls.ls_rodzaj_tary,
cast(u_eks.p_listy_nadania_obliczenia.Tara_Rodzaj_Opis(ls.ls_rodzaj_tary) as varchar2(15)) as ls_rodzaj_tary_opis,
ls.ls_rodzaj_netto,
u_eks.p_wazenia.Masa_Przewozowa_Opis(ls.ls_rodzaj_netto) as ls_rodzaj_netto_opis,
-- Suma mas z wagonów powiązanych z listem
ls.ls_masa_tara,
ls.ls_masa_netto,
ls.ls_masa_brutto,
ls.ls_kontrola_kredytu,
-- Dodatkowe oświadczenie nadawcy
ls.ls_os_id,
os.os_symbol,
os.os_uzyty,
-- Nadawca
ub.ub_symbol,
-- Szablon nadawcy
ls.ls_ubz_id,
ubz.ubz_symbol,
-- Odbiorca
kn.kn_symbol,
-- Szablon odbiorcy
ls.ls_klz_id,
kz.klz_symbol,
-- Towar podstawowy
tw.tw_symbol,
-- Szablon towaru
ls.ls_tlz_id,
tz.tlz_symbol,
-- Dane faktury przewoźnika
lsps.lsps_faktura_numer,
lsps.lsps_faktura_pozycja,
lsps.lsps_faktura_kwota
from u_eks.t_listy ls
left outer join u_eks.t_listy_rodzaje lsr on
lsr.lsr_id = ls.ls_lsr_id
left outer join u_eks.t_przewoznicy pwz on
pwz.pwz_pwz_id = ls.ls_pwz_pwz_id and
ls.ls_data_nad between pwz.pwz_data_od and pwz.pwz_data_do
-- Odbiorca
left outer join u_eks.t_kontrahenci kn on
kn.kn_kn_id = ls.ls_kn_kn_id and
ls.ls_data_nad between kn.kn_data_od and kn.kn_data_do
-- Nadawca
left outer join u_adm.t_uzytkownicy_bocznicy ub on
ub.ub_ub_id = ls.ls_ub_ub_id and
ls.ls_data_nad between ub.ub_data_od and ub.ub_data_do
-- Towar podstawowy
left outer join u_eks.t_towary tw on
tw.tw_id = ls.ls_tw_id
left outer join u_eks.t_uzytkownicy_bocz_zestawy ubz on
ubz.ubz_id = ls.ls_ubz_id
left outer join u_eks.t_kontrahenci_lista_zestawow kz on
kz.klz_id = ls.ls_klz_id
left outer join u_eks.t_towary_lista_zestawow tz on
tz.tlz_id = ls.ls_tlz_id
left outer join u_eks.t_instr_wysylkowe iw on
iw.iw_id = ls.ls_iw_id
left outer join u_eks.t_oswiadczenia os on
os.os_id = ls.ls_os_id
-- Stacja nadania
left outer join u_eks.t_stacje stn on
stn.st_st_id = ls.ls_nad_st_st_id and
ls.ls_data_nad between stn.st_data_od and stn.st_data_do
-- Stacja przeznaczenia
left outer join u_eks.t_stacje stp on
stp.st_st_id = ls.ls_prz_st_st_id and
nvl(ls.ls_data_prz, ls.ls_data_nad) between stp.st_data_od and stp.st_data_do
join u_eks.t_listy_przesylki lsps on
lsps.lsps_id = ls.ls_przesylka_id
join u_eks.t_listy_nadania_dane_dodatkowe lsnd on
lsnd.lsnd_id = ls.ls_id;
and trigger looks like:
create or replace trigger u_eks.tg_iou_listy_nadania
instead of update on u_eks.v_listy
for each row
declare
v_rodzaj_netto u_eks.t_przewoznicy.pwz_netto_tara_belki%type;
v_ilosc_wagonow pls_integer;
v_masa_tara pls_integer;
v_masa_netto pls_integer;
-- Zmienne do obsługi zmiany rodzaju listu
v_tmp_lsps_id u_eks.t_listy.ls_przesylka_id%type;
v_tmp_lsps_rowid rowid;
begin
-- dla listu zmieniono przewoźnika lub datę nadania
if :new.ls_pwz_pwz_id :old.ls_pwz_pwz_id or :new.ls_data_nad :old.ls_data_nad then
-- Drugi próg kontroli - sprawdzamy czy po zmianie przewoźnika lub daty nadania zmienia się sposób
-- obliczania masy netto
v_rodzaj_netto := u_eks.p_wazenia.Masa_Przewozowa_Rodzaj(
u_eks.p_listy_wagony_edycja.Przewoznik_Masa_Wg_Belki(:new.ls_pwz_pwz_id, :new.ls_data_nad));
if :old.ls_rodzaj_netto v_rodzaj_netto then
-- jest różnica w sposobie ustalania masy - przeliczamy masy netto
u_eks.p_listy_wagony_edycja.Przelicz_Mase_Przew(
i_ls_id => :old.ls_id,
i_rodzaj_netto => v_rodzaj_netto);
end if;
end if;
-- Przeliczamy sumy mas
u_eks.p_listy_wagony_edycja.Sumy_Wagonow_Oblicz(i_ls_id => :old.ls_id, i_rodzaj_tary => :new.ls_rodzaj_tary,
o_ilosc_wagonow => v_ilosc_wagonow, o_masa_tara => v_masa_tara, o_masa_netto => v_masa_netto);
-- Dodanie wpisu tymczasowego, wykorzystywanego gdy jest zmiana rodzaju listu
if :old.ls_lsr_id :new.ls_lsr_id then
-- Tworzymy tymczasowy zapis dla przesyłki z ustawionym nowym rodzajem listu
u_eks.p_listy_utworz.Nowa_Przesylka(io_lsps_id => v_tmp_lsps_id, i_lsps_lsr_id => :new.ls_lsr_id,
o_lsps_rowid => v_tmp_lsps_rowid);
-- Usuwamy zapisy o szablonach towaru listu
u_eks.p_listy_edycja.Towary_Usun_Tmp(i_ls_id => :old.ls_id);
end if;
-- Zmiana danych listu w tabeli
update u_eks.t_listy ls set
ls_id = :old.ls_id,
ls_pwz_pwz_id = :new.ls_pwz_pwz_id,
ls_lsr_id = :new.ls_lsr_id,
ls.ls_przesylka_id = nvl(v_tmp_lsps_id, ls.ls_przesylka_id),
ls_zalacznik = :new.ls_zalacznik,
ls.ls_nad_st_st_id = :new.ls_nad_st_st_id,
ls_data_nad = :new.ls_data_nad,
ls.ls_prz_st_st_id = :new.ls_prz_st_st_id,
ls_numer_prz = :new.ls_numer_prz,
ls_data_prz = :new.ls_data_prz,
ls_tlz_id = :new.ls_tlz_id,
ls_tw_id = :new.ls_tw_id,
ls_klz_id = :new.ls_klz_id,
ls_kn_kn_id = :new.ls_kn_kn_id,
ls_ubz_id = :new.ls_ubz_id,
ls_ub_ub_id = :new.ls_ub_ub_id,
ls_iw_id = :new.ls_iw_id,
ls_os_id = :new.ls_os_id,
ls_kontrola_kredytu = :new.ls_kontrola_kredytu,
ls.ls_rodzaj_tary = :new.ls_rodzaj_tary,
ls.ls_rodzaj_netto = nvl(v_rodzaj_netto, ls.ls_rodzaj_netto),
ls.ls_masa_tara = v_masa_tara,
ls.ls_masa_netto = v_masa_netto,
ls.ls_uz_id = u_btk.p_uzytkownik_biezacy.Id,
ls.ls_czas_sporzadz = current_date
where ls.ls_id = :old.ls_id
-- Zablokowanie możliwości zmiany listu po wprowadzeniu numeru nadania.
-- dodatkowy warunek jest konieczny po wprowadzeniu możliwości wpisywania
-- danych faktury przewoźnika - w tym wypadku próba aktualizacji listu nadanego
-- skończy się zgłoszeniem wyjątku. Blokada może zostać usunięta, gdy do programu
-- zostanie wprowadzona ewidencja faktur z przypisywaniem pozycji do listów.
and ls.ls_numer_nad is null;
-- Ciąg dalszy obsługi zmiany rodzaju listu przewozowego
if :old.ls_lsr_id :new.ls_lsr_id then
-- Ustawiamy nowy rodzaj listu w tabeli przesyłek - list jest powiązany z przesyłką tymczasową.
update u_eks.t_listy_przesylki lsps set
lsps.lsps_lsr_id = :new.ls_lsr_id
where lsps.lsps_id = :old.ls_przesylka_id;
-- Przepisujemy powiązanie listu do wcześniejszej przesyłki
update u_eks.t_listy ls set
ls.ls_przesylka_id = :old.ls_przesylka_id
where ls.ls_id = :old.ls_id;
-- Usunięcie przesyłki tymczasowej
delete from u_eks.t_listy_przesylki lsps
where lsps.rowid = v_tmp_lsps_rowid;
end if;
-- Aktualizacja danych przesyłki
update u_eks.t_listy_przesylki set
lsps_faktura_numer = :new.lsps_faktura_numer,
lsps_faktura_pozycja = :new.lsps_faktura_pozycja,
lsps_faktura_kwota = :new.lsps_faktura_kwota
where lsps_id = :old.ls_przesylka_id;
-- Sprawdzamy ilość linii oświadczenia, gdy są jakieś zmiany w szablonach listu
if (nvl(:old.ls_iw_id, 0) :new.ls_iw_id) or (nvl(:old.ls_klz_id, 0) :new.ls_klz_id) or
(nvl(:old.ls_tlz_id, 0) :new.ls_tlz_id) or (nvl(:old.ls_os_id, 0) :new.ls_os_id) then
-- Sprawdzenie czy linie oświadczenia zmieszczą się w liście
u_eks.p_listy_edycja.Sprawdz_Rozmiar_Oswiadczenia(i_ls_id => :old.ls_id, i_ls_lsr_id => :new.ls_lsr_id);
end if;
end tg_iou_listy_nadania;
Problem occurs only when condition :old.ls_lsr_id :new.ls_lsr_id has value True.
Do you want all tables definitions used in the view?
regards
Adam Siwon
this is not easy. View looks like:
create or replace view u_eks.v_listy as
select
ls.rowid as ls_rowid,
ls.ls_id,
ls.ls_pwz_pwz_id,
ls.ls_lsr_id,
ls.ls_zalacznik,
ls.ls_nad_st_st_id,
ls.ls_przesylka_id,
lsps.lsps_zlecenie_dodatkowe,
stn.st_numer as stn_numer,
stn.st_nazwa as stn_nazwa,
ls.ls_numer_nad,
ls.ls_data_nad,
ls.ls_prz_st_st_id,
stp.st_numer as stp_numer,
stp.st_nazwa as stp_nazwa,
ls.ls_numer_prz,
ls.ls_data_prz,
lsr.lsr_symbol,
pwz.pwz_symbol,
pwz.pwz_nazwa,
pwz.pwz_symbol_cyfr,
pwz.pwz_symbol_liter,
pwz.pwz_tara_z_belki,
pwz.pwz_netto_tara_belki,
ls.ls_iw_id,
iw.iw_symbol,
iw.iw_uzyta,
ls.ls_tw_id,
ls.ls_kn_kn_id,
ls.ls_ub_ub_id,
ls.ls_czas_sporzadz,
ls.ls_ilosc_wagonow,
lsnd.lsnd_ilosc_wagonow_wycof as ls_ilosc_wagonow_wycof,
lsnd.lsnd_ilosc_wagonow_zamien as ls_ilosc_wagonow_zamien,
-- Rodzaj tary i sposób ustalenia masy netto
ls.ls_rodzaj_tary,
cast(u_eks.p_listy_nadania_obliczenia.Tara_Rodzaj_Opis(ls.ls_rodzaj_tary) as varchar2(15)) as ls_rodzaj_tary_opis,
ls.ls_rodzaj_netto,
u_eks.p_wazenia.Masa_Przewozowa_Opis(ls.ls_rodzaj_netto) as ls_rodzaj_netto_opis,
-- Suma mas z wagonów powiązanych z listem
ls.ls_masa_tara,
ls.ls_masa_netto,
ls.ls_masa_brutto,
ls.ls_kontrola_kredytu,
-- Dodatkowe oświadczenie nadawcy
ls.ls_os_id,
os.os_symbol,
os.os_uzyty,
-- Nadawca
ub.ub_symbol,
-- Szablon nadawcy
ls.ls_ubz_id,
ubz.ubz_symbol,
-- Odbiorca
kn.kn_symbol,
-- Szablon odbiorcy
ls.ls_klz_id,
kz.klz_symbol,
-- Towar podstawowy
tw.tw_symbol,
-- Szablon towaru
ls.ls_tlz_id,
tz.tlz_symbol,
-- Dane faktury przewoźnika
lsps.lsps_faktura_numer,
lsps.lsps_faktura_pozycja,
lsps.lsps_faktura_kwota
from u_eks.t_listy ls
left outer join u_eks.t_listy_rodzaje lsr on
lsr.lsr_id = ls.ls_lsr_id
left outer join u_eks.t_przewoznicy pwz on
pwz.pwz_pwz_id = ls.ls_pwz_pwz_id and
ls.ls_data_nad between pwz.pwz_data_od and pwz.pwz_data_do
-- Odbiorca
left outer join u_eks.t_kontrahenci kn on
kn.kn_kn_id = ls.ls_kn_kn_id and
ls.ls_data_nad between kn.kn_data_od and kn.kn_data_do
-- Nadawca
left outer join u_adm.t_uzytkownicy_bocznicy ub on
ub.ub_ub_id = ls.ls_ub_ub_id and
ls.ls_data_nad between ub.ub_data_od and ub.ub_data_do
-- Towar podstawowy
left outer join u_eks.t_towary tw on
tw.tw_id = ls.ls_tw_id
left outer join u_eks.t_uzytkownicy_bocz_zestawy ubz on
ubz.ubz_id = ls.ls_ubz_id
left outer join u_eks.t_kontrahenci_lista_zestawow kz on
kz.klz_id = ls.ls_klz_id
left outer join u_eks.t_towary_lista_zestawow tz on
tz.tlz_id = ls.ls_tlz_id
left outer join u_eks.t_instr_wysylkowe iw on
iw.iw_id = ls.ls_iw_id
left outer join u_eks.t_oswiadczenia os on
os.os_id = ls.ls_os_id
-- Stacja nadania
left outer join u_eks.t_stacje stn on
stn.st_st_id = ls.ls_nad_st_st_id and
ls.ls_data_nad between stn.st_data_od and stn.st_data_do
-- Stacja przeznaczenia
left outer join u_eks.t_stacje stp on
stp.st_st_id = ls.ls_prz_st_st_id and
nvl(ls.ls_data_prz, ls.ls_data_nad) between stp.st_data_od and stp.st_data_do
join u_eks.t_listy_przesylki lsps on
lsps.lsps_id = ls.ls_przesylka_id
join u_eks.t_listy_nadania_dane_dodatkowe lsnd on
lsnd.lsnd_id = ls.ls_id;
and trigger looks like:
create or replace trigger u_eks.tg_iou_listy_nadania
instead of update on u_eks.v_listy
for each row
declare
v_rodzaj_netto u_eks.t_przewoznicy.pwz_netto_tara_belki%type;
v_ilosc_wagonow pls_integer;
v_masa_tara pls_integer;
v_masa_netto pls_integer;
-- Zmienne do obsługi zmiany rodzaju listu
v_tmp_lsps_id u_eks.t_listy.ls_przesylka_id%type;
v_tmp_lsps_rowid rowid;
begin
-- dla listu zmieniono przewoźnika lub datę nadania
if :new.ls_pwz_pwz_id :old.ls_pwz_pwz_id or :new.ls_data_nad :old.ls_data_nad then
-- Drugi próg kontroli - sprawdzamy czy po zmianie przewoźnika lub daty nadania zmienia się sposób
-- obliczania masy netto
v_rodzaj_netto := u_eks.p_wazenia.Masa_Przewozowa_Rodzaj(
u_eks.p_listy_wagony_edycja.Przewoznik_Masa_Wg_Belki(:new.ls_pwz_pwz_id, :new.ls_data_nad));
if :old.ls_rodzaj_netto v_rodzaj_netto then
-- jest różnica w sposobie ustalania masy - przeliczamy masy netto
u_eks.p_listy_wagony_edycja.Przelicz_Mase_Przew(
i_ls_id => :old.ls_id,
i_rodzaj_netto => v_rodzaj_netto);
end if;
end if;
-- Przeliczamy sumy mas
u_eks.p_listy_wagony_edycja.Sumy_Wagonow_Oblicz(i_ls_id => :old.ls_id, i_rodzaj_tary => :new.ls_rodzaj_tary,
o_ilosc_wagonow => v_ilosc_wagonow, o_masa_tara => v_masa_tara, o_masa_netto => v_masa_netto);
-- Dodanie wpisu tymczasowego, wykorzystywanego gdy jest zmiana rodzaju listu
if :old.ls_lsr_id :new.ls_lsr_id then
-- Tworzymy tymczasowy zapis dla przesyłki z ustawionym nowym rodzajem listu
u_eks.p_listy_utworz.Nowa_Przesylka(io_lsps_id => v_tmp_lsps_id, i_lsps_lsr_id => :new.ls_lsr_id,
o_lsps_rowid => v_tmp_lsps_rowid);
-- Usuwamy zapisy o szablonach towaru listu
u_eks.p_listy_edycja.Towary_Usun_Tmp(i_ls_id => :old.ls_id);
end if;
-- Zmiana danych listu w tabeli
update u_eks.t_listy ls set
ls_id = :old.ls_id,
ls_pwz_pwz_id = :new.ls_pwz_pwz_id,
ls_lsr_id = :new.ls_lsr_id,
ls.ls_przesylka_id = nvl(v_tmp_lsps_id, ls.ls_przesylka_id),
ls_zalacznik = :new.ls_zalacznik,
ls.ls_nad_st_st_id = :new.ls_nad_st_st_id,
ls_data_nad = :new.ls_data_nad,
ls.ls_prz_st_st_id = :new.ls_prz_st_st_id,
ls_numer_prz = :new.ls_numer_prz,
ls_data_prz = :new.ls_data_prz,
ls_tlz_id = :new.ls_tlz_id,
ls_tw_id = :new.ls_tw_id,
ls_klz_id = :new.ls_klz_id,
ls_kn_kn_id = :new.ls_kn_kn_id,
ls_ubz_id = :new.ls_ubz_id,
ls_ub_ub_id = :new.ls_ub_ub_id,
ls_iw_id = :new.ls_iw_id,
ls_os_id = :new.ls_os_id,
ls_kontrola_kredytu = :new.ls_kontrola_kredytu,
ls.ls_rodzaj_tary = :new.ls_rodzaj_tary,
ls.ls_rodzaj_netto = nvl(v_rodzaj_netto, ls.ls_rodzaj_netto),
ls.ls_masa_tara = v_masa_tara,
ls.ls_masa_netto = v_masa_netto,
ls.ls_uz_id = u_btk.p_uzytkownik_biezacy.Id,
ls.ls_czas_sporzadz = current_date
where ls.ls_id = :old.ls_id
-- Zablokowanie możliwości zmiany listu po wprowadzeniu numeru nadania.
-- dodatkowy warunek jest konieczny po wprowadzeniu możliwości wpisywania
-- danych faktury przewoźnika - w tym wypadku próba aktualizacji listu nadanego
-- skończy się zgłoszeniem wyjątku. Blokada może zostać usunięta, gdy do programu
-- zostanie wprowadzona ewidencja faktur z przypisywaniem pozycji do listów.
and ls.ls_numer_nad is null;
-- Ciąg dalszy obsługi zmiany rodzaju listu przewozowego
if :old.ls_lsr_id :new.ls_lsr_id then
-- Ustawiamy nowy rodzaj listu w tabeli przesyłek - list jest powiązany z przesyłką tymczasową.
update u_eks.t_listy_przesylki lsps set
lsps.lsps_lsr_id = :new.ls_lsr_id
where lsps.lsps_id = :old.ls_przesylka_id;
-- Przepisujemy powiązanie listu do wcześniejszej przesyłki
update u_eks.t_listy ls set
ls.ls_przesylka_id = :old.ls_przesylka_id
where ls.ls_id = :old.ls_id;
-- Usunięcie przesyłki tymczasowej
delete from u_eks.t_listy_przesylki lsps
where lsps.rowid = v_tmp_lsps_rowid;
end if;
-- Aktualizacja danych przesyłki
update u_eks.t_listy_przesylki set
lsps_faktura_numer = :new.lsps_faktura_numer,
lsps_faktura_pozycja = :new.lsps_faktura_pozycja,
lsps_faktura_kwota = :new.lsps_faktura_kwota
where lsps_id = :old.ls_przesylka_id;
-- Sprawdzamy ilość linii oświadczenia, gdy są jakieś zmiany w szablonach listu
if (nvl(:old.ls_iw_id, 0) :new.ls_iw_id) or (nvl(:old.ls_klz_id, 0) :new.ls_klz_id) or
(nvl(:old.ls_tlz_id, 0) :new.ls_tlz_id) or (nvl(:old.ls_os_id, 0) :new.ls_os_id) then
-- Sprawdzenie czy linie oświadczenia zmieszczą się w liście
u_eks.p_listy_edycja.Sprawdz_Rozmiar_Oswiadczenia(i_ls_id => :old.ls_id, i_ls_lsr_id => :new.ls_lsr_id);
end if;
end tg_iou_listy_nadania;
Problem occurs only when condition :old.ls_lsr_id :new.ls_lsr_id has value True.
Do you want all tables definitions used in the view?
regards
Adam Siwon
-
Challenger
- Devart Team
- Posts: 925
- Joined: Thu 17 Nov 2005 10:53