konto usunięte

Temat: Postgresql - PL/SQL pytanie o parametr

Witam,

chciałbym aby przy pomocy jednego z parametrów funkcji wbudowanej przekazać do warunków zapytania wyrażenie (x,s,v,h,y) gdzie te litery to liczby całkowite.
Chodzi o np coś takiego:

moja_funkcja(text,text, XXXXX ) --tu własnie te XXXX oznacza to o co pytam :)
a w treści funkcji w jednym z miejsc jest
SELECT ...
FROM ...
WHERE
liczba in (XXXXX)

Mam nadzieje, że moje pytanie jest zrozumiałe :)
Ma ktoś jakiś pomysł ? nie za bardzo wiem jak to sformuować zeby zapytać Google myślałem o jakimś typie tablicowym albo coś.. ale nie wiem. Czy w ogóle da się tak zrobić?
Piotr Kalański

Piotr Kalański Big Data Engineer
Team Leader, CDMP,
CBIP

Temat: Postgresql - PL/SQL pytanie o parametr

Też kiedyś miałem podobny problem, ale w Oracle. W Oracle (w PostgreSQL też) nie ma wsparcia dla varargs. Co prawda istnieją procedury, które wyglądają tak jakby przyjmowały zmienną liczbę parametrów, ale to za sprawą przeciążania, tutaj jest dyskusja na ten temat: http://database.itags.org/oracle/278490/.

Przychodzi mi do głowy mało eleganckie rozwiązanie wykorzystujące Dynamic SQL. Parametr przekazany do funkcji byłby po prostu napisem.

http://www.postgresql.org/docs/8.4/interactive/ecpg-dy...
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Postgresql - PL/SQL pytanie o parametr

W Oracle można skorzystać z kursora - na szybko znalazłem coś takiego:

http://www.oracle.com/technology/sample_code/tech/pl_s...

konto usunięte

Temat: Postgresql - PL/SQL pytanie o parametr

Jeśli chodzi o PostgreSQL to wydaje mi się, że można tutaj skorzystać z typu tablicowego.

Prosty przykład.


CREATE FUNCTION test(integer[]) RETURNS integer AS 'select array_length($1, 1);' LANGUAGE SQL;

select test(ARRAY[1,2,3]);

>> 3


Analogicznie można skorzystać z typu tablicowego w klauzli WHERE z operatorem IN.Paweł Piotr Przeradowski edytował(a) ten post dnia 17.09.10 o godzinie 20:25

konto usunięte

Temat: Postgresql - PL/SQL pytanie o parametr

To rozwiązanie z typem tablicowym byłoby ok ale to postgres 8.1 i nie ma operatora @> :( trzeba by funkcje samemu napisać.. bo z operatorem IN to chyba nie działa..Wojtek Stępień edytował(a) ten post dnia 17.09.10 o godzinie 22:30

konto usunięte

Temat: Postgresql - PL/SQL pytanie o parametr

Można wykorzystać ANY/SOME/ALL: http://www.postgresql.org/docs/8.1/interactive/functio...

konto usunięte

Temat: Postgresql - PL/SQL pytanie o parametr

Wielkie dzięki :)

konto usunięte

Temat: Postgresql - PL/SQL pytanie o parametr

1. Wystarczy dopilnować, żeby typ w tablicy był taki sam jak typ kolumny i any działa doskonale. Idzie po indeksie, działa o wiele szybciej niż in. No przynajmniej na 8.1 - potem operator in mocno podrasowali...

2. Jeżeli by się nie dało. Da się po tablicy przeiterować - stworzyć zapytanie, potem je wykonać. Mało to "esquelowe", ale można.

3. Co do zmiennej liczby parametrów - afair - idzie zrobić ale w C.

konto usunięte

Temat: Postgresql - PL/SQL pytanie o parametr

ANY działa właśnie tak jak tego oczekuje więc jest OK
Jakub Fila

Jakub Fila Inżynieria / finanse
/ zarządzanie

Temat: Postgresql - PL/SQL pytanie o parametr

Michał Z.:
1. Wystarczy dopilnować, żeby typ w tablicy był taki sam jak typ kolumny i any działa doskonale. Idzie po indeksie, działa o wiele szybciej niż in. No przynajmniej na 8.1 - potem operator in mocno podrasowali...

2. Jeżeli by się nie dało. Da się po tablicy przeiterować - stworzyć zapytanie, potem je wykonać. Mało to "esquelowe", ale można.

3. Co do zmiennej liczby parametrów - afair - idzie zrobić ale w C.

Ale pisanie w C funkcji z otwartą lista argumentów też jest średnio eleganckie - po pierwsze argumenty są przyjmowane jako char* i trzeba dokonywać ich konwersji, po drugie parsowana jest tablica argumentów. Narzut jest niestety spory.

Wg mnie najbardziej optymalne jest, choć może z punktu widzenia użytkownika mniej eleganckie, przekazanie do funkcji tablicy.Jakub Fila edytował(a) ten post dnia 16.11.11 o godzinie 17:33

konto usunięte

Temat: Postgresql - PL/SQL pytanie o parametr

Jakub Fila:
Michał Z.:
1. Wystarczy dopilnować, żeby typ w tablicy był taki sam jak typ kolumny i any działa doskonale. Idzie po indeksie, działa o wiele szybciej niż in. No przynajmniej na 8.1 - potem operator in mocno podrasowali...

2. Jeżeli by się nie dało. Da się po tablicy przeiterować - stworzyć zapytanie, potem je wykonać. Mało to "esquelowe", ale można.

3. Co do zmiennej liczby parametrów - afair - idzie zrobić ale w C.

Ale pisanie w C funkcji z otwartą lista argumentów też jest średnio eleganckie - po pierwsze argumenty są przyjmowane jako char* i trzeba dokonywać ich konwersji, po drugie parsowana jest tablica argumentów. Narzut jest niestety spory.

Wg mnie najbardziej optymalne jest, choć może z punktu widzenia użytkownika mniej eleganckie, przekazanie do funkcji tablicy.

Do tego jak się czegoś nie zwolni - serwer nie jest zbyt zachwycony. Przy innych rozwiązaniach raczej nie ma z tym problemu. Podałem raczej dla porządku, może gdzieś się komuś przyda...
Jakub Fila

Jakub Fila Inżynieria / finanse
/ zarządzanie

Temat: Postgresql - PL/SQL pytanie o parametr

Michał Z.:

Do tego jak się czegoś nie zwolni - serwer nie jest zbyt zachwycony. Przy innych rozwiązaniach raczej nie ma z tym problemu. Podałem raczej dla porządku, może gdzieś się komuś przyda...

To akurat bardzo, bardzo dobrze - sprzątanie pamięci po sobie powinno być przyzwyczajeniem każdego developera. Ponieważ ja jestem starym prykiem i do dziś dużo piszę w Fortranie, C/C++ to ten nawyk mam. Jeśli aplikacja ma być wydajna i nie generować potężnego narzutu, to niezarządzalny język zawsze będzie miał przewagę. JVM i .NET w sumie dbają o tyle rzeczy, że chyba przyświecała ich tworzeniu maksyma "każdy idiota może zostać developerem" ;-)

Wracając do Twojej sugestii - wg mnie tablica, ew. z dodatkowym parametrem określającym rozmiar. Ew. iterowanie tablicy wg mnie nie jest niczym złym. Nieeleganckie natomiast będzie zaproponowane wcześniej użycie kursora, oprócz tego mało efektywne.

konto usunięte

Temat: Postgresql - PL/SQL pytanie o parametr

Jakub Fila:
Michał Z.:

Do tego jak się czegoś nie zwolni - serwer nie jest zbyt zachwycony. Przy innych rozwiązaniach raczej nie ma z tym problemu. Podałem raczej dla porządku, może gdzieś się komuś przyda...

To akurat bardzo, bardzo dobrze - sprzątanie pamięci po sobie powinno być przyzwyczajeniem każdego developera. Ponieważ ja jestem starym prykiem i do dziś dużo piszę w Fortranie, C/C++ to ten nawyk mam. Jeśli aplikacja ma być wydajna i nie generować potężnego narzutu, to niezarządzalny język zawsze będzie miał przewagę. JVM i .NET w sumie dbają o tyle rzeczy, że chyba przyświecała ich tworzeniu maksyma "każdy idiota może zostać developerem" ;-)
Też kiedyś myślałem, że nie ma jak assembler... :) Tyle, że to jest kolejna rzecz, o której trzeba pamiętać. W Perlu nie trzeba, a np. typy tablicowe przekazywane jako parametry nie są konwertowane na stringi... Nie trzeba parsować w tę i wew tę.
Wracając do Twojej sugestii - wg mnie tablica, ew. z dodatkowym parametrem określającym rozmiar. Ew. iterowanie tablicy wg mnie nie jest niczym złym. Nieeleganckie natomiast będzie zaproponowane wcześniej użycie kursora, oprócz tego mało efektywne.
Tu się zgadzam, iterowanie po tablicy - nie ważne, czy tablica jest jednym blokiem, czy linked-listą - to jest prosta sprawa. Iterowanie po kursorze jest bardziej skomplikowane.
Jakub Fila

Jakub Fila Inżynieria / finanse
/ zarządzanie

Temat: Postgresql - PL/SQL pytanie o parametr

Michał Z.:
Tu się zgadzam, iterowanie po tablicy - nie ważne, czy tablica jest jednym blokiem, czy linked-listą - to jest prosta sprawa. Iterowanie po kursorze jest bardziej skomplikowane.

Nawet nie chodzi o złożoność składniową - po prostu kursor sam w sobie jest mechizmem mało wydajnym. Nie wiemy co prawda jakie są wymagania na wydajność tej aplikacji, ale trzeba to wziąć pod uwagę.

Następna dyskusja:

pytanie o widoki w postgres...




Wyślij zaproszenie do