码迷,mamicode.com
首页 > 数据库 > 详细

SQL 绑定变量优化

时间:2015-11-11 10:10:26      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:

这个方案要点在于以下三点:

1,  每次拼接条件时,都把条件对应的变量值塞入嵌套表中。因为是一一对应的,因此在取变量值时,很容易就匹配上。

2,  因为绑定变量执行时,using一定要把所有的绑定变量值都列出来。因此最后,最后会有一个case语句,根据变量个数来确定执行那个分支。

3,  嵌套表的类型是字符类型的。因此要获取日期类型和数字类型值时,记得加上to_date to_number转换。

如果对用例有疑问,可是随时找我沟通。同时也请汪文娟同学督促各开发分组接口人向分组内宣导,以后新上线的sql,尽量使用绑定变量。谢谢

 

Ps:例子中分别有对numberdate类型值的处理。

 

create or replace procedure p_anycon(p_id number,p_name varchar2,p_date varchar2)

is

l_total number := 0;

l_obj_id number :=p_id;

l_obj_name varchar(30) :=p_name;

l_dt  varchar2(30):=p_date;

l_cnt number := 0;

l_sql varchar2(1000) := ‘ select/*+linzy799*/ count(owner) cnt  from t_obj11 where 1=1‘;

type tab_var_type is table of varchar2(60) index by  Pls_Integer;

  tab_con tab_var_type;

begin

if (l_obj_id is not null) then

   l_cnt := l_cnt+1;

   tab_con(l_cnt) := l_obj_id;

   --拼出占位符,这样不需要记住到了第几个占位,相当于 ‘ and object_id = to_number(:B1) ‘

   l_sql := l_sql||‘ and object_id = to_number(:B‘||l_cnt||‘) ‘;

end if;

 

 if ( l_obj_name is not null) then

   l_cnt := l_cnt+1;

   tab_con(l_cnt) := l_obj_name;

   --相当于拼接and object_name = :B2

    l_sql := l_sql||‘ and object_name = :B‘||l_cnt;

end if;

 

 if ( l_dt is not null) then

---这里实际上是对两个date 绑定变量进行赋值。

   l_cnt := l_cnt+1;

   tab_con(l_cnt) := l_dt;

   l_sql := l_sql||‘ and created between to_date(:B‘||l_cnt||‘,‘‘yyyy-mm-dd hh24:mi:ss‘‘) ‘;

  

   l_cnt := l_cnt+1;

   tab_con(l_cnt) := l_dt;

   l_sql := l_sql||‘ and to_date(:B‘||l_cnt||‘,‘‘yyyy-mm-dd hh24:mi:ss‘‘)+1  ‘;

end if;

case when l_cnt = 0  then

          execute immediate l_sql into l_total;

      when l_cnt = 1  then

          execute immediate l_sql into l_total using tab_con(1);

      when l_cnt = 2  then

          execute immediate l_sql into l_total using tab_con(1), tab_con(2);

      when l_cnt = 3  then

          execute immediate l_sql into l_total using tab_con(1), tab_con(2), tab_con(3);

      when l_cnt = 4  then

          execute immediate l_sql into l_total using tab_con(1), tab_con(2), tab_con(3), tab_con(4);

      else

          dbms_output.put_line(‘undefind bind parameters!‘);

end case;

end;

/


SQL 绑定变量优化

标签:

原文地址:http://my.oschina.net/thc/blog/528746

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!