sql >> データベース >  >> RDS >> Oracle

Oracleプロシージャの文字列で関数呼び出しを呼び出す

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

    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>
    

    編集

    公平を期すために、トニーのソリューションも同様に機能することを指摘する必要があると思います。

    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を回避することで、おそらくより良いでしょう。



    1. Active_support /dependencies.rb:247 `require':そのようなファイルをロードできません-2.1 / pg_ext(LoadError)

    2. R12.1.3で同時リクエストを送信する際の配信オプション

    3. Pythonpsycopg2タイムアウト

    4. プリペアドステートメントの結果をテーブルとしてmysqlに保存しますか?