1

Temat: Trigger update'ujacy pole typu DATE

Witam wszystkich serdecznie.
W myśl: "Żadne pytanie nie jest zbyt proste dla tego działu." proszę o pomoc w poniższym problemie:
Chciałbym stworzyć wyzwalacz, który po spełnieniu pewnego warunku zaktualizuje wiersz wstawiając nową datę.

Mam następująca tabelę POZYCZKI:

 Column                 |     Type         |                               Modifiers                              
-----------------------+----------------+---------------------------------------------------------------------
 id_pozyczki            | integer          | not null PRIMARY KEY
 id_kontrahent         | integer          | not null
 data_pozyczki        | date              | not null
 ilosc_pozyczki        | numeric(6,2)   | not null
 splata_pozyczki      | numeric(6,2)  | default 0
 kierunek_pozyczki  | character(1)   | 
 data_splaty             | date              | 

wypełniam ją insertem:

insert into pozyczki (id_kontrahent, data_pozyczki, ilosc_pozyczki, kierunek_pozyczki) values (1, 2009-06-10, 400, 1);

następnie robie update:

update pozyczki set splata_pozczyki = 400 where id_pozyczki = 1;

Chciałbym, żeby po każdym update'cie było sprawdzanie czy pola ilosc_pozyczki i splata_pozyczki są równe i jeśli tak to automatycznie wypełnia się pole data_splaty aktualną datą.
poniżej wkleje moje "próby":

-- trigger uruchamiajacy  funkcje...
create trigger trig_splata 
after update on kasa_pozyczki
for each row 
execute procedure splata_trigger();
-- funkcja..
create function splata_trigger() returns opaque AS' 
declare
--  aktualna_data date:= current_date;
BEGIN 
 if(old.ilosc_pozyczki = new.splata_pozyczki ) then
  --  NEW.data_splaty = now();
   update kasa_pozyczki set data_splaty = (select current_date);-- WHERE splata_pozyczki = NEW.splata_pozyczki;
  return NEW;
 else
  return NULL;
 end if;
 
END;
' language 'plpgsql';

I niestety to nie działa hmm pl/pgsql dopiero zaczynam proszę o wyrozumiałość;)
Bardzo proszę o pomoc. Z góry dziękuję

2

Odp: Trigger update'ujacy pole typu DATE

Co znaczy nie działa? Jakiś komunikat błędu czy robi nie to co trzeba?

3

Odp: Trigger update'ujacy pole typu DATE

Sorki, że nie napisałem, a więc tak:
- jeśli robię update mniejszy niż ilosc_pozyczki to jest ok wiersz jest updateowany
- jeśli robię update równy ilosc_pozyczki taki jak ten:

UPDATE pozyczki SET splata_pozyczki = 400 where id_pozyczki = 1;

to zaczyna chwilowo mulić i wyrzuca sporo takich samych komunikatów jak ten:

wyrażenie SQL "update pozyczki set data_splaty = (select current_date)"
PL/pgSQL function "splata_trigger" line 7 at SQL statement

Ostatnio edytowany przez krzysko (2009-06-11 14:44:15)

4

Odp: Trigger update'ujacy pole typu DATE

Wydaje mi sie ze sie zapetla. Jak zrobisz update rowny ilosc_pozyczki to trigger robi znowu update, ktory znowu uruchamia trigger  a w nim warunek

old.ilosc_pozyczki = new.splata_pozyczki

jest spelniony i tak w kolko - petla.
Czy sie mylę?

5

Odp: Trigger update'ujacy pole typu DATE

Słuszna uwaga smile a czy masz jakis pomysł jak to rozwiązać?

6

Odp: Trigger update'ujacy pole typu DATE

Mógłbyś dodać do warunku w if'ie sprawdzenie czy

old.ilosc_pozyczki <> old.splata_pozyczki

(tylko nie pamiętam czy operator 'różne od' to <> czy != smile.)
To powinno zadziałać. Chyba że nie zrozumiałem do końca logiki działania tego triggera.

7

Odp: Trigger update'ujacy pole typu DATE

Ok. Sprawdzę to i dam znać co z tego wyszło:)

8

Odp: Trigger update'ujacy pole typu DATE

Sorki, że tak długo nie napisałem.
Podane wyżej rozwiązanie DZIAŁA. smile:)

Bardzo dziękuję za pomoc.

całość funkcji wygląda teraz tak:

create function splata_trigger() returns opaque AS' 
declare
BEGIN 
 if(old.ilosc_pozyczki = new.splata_pozyczki ) and (old.ilosc_pozyczki != old.splata_pozyczki) then
   update pozyczki set data_splaty = (select current_date) WHERE splata_pozyczki = NEW.splata_pozyczki;
  return NEW;
 else
  return NULL;
 end if;
 
END;
' language 'plpgsql';

Aha Postgres przy 'kompilacji' zmienia typ zwracany przez tą funkcję z opaque na trigger co nie jest żadnym problemem;)

Zastanawiam się czy lepiej nie napisać funkcji do update'u, która przy okazji sprawdzałaby ten warunek spłaty i działaby zamiast tego triggera:)
POZDRAWIAM i jeszcze raz DZIĘKI!

9

Odp: Trigger update'ujacy pole typu DATE

Wydajnościowo pewnie szybciej bedzie wołać beposrednio update'a.
Co do trybu opaque to zostal zastąpiony typem trigger.

pz