Oracle execute immediate 拼接条件 参数化

在将项目数据库切换到Oracle的过程中,了解到execute immediate用于动态执行SQL。文章指出,为防止SQL注入,不应直接拼接参数值,而应采用参数化的方式。文中提供了一个存储过程示例,旨在帮助Oracle初学者理解如何安全地使用execute immediate。
摘要由CSDN通过智能技术生成

最近在将项目的数据库改成Oracle,本人对Oracle也是一无所知,边做边摸索。

在使用 execute immediate 动态执行SQL分页,发现网上很多例子都是通过参数值直接拼接成SQL来执行。

对于Oracle新手来说,好像Oracle没有类似 SQLServer exec sp_executesql 参数化查询这样的功能。

例如:

declare
  p_accountnum  varchar2(100);
  p_groupid     integer;
  p_recordcount integer;
  p_select      varchar2(500);
begin
  p_accountnum := 'gh_xxxxxxxxx';
  p_groupid    := 109;
  p_select     := 'select count(*) from wxuser where 1=1 and accountnum =''' ||  p_accountnum || ''' and groupid =' || p_groupid;
  execute immediate p_select into p_recordcount;
  dbms_output.put_line(p_recordcount);
end;

这样很明显的一样问题,如果参数p_accountnum存在SQL特殊字符,就会出现SQL注入了。当然你也可以在项目程序中对SQL特殊字符进行过滤。

但有时候在写程序中,可能因各种不小心会忘记对SQL特殊字符过滤,所以最可靠的办法就是直接将值参数化,不通过参数值直接拼接成SQL来执行。

这是我写的一个

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值