2

Oracle 10g を使用してアプリケーションを作成しています。

私は現在この問題に直面しています。型 varchar2 のパラメーターとして「filename」を取り込みます。

filename に含まれるサンプル値は次のとおりです。to_char(sysdate, 'DDD')'.

手順では、このファイル名の値を TEST147 のように取得したいと考えています。私が書くとき:

select filename
into ffilename
from dual;

値 ffilename = TEST || を取得します。to_char(sysdate, 'DDD') は理にかなっています。しかし、どうすればこの問題を回避し、文字列値で関数を呼び出すことができますか?

助けていただければ幸いです。ありがとう。

4

2 に答える 2

5

この例の文字列値は無効な式です。' TEST ' || to_char(sysdate、'DDD')

これを実行できることを評価するには:

execute immediate 'begin :result := ' || filename || '; end;'
  using out v_string;

v_stringには「TEST147」が含まれます。

于 2010-05-27T08:13:57.443 に答える
4

文字列を動的に実行するのは簡単です...

create or replace function fmt_fname (p_dyn_string in varchar2)
    return varchar2
is
    return_value varchar2(128);
begin
    execute immediate 'select '||p_dyn_string||' from dual'
        into return_value;
    return  return_value;
end fmt_fname;
/

文字列に恐ろしい引用符が付いたリテラルが含まれている場合に問題が発生します...

SQL> select fmt_fname('TEST||to_char(sysdate, 'DDD')') from dual
  2  /
select fmt_fname('TEST||to_char(sysdate, 'DDD')') from dual
                                          *
ERROR at line 1:
ORA-00907: missing right parenthesis


SQL>

したがって、投稿された文字列に含まれていないものを含め、すべてのアポストロフィをエスケープする必要があります。

SQL> select * from t34
  2  /

        ID FILENAME
---------- ------------------------------
         1 APC001
         2 XYZ213
         3 TEST147


SQL> select * from t34
  2  where filename = fmt_fname('''TEST''||to_char(sysdate, ''DDD'')')
  3  /

        ID FILENAME
---------- ------------------------------
         3 TEST147

SQL>

編集

公平を期すために、Tonyのソリューションも同様に機能することを指摘しておく必要があります。

SQL> create or replace function fmt_fname (p_dyn_string in varchar2)
  2      return varchar2
  3  is
  4      return_value varchar2(128);
  5  begin
  6      execute immediate 'begin :result := ' || p_dyn_string || '; end;'
  7          using out return_value;
  8      return  return_value;
  9  end;
 10  /

Function created.

SQL> select fmt_fname('''TEST''||to_char(sysdate, ''DDD'')') from dual
  2  /

FMT_FNAME('''TEST''||TO_CHAR(SYSDATE,''DDD'')')
--------------------------------------------------------------------------------
TEST147

SQL>

実際、DUALでSELECTを回避することで、おそらくより良い結果が得られます。

于 2010-05-27T12:01:43.447 に答える