Function Get_daorus(
   ORDER_NO_             In Varchar2
)
Return varchar2
Is
   temp  varchar2(50);   
   Cursor  get_attr_ Is
   (select part_no from ifsapp.DOP_ORDER_ORD_BY_ID where part_no like '401%' and dop_id in 
  (select DOP_ID from ifsapp.DOP_ORDER_ORD_BY_ID where CONFIGURATION_ID in (select CONFIGURATION_ID from customer_order_line
   where order_no=ORDER_NO_  AND line_no||rel_no||line_item_no not in (select line_no||rel_no||line_item_no
   from DOP_DEMAND_CUST_ORD where ORDER_NO=ORDER_NO_))));
Begin
  Open get_attr_;
  Fetch get_attr_ Into temp;
  Close get_attr_;
  Return temp;
End Get_daorus;
这是本人写的包里面的一个简单函数据的一个游标,游标里的select语句查询到的part_no有很多行的数据,但这个游标出来的效果只是一行数据,是
part_no
A1001BC101
而本人想要的是全部行的数据
part_no
A1001BC101
A1001BC102
A1001BC103
A1001BC104
A1001BC105
.
.
.
请教各位如何修改这个游标,以达到多行输出的效果

解决方案 »

  1.   

    另外
      (select part_no from ifsapp.DOP_ORDER_ORD_BY_ID where part_no like '401%' and dop_id in 
      (select DOP_ID from ifsapp.DOP_ORDER_ORD_BY_ID where CONFIGURATION_ID in (select CONFIGURATION_ID from customer_order_line 
      where order_no=ORDER_NO_  AND line_no||rel_no||line_item_no not in (select line_no||rel_no||line_item_no 
      from DOP_DEMAND_CUST_ORD where ORDER_NO=ORDER_NO_)))); 
    请哪位高手帮我优化一下
      

  2.   

    对于多行数据的游标,不要用OPEN打开,用
      For cur_ IN  get_attr LOOP
         temp := cur.part_no;
         ...
         ...
      end loop;
      

  3.   

    对于你要的"多行输出的效果",
    我理解你要问的是:
      select的时候出来的结果集包含多条记录,
      你现在只取了其中一条,而你要的是所有的记录,对吗?我也初学Oracle,不知道是不是这样,说的不对的,还请谅解!我说一下我的看法:在begin里面应该先初始化cursor...
    begin
       if get_attr_%isopen then
          close get_attr_;
        end if;
        
        open get_attr_;    -- 循环取出多条记录
         loop
            fetch get_attr_ into temp;
            if get_attr_%notfound then
                exit;
            end loop;
            -- 这里可以处理取出的这条记录
         end loop;
    end;
      

  4.   

    ... 
    begin 
      if get_attr_%isopen then 
          close get_attr_; 
        end if; 
        
        open get_attr_;     -- 循环取出多条记录 
        loop 
            fetch get_attr_ into temp; 
            if get_attr_%notfound then 
                exit; 
            end if
            -- 这里可以处理取出的这条记录 
        end loop; 
    end;那里是end if
      

  5.   

    ... 
    begin 
      if get_attr_%isopen then 
          close get_attr_; 
        end if; 
        
        open get_attr_;     -- 循环取出多条记录 
        loop 
            fetch get_attr_ into temp; 
            if get_attr_%notfound then 
                exit; 
            end if
            -- 这里可以处理取出的这条记录 
        end loop; 
    end;那里是end if
      

  6.   

    根本问题是楼主不知道游标是怎样工作的,每次fetch游标的指针往下移动一行,
    你的程序里只执行了一次fetch当然只能取出一条记录,
    假如你的游标有5条记录,fetch5次的话就会把所有记录都取出类,
    但实际应用中连写5次fetch当然很麻烦,所用一般都与一些循环的语法一起使用,
    用cursor%notfound判断游标是否到结果集末尾。