Объединение значений в объекте Json в функции postgres 9.6 - PullRequest
0 голосов
/ 27 сентября 2018

я пытаюсь перебрать json в функции postgres, получить массив 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;
objetovariedadesnot JSON;
objetopreciosnot JSON;

i JSON;
BEGIN 
objetoinsert :='[]';
objetorespuesta :='[]';
objetovariedadesnot:='[]';
objetopreciosnot :='[]';

 FOR i IN SELECT * FROM json_array_elements(val)
  LOOP
  /*valido variedad*/
    varvariedad:=0;
    select id into varvariedad from variedad_flors where nombre = trim( i->>'nombre');

        IF varvariedad  > 0 THEN
        vartallo:=0;
        select id into vartallo from tallos where nombre = trim( i->>'tallo');

                IF vartallo == 0 THEN
                objetovariedadesnot := objetovariedadesnot || '{"error":"No existe Tallo", "qty": "'||trim( i->>'qty')||'", "caja": "'||trim( i->>'caja')+'", "tallo": "'||trim( i->>'tallo')||'", "precio": "'|| trim( i->>'precio')||'"}'::jsonb; 
                ELSE
                varcaja:=0;
                select id into varcaja from tallos where nombre = trim( i->>'caja');

                        IF varcaja == 0 THEN
                        objetovariedadesnot := objetovariedadesnot || '{"error":"No existe Caja", "qty": "'||trim( i->>'qty')||'", "caja": "'||trim( i->>'caja')||'",, "tallo": "'||trim( i->>'tallo')||'", "precio": "'||trim( i->>'precio')||'"}}'::jsonb;    

                        ELSE
                         varlista:=0;
                         select id into varlista from listaprecio where variedad = trim(varvariedad);

                            IF varlista == 0 THEN
                                objetopreciosnot := objetopreciosnot || '{"error":"No existe List de precio", "qty": "'||trim( i->>'qty')||'", "caja": "'||trim( i->>'caja')||'", "tallo": "'||trim( i->>'tallo')||'", "precio": "'||trim( i->>'precio')||'"}'::jsonb;  
                            ELSE
                                objetoinsert := objetoinsert ||'{"id_listaprecios":"'||varlista||'", "cantidad": '|| i->>'qty'||', "id_variedad": "'||varvariedad||'"}';
                            END IF;
                        END IF; 
                END IF;
        ELSE
                 objetovariedadesnot := objetovariedadesnot || '{"error":"No existe variedad", "qty": "'||trim( i->>'qty')||'", "caja": "'||trim( i->>'caja')||'", "tallo": "'||trim( i->>'tallo')||'", "precio": ' || trim( i->>'precio')|| '}'::jsonb;    
        END IF;
  END LOOP;

END;
$$ LANGUAGE PLpgSQL;

ошибка вот-вот конкатенирует "}}", как я могу объединить все, как правильно, чтобы избежать следующей ошибки

ERROR:  invalid input syntax for type json
LINE 1: ...tallo')||'", "precio": ' || trim( i->>'precio')|| '}}'::json...
                                                             ^
DETAIL:  Expected JSON value, but found "}".
QUERY:  SELECT objetovariedadesnot || '{"error":"No existe variedad", "qty": "'||trim( i->>'qty')||'", "caja": "'||trim( i->>'caja')||'", "tallo": "'||trim( i->>'tallo')||'", "precio": ' || trim( i->>'precio')|| '}}'::jsonb
CONTEXT:  JSON data, line 1: }...
PL/pgSQL function setproduct(json) line 50 at assignment

********** Error **********

ERROR: invalid input syntax for type json
SQL state: 22P02
Detail: Expected JSON value, but found "}".
Context: JSON data, line 1: }...
PL/pgSQL function setproduct(json) line 50 at assignment

Большое спасибо за вашу помощь, я ищу это вGoogle, но я не могу найти что-то похожее на мою ошибку

1 Ответ

0 голосов
/ 28 сентября 2018

я заблудился, начав изучать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...