Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ओरेकल प्रक्रिया में एक स्ट्रिंग में फ़ंक्शन कॉल को आमंत्रित करना

स्ट्रिंग को गतिशील रूप से निष्पादित करना काफी आसान है ...

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

समस्या तब उत्पन्न होती है जब आपके स्ट्रिंग में खतरनाक उद्धरणों के साथ शाब्दिक होते हैं ...

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>

इसलिए हमें उन सभी धर्मत्यागों से बचना होगा, जिनमें वे भी शामिल हैं जिन्हें आपने अपनी पोस्ट की गई स्ट्रिंग में शामिल नहीं किया है:

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>

संपादित करें

सिर्फ निष्पक्षता के लिए मुझे लगता है कि मुझे यह बताना चाहिए कि टोनी का समाधान ठीक वैसे ही काम करता है:

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>

वास्तव में, DUAL पर SELECT से बचना शायद बेहतर है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. बड़ा .पैच_स्टोरेज

  2. एसक्यूएल डेवलपर 4.1.2

  3. मैं SQL में उद्धरणों से कैसे निपटूं?

  4. पैकेज के भीतर वर्तमान में निष्पादन प्रक्रिया का नाम

  5. wf_java_deferred कतार का पुनर्निर्माण कैसे करें