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.

MySQL - prosta funkcja z wyzwalczem

magnezmagnez 28 Kwi 2013 14:35 1683 9
  • #1 28 Kwi 2013 14:35
    magnezmagnez
    Poziom 6  

    Witam, mam do napisania funkcje w psql: "Stworz funkcje i wyzwalacz (TRIGGER), ktora przy probie wypozyczenia plyty nie pozwoli wypozyczyc nowej plyty uzytkownikowi, ktory przetrzymal jakas plyte dluizej niz 4 miesiace."

    Mam stworzona baze, ktora zawiera m.in. nastepujace tabele:

    Kod: sql
    Zaloguj się, aby zobaczyć kod

    moja niedzialajaca funkcja i wyzwalacz:

    Kod: sql
    Zaloguj się, aby zobaczyć kod


    funkcja zostaje przyjeta, ale kiedy probuje dodac jakies wypozyczenie to wyskakuje blad, ze kolumna kto_wypozyczyl nie istnieje (chociaz istnieje) oraz
    ZAPYTANIE: SELECT kto_wypozyczyl
    KONTEKST: PL/pgSQL function "czy_wypozyczyc" line 3 at przypisanie

    Szukam tez jakies funkcji ktora porowna mi dokladnie 4 miesiace co do sekundy czylio np dla wypozyczenia 06-01-2013 12:34:56 cztery miesiace powinny mijac 06-05-2013 12:34:56 ale to juz mniejszy problem.
    Z gory wielkie dzieki za jakies wskazowki.
    Pozdrawiam

    0 9
  • #2 28 Kwi 2013 16:15
    Dżyszla
    Poziom 42  

    Przede wszystkim zapoznaj się z kursorami:
    http://dev.mysql.com/doc/refman/5.0/en/cursors.html - dzięki temu będziesz mógł analizować wiele rekordów. Bo rozumiem, że chcesz w ramach dodania jednego rekordu sprawdzić, czy nie istnieje jakikolwiek dla użytkownika...
    Ponadto - trigger nie przejmuje parametrów, ale funkcja w nim zawarta już może. Pamiętaj, że masz dostęp do wstawianego rekordu (poprzez zmienne NEW i/lub OLD - http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html)

    0
  • #3 28 Kwi 2013 17:44
    magnezmagnez
    Poziom 6  

    Dżyszla napisał:

    Ponadto - trigger nie przejmuje parametrów, ale funkcja w nim zawarta już może. Pamiętaj, że masz dostęp do wstawianego rekordu (poprzez zmienne NEW i/lub OLD - http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html)


    u mnie wyskakuje blad ze funkcje wyzwalaczy nie moga przyjmowac zadnych argumentow

    0
  • #5 28 Kwi 2013 18:10
    magnezmagnez
    Poziom 6  

    Dżyszla napisał:
    Możesz pokazać kod, przy którym wyskakuje taki błąd oraz jego treść?


    funkcja:
    CREATE FUNCTION czy_wypozyczyc(int) RETURNS TRIGGER
    LANGUAGE plpgsql
    AS
    '
    DECLARE roznica int;
    BEGIN
    if (DATEDIFF((SELECT data_wypozyczenia FROM wypozyczenie where kto_wypozyczyl=$1), (NOW()))>120) then
    RAISE NOTICE ''Brak mozliwosci wypozyczenia'';
    RETURN NULL;
    end if;
    if (DATEDIFF((SELECT data_wypozyczenia FROM wypozyczenie where kto_wypozyczyl=$1), (NOW()))<=120)then
    RAISE NOTICE ''Wypozyczenie mozliwe'';
    RETURN NEW;
    end if;
    END;
    ';

    trigger:
    CREATE TRIGGER trigg_czy_wyp BEFORE INSERT ON wypozyczenie FOR EACH ROW EXECUTE PROCEDURE czy_wypozyczyc(kto_wypozyczyl);

    tresc bledu:
    "Funkcje wyzwalaczy nie moga przyjmowac zadnych argumnetow"

    0
  • #6 28 Kwi 2013 20:36
    Dżyszla
    Poziom 42  

    Niestety na swoim serwerze mam 5.0, a tam trzeba było mieć uprawnienia SUPER, z kolei na testowej bazie phpMyAdmin coś nie działa dodawanie procedur :/

    A spróbuj tylko zamiast EXECUTE PROCEDURE użyć CALL... W sumie poza brakiem uprawnień, to mój serwer nie zwrócił żadnego błędu (a ewentualne błedy w ciele są wyswietlane przed sprawdzeniem uprawnień.

    0
  • #7 28 Kwi 2013 22:22
    magnezmagnez
    Poziom 6  

    Dżyszla napisał:
    Niestety na swoim serwerze mam 5.0, a tam trzeba było mieć uprawnienia SUPER, z kolei na testowej bazie phpMyAdmin coś nie działa dodawanie procedur :/

    A spróbuj tylko zamiast EXECUTE PROCEDURE użyć CALL... W sumie poza brakiem uprawnień, to mój serwer nie zwrócił żadnego błędu (a ewentualne błędy w ciele są wyświetlane przed sprawdzeniem uprawnień.


    A co jest złego w tej poprzedniej wersji bez przesyłania do funkcji argumentów?

    0
  • #8 28 Kwi 2013 22:29
    Dżyszla
    Poziom 42  

    Używasz w niej nazwy kto_wypozyczyl, która nie jest ani zmienną, ani... w zasadzie w ogóle nie wiadomo, czym jest. Funkcje nigdy nie są związane z jakimś rekordem, więc nie mogą się odwoływać w taki sposób. Jeśli chciałeś wykorzystać funkcję w kontekście rekordu, to przekaż jako parametr jego identyfikator lub poszczególne wartości, których potrzebujesz.

    BTW - jaki jest powód użycia LANGUAGE plpgsql ? Nie prościej i czytelniej zapisać to bardziej natywnie?

    0
  • #9 29 Kwi 2013 07:30
    magnezmagnez
    Poziom 6  

    Dżyszla napisał:
    Jeśli chciałeś wykorzystać funkcję w kontekście rekordu, to przekaż jako parametr jego identyfikator lub poszczególne wartości, których potrzebujesz.


    Przeciez nie da sie u mnie przekazywac parametrow. Musi byc jakis sposob zeby to zrobic bez nich, poniewaz to jest tyko moje "zadanie domowe" :p

    Dżyszla napisał:

    BTW - jaki jest powód użycia LANGUAGE plpgsql ? Nie prościej i czytelniej zapisać to bardziej natywnie?


    Korzystam z gotowych szablonow, na razie jest to moja pierwsza funkcja ktora pisze :)

    0
  • #10 29 Kwi 2013 18:39
    Dżyszla
    Poziom 42  

    Spróbuj natywnych rozwiązań :) Wtedy podczas "kompilacji" serwer będzie w stanie sprawdzić z pewnością znacznie więcej ze składni funkcji.

    Przejrzałem podręcznik użytkownika, ale nic nie znalazłem o tym, aby nie można było stosować funkcji posiadających parametry w ciele funkcji lub triggera. Strasznie mi się to dziwne wydaje i się zastanawiam, czy przypadkiem komunikat (tym bardziej, że po polsku) nie jest jaką pomyłką i chodzi o coś innego...

    0