0

我想循环一个 Json 字符串来检索值。以下代码给了我一个 JSON 路径表达式错误。

declare 
buffer clob;
  pos number;
  Numb number; 
begin
  pos := 1;
  buffer := '{"root":[{"theData":[224.08755140452405,124.08755140452405,324.08755140452405]}]}';
  pos := 0; 
  
  EXECUTE IMMEDIATE 'select json_value(buffer,''$.root[0].theData[:pos]'') from dual'
  using pos
  returning INTO numb;
  dbms_output.put_line(numb);
  
end;

如果我用以下语句替换执行立即命令

select json_value(buffer,'$.root[0].theData[0]') into numb from dual;

它工作正常。有任何想法吗?

4

2 回答 2

2

如果您查看文档,他们会提到 JSON 路径表达式必须是字符串文字- 因此它不能包含绑定变量或替换变量。

但是由于您使用 运行它execute immediate,因此当字符串作为查询执行时,您可以使其看起来像文字。我想你想要这样的东西:

EXECUTE IMMEDIATE 'select json_value(:buffer,''$.root[0].theData[' || pos || ']'') from dual'
into numb
using buffer;

编辑:还更正了语法

于 2021-09-01T19:36:10.870 回答
2

您可以对 JSON使用 PL/SQL 对象类型,而不是使用 SQL :

declare 
  buffer clob := '{"root":[{"theData":[224.08755140452405,124.08755140452405,324.08755140452405]}]}';
  pos    PLS_INTEGER := 0;
  Numb   number;
  json_arr JSON_ARRAY_T;
begin
  json_arr := TREAT(
                JSON_OBJECT_T( buffer ).get_array('root').get(0)
                AS JSON_OBJECT_T
              ).get_array('theData');

  FOR pos IN 0 .. json_arr.get_size() - 1 LOOP
    numb := json_arr.get_number(pos);
    dbms_output.put_line(numb);
  END LOOP;
end;
/

哪个输出:

224.08755140452405
124.08755140452405
324.08755140452405

db<>在这里摆弄

于 2021-09-01T22:32:39.497 回答