为 Oracle 转义 JSON 中的 & 符号

Escaping ampersands in JSON for Oracle

我们正在将 JSON 发送到 oracle 函数,有时它包含 & 符号。我想知道是否有任何其他方法可以防止 "variable substitution" 由于&符号而导致的问题,而不必将字符串修改为

'{"this is the JSON &'||' it contains an ampersand"}'

我试过这些,但它们不起作用。

'{"this is the JSON && it contains an ampersand"}'

'{"this is the JSON /& it contains an ampersand"}'

'{"this is the JSON \& it contains an ampersand"}'

编辑:

这是我们在 Toad 中手动导入的方式:

declare
    vOut varchar2(400);
begin
    vOut:=CartJSON.RequestEntry('JSON HERE'); -- function to parse JSON
    dbms_output.put_line('Here:'||vOut);
end;

更新

OP 使用的是 TOAD 而不是 SQL*Plus。


蟾蜍

在 TOAD 中,可以通过三种方式执行语句而不用值替换与符号 (&):

  • 菜单级别

View -> TOAD Options: go to the "execute/compile" node/item and uncheck the "Prompt for substitution variables" option.

  • 编辑级别

Right click in the editor and uncheck the "Prompt for substitution variables" option.

  • 使用 set define off 作为脚本执行

大多数基于 GUI 的工具,如 SQL Developer、TOAD 等,现在支持大量 SQL*Plus 命令,并且作为脚本执行似乎与 SQL*Plus 中的非常相似。但是,很可能旧版本的 GUI 工具可能不支持 SQL*Plus 命令。


SQL*加号

使用&符号作为替代变量是一个Oracle SQL*Plus客户端 特征。

SQL*Plus 你可以做到

  • 关闭定义

例如,

SQL> SET DEFINE OFF
SQL> SELECT '{"this is the JSON && it contains an ampersand"}' str FROM dual;

STR
------------------------------------------------
{"this is the JSON && it contains an ampersand"}

或者,

  • 设置扫描关闭

例如,

SQL> SET SCAN OFF
SQL> SELECT '{"this is the JSON && it contains an ampersand"}' str FROM dual;

STR
------------------------------------------------
{"this is the JSON && it contains an ampersand"}

SQL>

或者,

  • 或者,您可以使用 CHR(38) 作为符号。

例如,

SQL> SELECT '{"this is the JSON '|| chr(38)||chr(38) ||' it contains an ampersand"}' str FROM dual;

STR
------------------------------------------------
{"this is the JSON && it contains an ampersand"}

SQL>

好的,现在我们知道您正在使用 Toad,问题是您正在尝试 运行 set define off 就好像它是 sql 语句(执行语句在插入符号/F9)而不是作为 SQLPlus 语句(即作为脚本的一部分 - 作为脚本执行/F5)。您有两个选择:

1: 运行 两个语句作为脚本 (F5):

set define off;

declare
    vOut varchar2(400);
begin
    vOut:=CartJSON.RequestEntry('JSON HERE'); -- function to parse JSON
    dbms_output.put_line('Here:'||vOut);
end;
/
  1. 在编辑器上单击鼠标右键 window 并关闭替换变量提示,然后 运行 您的匿名块作为单个语句 (F9)。