स्ट्रिंग को गतिशील रूप से निष्पादित करना काफी आसान है ...
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 से बचना शायद बेहतर है।