я заблудился, начав изучать postgres, я изменил логику функции, поэтому, если кому-то понадобится сделать что-то похожее, это код, в конце я приведу некоторые значения json, сохраню все во временной таблице иответьте, прочитайте временную таблицу и приведите к json, так что, наконец, нам не нужно объединять строку со значениями json
CREATE OR REPLACE FUNCTION setProduct(val json)
RETURNS JSON AS $$
DECLARE
varvariedad INTEGER;
vartallo INTEGER;
varlista INTEGER;
varcaja INTEGER;
objetoinsert JSON;
objetorespuesta JSON;
i JSON;
BEGIN
/*
CREATE TEMPORARY TABLE tmp_respuesta
(
error bigint,
message VARCHAR(150),
variedad VARCHAR(150),
qty bigint,
caja VARCHAR(20),
tallo varchar(20)
)
ON COMMIT DELETE ROWS;*/
FOR i IN SELECT * FROM json_array_elements(val)
LOOP
/*valido variedad*/
varvariedad:=0;
raise notice 'empiezo: %',i->>'variedad' ;
select id into varvariedad from variedad_flors where nombre = trim( i->>'variedad');
IF varvariedad > 0 THEN
vartallo:=0;
select id into vartallo from tallos_flors where nombre = trim( i->>'tallo');
IF vartallo = 0 THEN
insert into temp_variedadesnot
(error,message,variedad,qty,caja,tallo) VALUES (1,'No existe Tallo',varlista,i->>'variedad',i->>'qty'::BIGINT,i->>'caja',i->>'tallo');
ELSE
varcaja:=0;
select id into varcaja from cajas_flors where nombre = trim( i->>'caja');
IF varcaja = null THEN
insert into tmp_respuesta
(error,message,variedad,qty,caja,tallo) VALUES (1,'No existe caja',i->>'variedad',(i->>'qty')::BIGINT,i->>'caja',i->>'tallo');
ELSE
varlista:=0;
select id into varlista from listaprecios where id_tipoflor = varvariedad;
IF varlista = 0 THEN
insert into tmp_respuesta (error,message,variedad,qty,caja,tallo) VALUES
(2,'No existe Lista de precio',i->>'variedad',(i->>'qty')::BIGINT,i->>'caja',i->>'tallo');
ELSE
insert into productos (id_listaprecios,cantidad,id_variedad) VALUES (varlista,(i->>'qty')::BIGINT,varvariedad);
insert into tmp_respuesta (error,message,variedad,qty,caja,tallo) VALUES
(0,'Registro Exitoso',i->>'variedad',(i->>'qty')::BIGINT,i->>'caja',i->>'tallo');
END IF;
END IF;
END IF;
ELSE
insert into tmp_respuesta
(error,message,variedad,qty,caja,tallo) VALUES (1,'No existe Variedad' ,varlista,(i->>'qty')::BIGINT,i->>'caja',i->>'tallo');
END IF;
END LOOP;
select json_agg(row_to_json(tmp_respuesta)) into objetoinsert from tmp_respuesta;
return objetoinsert ;
END;
$$ LANGUAGE PLpgSQL;