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

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

WBOY
WBOYOriginal
2016-06-07 16:58:531466browse

在开始做开发的时间里,由于方便,使用的是oracle 10g xe,官方的称法叫做oracle 10g特别版,最开始使用就是它方便。再使用p

    困扰了自己一个多月的Oracle存储过程由于版本不同的问题,今天花了一整天的时间,终于在下午晚些的时候,解决了,这个问题在本月的绩效考核之中占10%呢,还是很重要的,既然解决了,写下,给大伙做个简单说明。

    是这样的,前段时间,由于公司的一个管理信息系统要搞发布会,功能上,老大要求在“销售统计”这块能够加上多条件组合查询的功能,这个功能做好了,真的很好,但是要灵活组合用户的输入的各项条件,再进行数据库的内容筛选,也是不容易以一种简单的方法实现的。在这个上面,,我使用了Servlet做控制条件(开发基于J2EE的MVC模式),oracle存储过程来进行动态sql的处理,里面很多的判断,就不细说了,设计思想是这样的,下面上图:

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

    在开始做开发的时间里,由于方便,使用的是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 = '                    -- 第一个                     var_sql_lt1 := ' and (mp.re_name             end if;
            if var_hidden1 = '>=' then
                    var_sql_gteq1 := ' and (mp.re_name >= '''|| var_value1 ||'''';
            end if;
            if var_hidden1 = '                   var_sql_lteq1 := ' and (mp.re_name             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 = '                    -- 第一个                     var_sql_lt1 := var_sql_lt1 || ' or mp.re_name             end if;
            if var_hidden1 = '>=' then
                    var_sql_gteq1 := var_sql_gteq1 || ' or mp.re_name >= '''|| var_value1 ||'''';
            end if;
            if var_hidden1 = '                   var_sql_lteq1 := var_sql_lteq1 || ' or mp.re_name             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;

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn