我试图创建一个PL / SQL函数,它会在特定日期(y)之后或之后计算特定客户(x)的所有发票,但似乎无法弄明白句法。我已经使用SQL几年了,但我对PL / SQL编码完全不熟悉,似乎无法正确实现我的SQL代码。我认为我有正确的想法,但不知道如何循环计算特定客户的每张发票。我一直在尝试使用我的COUNT和DISTINCT函数时遇到错误,因为我不认为我将它们放在正确的位置。我希望它返回的只是发票数量。非常感谢任何帮助,谢谢。
CREATE OR REPLACE FUNCTION FTN_CountInv
(x IN INTEGER, y IN DATE)
RETURN INTEGER
AS
v_inv_number invoice.inv_number%type;
v_cus_code invoice.cus_code%type;
v_inv_date invoice.inv_date%type;
CURSOR v_inv_cursor IS SELECT inv_number, cus_code, inv_date FROM invoice;
BEGIN
OPEN v_inv_cursor;
WHILE v_inv_date >= y
LOOP
COUNT (v_inv_number)
FOR EACH DISTINCT x;
FETCH v_inv_cursor INTO v_inv_number, v_cus_code, v_inv_date;
EXIT WHEN v_inv_cursor%NOTFOUND;
END LOOP;
CLOSE v_inv_cursor;
END;
答案 0 :(得分:2)
由于你是PL / SQL的新手,我强烈建议使用FOR LOOPS而不是游标。游标为您提供了更大的灵活性,但它们更难理解和使用:
CREATE OR REPLACE FUNCTION FTN_CountInv
(x IN INTEGER, y IN DATE)
RETURN INTEGER
AS
v_counter integer := 0;
BEGIN
FOR c in (SELECT inv_number, cus_code, inv_date FROM invoice) LOOP
IF c.inv_date > y THEN
v_counter := v_counter + 1;
END IF;
END LOOP;
RETURN v_counter
END;
在这种情况下,“c”成为引用SQL select返回的每一列的方法。 “c”是一个变量,包含行的值,这些值在循环的每次迭代中都会发生变化。
如果您了解SQL,最好的方法是使用SQL获取您想要的计数并将其传递给您返回的变量,这可能是一个更简单的解决方案。参见:
CREATE OR REPLACE FUNCTION FTN_CountInv
(x IN INTEGER, y IN DATE)
RETURN INTEGER
AS
v_inv_count integer;
BEGIN
SELECT count(*)
INTO v_inv_count
FROM invoice
WHERE inv_date > y;
RETURN v_inv_count;
END;