2017-06-06 160 views
0

我創建了一個用戶定義的函數,計算庫存數量對產品異常處理SQL

CREATE OR REPLACE FUNCTION function_quantityInStock(
    oldProductQuantity IN INTEGER, 
    orderedQuan IN INTEGER) 
    RETURN INTEGER 
IS 
    v_newQuantity INTEGER; 
    v_oldQuantity INTEGER; 
    v_orderedQuan INTEGER; 
BEGIN 
    v_newquantity := oldProductQuantity - orderedQuan; 
    RETURN v_newquantity; 
EXCEPTION 
    WHEN OTHERS THEN 
     dbms_output.put_line('Please check your data.'); 
END function_quantityInstock; 

我然後創建一個觸發器,通過調用函數

CREATE OR REPLACE TRIGGER TRIGGER_QUANTITY AFTER INSERT ON ordered_product 
FOR EACH ROW 
DECLARE 
    v_oldQuantity INTEGER; 
BEGIN 
    SELECT PRODUCT_QUANTITYINSTOCK INTO v_oldQuantity 
    FROM product 
    WHERE product_id = :NEW.product_id; 

    UPDATE PRODUCT 
    SET product_quantityinstock = 
      function_quantityINSTOCK(v_oldQuantity, :NEW.ORDERED_PRODUCTQUANTITY) 
    WHERE product_id = :NEW.product_id; 
END; 

我想更新表當用戶輸入無效數據時顯示一條消息,但我的異常塊沒有這樣做。

我用下面的anonyomus塊測試功能:

SET SERVEROUTPUT ON; 

DECLARE 
    v_productID ordered_product.product_id%TYPE:= &ProductID; 
    v_orderID  ordered_product.order_id%TYPE:=&OrderID; 
    v_orderedQuan ordered_product.ordered_productQuantity%TYPE := &OrderedProductQuantity; 
    v_totalCost ordered_product.ordered_productTotalCost%TYPE := '&TotalCost'; 
BEGIN 
    INSERT INTO ordered_product VALUES 
    (v_orderID, v_productID, v_orderedQuan, v_totalCost); 

    dbms_output.put_line('A new record has been inserted.'); 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     dbms_output.put_line('Invalid data!'); 
    WHEN VALUE_ERROR THEN 
     dbms_output.put_line('Error! Please check your values.'|| SQLERRM); 
END; 
+0

這不是SQL Server語法。你使用的是什麼RDBMS? –

+0

這是純粹的PL/SQL - Oracle。我不知道爲什麼你的問題最終在SQL Server領域。 –

回答

0

您可能忽略exec dbms_output.enable(10000),因此不會看到輸出。

你應該扔掉使用

raise_application_error(-20000, 'Please check your data.'); 

而且它是不好的做法使用when others捕獲所有異常,然後忽略它們的異常。

+1

他在頂部有一個'set serveroutput',所以dbms_output應該可以。儘管同意處理異常。 –

0

如果我是你,我不會依賴dbms_output.put_line來傳遞信息。相反,依靠標準異常處理,例如RAISE或RAISE_APPLICATION_ERROR。此外,因爲你試圖找到新的數量,我想移動選擇在產品上表進入功能,是這樣的:

CREATE OR REPLACE FUNCTION function_quantityinstock(p_product_id IN product.product_product_id p_orderedquan IN INTEGER) 
    RETURN INTEGER IS 
    v_newquantity INTEGER; 

    e_not_enough_stock EXCEPTION; 
    e_not_enough_stock_num INTEGER := -20001; 

    e_no_product_exists_num INTEGER := -20002; 

    PRAGMA EXCEPTION_INIT(e_not_enough_stock, -20001); 
BEGIN 
    SELECT product_quantityinstock - orderedquan 
    INTO v_newquantity 
    FROM product 
    WHERE product_id = :new.product_id; 

    IF v_newquantity < 0 
    THEN 
    RAISE e_not_enough_stock; 
    END IF; 

    RETURN v_newquantity; 

EXCEPTION 
    WHEN no_data_found THEN 
    raise_application_error(-e_no_product_exists_num, 
        'No product exists for product_id = ' || product_id); 

    -- no need to check for TOO_MANY_ROWS if product_id is the primary/unique key on the product table. 
    WHEN e_not_enough_stock THEN 
    raise_application_error(e_not_enough_stock_num, 
        'Not enough stock present to fulfil the order for product_id = ' || 
        product_id); 

    WHEN OTHERS THEN 
    raise_application_error(SQLCODE, 
        'Unexpected error occurred whilst finding new quantity for product_id = ' || 
        product_id || ': ' || SQLERRM); 

END function_quantityinstock; 
/

你需要改變,雖然函數名,以反映它正在做的動作,因爲它正在返回庫存中的新數量......