PL / SQL循环计数问题

时间:2015-10-29 23:12:59

标签: sql plsql

我试图创建一个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;

1 个答案:

答案 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;