sql >> Databáze >  >> RDS >> Oracle

Vyvolání volání funkce v řetězci v proceduře Oracle

Je dostatečně snadné dynamicky spustit řetězec ...

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

Problém nastává tam, kde váš řetězec obsahuje literály, s obávanými uvozovkami ...

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>

Takže musíme uniknout apostrofům, všem, včetně těch, které jste nezahrnuli do svého zveřejněného řetězce:

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>

UPRAVIT

Jen v zájmu spravedlnosti mám pocit, že bych měl zdůraznit, že Tonyho řešení funguje stejně dobře:

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>

Ve skutečnosti, když se vyhnete SELECT na DUAL, je to pravděpodobně lepší.



  1. Aplikace ve stylu průzkumu kolejí - Zobrazit všechny odpovědi na možnost

  2. Plány SQL Server:rozdíl mezi Index Scan / Index Seek

  3. kubernetes timescaledb statefulset:Změny ztracené při rekreaci modulu

  4. Příkaz INSERT je v konfliktu s omezením FOREIGN KEY - SQL Server