2013-08-07 45 views
1

我想将Oracle中的字符串转换为与特定API兼容的修改字符串。在Oracle中替换非字母数字字符

我想保留所有字母数字字符不变,用+字符替换所有空格,并用%加上它们的十六进制代码替换所有特殊字符。

例如,

项目1:螺母&螺栓

应该成为

项目+ 1个%3A +坚果+%26个+螺栓

是否有任何方式只使用SQL来做到这一点?

+2

我不知道嵌套'REPLACE'函数调用的其他方法,每个字符转换一个。 'TRANSLATE'函数非常接近,但它只能用另一个单个字符替换单个字符。我认为你被用户定义的函数困住了,但是一旦你有了一个你可以从SQL调用足够简单的函数。 –

回答

4

我不认为你可以用普通的SQL来达到那里没有嵌套replace调用。你可以用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调用转换那些+

埃德吉布斯说,你可以做一个函数,所以你至少可以把它从普通的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调用)。

+0

你可以修改文档链接吗?它不工作 – XING

+0

@Raj_Te - 完成; Oracle文档链接发生了很多。我经常看到其他人正在修改旧的答案以解决问题,所以如果遇到任何问题,请随时留意。 –

+0

再一次纠正,如果我执行你的块或查询,它会要求输入文字。因此,无论您需要在开始时声明“set define off”还是将输入字符串修改为==='Project 1:Nuts'||'&'||' Bolts'==== – XING

0

apex_util.url_encode应该工作。