2015-10-18 85 views
0

我有兩個表:比爾:甲骨文函數重載

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; 
+0

你的WHTH OTHERS子句是不好的做法。您將真實消息中的所有有用信息都取消,並返回通用的無用消息。應用程序管理員應該怎麼做? – APC

+0

只是一個練習的消息,我稍後會修改它 – GKra

+0

修改後的代碼會做什麼,您不希望它做什麼?你希望它做什麼沒有做到?我不明白你的問題是什麼。事實上,你實際上並沒有在你的查詢中加入'bill_item'和'menu_item'似乎存在問題,但由於我現在不知道你想要解決什麼問題,我不確定這是否是源錯誤。 –

回答

0
IF V_Total IS NULL THEN 
RETURN 'Nothing sold yet'; 
END IF; 

右後

Where Bill.Item_Number = V_Item_Number; 

可能工作。

更精確的將是從哪裏賬單項目..

+0

或檢查是否存在(從條目中選擇1項).. :) – clq

+0

下一次只需編輯您的原始答案,而不是刪除它併發布第二個答案。 – APC

+0

有沒有辦法通過異常部分來處理這兩件事情?我考慮使用語句一起選擇Item.Item_Number和Bill.Item_Number並使用NO_DATA_FOUND處理它們,或者像您說的那樣,在這些表的一個上選擇count(Item_Number)。您認爲在Bill表或Item表上使用select count()會更好嗎? – GKra

0

我得到它修改了一些錯別字在#1後進行檢查COUNT(*)。謝謝大家。