sql >> Database teknologi >  >> RDS >> Oracle

Aktivering af et funktionskald i en streng i en Oracle-procedure

Det er nemt nok dynamisk at udføre en streng ...

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

Problemet opstår, hvor din streng indeholder bogstaver, med de frygtede citater ...

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>

Så vi er nødt til at undslippe apostroferne, dem alle, inklusive dem, du ikke har inkluderet i din postede streng:

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>

REDIGER

For retfærdighedens skyld føler jeg, at jeg skal påpege, at Tonys løsning fungerer lige så godt:

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>

Faktisk er det nok bedre ved at undgå SELECT på DUAL.



  1. SQL Server:Hvad er batching-sætninger (dvs. brug af GO) gode til?

  2. SQL server 2008 - funktioner til justering af ydeevne til indsættelse af store mængder data

  3. Brug af CASE-udtryk i SQL Server

  4. mysql flytte række mellem tabeller