问题描述
嗨,
我正在尝试编写一个函数,该函数将接受算术运算符 (例如: mod(100,10)) 作为输入,结果将来自输入算术运算
-----
声明
l_retval varchar2(200);
函数算术运算 (p _ 属性14 varchar2,
P _ val编号)
返回varchar2
是
l_final_val varchar2(200);
l_str varchar2(20);
l_tst varchar2(100);
开始
如果p_attribute14不为空,而p_val不为空
然后
l_str := 替换 (p_attribute14,'结果',p_val);
dbms_output.put_line(l_str);
l_final_val := '从对偶中选择: l_str';
使用l_str立即执行l_final_val到l_tst;
返回l_tst;
如果结束;
结束算术运算;
开始
l_retval := arith_oper('mod (结果,10)',100);
dbms_output.put_line(l_retval);
结束;
---
我期望它应该给出0作为输出,但它给出了mod(100,10)
请建议
我正在尝试编写一个函数,该函数将接受算术运算符 (例如: mod(100,10)) 作为输入,结果将来自输入算术运算
-----
声明
l_retval varchar2(200);
函数算术运算 (p _ 属性14 varchar2,
P _ val编号)
返回varchar2
是
l_final_val varchar2(200);
l_str varchar2(20);
l_tst varchar2(100);
开始
如果p_attribute14不为空,而p_val不为空
然后
l_str := 替换 (p_attribute14,'结果',p_val);
dbms_output.put_line(l_str);
l_final_val := '从对偶中选择: l_str';
使用l_str立即执行l_final_val到l_tst;
返回l_tst;
如果结束;
结束算术运算;
开始
l_retval := arith_oper('mod (结果,10)',100);
dbms_output.put_line(l_retval);
结束;
---
我期望它应该给出0作为输出,但它给出了mod(100,10)
请建议
专家解答
您不能将函数作为绑定变量传递!Oracle数据库将其视为字符串 “mod(100,10)”,而不是函数。
执行此操作,您必须将函数连接到SQL字符串中:
但是要注意: 编写一个过程来接受和执行任何函数都是一些讨厌的SQL注入的秘诀...
执行此操作,您必须将函数连接到SQL字符串中:
create or replace function arith_oper (
p_attribute14 varchar2,
p_val number )
return varchar2
is
l_final_val varchar2 ( 200 ) ;
l_str varchar2 ( 20 ) ;
l_tst varchar2 ( 100 ) ;
begin
if p_attribute14 is not null and p_val is not null then
l_str := replace ( p_attribute14,'RESULT',p_val ) ;
dbms_output.put_line ( l_str ) ;
l_final_val := 'select ' || l_str || ' from dual';
execute immediate l_final_val into l_tst;
return l_tst;
end if;
end arith_oper;
/
declare
l_retval varchar2(100);
begin
l_retval := arith_oper ( 'mod(RESULT,10)',100 ) ;
dbms_output.put_line ( l_retval ) ;
end;
/
PL/SQL procedure successfully completed.
mod(100,10)
0
但是要注意: 编写一个过程来接受和执行任何函数都是一些讨厌的SQL注入的秘诀...
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




