Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Plpgsql - Pytanie z funkcją i wyzwalaczem Plpgsql

blade2093 12 Maj 2013 18:08 1686 7
  • #1 12 Maj 2013 18:08
    blade2093
    Poziom 2  

    Otóż mam problem, musze napisać funkcję i wyzywalacz, która powoli mi na zmianę wartości w tabeli i dopisze nowe do innych. Mam takowy model wypożyczalni płyt.
    Mam takie tabele zrobione: plyta (numer serial, nazwa varchar,cena varchar), wypozyczenie(kto_wypozyczyl, co_wypozyczyl, data wypozyczenia), klient(id serial, nr dowodu, imie, nazwisko). Opruję głownie na primary_key tych tabel.

    Napisałem taki skrypt funkcji

    Cytat:

    CREATE OR REPLACE FUNCTION zmianaceny() RETURNS TRIGGER LANGUAGE plpgsql AS ' BEGIN SELECT ((SELECT NEW.cena FROM plyta)-(SELECT OLD.cena FROM plyta)) INTO doplata FROM wypozyczenie,plyta WHERE wypozyczenie.co_wypozyczyl=plyta.numer AND wypozyczenie.kto_wypozyczyl=$1; RETURN NULL; END;';


    Oraz Trigger
    Cytat:
    CREATE TRIGGER doplata AFTER UPDATE ON plyta FOR EACH ROW EXECUTE PROCEDURE zmianaceny();


    Mój plan był taki, żeby po zaktualizowaniu ceny plyty jakiejś, odpali się triger, który uruchomi funkcję wyliczającą różnicę między cenami starą, a nową i wstawi ją do kolumny doplat w tabeli wypozyczeń.

    Funkcję i triger stworzyło, ale przy próbie zaktualizowania wartości płyty dostaję komunikat, że "NEW nie jest jeszcze zadeklarowane struktura rekordu "new" nie jest jeszcze znana
    SZCZEGÓŁY: Struktura jest nieokreślona dla niezainicjowanego rekordu abstrakcyjnego."

    Proszę o poradę.

    0 7
  • #3 12 Maj 2013 19:36
    blade2093
    Poziom 2  

    Ale jak to zrobić? Bo kiedy chce zrobić funkcję z argumentami (funkcja(float,int) np.), to mi pisze, że funkcja podlączona do triggera nie może zawierać czegoś tam.

    0
  • #5 12 Maj 2013 21:19
    blade2093
    Poziom 2  

    Gdybym wiedział, że tak nożna. Na uczelni nam zs dużo nie pokazali, wiec jestem trochę zielony. Tyle mi się udało napisać dzięki jakimś poradnikom. A w którym miejscu wtedy wstawić tą funkcję do trigera?

    0
  • #7 15 Maj 2013 13:22
    blade2093
    Poziom 2  

    Otóż coś pokombinowałem i teraz normalnie tworzy funkcję, przy aktualizowaniu ceny nie wyświetla się żaden błąd, ale funkcja nie dodaje do rubryki doplata żadnej wartości. Co robię źle?

    Cytat:
    CREATE OR REPLACE FUNCTION zmianaceny() RETURNS TRIGGER LANGUAGE plpgsql AS 'DECLARE doplata float; BEGIN SELECT NEW.cena-OLD.cena INTO doplata FROM wypozyczenie,plyta WHERE plyta.numer=wypozyczenie.co_wypozyczyl AND plyta.numer=numer; RETURN NULL;END;';


    Próbowałem także w funkcję wcisnąć update, ale wyświetla się bląd "brak klauzuli FROM plyta"
    Cytat:
    CREATE OR REPLACE FUNCTION zmianaceny() RETURNS TRIGGER LANGUAGE plpgsql AS ' BEGIN UPDATE wypozyczenie SET doplata = NEW.cena-OLD.cena WHERE wypozyczenie.co_wypozyczyl=plyta.numer AND plyta.numer =NEW.numer; RETURN NULL;END;';

    0