這是很容易的動態執行字符串...
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的選擇它可能是更好的。
來源
2010-05-27 12:01:43
APC
通過SQL執行未經驗證的用戶輸入可能會導致SQL注入攻擊。使用SELECT至少可以提供一些保護,因爲它限制了函數的功能。允許PL/SQL注入會導致各種問題。 – 2010-05-27 23:40:34