CURSOR c_i_permit_id_s IS select permit_value from itel_permit t where t.permit_value in (v_permit_id_s)
                             union 
                             select permit_value from itel_permit t where t.permit_value in (v_position_permit_id_s)
                             union  
                             select permit_value from itel_permit t where t.permit_value in (v_role_permit_id_s) ;
我想在存储过程中写一个CURSOR .
要将不同参数据的三个查询语句合并,
在普通查询情况下是可以用的,
但是放到存储过程中就没有用了,
我想问下大家在CURSOR中能使用 MINUS或union,
如果能,要怎么使用,
谢谢大家

解决方案 »

  1.   

    CURSOR c_i_permit_id_s IS 
      select tt.* from
      (select permit_value from itel_permit t where t.permit_value in (v_permit_id_s)
                                 union 
                                 select permit_value from itel_permit t where t.permit_value in (v_position_permit_id_s)
                                 union  
                                 select permit_value from itel_permit t where t.permit_value in (v_role_permit_id_s))tt ;
      

  2.   

    不行呀,
    还是执行行数为0(Rowcount = 0, %open, %notfound, first iteration)
      

  3.   

    应该可以实现的。是不是CURSOR 执行前你没有对参数赋值?
      

  4.   

    union应该没有问题。
    我觉得问题出在
    t.permit_value in (v_role_permit_id_s)
    这种处参数的查询上面。
    这样写和t.permit_value = v_role_permit_id_s
    是没有区别的。
    即使你的v_role_permit_id_s是一个以逗号分割的字符串,oracle也只认为他是一个字符串,而不是把它当作一组值来使用。
    所以你的in就根本没有起到作用。
    查询就不会有结果。
    举个例子
    v_role_permit_id_s:='1,2,3';
    select * from table1 where col1 in (v_role_permit_id_s);
    会被Oracle等同于下面的SQL处理。
    select * from table1 where col1 in ('1,2,3');
    注意是‘1,2,3’而不是(1,2,3)
    所以检索结果当然不会。