PostgreSQL: проблема с передачей массива в процедуру
У меня есть тип как:
CREATE TYPE status_record AS
(
id bigint,
status boolean
);
Процедура, которая выполняет некоторую обработку с массивом типа в качестве входного параметра, например:
CREATE OR REPLACE FUNCTION update_status(status_list status_record[])
RETURNS text AS
$BODY$
DECLARE
BEGIN
--does some processing
return 'SUCCESS';
end;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Наконец я запросил процедуру как:
select *
from update_status(cast(ARRAY[(385,false),(387,false)] as status_record[]));
Все отлично работает в pgadmin. Позже, когда я попытался вызвать то же самое, используя Hibernate-нативный SQL Query Ka Boom!!! Отображается следующее:
org.postgresql.util.PSQLException: ERROR: array value must start with "{" or dimension information
Последний вопрос: оба ARRAY[--something]
а также {--something}
делает ту же работу?
2 ответа
Используйте литерал массива (текстовое представление массива), так как конструктор массива ARRAY[...]
Должен быть оценен Postgres:
SELECT update_status('{"(1,t)","(2,f)"}'::status_record[]);
Может быть, даже без явного приведения:
SELECT update_status('{"(1,t)","(2,f)"}');
Подобные случаи были на SO раньше:
Попробуйте поместить массив и инициализацию типа в строку, возможно, вы сможете обойти проблемы со слоем запутывания (иначе ORM):
select update_status(cast('{"(1,true)", "(2,false)"}' as status_record[]));
Я не знаю Hibernate, поэтому я не могу сказать, сработает ли это.