<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - zmiana funkcji]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=538&amp;type=atom"/>
	<updated>2011-02-01T17:49:12Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=538</id>
		<entry>
			<title type="html"><![CDATA[zmiana funkcji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2380#p2380"/>
			<content type="html"><![CDATA[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;]]></content>
			<author>
				<name><![CDATA[adamleon]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=873</uri>
			</author>
			<updated>2011-02-01T17:49:12Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2380#p2380</id>
		</entry>
</feed>
