Cześć wszystkim,
Mam problem z funkcją, która sprawdza kwotę kary pieniężnej za przetrzymaną książkę i wpisuje ją do odpowiedniej kolumny. Problem jest taki, że próbowałem na różne sposoby zmienić tą funkcję, a problem wyskakuje wciąż ten sam. Ostatnia aktualizacja błędu wraz z kodem funkcji poniżej:
KOD FUNKCJI:
CREATE OR REPLACE FUNCTION policz_pieniadze() RETURNS TRIGGER AS' DECLARE roznica_dat int4; data_zwrotu date; data_przewidywana date; BEGIN SELECT borrowed_books.date_due_for_return INTO data_przewidywana FROM borrowed_books WHERE book_borrowing_id = OLD.book_borrowing_id; data_zwrotu = NEW.date_returned; roznica_dat = data_zwrotu - data_przewidywana; IF roznica_dat > 0 THEN UPDATE borrowed_books SET amount_of_fine = roznica_dat * (SELECT value FROM rules WHERE rules_id = 1) WHERE borrowed_books.book_borrowing_id = OLD.book_borrowing_id; RETURN NEW; ELSE UPDATE borrowed_books SET amount_of_fine = 0 WHERE borrowed_books.book_borrowing_id = OLD.book_borrowing_id; RETURN NEW; END IF; END; 'LANGUAGE 'plpgsql';
Czy mi się wydaje czy w tym triggerze odpalasz zawsze zapytanie UPDATE na tej samej tabeli co skutkuje zapętleniem całości? Zamiast wykonywać zapytania UPDATE po prostu zmień wartość rekordu z NEW:
IF roznica_data > 0 THEN NEW.amount_of_fine := ...; ELSE NEW.amount_of_fine := 0; END IF; RETURN NEW;
Czyli jeśli w triggerze występuje Update to znowu "załącza się" ten sam trigger i tak w kółko? A więc tak działa rekurencja w PSQL Ok, w takim razie funkcja jest trochę odchudzona, lecz w tym problem że nie chce się zapisać kwota kary do tabeli (Nie wiem jak, ale sposób NEW.amount_of_fine = ... nie działa). Może mi ktoś wytłumaczyć jak to zrobić? Próbowałem rzutować, kombinować ze zmiennymi roznica_dat i (SELECT value ...) ale raczej nie tutaj jest problem.
FUNKCJA PO ODCHUDZENIU:
CREATE OR REPLACE FUNCTION policz_pieniadze() RETURNS TRIGGER AS' DECLARE roznica_dat int; BEGIN roznica_dat = NEW.date_returned - OLD.date_due_for_return; IF roznica_dat > 0 THEN NEW.amount_of_fine = roznica_dat * (SELECT value FROM rules WHERE rules_id = 1); ELSE NEW.amount_of_fine = 0; END IF; RETURN NEW; END; 'LANGUAGE 'plpgsql';
= to operator porównania, := to operator przypisania.
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)