1

Temat: Funkcja która jako argument dostaje "listę"

select * from kto_dostarcza( ('jabłko', 'banan', 'mango'));

2

Odp: Funkcja która jako argument dostaje "listę"

Ostatnio edytowany przez c_michal (2013-11-08 15:08:31)

3

Odp: Funkcja która jako argument dostaje "listę"

Zamiast "owoc in ( select unnest)" można użyć owoc = any($1)

--
The best thing about modern society is how easy it is to avoid contact with it.

4

Odp: Funkcja która jako argument dostaje "listę"

OK, działa.
I dlatego właśnie lubię to forum :-)

5

Odp: Funkcja która jako argument dostaje "listę"

Teraz mam dłuższą chwilę, więc mogę przejrzeć dokładniej.

Po pierwsze - Nigdy nie nazywaj zmiennych tak jak nazwy kolumn/tabel (owoc to zmienna czy kolumna?!)
Po drugie - zamiast podawać jako argument arraya (oczywiście można), można też użyć variadiców:

create function kto_dostarcza( VARIADIC p_owoce text[] )
    returns table (owoc text, dostawca text) as
$$
select owoc, dostawca from owocowy_rynek where owoc = any(p_owoce);
$$
language sql;

Dzięki czemu wywołanie funkcji będzie prostsze:

$ select * from kto_dostarcza( 'pomarancze', 'banany');
    owoc    | dostawca 
------------+----------
 pomarancze | a
 banany     | b
 banany     | c
(3 rows)
--
The best thing about modern society is how easy it is to avoid contact with it.

6

Odp: Funkcja która jako argument dostaje "listę"

Variadic-om się kiedyś przyjrzę.
Czemu: "Nigdy nie nazywaj zmiennych tak jak nazwy kolumn/tabel" ???

7

Odp: Funkcja która jako argument dostaje "listę"

Zastanów się jak postgres ma zrozumieć zapytanie:

select * from tabelka where owoc = any( owoc );

gdzie owoc to zarówno nazwa kolumny jak i zmiennej.

--
The best thing about modern society is how easy it is to avoid contact with it.

8

Odp: Funkcja która jako argument dostaje "listę"

Pewnie wypisze odpowiedni komunikat.

A tak :

select * from tabelka where tabelka.owoc = any( owoc );

:-P

9

Odp: Funkcja która jako argument dostaje "listę"

Pewnie, że można. Ale po co? Zdecydowanie lepiej jest używać unikatowych nazw. Ja osobiście zazwyczaj używam prefiksu "p_" do parametrów, i v_ do zmiennych (w plpgsql'u, bo w sqlu nie ma zmiennych).

--
The best thing about modern society is how easy it is to avoid contact with it.