我有表格(Customers,Pbasket和pp),并在表格中插入了以下值
基本上我的任务是创建一个功能,找到客户购买的所有产品编号(p#),并且我必须传递客户ID(c#)作为输入参数;
这是我的pl / sql脚本
我注意到了
没有为c#(100)返回结果,这是正确的。
但我注意到c#(101)和c#(102)
结果应该返回多个p#但是它只返回1个结果,即使我有我的while循环。
我的结果输出
请建议。
答案 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
函数(需要轻微修改)!