为什么80%的码农都做不了架构师?>>>
这个方案要点在于以下三点:
1, 每次拼接条件时,都把条件对应的变量值塞入嵌套表中。因为是一一对应的,因此在取变量值时,很容易就匹配上。
2, 因为绑定变量执行时,using一定要把所有的绑定变量值都列出来。因此最后,最后会有一个case语句,根据变量个数来确定执行那个分支。
3, 嵌套表的类型是字符类型的。因此要获取日期类型和数字类型值时,记得加上to_date 和to_number转换。
如果对用例有疑问,可是随时找我沟通。同时也请汪文娟同学督促各开发分组接口人向分组内宣导,以后新上线的sql,尽量使用绑定变量。谢谢
Ps:例子中分别有对number和date类型值的处理。
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);