【发布时间】:2019-03-02 18:52:25
【问题描述】:
我试图在 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;
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 中搜索此内容,但找不到与我的错误类似的内容
【问题讨论】:
-
如果您使用 Postgres JSON 函数作为
json_insert()而不是字符串连接会更好。他们确保 JSON 结构保持有效postgresql.org/docs/current/static/functions-json.html -
谢谢,我真的把一切都复杂化了,我将函数更改为保存在临时表中而不是推入数组,然后,完成迭代,读取表并转换为 json
标签: arrays json postgresql loops