我想写一个存储过程
有a,b,c几个变量
语句  :
 select * from tablename where d >a and d <b;我想把上面语句中的 "d>a and d<b" 放入一个字符串变量strwhere中,也就是写成这样:select * from tablename where strwhere;请问这个strwhere怎么给它赋值呢?

解决方案 »

  1.   

    补充一点,就是当变量a,b,c不空的时候才放入变量字符串中,空的话就不考虑。
    楼上的能否具体一点!
      

  2.   

    to yjdn(文刀无尽) 这个在存储过程里面有没有办法实现呢?我这个是必须放到存储过程里面的》
    在程序里面我知道怎么写!
      

  3.   

    对啊!可是我不知道怎么给它赋值,这样赋值对吗?
    if a is not null then
    strwhere ='and d>a';
    end if
    if b is not null then
    strwhere ='and d<b';
    end if
    selecl * from tablename where 1=1 strwhere ;我这样写哪里错了?
      

  4.   

    我写了存储过程麻烦你看一下:                            AS
      
      m_begintime varchar2(36);
      m_endtime varchar2(36);
      m_proid number(5);
      m_serid varchar2(36);
      m_usernum varchar2(21);
      m_notes number(5);
      m_serprovide number(5);
      
      cursor c1 IS select * from platform.tblselcondition;
      
      strwhere1 varchar2(256);
      strwhere2 varchar2(256);
      
      m_upnum varchar2(256);
    BEGIN    OPEN c1;
        LOOP
        FETCH c1 into m_begintime,m_endtime,m_proid,m_serid,m_usernum,m_notes,m_serprovide;
        EXIT WHEN c1%NOTFOUND;
        END LOOP;
        
        close c1;
        --DBMS_OUTPUT.PUT_LINE(m_serid);
        
        IF m_begintime is not null THEN
           strwhere1:='Recvdate > m_begintime';
           strwhere2:='sendtime > m_begintime';
        END IF;
        
        IF m_endtime is not null THEN
           strwhere1:='AND Recvdate < m_endtime';
           strwhere2:='AND sendtime < m_endtime';
        END IF; 
         
        IF m_serid is not null then
            strwhere1:='AND ServiceID = m_serid';
            strwhere2:='AND ServiceID = m_serid';
            DBMS_OUTPUT.PUT_LINE(m_serid);
        END IF;
        
        IF m_usernum is not null then
            strwhere1:='AND SrcTerminalID = m_usernum';
            strwhere2:='AND DestTerminalID = m_usernum';
            
        END IF;
        
        DBMS_OUTPUT.PUT_LINE(strwhere1);
        
        IF m_serprovide = 0 then
             execute immediate 'select count(1) from synrecvsmscm where 1=1 strwhere1'return into m_upnum;
             
        END IF;
        DBMS_OUTPUT.PUT_LINE(m_upnum);
    End;编译时没错,执行的时候报错!
      

  5.   

    execute immediate 'select count(1) from synrecvsmscm where 1=1 strwhere1'return into m_upnum;--这一句,你strwhere1不是一个变量吗?怎么放到字符串里去了?
    应该是
          execute immediate 'select count(1) from synrecvsmscm where 1=1 '||strwhere1return into m_upnum;
      

  6.   

    谢谢了!
    可是我发现这样写 strwhere1 的值只是最后面的那一个,而上面符合条件的连接不起来啊!
    赋值语句应怎么写才能连在一起呢?
      

  7.   

    我连了,可是又报错了 
    execute immediate 'select count(1) from synrecvsmscm where 1=1 '||strwhere1return into m_upnum;invalid column name我检查了列名不会错的,我换成count(列名)也没用
      

  8.   

    execute immediate 'select count(1) from synrecvsmscm where 1=1 '||strwhere1 return into m_upnum;--我上面写错,return前是有空格的
      

  9.   

    你真细心,这个没问题,我的有空格。
    还是报 invalid column name
      

  10.   

    execute immediate 'SQL' || strWhere ;
      

  11.   

    建议用pl/sql developer工具debug跟踪一下就知道了,呵呵