Источник таблицы содержит целочисленный столбец. Его значения необходимо передать функции Postgresql 12 для выбора данных из другой таблицы.
Я пытался использовать массив
CREATE OR REPLACE FUNCTION public.TestAddAssetTransactions(dokumnrs int[])
RETURNS int AS
$BODY$
with i1 as (
INSERT INTO bilkaib (dokumnr)
select dokumnr from dok where dokumnr in (select * from unnest(dokumnrs))
returning *
)
select count(*) from i1;
$BODY$ language sql;
create temp table bilkaib (dokumnr int ) on commit drop;
create temp table dok (dokumnr serial primary key ) on commit drop;
create temp table source (dokumnr int ) on commit drop;
insert into source values (1),(2);
select TestAddAssetTransactions( (select ARRAY[dokumnr] from source)::int[] )
но получил ошибку
ОШИБКА: подзапрос, используемый в качестве выражения, возвращает более одной строки.
Как передать значения одного столбца из строк таблицы в функцию? Должен ли использоваться массив, тип таблицы или временная таблица?
Использование Postgresql 12+
Вам нужно агрегировать int
s в вызове функции. В противном случае вы просто переводите каждое значение в одноэлементный массив, а они пытаются преобразовать столбец в массив из int
.
select TestAddAssetTransactions( (select array_agg(dokumnr)::int[] from source) );
Конечно. Это просто хорошая практика, потому что array_agg()
возвращает массив всего, что вы ему подаете. Если вы каким-то образом подадите text
, он прервется при поиске функции, не найдя функцию с таким именем, которая принимает text[]
вместо int[]
. Когда вы произносите по вызову, вы получите сообщение об ошибке.
Спасибо. Можно ли снять
::int[]
литой? Я проверил, и это работало без приведения.