【发布时间】:2014-06-08 18:20:28
【问题描述】:
我希望我的函数显示“找到空发票!”或“未找到发票”错误消息。 但是当我选择有错误的数据(表中不存在)时,它返回“未选择行”。请指导我正确的 SELECT 方法。
SET ECHO ON;
SET SERVEROUTPUT ON;
CREATE OR REPLACE FUNCTION totalInvoiceAmount(InvoiceNo IN INVOICE_ITEM.InvoiceNumber%TYPE)
RETURN NUMBER IS
TotalCost NUMBER(20);
CURSOR X_RECORD IS SELECT * FROM INVOICE_ITEM;
CURSOR Y_RECORD IS SELECT * FROM INVOICE_ITEM;
tempCost NUMBER:=0;
InvoiceCheck BOOLEAN:=FALSE;
InvoiceEmpty BOOLEAN:=TRUE;
BEGIN
FOR Record IN X_RECORD LOOP
IF Record.InvoiceNumber = InvoiceNo THEN
InvoiceCheck:=TRUE;
EXIT;
ELSE
InvoiceCheck:=FALSE;
END IF;
END LOOP;
FOR Record IN Y_RECORD LOOP
IF Record.InvoiceNumber = InvoiceNo AND InvoiceCheck=FALSE THEN
InvoiceEmpty:=TRUE;
EXIT;
ELSE
InvoiceEmpty:=FALSE;
END IF;
END LOOP;
IF InvoiceCheck=FALSE AND InvoiceEmpty=FALSE THEN
DBMS_OUTPUT.PUT_LINE('Invoice Not Found!');
RETURN -1;
ELSIF InvoiceCheck=FALSE AND InvoiceEmpty=TRUE THEN
DBMS_OUTPUT.PUT_LINE('Empty Invoice Found!');
RETURN 0;
ELSE
FOR Record IN X_RECORD LOOP
IF Record.InvoiceNumber = InvoiceNo THEN
tempCost:=tempCost+(Record.UnitPrice*Record.Quantity);
END IF;
END LOOP;
TotalCost:=tempCost;
RETURN TotalCost;
END IF;
END;
/
SELECT invoicenumber,totalInvoiceAmount(invoicenumber) AS "Total Cost" FROM INVOICE_ITEM Where invoicenumber=2011011;
SELECT invoicenumber,totalInvoiceAmount(invoicenumber) AS "Total Cost" FROM INVOICE_ITEM where invoicenumber=2011010;
【问题讨论】:
-
你能说得更具体些吗?哪条线抛出错误?编写这样的函数似乎效率很低。您已经在 INVOICE_ITEM 表上进行了选择,因此您手头有数据。函数的目的是什么。另外,您的光标正在选择表中的所有行,然后过滤它们?我认为您甚至不需要这个,只需使用聚合函数(SUM)来做同样的事情。 PL/SQL 有一定的用途,但它可以避免学习如何在直接 SQL 中做同样的事情,这样会更快。
-
两个游标从同一个表中读取;因此,如果第一个光标没有找到与输入发票编号匹配的数据,第二个光标也将找不到与输入发票编号匹配的数据。我怀疑您的逻辑不正确,应该涉及其他字段或表格。是否有第一个游标应该读取的 INVOICE 表?