你寫的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
功能(需要略作修改)爲性能過大的結果集!
謝謝你的建議 – user3213758