Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Funkcja kasująca dane
czachor
post 22.01.2005, 14:48:29
Post #1





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Witam!
Zaczynam działać z postgresem i natrafiłem na pewien problem...

Mam utworzoną tabelę:
  1. CREATE TABLE "users" (
  2. "ip" inet NOT NULL,
  3. "timer" timestamp without time zone NOT NULL
  4. ) WITH OIDS;


Chciałbym, żeby przy wykonywaniu INSERT'ów automatycznie kasowane były wpisy starsze niż 1 dzień... Tu mam problem...

Tworzę do tego procedurę:
  1. CREATE TRIGGER delete_users BEFORE INSERT ON users FOR EACH ROW EXECUTE PROCEDURE del_older();

I funkcja del_older:
Kod
    BEGIN
         DELETE FROM users WHERE timer < '1 day'::interval;
    END;
(Zapytanie SQL jest dobre)

Niestety przy wstawianiu danych do tabeli 'users' otrzymuję błąd:
Cytat
ERROR:  control reached end of trigger procedure without RETURN
CONTEXT:  PL/pgSQL function "del_older"

Próbowałem wstawić return wzorując się na manualu postgresa, jak i stworzyć na jego podstawie prawidłową funkcję, ale nic mi nie wychodzi sad.gif

Będę wdzięczny za pomoc...


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
Go to the top of the page
+Quote Post
Jabol
post 22.01.2005, 16:46:46
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


po pierwsze, po co 'for each row'. Nie znam się na triggerach, ale tutaj masz dokładnie o count() - 1 razy za często wykonywaną operację.
a co do zapytania. Wydaje mi się, że Twoja funkcja powinna coś zwracać (cokolwiek, poczytaj w dokumentacji triggerów co mają zwracać).
Go to the top of the page
+Quote Post
czachor
post 22.01.2005, 21:24:46
Post #3





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


No fakt, 'for each row' raczej niepotrzebne. Dzięki.

Kombinuję z tym returnem, ciężko mi to idzie, póki co udało mi się zrobić to na regułach (rules):
  1. CREATE RULE del_old AS ON INSERT TO users DO DELETE
  2. FROM users WHERE (users.timer < (now() - '1 day'::interval));

Jeżeli ktoś będzie wiedział, jak zrobić sprawę na triggerach, będę wdzięczny.

--UPDATE
I po problemie...
Poprawna funkcja del_older():
Kod
CREATE OR REPLACE FUNCTION del_older() RETURNS trigger AS '
    BEGIN
        DELETE FROM "users" WHERE ("timer" < (NOW() - \'1 day\'::interval));
        RETURN NULL;
   END;
' LANGUAGE plpgsql;


Ten post edytował czachor 22.01.2005, 21:51:48


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2024 - 14:46