暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 动态SQL执行函数

askTom 2017-02-22
266

问题描述

嗨,

我正在尝试编写一个函数,该函数将接受算术运算符 (例如: 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字符串中:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论