oracle 在PL/SQL中使用变量创建动态JSON_TABLE查询

e4eetjau  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(130)

我有一个PL/SQL过程,其中包含以下静态SQL代码,它按预期工作:

SELECT LISTAGG(value, ',') WITHIN GROUP (ORDER BY NULL) 
INTO SELECTED_GEO 
FROM JSON_TABLE(v_json_clob, '$.GEO.GEO20[*]' COLUMNS value PATH '$');

现在,我试图通过用变量P_X替换固定值'20'来使代码动态化。变量SELECTED_GEO是一个OUT参数,将由Web应用程序读取。以下是我尝试过的:

EXECUTE IMMEDIATE 'SELECT LISTAGG(value, '','') WITHIN GROUP (ORDER BY NULL) INTO SELECTED_GEO 
FROM JSON_TABLE(' || v_json_clob || ', ''$.GEO.GEO' || P_X || '[*]'' COLUMNS value PATH ''$'')';

当我打印动态生成的SQL时,它看起来是正确的,并且与静态版本相匹配。但是,当我执行该过程时,动态SQL版本并没有按预期工作。
我已经验证了v_json_clob和P_GEO_TYPE的值在运行时是正确的。尽管如此,动态版本无法检索预期的数据,而静态版本可以完美地工作。
我得到这个错误:
ORA-00936:缺少表达式
在这种情况下,我的动态SQL方法是否遗漏了什么?如果能深入了解为什么动态版本可能无法按预期运行,将不胜感激。

dzhpxtsq

dzhpxtsq1#

使用绑定变量将值传入和传出动态查询:

DECLARE
  v_json_clob  CLOB         := '{"GEO":{"GEO20": "abc"}}';
  p_x          VARCHAR2(20) := '20';
  selected_geo VARCHAR2(20);
BEGIN
  EXECUTE IMMEDIATE q'{SELECT LISTAGG(value, ',') WITHIN GROUP (ORDER BY NULL) FROM JSON_TABLE(:1, '$.GEO.GEO}' || P_X || q'{[*]' COLUMNS value PATH '$')}'
    INTO  SELECTED_GEO
    USING v_json_clob;
  DBMS_OUTPUT.PUT_LINE(SELECTED_GEO);
END;
/

其输出:

abc

fiddle

相关问题