Oracle通过struct传入varchar2参数为null的解决办法


    困扰了自己一个多月的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;

  • 1
  • 2
  • 下一页

相关内容