我有兩個表:比爾:甲骨文函數重載
Bill_Number (PK/FK),
Menu_Item_Number (PK/FK),
Discount,
Quantity_Sold,
Price.
而且項目:
Item_Number (PK),
Item_Name,
Current_Price,
Production_Cost.
現在我想創建一個將收到ITEM_NUMBER作爲輸入的功能和返回完整的SUM(Quantity_Sold * Price)
和折扣後SUM(Quantity_Sold*Price)
。
在我的例外情況中,如果Item_Number不存在於Item表中,我想處理NO_DATA_FOUND錯誤。如果Item_Number存在但我從未售出,我也想要返回消息。我在第一種情況下使用了NO_DATA_FOUND(Item_Number不存在),所以我必須爲第二種情況使用哪一種?
這是我的代碼:
FUNCTION FN_Check
(P_Item_Number NUMBER)
RETURN Varchar2
IS
V_Count Number (5,0);
V_Item_Number Number (5,0);
V_Output Varchar2 (500);
V_TotalDiscount Number (10,2);
V_CurrentTotal Number (10,2);
itemHasNotSold Exception;
Begin
Select Item_Number
Into V_Item_Number
From Menu_Item
Where Item_Number = P_Item_Number;
Select NVL(count(Item_Number),0)
INTO V_Count
From Bill
Where Menu_Item_Number = V_Menu_Item_Number;
If V_Count = 0 THEN
RAISE itemHasNotSold;
ELSE
Select SUM(bi.Selling_Price*bi.Quantity_Sold - bi.Selling_Price*bi.Quantity_Sold*bi.Discount/100),
SUM(bi.QUANTITY_SOLD *mi.Current_Price)
Into V_TotalWithDiscount, V_CurrentTotal
From Bill_Item bi, Menu_Item mi
Where bi.Item_Number = P_Item_Number and mi.Item_Number= bi.Item_Number;
V_Output := V_Menu_Item_Number || 'was sold total' || V_TotalWithDiscount || 'and the total should be' || V_CurrentTotal || 'with the current price';
END IF;
Return V_OutPut;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, 'Menu Item Number does not exist');
RETURN V_Output;
When itemHasNotSold THEN
RAISE_APPLICATION_ERROR (-20002, 'Item has not sold');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20003, 'Data error.Please contact xxx-yyyyyyy for more infomation');
End FN_Check;
你的WHTH OTHERS子句是不好的做法。您將真實消息中的所有有用信息都取消,並返回通用的無用消息。應用程序管理員應該怎麼做? – APC
只是一個練習的消息,我稍後會修改它 – GKra
修改後的代碼會做什麼,您不希望它做什麼?你希望它做什麼沒有做到?我不明白你的問題是什麼。事實上,你實際上並沒有在你的查詢中加入'bill_item'和'menu_item'似乎存在問題,但由於我現在不知道你想要解決什麼問題,我不確定這是否是源錯誤。 –