SQL 绑定变量优化

为什么80%的码农都做不了架构师?>>>   hot3.png

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

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;

/



open re_cursor for sql_statement using tab_con(1), tab_con(2);

转载于:https://my.oschina.net/thc/blog/528746

你可能感兴趣的:(SQL 绑定变量优化)