关于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=(传入的东西)?是这样么??
求大神啊!!

参考技术A procedure proc_test(
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函数参数的问题

sql 存储过程如何动态拼接where后面的条件

Oracle [存储过程] 执行动态拼接SQL语句并返回结果??

PL_sql如何执行oracle存储过程

存储过程拼接了两个sql,如何执行;

oracle 存储过程sql语句