如何在 JSON 路径中插入一个变量 (Oracle PL SQL)?

how to insert a variable in JSON Path (Oracle PL SQL)?

set serveroutput on;
declare
nmbr_v number;
v_id number;
-- I want to insert the variable nmbr_v instead of the value 4444
cursor cur_nmbr is select id from tbl where json_exists(nmbr, '$[*]?(@ == 4444)');
begin
open cur_nmbr;
loop

fetch cur_nmbr into v_id;
exit when cur_nmbr %notfound;
dbms_output.put_line( 'id= ' ||v_id);
end loop;

close cur_nmbr;
end;

JSON 路径必须是文本文字,所以你不能(无论你在问题中使用 + 还是连接运算符 ||,或者用完整路径构建一个变量)。

我相信您需要使用动态 SQL,您可以在此处将其实现为动态隐式游标:

declare
  nmbr_v number := 4444;
  v_id number;
  cur_stmt varchar2(80);
  cur_nmbr sys_refcursor;
begin
  cur_stmt := q'^select id from tbl where json_exists(nmbr, '$[*]?(@.x == ^' || nmbr_v || q'^)')^';
  dbms_output.put_line(cur_stmt);

  open cur_nmbr for cur_stmt;
  loop
    fetch cur_nmbr into v_id;
    exit when cur_nmbr %notfound;
    dbms_output.put_line( 'id= ' ||v_id);
  end loop;

  close cur_nmbr;
end;
/

现在 cur_nmbr 声明为 sys_refcursor 而不是静态显式游标,然后动态构建和提供游标查询。

语句构造使用the alternative quoting mechanismq'^...^' 表示该字符串中出现的任何单引号都不需要转义。

cur_stmt 变量不是严格需要的,但拥有它很有帮助,因此您可以输出它以进行调试;这里显示输出:

select id from tbl where json_exists(nmbr, '$[*]?(@.x == 4444)')

这是您原来的静态游标查询。

db<>fiddle,包括显示各种无效的方法和它们得到的错误。

如果传入 nmbr_v 值,那么您当然可能需要进行一些验证。