Передать более 100 аргументов в функцию, используя Array в качестве параметра - PullRequest
1 голос
/ 25 сентября 2019

Мне нужно создать хранимую процедуру, которая проверяет, существуют ли в таблице определенные учетные записи. Если она существует

Необходимо создать пользовательскую функцию в PostgreSQL для обновления / вставки таблицы.Мне нужно пройти около 200 значений, которые невозможно достичь.Некоторые предлагали использовать Array в качестве параметров.Но это не работает для меня правильно.Все 200 полей объединяются с int, varchar, double, float и т. Д. Также мы не можем изменить порядок.

Скажите, пожалуйста, как передать их в качестве параметров и использовать их в операторе update / insert.

Мой код выглядит примерно так

create or replace function test(variadic text[])
....
Begin
Insert into customers (custno , company, firstname) values ($1[1],$1[2],$1[3]);
....
END;

1 Ответ

0 голосов
/ 25 сентября 2019

Лучший способ сделать это - передать составной тип в качестве аргумента.

Вы можете использовать тип, который назван как таблица и автоматически создан с помощью CREATE TABLE.

ЗдесьЭто рабочий пример с 300 столбцами:

CREATE TABLE wide (
   i0 integer,
   t0 text,
   d0 date,
   i1 integer,
   t1 text,
   d1 date,
   i2 integer,
   t2 text,
   d2 date,
   i3 integer,
   t3 text,
   d3 date,
[... many missing columns]
   i99 integer,
   t99 text,
   d99 date
);

CREATE OR REPLACE PROCEDURE insert_wide(arg wide)
   LANGUAGE plpgsql AS
$$BEGIN
   INSERT INTO wide SELECT (arg).*;
END;$$;

CALL insert_wide(
        ROW(
           0,
           'atext',
           current_date + 0,
           1,
           'atext',
           current_date + 1,
           2,
           'atext',
           current_date + 2,
           3,
           'atext',
           current_date + 3,
[again, many missing columns]
           99,
           'atext',
           current_date + 99
        )
     );

Но я думаю, что если у вас есть таблицы с таким количеством столбцов, вы делаете что-то не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...