2014-03-01 45 views
0

我有表(Customers,Pbasket和PP)与插入表中的下列值PL/SQL函数而循环返回1行只

http://pastebin.com/eMUtLJn9

基本上我任务是创建一个查找函数客户购买的所有产品编号(p#),我必须将客户编号(c#)作为输入参数;

这是我的PL/SQL脚本

http://pastebin.com/SqkY0P9N

我注意到,

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

,但我注意到,对于C#(101)和C#(102)

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

我的结果

enter image description here

请咨询的输出。

回答

1

你写的function应该返回一个只有一行。而且,您的LOOP中有一个return。所以经过第一次迭代控制被返回。(开留下永远的cursor

创建SQL对象的类型

create type my_numbers as table of NUMBER; 
/

功能恢复的表!

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)); 

我们也可以用Pipelined功能(需要略作修改)为性能过大的结果集!

+0

谢谢你的建议 – user3213758