Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wywoływanie wywołania funkcji w łańcuchu w procedurze Oracle

Wystarczająco łatwo jest dynamicznie wykonać ciąg znaków...

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

Problem pojawia się, gdy twój ciąg zawiera literały, z przerażającymi cudzysłowami ...

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>

Musimy więc uciec przed apostrofami, wszystkimi, łącznie z tymi, których nie umieściłeś w przesłanym ciągu:

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>

EDYTUJ

W trosce o uczciwość uważam, że powinienem zaznaczyć, że rozwiązanie Tony'ego działa równie dobrze:

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>

W rzeczywistości, unikając SELECT na DUAL, prawdopodobnie jest lepiej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:tabela mutuje

  2. Wiele wierszy wartości w jednym wierszu

  3. naruszono ograniczenia loadera podczas łączenia klasy javax/xml/namespace/QName z aplikacji webowej na Oracle 10g

  4. Czy mogę przechowywać ciąg binarny w kolumnie CLOB?

  5. Uzyskaj liczbę wszystkich tabel w schemacie