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, поэтому я не могу сказать, сработает ли это.

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