1

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;