Оператор Json не работает с переменной - PullRequest
0 голосов
/ 07 января 2019

Тестовый запрос:

select * from testarray(1120,'{"oserial":
["10002695","10002692"],"nserial":[{"serial":"10002693","price":"180.00"},
{"serial":"10002697","price":"180.00"}]}');
CREATE OR REPLACE FUNCTION public.testarray(salesid int,items json) 
RETURNS int
LANGUAGE plpgsql
AS $$
declare
  resu text;
  resu2 text := 'TH';
  ssrow RECORD;
  oserlen int := 0;
  counter int := 0;
begin
  select json_array_length(items::json->'oserial') into oserlen;
  while counter < oserlen loop
    -- if I change 0 to counter, this function does not work
    select (items::json#>>'{oserial,0}') into resu; 
    select * into ssrow 
    from salesserial 
    where fk_salesid=salesid 
      and serialnum=resu::int;

    insert into stockloct(serialnum,fk_barcode,source,exflag) 
    values(ssrow.serialnum,ssrow.fk_barcode,ssrow.fk_salesid,true);

    counter := counter + 1;
  end loop; 
  select items::json#>'{nserial,0,serial}' into resu2;
  return oserlen;
end;
$$;

Я тестирую функции PostgreSQL.

Эта строка ниже не работает, может кто-нибудь мне помочь. Заранее спасибо. Я использую Postgresql версии 9.5. Если я изменяю переменную 0 на counter в строке json, выбор не возвращает значение. Работает только с числом, а не с переменными.

select (items::json#>>'{oserial,0}') into resu; 
-- if i change 0 to counter variable, this select returns null i think as the insert below the line fails; 

1 Ответ

0 голосов
/ 07 января 2019

Правый аргумент для #>> является текстовым массивом. Заменить

select (items::json#>>'{oserial,0}') into resu; 

с

select items::json#>>array['nserial',counter::text] into resu; 
...