Как передать массив пользовательских типов в функцию 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, все еще не зная, как вызвать функцию, заполненную пользовательским параметром массива.