sql >> Database >  >> RDS >> Oracle

Een functieaanroep aanroepen in een string in een Oracle Procedure

Het is eenvoudig genoeg om een ​​string dynamisch uit te voeren ...

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

Het probleem doet zich voor waar uw string letterlijke waarden bevat, met de gevreesde aanhalingstekens ...

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>

We moeten dus ontsnappen aan de apostrofs, allemaal, inclusief degene die je niet hebt opgenomen in je geposte string:

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>

BEWERKEN

Eerlijkheidshalve moet ik erop wijzen dat Tony's oplossing net zo goed werkt:

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>

In feite is het waarschijnlijk beter om de SELECT op DUAL te vermijden.



  1. ORA-01653:kan tabel niet uitbreiden met in tabelruimte ORA-06512

  2. datum verschil, inclusief tijd

  3. recursieve zelfquery

  4. Waarom is deze Django (1.6) annotatietelling zo traag?