LINUX.ORG.RU

PostgreSQL и массивы


0

0

Здравствуйте!

Как в PG/plSQL работать с аргументами функции - массивами неизвестной заранее длины? Можно где-нить почитать об этом? А то в мануале нашёл только поля таблиц и select ... from ...

Заранее благодарен!

★★★★

вот тебе пример. (кривовато конечно, но думаю разберешься)

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
create function myArraySum(_int4) returns int8 as'
declare
a ALIAS FOR $1;
i int:=1;
sum int8:= 0;
begin
while a[i] > 0 loop
sum:=sum+a[i];
i:=i+1;
end loop;
return sum;
end;
' language 'plpgsql';
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

select myArraySum('{10,20,30,40}');
-> 100

Effect
()
Ответ на: комментарий от mv

терминатор вставлять не надо.
просто в первом примере не учел нули.

можно так например:

create function myArraySum2(_int4) returns int8 as'
declare
a ALIAS FOR $1;
i int:=1;
sum int8:= 0;
begin
loop
sum:=sum+a[i];
i:=i+1;
exit when a[i] ISNULL;
end loop;
return sum;
end;
' language 'plpgsql';


select myArraySum2('{1,1,0,0,1}');
-> 3

Effect
()
Ответ на: комментарий от Effect

риторический вопрос: а что будет "select myArraySum('{0,10,20,30,40}');" ;)

CREATE OR REPLACE FUNCTION array_to_set(
    arr anyarray
) RETURNS SETOF anyelement AS $$
BEGIN
    FOR idx IN array_lower(arr, 1)..array_upper(arr, 1) LOOP
        RETURN NEXT arr[idx];
    END LOOP;
END;
$$ LANGUAGE plpgsql;

http://www.oreilly.com/pub/a/databases/2006/09/07/plpgsql-batch-updates.html?pa
ge=2

AcidumIrae ★★★★★
()

Вопрос к гурам :) Давненько с pg на нагруженных задачах не работал (последнее, что видел - 8.1 сразу после релиза), как он себя сейчас ведёт по части скорости? Autovacuum всё также тормозит?

И что вы думаете про pgcluser (синхронная мультимастер-репликация с балансировщиком нагрузки)? Имхо, как раз вот этого и не хватало для масштабных проектов.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.