显示错误消息而不是“未选择行”

Posted

技术标签:

【中文标题】显示错误消息而不是“未选择行”【英文标题】:Display error message instead of 'no rows selected' 【发布时间】: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 表? 【参考方案1】:

您想要的消息来自您在 SELECT 语句中调用的函数。因此,如果该 SELECT 没有返回任何行,则没有可用于调用该函数的行。

恐怕不清楚您要实现什么,但无论是什么,您都需要一种不同的方法。说了这么多,我建议这样的事情可能会给你想要的东西(以更正统和更有效的方式):

SELECT invoicenumber, 
       sum(UnitPrice*Quantity) AS "Total Cost" 
FROM INVOICE_ITEM 
where invoicenumber=2011010
group by InvoiceNumber;

【讨论】:

【参考方案2】:
SET ECHO ON;
SET SERVEROUTPUT ON;

CREATE OR REPLACE FUNCTION totalInvoiceAmount(InvoiceNo IN       INVOICE_ITEM.InvoiceNumber%TYPE)
RETURN NUMBER IS
TotalCost NUMBER(20);
invoice_not_found EXCEPTION ;
empty_invoice_found EXCEPTION ;


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!');
    RAISE invoice_not_found;
    --RETURN -1;
ELSIF InvoiceCheck=FALSE AND InvoiceEmpty=TRUE THEN
    --DBMS_OUTPUT.PUT_LINE('Empty Invoice Found!');
    RAISE 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;
EXCEPTION
when invoice_not_found then
 DBMS_OUTPUT.PUT_LINE('Invoice Not Found!');
 raise -1;
when empty_invoice_found then
 DBMS_OUTPUT.PUT_LINE('Empty Invoice Found!');
 raise 0;

END;

您可以在异常中捕获它并相应地处理它,让我知道它是否有效

【讨论】:

以上是关于显示错误消息而不是“未选择行”的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu PHP5/Apache2 - 显示 500 错误而不是错误消息

为啥使用用户定义的异常而不是简单地显示错误消息[重复]

分段错误而不是显示消息 - 使用 c 中的指针从文件中读取

javascript 如果您发送WebHook的服务器以此JSON格式响应,则在处理阶段(而不是TY消息)后显示错误消息:

处理所有异常并显示自定义错误页面而不是默认框架错误页面

当我点击索引页面而不是错误消息时,我只是得到一个空白页面。PHP