困扰了自己一个多月的Oracle存储过程由于版本不同的问题,今天花了一整天的时间,终于在下午晚些的时候,解决了,这个问题在本月的绩效考核之中占10%呢,还是很重要的,既然解决了,写下,给大伙做个简单说明。
是这样的,前段时间,由于公司的一个管理信息系统要搞发布会,功能上,老大要求在“销售统计”这块能够加上多条件组合查询的功能,这个功能做好了,真的很好,但是要灵活组合用户的输入的各项条件,再进行数据库的内容筛选,也是不容易以一种简单的方法实现的。在这个上面,,我使用了Servlet做控制条件(开发基于J2EE的MVC模式),oracle存储过程来进行动态sql的处理,里面很多的判断,就不细说了,设计思想是这样的,下面上图:
在开始做开发的时间里,由于方便,使用的是oracle 10g xe,官方的称法叫做oracle 10g特别版,最开始使用就是它方便。再使用pl sql工具来写存储过程,编写、测试,都没问题。到了10月10日那天要发布的时候,从xe把数据库导入企业版的oracle10g中以后,测试发现原来运行正常的页面点击以后,就白了,什么内容都没有,到MyEclipse的console台里查看,报了错,第一眼看过去,应该是存储过程里的动态sql组合不对。第二天,把存储过程组合好的sql输出以后,发现在if…then中的判断根本没做,当时感觉就是判断相等的地方,没有判断到,直到今天都这样认为。
(1)创建oracle数组类型:
drop table choice;
create table choice(
xhidden varchar2(10),
xvalue varchar2(100)
);
drop type XSKF_CHOICE;
drop type XSKF_CHOICE_LST;
create or replace type XSKF_CHOICE as object (
xhidden varchar2(10),
xvalue varchar2(100)
);
create or replace type XSKF_CHOICE_LST as table of XSKF_CHOICE;
(2)在oracle的存储过程中判断字符串是否相等:
— 7. 多条件组合查询
procedure proc_select_multi2(
xskf_lst in xskf_choice_lst , xskf_paixu in varchar2 ,
idStr in varchar2 , splx_paixu in varchar2 ,
spbh_lst in xskf_choice_lst , spbh_paixu in varchar2 ,
fromdate in varchar2 , todate in varchar2 ,
m2_cursor out xskf_cursor
) as
var_sql varchar2(4000);
var_i_paixu number(2) := 0;
— 7.1 销售库房
var_choice1 xskf_choice;
var_sql_like1 varchar2(1000);
var_sql_notlike1 varchar2(1000);
var_sql_lt1 varchar2(1000);
var_sql_gt1 varchar2(1000);
var_sql_lteq1 varchar2(1000);
var_sql_gteq1 varchar2(1000);
var_sql_uneq1 varchar2(1000);
var_sql_eq1 varchar2(1000);
var_hidden1 varchar2(10);
var_value1 varchar2(100);
var_i_xskf1 number(2) := 0; — 控制 商品库房 条件的组合
— ——————————————–
— 7.2 商品类型
— ——————————————–
— 7.3 商品编号
var_choice3 xskf_choice;
var_sql_like3 varchar2(1000);
var_sql_notlike3 varchar2(1000);
var_sql_lt3 varchar2(1000);
var_sql_gt3 varchar2(1000);
var_sql_lteq3 varchar2(1000);
var_sql_gteq3 varchar2(1000);
var_sql_uneq3 varchar2(1000);
var_sql_eq3 varchar2(1000);
var_hidden3 varchar2(10);
var_value3 varchar2(100);
var_i_xskf3 number(2) := 0; — 控制 商品编号 条件的组合
— ——————————————–
begin
var_sql := ‘select s.sr_id as 商品id , mp.re_name as 销售库房 , cl.cc_name as 商品类型 , s.sr_number as 商品编号,s.sr_name as 商品名称, sc.cs_idername as 出库单号, sc.cs_zuser as 主销售员, sc.cs_fuser as 配合销售员, sc.cs_leixing as 销售类型 , sc.cs_invoice as 发票号码 , sc.cs_man1 as 客户名称, ma.ar_name as 客户区域 , s.sr_price1 as 商品进价, sc.cs_price as 商品售价,sc.cs_price – s.sr_price1 as 利润 , sc.cs_intime as 售出时间 from s_storeroom s join s_comclass cl on s.sr_ccid = cl.cc_id join s_comsale sc on s.sr_number = sc.cs_srid join mp_reta mp on mp.re_id = s.sr_reid join c_customerInf ci on ci.ci_id = sc.cs_manid join mp_Area ma on ma.ar_id = ci.ci_arid where 1=1’;
— 1. 销售库房 组合查询字符串
for i in 1..xskf_lst.count loop
–取得choice各列的值
var_choice1 := xskf_lst(i);
var_hidden1 := xskf_lst(i).xhidden;
var_value1 := xskf_lst(i).xvalue;
–添加筛选条件
–where 1=1 and cl.cc_id in (212,244,245,246,247,248,249,243,213,250,251,252,253,254,255,256,257,258,214,215,210) and mp.re_name like ‘%门%’ and s.sr_number like ‘%sp%’ and s.sr_name like ‘%宏%’ and sc.cs_idername like ‘%2%’ and (sc.cs_zuser like ‘%朱%’ or sc.cs_fuser like ‘%江%’) and sc.cs_leixing like ‘%不%’ and sc.cs_invoice like ‘%3%’ and sc.cs_man1 like ‘%科%’ and ma.ar_name like ‘%川%’
if 0 = var_i_xskf1 then
–第一个条件
if var_hidden1 = ‘like’ then
var_sql_like1 := ‘ and (mp.re_name like ”%’|| var_value1 ||’%”’;
end if;
if var_hidden1 = ‘not like’ then
— 第一个 not like
var_sql_notlike1 := ‘ and (mp.re_name not like ”%’|| var_value1 ||’%”’;
end if;
if var_hidden1=’=’ then
— 第一个 =
var_sql_eq1 := ‘ and (mp.re_name = ”’|| var_value1 ||””;
end if;
if var_hidden1 = ‘>’ then
— 第一个 >
var_sql_gt1 := ‘ and (mp.re_name > ”’|| var_value1 ||””;
end if;
if var_hidden1 = ‘<' then
— 第一个 <
var_sql_lt1 := ‘ and (mp.re_name < '''|| var_value1 ||'''';
end if;
if var_hidden1 = ‘>=’ then
var_sql_gteq1 := ‘ and (mp.re_name >= ”’|| var_value1 ||””;
end if;
if var_hidden1 = ‘<=' then
var_sql_lteq1 := ‘ and (mp.re_name <= '''|| var_value1 ||'''';
end if;
if var_hidden1 = ” then
var_sql_uneq1 := ‘ and (mp.re_name ”’|| var_value1 ||””;
end if;
else
— 多于一个条件
if var_hidden1 = ‘like’ then
var_sql_like1 := var_sql_like1 || ‘ or mp.re_name like ”%’|| var_value1 ||’%”’;
end if;
if var_hidden1 = ‘not like’ then
— 第一个 not like
var_sql_notlike1 := var_sql_notlike1 || ‘ or mp.re_name not like ”%’|| var_value1 ||’%”’;
end if;
if var_hidden1=’=’ then
— 第一个 =
var_sql_eq1 := var_sql_eq1 || ‘ or mp.re_name = ”’|| var_value1 ||””;
end if;
if var_hidden1 = ‘>’ then
— 第一个 >
var_sql_gt1 := var_sql_gt1 || ‘ or mp.re_name > ”’|| var_value1 ||””;
end if;
if var_hidden1 = ‘<' then
— 第一个 <
var_sql_lt1 := var_sql_lt1 || ‘ or mp.re_name < '''|| var_value1 ||'''';
end if;
if var_hidden1 = ‘>=’ then
var_sql_gteq1 := var_sql_gteq1 || ‘ or mp.re_name >= ”’|| var_value1 ||””;
end if;
if var_hidden1 = ‘<=' then
var_sql_lteq1 := var_sql_lteq1 || ‘ or mp.re_name <= '''|| var_value1 ||'''';
end if;
if var_hidden1 = ” then
var_sql_uneq1 := var_sql_uneq1 || ‘ or mp.re_name ”’|| var_value1 ||””;
end if;
end if;
var_sql := var_sql || var_sql_like1 || var_sql_notlike1 || var_sql_lt1 || var_sql_gt1 || var_sql_lteq1 || var_sql_gteq1 || var_sql_uneq1 || var_sql_eq1;
var_i_xskf1 := var_i_xskf1 + 1;
end loop;
if var_i_xskf1 > 0 then
— 存在筛选条件,在筛选条件最后添加 ‘ ) ‘ , 结束
var_sql := var_sql || ‘)’;
end if;