关于oracle存储过程中的sql拼接,大神进!!!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于oracle存储过程中的sql拼接,大神进!!!相关的知识,希望对你有一定的参考价值。
oracle中有个package,package里有个procedure:
procedure proc_test(
in_id in varchar2,
out_sum out varchar2
) as
begin
select count(*) into out_sum from table_name where id = ‘’||in_id||‘’;
end
当in_id传入' or 1=1--或者' or '1'='1时,都不会发生sql注入,这是为啥啊??是因为in_id作为一个整体去跟id做比较么?无论传入什么,都是where id=(传入的东西)?是这样么??
求大神啊!!
in_id in varchar2,
out_sum out varchar2
) as
begin
execute immediate 'select count(*) from table_name '||in_id into out_sum;
end;
/
sqlplus里调用时:
var out_sum varchar2(10)
exec package_name.proc_test('where id=''XXX'' or 1=1',:out_sum)
print out_sum追问
像我那样写不会发生注入 是么?
追答不会,因为你的sql条件会随着参数改变条件,是动态的,所以得用动态sql,动态sql方法多,这只是其中的一种
本回答被提问者采纳如何在oracle存储过程中执行动态sql语句
给你一个案例对这些,使用execute immediate就可以了,存储过程和语句块也是一样的,自己改一改,没区别的。
EXECUTE IMMEDIATE dynamic_string
[INTO define_variable[, define_variable]... | record]
[USING [IN | OUT | IN OUT] bind_argument [, [IN | OUT | IN OUT] bind_argument]...]
[RETURNING | RETURN INTO bind_argument[, bind_argument]...];
1, 操作 DDL语句,这也是动态 SQL的常用操作之一
如下所示使用动态 SQL创建 数据库表:
DECLARE
l_dync_sql VARCHAR2(100);
BEGIN
l_dync_sql := \'CREATE TABLE cux_dync_test(id NUMBER, creation_date DATE)\';
EXECUTE IMMEDIATE l_dync_sql;
END;
2,操作 DML语句,使用 USING子句可以按照顺序将输入的值绑定到变量,如果动 态SQL只有单行输出的话可以直接使用 INTO来接收输出值,如下所示。
DECLARE
l_dync_sql VARCHAR2(100);
l_person_name VARCHAR2(140);
l_age NUMBER;
BEGIN
l_dync_sql := \'SELECT person_name, age FROM cux_cursor_test WHERE person_id = :1\';
EXECUTE IMMEDIATE l_dync_sql
INTO l_person_name, l_age -- 使用into语句接手动态SQL的输出,如果输出多行则出错
USING 101; -- 给绑定变量赋值
dbms_output.put_line(\'Person Name: \' || l_person_name);
dbms_output.put_line(\'Age: \' || l_age);
END; 参考技术A CREATE OR REPLACE Procedure UP_ExecSqlProcForDS(strSql In Varchar2,cur_out Out sys_refcursor)AsBeginOpen cur_out ForstrSql;End;
以上是关于关于oracle存储过程中的sql拼接,大神进!!!的主要内容,如果未能解决你的问题,请参考以下文章
java调用oracle存储过程 关于sql里面in函数参数的问题