Blad przy tworzeniu postgresql funcji.

0

Witam,

Musze napisac funkcje, ktora bedzie wywolywana przez trigger.

CREATE OR REPLACE FUNCTION deal_update() RETURNS trigger AS
            $$
            BEGIN


            SELECT id, lower(time_range), upper(time_range)
            FROM deal
            WHERE (lower(time_range) IS NULL OR upper(time_range) IS NULL )
              AND id = OLD.id;
                IF FOUND THEN
                    RAISE EXCEPTION 'test';
                END IF;

                UPDATE deal
                   SET time_range = tstzrange(lower(time_range), current_timestamp)
                 WHERE  id = OLD.id;

                RETURN NULL;

            END;
            $$
                LANGUAGE plpgsql;

Powyzsza funkcja rzuca blad:

[42601] ERROR: query has no destination for result data Hint: If you want to discard the results of a SELECT, use PERFORM instead. Where: PL/pgSQL function deal_update() line 5 at SQL statement

2

Nie może zwracać NULL. Musi zwracać NEW lub OLD.
Poza tym nie sprawdzasz, czy jest to trigger na DELETE lub UPDATE - dopiero wtedy ma OLD.

EDIT: Poza tym error wyrażnie ci mówi, co jest nie tak. SELECT zwraca coś, a w triggerze za bardzo nie ma gdzie... Zwłaszcza, że wyniku nie zapisujesz do zmiennej. Zamień
SELECT id, lower(time_range), upper(time_range) FROM deal
na
PERFORM id, lower(time_range), upper(time_range) FROM deal
a powinno być OK

0

PERFORM dziala i fakt zapomnialem o into to jakos przypisywalo sie chyba do zmiennej. Wyrzuca mi teraz blad do RAISE EXCEPTION 'test'; Czy jest to tez niepoprawna skladnia?

edit

Zawsze moge uzyc NOT FOUND i wywolac tego UPDATEa w srodu ifa.

0

@Marcin.Miga: Jak zwykle ratujesz dupsko. I dzieki za wytkniece bledow. Wrocilem do dokumentacji, bo sie okazuje, ze juz dawno triggerow/funcji nie pisalem. I fakt zapomnialem kiedy stodowac BEFORE/AFTER oraz OLD/NEW.

Ostatecznie konczy sie kod na takim czyms:

CREATE OR REPLACE FUNCTION update() RETURNS trigger AS
$$
BEGIN
    IF (TG_OP = 'UPDATE')
    THEN
        IF LOWER(OLD.valid_range) IS NOT NULL AND UPPER(OLD.valid_range) IS NULL
        THEN
            NEW.valid_range = TSTZRANGE(LOWER(OLD.valid_range), CURRENT_TIMESTAMP);
        END IF;
    END IF;

    RETURN NEW;

END;
$$
    LANGUAGE plpgsql;


CREATE TRIGGER update_trigger
    BEFORE UPDATE ON db_table
    FOR EACH ROW EXECUTE PROCEDURE update();

Mam nadzieje, ze nie widzisz nic podejrzanego?

1 użytkowników online, w tym zalogowanych: 0, gości: 1