Как передать массив пользовательских типов в функцию Postgres

У меня есть пользовательский тип

CREATE TYPE mytype as (id uuid, amount numeric(13,4));

Я хочу передать его функции со следующей подписью:

CREATE FUNCTION myschema.myfunction(id uuid, mytypes mytype[])
  RETURNS BOOLEAN AS...

Как я могу вызвать это в запросе postgres и неизбежно из PHP?

2 ответа

Вы можете использовать альтернативный синтаксис со строковым литералом вместо конструктора массива, который является функциональной конструкцией Postgres и может вызвать проблемы, когда вам нужно передать значения - как в подготовленном выражении:

SELECT myschema.myfunc('0d6311cc-0d74-4a32-8cf9-87835651e1ee'
                  , '{"(0d6311cc-0d74-4a32-8cf9-87835651e1ee, 25)"
                    , "(6449fb3b-844e-440e-8973-31eb6bbefc81, 10)"}'::mytype[]);

Я добавил разрыв строки между двумя типами строк в массиве для отображения здесь. Это законно.

Как найти правильный синтаксис для любого литерала?

Вот демо:

CREATE TEMP TABLE mytype (id uuid, amount numeric(13,4));

INSERT INTO mytype VALUES
  ('0d6311cc-0d74-4a32-8cf9-87835651e1ee', 25)
 ,('6449fb3b-844e-440e-8973-31eb6bbefc81', 10);

SELECT ARRAY(SELECT m FROM mytype m);

Возвращает:

{"(0d6311cc-0d74-4a32-8cf9-87835651e1ee,25.0000)","(6449fb3b-844e-440e-8973-31eb6bbefc81,10.0000)"}

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

select myschema.myfunc('0d6311cc-0d74-4a32-8cf9-87835651e1ee'
                , ARRAY[('ac747f0e-93d4-43a9-bc5b-09df06593239', '25.00')
                              , ('6449fb3b-844e-440e-8973-31eb6bbefc81', '10.00')]::mytype[]
    );

Тем не менее, все еще нужно разрешить часть PHP, все еще не зная, как вызвать функцию, заполненную пользовательским параметром массива.

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