Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Memanggil panggilan fungsi dalam string dalam Prosedur Oracle

Cukup mudah untuk mengeksekusi string secara dinamis ...

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;
/

Masalah muncul di mana string Anda berisi literal, dengan tanda kutip yang ditakuti ...

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>

Jadi kita harus menghindari apostrof, semuanya, termasuk yang belum Anda sertakan dalam string yang Anda posting:

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>

EDIT

Demi keadilan, saya rasa saya harus menunjukkan bahwa solusi Tony bekerja dengan baik:

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>

Bahkan, dengan menghindari SELECT pada DUAL mungkin lebih baik.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ambil catatan dari kolom tertentu di Oracle

  2. INSERT Performance - Bitmap vs B-Tree

  3. Bagaimana saya bisa mengekstrak file dari bidang Oracle BLOB?

  4. Oracle Entity Framework - Hasilkan Entitas Dari Tabel dalam Skema Berbeda

  5. Cara membagi satu kolom menjadi beberapa kolom