1

Oracle の文字列を、特定の API と互換性のある変更された文字列に変換しようとしています。

すべての英数字をそのまま残し、すべてのスペースを + 文字に置き換え、すべての特殊文字を % とその 16 進コードに置き換えたいと思います。

例えば、

プロジェクト 1: 基本事項

なるべき

プロジェクト+1%3A+ナッツ+%26+ボルト

SQLのみを使用してこれを行う方法はありますか?

4

2 に答える 2

4

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 を介して呼び出す場合、クライアントまたはアプリケーションはそれを必要としない場合があります)。

于 2013-08-07T18:43:11.017 に答える
0

apex_util.url_encode が機能するはずです。

于 2016-08-19T09:24:21.543 に答える