1

Temat: [SQL] Funkcje

Witam,

Szukam rozwiązania, szperam w Manualu Postgresa, ale jakoś mi nie wychodzi. Próbuję stworzyć funkcję, pobierającą rekordy z bazy danych - to nie jest problemem. Problemem jest stworzenie "type". Normalnie definiuje pola, które ma zwracać, czyli np.

CREATE TYPE type_profile (profile_id integer, profile_name text) itd.

a później tworzę sobie do tego funkcję, np.

CREATE OR REPLACE function f_profile(profile_number integer) RETURNS SETOF type_profile AS $$ 
DECLARE 
    profile_number alias FOR $1; 
    result type_profile;
BEGIN     
    FOR result IN 
    SELECT * FROM tabela WHERE id = profile_number itd.
    LOOP
        RETURN NEXT result;
    END LOOP;
    RETURN;
END; 
$$ LANGUAGE 'plpgsql';

Teraz jednak nie wiem, ile pól (i jakie ma zwracać "type"), próbowałem coś w stylu:

CRETATE TYPE type_profile(*)

Ale to oczywiście nie działa. Nie bardzo wiem, jak się do tego zabrać. Chcę zrobić funkcję, zwracającą mi rekordy, na podstawie parametru, ale chyba poległem...

Any ideas? :-)

Pozdrawiam,
Rafał

2

Odp: [SQL] Funkcje

3

Odp: [SQL] Funkcje

Tak, wiem, że tak można, niestety to mnie nie ratuje, gdyż ilość kolumn w tabeli może zmieniać się dynamicznie. Dlatego zastanawiam się, czy da się jakoś napisać funkcję, która po wywołaniu zwróci wszystkie rekordy tabeli (lub kilku tabel, jeżeli w SELECT funkcji, zastosuje JOIN). Nie chcę (nie mogę) zastosować TYPE, bo nie wiem, co będzie zwracane.

Kombinuję na wszelkie sposoby, ale kompletnie nic mi nie działa.

Skonstruowałem sobie coś takiego, ale cały czas woła o kolumny (a column definition list is required for functions returning "record"):

CREATE OR REPLACE FUNCTION f_profile(profile_number integer) RETURNS SETOF RECORD AS $$ 
DECLARE 
    profile_number ALIAS FOR $1; 
    result RECORD;
BEGIN
    FOR result IN
    SELECT * FROM ho_profile AS p 
        LEFT JOIN ho_card AS c ON c.card_profile_id = p.profile_id 
    WHERE p.profile_id = profile_number LIMIT 1
    LOOP
        RETURN NEXT result;
    END LOOP;
RETURN;
END;
$$ LANGUAGE 'PLPgSQL';

Ostatnio edytowany przez Shavei (2012-02-15 15:31:53)

4

Odp: [SQL] Funkcje

5

Odp: [SQL] Funkcje

Dziękuje Ci za rady, pobawię się w każde zaproponowane przez Ciebie rozwiązanie i zobaczę, co z tego wyniknie :-)