你写的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