Как передать значения столбцов таблицы в функцию

Источник таблицы содержит целочисленный столбец. Его значения необходимо передать функции 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+

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно агрегировать ints в вызове функции. В противном случае вы просто переводите каждое значение в одноэлементный массив, а они пытаются преобразовать столбец в массив из int.

select TestAddAssetTransactions( (select array_agg(dokumnr)::int[] from source) );

онлайн демо

Спасибо. Можно ли снять ::int[] литой? Я проверил, и это работало без приведения.

Andrus 11.02.2023 12:09

Конечно. Это просто хорошая практика, потому что array_agg() возвращает массив всего, что вы ему подаете. Если вы каким-то образом подадите text, он прервется при поиске функции, не найдя функцию с таким именем, которая принимает text[] вместо int[]. Когда вы произносите по вызову, вы получите сообщение об ошибке.

Zegarek 11.02.2023 12:34

Другие вопросы по теме