我认为如果没有嵌套的replace 调用,您就无法使用纯 SQL 到达那里。您可以使用utl_url.escape() function 获取示例值,但是因为您必须向它传递第二个参数并且这是一个布尔值,所以您必须在 PL/SQL 块中进行:
set define off
begin
dbms_output.put_line(replace(utl_url.escape('Project 1: Nuts & Bolts', true),
'%20', '+'));
end;
/
Project+1%3A+Nuts+%26+Bolts
url_utl.escape 函数将空格转换为%20:
Project%201%3A%20Nuts%20%26%20Bolts
...单个replace 调用将它们转换为+。
正如 Ed Gibbs 所说,您可以将其设为一个函数,这样您至少可以从普通 SQL 中调用它:
create or replace function my_escape(str in varchar2) return varchar2 is
begin
return replace(utl_url.escape(str, true), '%20', '+');
end;
/
set define off
select my_escape('Project 1: Nuts & Bolts') from dual;
MY_ESCAPE('PROJECT1:NUTS&BOLTS')
--------------------------------
Project+1%3A+Nuts+%26+Bolts
您可能需要检查合法和保留字符列表,看看是否还有其他需要特殊处理的内容。
(我已使用set define off 阻止我的客户端将 & 符号视为替换变量;您的客户端或应用程序可能不需要它,例如,如果通过 JDBC 调用)。