最近在将项目的数据库改成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来执行。
这是我写的一个