2014-03-01 111 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