sql >> Databasteknik >  >> RDS >> Oracle

Anropa ett funktionsanrop i en sträng i en Oracle-procedur

Det är lätt nog att dynamiskt exekvera en sträng ...

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 uppstår när din sträng innehåller bokstavliga ord, med de fruktade citattecken ...

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 måste undkomma apostroferna, alla, inklusive de du inte har inkluderat i din postade sträng:

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>

REDIGERA

Bara för rättvisans skull tycker jag att jag borde påpeka att Tonys lösning fungerar lika bra:

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>

I själva verket, genom att undvika SELECT på DUAL är det förmodligen bättre.



  1. SQL Server LIKE som innehåller hakparenteser

  2. beräkna de flesta användare någonsin online med MySQL

  3. Vad är Oracle Session?

  4. Massinsättning i MYSQL från XML-filer