2013-08-07 1 views
1

Oracle에서 문자열을 특정 API와 호환되는 수정 된 문자열로 변환하려고합니다.Oracle에서 비영 숫자 문자 대체

모든 영숫자를 그대로두고 모든 공백을 + 문자로 바꾸고 모든 특수 문자를 %와 (과) 16 진 코드로 바꿔야합니다.

프로젝트 1 예

: 너트 & 볼트

26 개 + 볼트

프로젝트 + 1 % 3A + 너트 + %가되어야 어떤 방법이 SQL 만 사용하여이 작업을 수행할까요?

+2

"REPLACE"함수 호출을 중첩하는 것 이외의 방법은 모르지만 각 문자 변환에 하나씩 포함됩니다. 'TRANSLATE' 함수는 탄력있게 닫히지 만 한 문자를 다른 한 문자로만 대체 할 수 있습니다. 나는 당신이 사용자 정의 함수를 고수하고 있다고 생각하지만 일단 SQL을 쉽게 호출 할 수있다. –

답변

4

나는 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 호출이 +에 사람들을 변환합니다. 에드 깁스 말했듯이

, 당신은 당신이 적어도 일반 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 - 완료; 오라클의 문서 링크로 많은 일이 발생합니다. 나는 종종 오래된 답변을 다른 사람들이 편집하여 수정하는 것을 보았습니다. 따라서 어떤 사람이든 만나게되면 자유롭게 생각하십시오. –

+0

하나 더 수정. 블록이나 쿼리를 실행하면 입력 리터럴을 묻습니다. 따라서 처음에 "set define off"를 선언하거나 입력 문자열을 === 'Project 1 : Nuts'|| '&'|| '로 수정해야합니다. Bolts '==== – XING

0

apex_util.url_encode가 작동합니다.