Oracle の文字列を、特定の API と互換性のある変更された文字列に変換しようとしています。
すべての英数字をそのまま残し、すべてのスペースを + 文字に置き換え、すべての特殊文字を % とその 16 進コードに置き換えたいと思います。
例えば、
プロジェクト 1: 基本事項
なるべき
プロジェクト+1%3A+ナッツ+%26+ボルト
SQLのみを使用してこれを行う方法はありますか?
replace
ネストされた呼び出しがなければ、単純な SQL ではそこに到達できないと思います。utl_url.escape()
functionを使用してサンプル値を取得できますが、2 番目のパラメーターを渡す必要があり、これはブール値であるため、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 を介して呼び出す場合、クライアントまたはアプリケーションはそれを必要としない場合があります)。
apex_util.url_encode が機能するはずです。