2012-04-04 1 views

Odpowiedz

18
IF 2 <> 0 THEN select * from users; END IF; 

Nie można używać instrukcji PL/pgSQL poza funkcjami plpgsql. A jeśli ten fragment pochodzi z funkcji plpgsql, to też jest nonsensem. Nie można bezpośrednio zwrócić wyniku zapytania, tak jak robi to T-SQL.

CREATE OR REPLACE FUNCTION test(p int) 
RETURNS SETOF users AS $$ 
BEGIN 
    IF p = 1 THEN 
    RETURN QUERY SELECT * FROM users; 
    END IF; 
    RETURN; 
END; 
$$ LANGUAGE plpgsql; 

Kiedy dostaniemy jakiś wynik z funkcji, trzeba użyć instrukcji RETURN - plpgsql zna tylko funkcję, to nie obsługuje procedury - tak nieograniczona SELECT nie ma sensu.

+0

Oh, dziękuję za odpowiedź. Nie, właśnie szukałem, jak zrobić "lub wybrać", w zależności od stanu w "IF". Tak więc znalazłem, że nie ma sposobu, aby zrobić to w prosty sposób, jak to IF (SELECT ...) = 2 THEN SELECT ... ELSE SELECT ... END IF; – Elkan

+0

Właściwie IF (wybierz a z t) = 2 THEN NULL; END IF; będzie działać, problem polega prawdopodobnie na tym, że próbujesz wybrać coś w kontekście, który niczego nie zwraca. W tym przypadku Pavel był doskonałym przykładem. Możesz użyć wyrażenia "RETURN QUERY", biorąc pod uwagę, że prawidłowo zdefiniowałeś swoją funkcję. – valgog

4

Nie obejmuje się strukturą kontrolną PL/pgSQL w funkcji anonymous block lub PL/pgSQL.

Dla wersji SQL tej struktury kontrolnej zobacz dokumentację dla CASE.

+0

Hm ... wielkie dzięki) – Elkan

+0

CASE nie może być używane na najwyższym poziomie, jednak tylko jako część zapytania SQL. Innymi słowy, nie można go użyć do kierowania zachowaniem, które nie jest już częścią innego zapytania, i tego właśnie wydawało się pierwotne pytanie. – BlueBomber

0

Nie zamykasz tego PL/pgSQL. Muszą być dołączone do anonymous code block. Przykład twojego kodu:

DO $$ BEGIN 

    IF 2 <> 0 THEN select * from users; END IF; 

END$$;