2014-11-20 2 views
1

Я использую PostgreSQL 8.4 и записываю функцию следующим образом. Я столкнулся с проблемой, как передать результат в массив. Я имею в виду, представьте, у меня есть запрос, возвращающегося только один столбец целого типа, какКак передать результирующий набор в массив?

SELECT amount from daily_profit; 

Я пытался написать что-то вроде следующего:

CREATE OR REPLACE FUNCTION fill_daily_profit() RETURNS void AS $$ 
DECLARE 
    arr integer[] := cast ((SELECT amount from partner.daily_profit) as integer[]);  
    -- doesn't work, the following error was produced: 
    -- cannot cast type integer to integer[] 
BEGIN 
END $$ 
LANGUAGE plpgsql; 

Любые идеи?

+2

Postgres 8.4 больше не поддерживается (= поддерживается), вы должны как можно скорее планировать обновление до текущей версии. –

+0

@a_horse_with_no_name Я знаю, но в нашем производственном окружении это невозможно сейчас. Но задача должна быть выполнена с использованием 8.4 ... –

ответ

3

я предлагаю более простой и быстрый ARRAY constructor для этого:

CREATE OR REPLACE FUNCTION fill_daily_profit() 
RETURNS void AS 
$func$ 
DECLARE 
    arr integer[] := ARRAY (SELECT amount FROM partner_daily_profit); 
BEGIN 
    ... 
END 
$func$ LANGUAGE plpgsql;

Добавить ORDER BY статью в SELECT, если вы хотите элементов в определенном порядке.

Однако, часто существует решение на основе множества за углом, которое априори освобождает от необходимости такой массив.

2

Вам необходимо агрегировать значения в массив:

CREATE OR REPLACE FUNCTION fill_daily_profit() RETURNS void AS $$ 
DECLARE 
    arr integer[];  
BEGIN 
    select array_agg(amount) 
    into arr 
    from partner_daily_profit; 
END $$ 
LANGUAGE plpgsql; 
Смежные вопросы