为 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;
/
- 在编辑器上单击鼠标右键 window 并关闭替换变量提示,然后 运行 您的匿名块作为单个语句 (F9)。
我们正在将 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;
/
- 在编辑器上单击鼠标右键 window 并关闭替换变量提示,然后 运行 您的匿名块作为单个语句 (F9)。