如何在 JSON 路径中插入一个变量 (Oracle PL SQL)?
how to insert a variable in JSON Path (Oracle PL SQL)?
- 我想插入变量 nmbr_v 而不是值 4444
- 我尝试在变量周围加上 + 但它不起作用
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 mechanism; q'^...^'
表示该字符串中出现的任何单引号都不需要转义。
cur_stmt
变量不是严格需要的,但拥有它很有帮助,因此您可以输出它以进行调试;这里显示输出:
select id from tbl where json_exists(nmbr, '$[*]?(@.x == 4444)')
这是您原来的静态游标查询。
db<>fiddle,包括显示各种无效的方法和它们得到的错误。
如果传入 nmbr_v
值,那么您当然可能需要进行一些验证。
- 我想插入变量 nmbr_v 而不是值 4444
- 我尝试在变量周围加上 + 但它不起作用
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 mechanism; q'^...^'
表示该字符串中出现的任何单引号都不需要转义。
cur_stmt
变量不是严格需要的,但拥有它很有帮助,因此您可以输出它以进行调试;这里显示输出:
select id from tbl where json_exists(nmbr, '$[*]?(@.x == 4444)')
这是您原来的静态游标查询。
db<>fiddle,包括显示各种无效的方法和它们得到的错误。
如果传入 nmbr_v
值,那么您当然可能需要进行一些验证。