本帖最后由 pzhwfl 于 2011-08-26 09:35:27 编辑

解决方案 »

  1.   

    没太看明白:
    1、这句话“满足以上2个条件的结果集被查询出来”,什么意思?哪2个条件?不是2个条件吧?
    2、调用时传的参数null,'10045',null,'01-7月 -10',null,null,和表里的字段怎么对应?谁是谁?
    3、你想返回什么内容?
      

  2.   


    --用不着存储过程
     SELECT TOPICD,
            COMMNAME,
            TIMEBEGIN,
            TIMEEND,
            MARKMONEY,
            ADDRESS
      FROM( SELECT  CASE WHEN TOPICD    IS NULL        THEN 1 ELSE 0 END C1,
                    CASE WHEN COMMNAME  = '10045'      THEN 1 ELSE 0 END C2,
                    CASE WHEN TIMEBEGIN IS NULL        THEN 1 ELSE 0 END C3,
                    CASE WHEN TIMEEND   = '01-7月 -10' THEN 1 ELSE 0 END C4,
                    CASE WHEN MARKMONEY IS NULL        THEN 1 ELSE 0 END C5,
                    CASE WHEN ADDRESS   IS NULL        THEN 1 ELSE 0 END C6,
                    TOPICD,
                    COMMNAME,
                    TIMEBEGIN,
                    TIMEEND,
                    MARKMONEY,
                    ADDRESS
              FROM TABLE_NAME)
      WHERE C1+C2+C3+C4+C5+C6 = 2;
      

  3.   

    2楼,SQL很强大,不过,感觉楼主好像是想研究存储过程。
    楼主:如果SQL好用的话,你还要用存储过程实现么?
      

  4.   


    可能写的乱了,是这个意思
     下面那个表中的列和查询语句et_query(...)中的6个参数一一对应。“满足以上2个条件”是我假设我的查询方式是et_query('a','b',null,null,null,null),要查询的就是
    select topic,commname from 表XX
    where topic = 'a'
    and   commname = 'b';  的意思抱歉描述的乱了
      

  5.   

    唉  要求用procedure  去做   可能就是要我们弄清其中关系
    昨天想了一晚上也没弄懂
      

  6.   

    那就把我的sql融入到你的存储过程就可以了。
    sql写出来了,存储过程还难么。  CREATE OR REPLACE PROCEDURE et_query(
        参数1 IN 类型,
        参数2 IN 类型,
        参数3 IN 类型,
        参数4 IN 类型,
        参数5 IN 类型,
        参数6 IN 类型,
        参数7 OUT = SYS_REFCURSOR =
      )AS 
      BEGIN
        OPEN 参数7 FOR
          SELECT TOPICD,
                  COMMNAME,
                  TIMEBEGIN,
                  TIMEEND,
                  MARKMONEY,
                  ADDRESS
            FROM( SELECT  CASE WHEN NVL(TOPICD,0)    = NVL(参数1,0)           THEN 1 ELSE 0 END C1,
                          CASE WHEN NVL(COMMNAME,0)  = NVL(参数2,0)           THEN 1 ELSE 0 END C2,
                          CASE WHEN NVL(TIMEBEGIN,0) = NVL(参数3,0)           THEN 1 ELSE 0 END C3,
                          CASE WHEN NVL(TIMEEND,SYSDATE)= NVL(参数4,SYSDATE)  THEN 1 ELSE 0 END C4,
                          CASE WHEN NVL(MARKMONEY,0) = NVL(参数5,0)           THEN 1 ELSE 0 END C5,
                          CASE WHEN NVL(ADDRESS,0)   = NVL(参数6,0)           THEN 1 ELSE 0 END C6,
                          TOPICD,
                          COMMNAME,
                          TIMEBEGIN,
                          TIMEEND,
                          MARKMONEY,
                          ADDRESS
                    FROM TABLE_NAME)
            WHERE C1+C2+C3+C4+C5+C6 = 2;
     
     END;
      

  7.   

    其是我的意思很简单,就是传入几个参数,在表中找到等于参数值的结果
    例如:
    1 我传入参数
    begin
    et_query('a','b','c','d','e','f');
    end;
    (这是符合6个参数的查询)2 就相当于select 列1,列2,列3...,列 6 from 表
    where 列1 = 'a'
    and   列2 = 'b'
    ...
    and   列6 = 'f' ;
      

  8.   


    --更正个地方
    --参数7 OUT = SYS_REFCURSOR = 不知道咋的多了俩等于号 去掉
    参数7 OUT   SYS_REFCURSOR--另外说一句 下面这个条件就是同时只满足俩条件, 改成 >=2 就是同时满足2个以上条件
    --改成 =3 就是同时满足3个条件 其余的不用解释了吧。WHERE C1+C2+C3+C4+C5+C6 = 2;
      

  9.   


    明白了  谢谢! 拿回去慢慢研究  
    感谢BenChi 和 yixilan 的热心回复,不过我估计yixilan 现在还没弄懂我的意思,不过非常感谢  :)
     
      

  10.   


    --我只写了三个参数,你有几个就写个,与之对应的if判断加上就可以了
    create or replace procedure sp_test
    (
       i_param1 in varchar2,
       i_param2 in varchar2,
       i_param3 in varchar2,
       o_ret out sys_refcursor
    ) as
      strsql varchar2(4000);
    begin
       strsql := 'select * from table where 1=1 ';
       
       if i_param1 is not null then
          strsql := strsql || ' and param1=''' || i_param1 || ''' ';;
       end if;
      
       if i_param2 is not null then
          strsql := strsql || ' and param2=''' || i_param1 || ''' ';;
       end if;
       
       if i_param3 is not null then
          strsql := strsql || ' and param3=''' || i_param1 || ''' ';;
       end if; 
       
       open o_ret for strsql;
    end;
      

  11.   

    THX VERY MUCH   
    不过我结贴了  不能给分了 - -||   SOR..