CREATE TYPE msg.entity_object AS (
field_id numeric,
field_value text
);
DO $$
declare
entity_Before_arr msg.entity_object[];
_rec msg.entity_object%rowtype;
_record record;
begin
/*
--1
entity_Before_arr := (SELECT ARRAY(SELECT (cf.field_id,cf.field_value)
FROM er.ref_comment_field cf
WHERE cf.comment_id = 986)
);
*/
--2
SELECT INTO entity_Before_arr
ARRAY(SELECT (cf.field_id,cf.field_value)
FROM er.ref_comment_field cf
WHERE cf.comment_id = 986);
/*
--1
FOREACH _rec IN ARRAY entity_Before_arr
LOOP
RAISE NOTICE 'field_id: % - %', _rec.field_id,_rec.field_value;
END LOOP;
*/
for _record in select unnest(entity_Before_arr) as v loop
RAISE NOTICE '%-%', (_record.v).field_id, (_record.v).field_value ;
end loop;
END
$$
-----------------------
Формируем массив пар полей типа msg.entity_object, для передачи в функции и обработки с помощью SQL.
SELECT ARRAY(
SELECT cast((cf.field_id,cf.field_value) as msg.entity_object) FROM er.ref_comment_field cf WHERE cf.comment_id = 986
) as v
Разворачивание полей:
select (d.val).field_id,
(d.val).field_value
from(
select unnest(entB.v) as val
from (
SELECT ARRAY(
SELECT cast((cf.field_id,cf.field_value) as msg.entity_object) FROM er.ref_comment_field cf WHERE cf.comment_id = 986
) as v
) entB
) d
Или компактнее
select (entB.v).field_id,
(entB.v).field_value
from (
SELECT unnest(ARRAY(
SELECT cast((cf.field_id,cf.field_value) as msg.entity_object) FROM er.ref_comment_field cf WHERE cf.comment_id = 986
)) as v
) entB
===========================================================
Ещё один вид/вариант обработки, собрали массив, передали дальше, проверили что можно его обработать и через SQL и через plPgSQL
DO $$
declare
entity_Before_arr msg.entity_object[];
_rec msg.entity_object%rowtype;
_record record;
begin
--2
SELECT INTO entity_Before_arr
ARRAY(
SELECT cast((cf.field_id,cf.field_value) as msg.entity_object)
FROM er.ref_comment_field cf
WHERE cf.comment_id = 986
);
for _record in select (entB.v).field_id,
(entB.v).field_value
from (
SELECT unnest(entity_Before_arr) as v
) entB
loop
RAISE NOTICE '%-%', _record.field_id, _record.field_value ;
end loop;
END
$$
Комментариев нет:
Отправить комментарий