Temat: zmiana funkcji
Witam
Mam funkcje która działa i jest wywoływana z programu. Jeżeli zmieni się ilosc_zamowiona to ma się wykoanć funkcja. Chciałbym ją przerobić na funkcję triggera FOR EACH ROW na after update pole ilosc_zamowiona tabeli tab_zamowienia_szczegoly_oferty.
Do funkcji podaje parametry z programu, a mogę je pobrać z bazy tylko właśnie do końca nie wiem jak.
Tylko old.ilosc_zamowiona będzie old reszta to po prostu pole, bez old ani new dla bieżącego wiersza.
zmdata jest stała dla całej funkcji w trakcie wykonywania.
Nie wiem czy jasno się wyraziłem.
Czy można to tak wykombinować?
AdamP.
CREATE OR REPLACE FUNCTION "fzmiana_ilosci_zamowienia" (
"zm_potr_sklad_id" integer,
"zm_data_na_kiedy_zamowienie" date,
"zm_old_ilosc_zamowiona" integer,
"zm_nr_kol_tab_glownej" integer
)
RETURNS boolean AS
$body$
declare
dane tab_potrawy_sklad_szczegoly%ROWTYPE;
begin
IF (select pobrana_do_zakupow FROM tab_zamowienia_szczegoly_oferty where nr_kolejny = zm_nr_kol_tab_glownej) = TRUE THEN
for dane in SELECT * FROM tab_potrawy_sklad_szczegoly where nr_skladu_potrawy = zm_potr_sklad_id
loop
UPDATE tab_potrawy_do_zakupu SET ilosc_zamowiona =
ilosc_zamowiona - (dane.ilosc_skladnika * zm_old_ilosc_zamowiona) where id_skladnika = dane.id_skladnika and
data_na_kiedy_zamowienie = cast(zm_data_na_kiedy_zamowienie as date) and zrealizowano_zakup = FALSE;
end loop;
UPDATE tab_zamowienia_szczegoly_oferty SET pobrana_do_zakupow = False where nr_kolejny = zm_nr_kol_tab_glownej;
return TRUE;
ELSE
return false;
end if;
end;
Moja propozycja
CREATE OR REPLACE FUNCTION "fzmiana_ilosci_zamowienia" ()
RETURNS trigger AS
$body$
declare
dane tab_potrawy_sklad_szczegoly%ROWTYPE;
zmdata date;
begin
IF (select pobrana_do_zakupow FROM tab_zamowienia_szczegoly_oferty where nr_kolejny = nr_kolejny_z_biezacej_tabeli) = TRUE THEN
select data into zmdata from tabela where nr_zamowienia=nr_zamowienia_z_biezacej_tabeli;
for dane in SELECT * FROM tab_potrawy_sklad_szczegoly where nr_skladu_potrawy = nr_skladu_z_biezacej_tabeli
loop
UPDATE tab_potrawy_do_zakupu SET ilosc_zamowiona =
ilosc_zamowiona - (dane.ilosc_skladnika * old.ilosc_zamowiona) where id_skladnika = dane.id_skladnika and
data_na_kiedy_zamowienie = cast(zmdata as date) and zrealizowano_zakup = FALSE;
end loop;
UPDATE tab_zamowienia_szczegoly_oferty SET pobrana_do_zakupow = False where nr_kolejny = nr_kolejny_z_biezacej_tabeli;
end if;
end;