PL / SQL函数while循环仅返回1行

时间:2014-03-01 13:24:54

标签: oracle plsql

我有表格(Customers,Pbasket和pp),并在表格中插入了以下值

http://pastebin.com/eMUtLJn9

基本上我的任务是创建一个功能,找到客户购买的所有产品编号(p#),并且我必须传递客户ID(c#)作为输入参数;

这是我的pl / sql脚本

http://pastebin.com/SqkY0P9N

我注意到了

没有为c#(100)返回结果,这是正确的。

但我注意到c#(101)和c#(102)

结果应该返回多个p#但是它只返回1个结果,即使我有我的while循环。

我的结果输出

enter image description here

请建议。

1 个答案:

答案 0 :(得分:1)

您写的function应该只返回一个行。而且,您的return中有一个LOOP。所以在第一次迭代之后,控制权将被返回。(让cursor永远打开)

创建一个SQL对象类型

create type my_numbers as table of NUMBER;
/

FUNCTION返回一张桌子!

CREATE OR REPLACE FUNCTION  purchased(cId IN NUMBER) 
RETURN my_numbers
IS  
    product VARCHAR2(45); 
    I NUMBER;
    v_my_list my_numbers := my_numbers();
    CURSOR CursorRow IS 
    SELECT p# 
    FROM customer c  
    LEFT OUTER JOIN pbasket pb 
    ON c.c# = pb.c# 
    LEFT OUTER JOIN pp pp 
    ON pb.whenfinalised = pp.whenfinalised
    WHERE c.c# = cId;
    CurrentPos CursorRow%ROWTYPE; 
BEGIN
    OPEN CursorRow;  
    I := 1;
    FETCH CursorRow into CurrentPos;
    LOOP
    EXIT WHEN CursorRow%NOTFOUND    
       v_my_list.EXTEND;
       v_my_list(I) := CurrentPos.p#;   
       I := I + 1;
    END LOOP;
    CLOSE CursorRow;
    RETURN v_my_list;
END purchased;
/

最终的SELECT查询:

select  * FROM TABLE(CAST(purchased(100) as my_numbers));

我们还可以在大型结果集上使用{em>性能的Pipelined函数(需要轻微修改)!