2013-05-03 10 views
1

ID的功能,想調用這個函數:調用在刪除之前觸發

CREATE OR REPLACE PACKAGE orders_salary_manage2 AS 
    FUNCTION total_calc(p_order in NUMBER) 
    RETURN NUMBER; 
END; 

CREATE OR REPLACE PACKAGE BODY orders_salary_manage2 AS 
    tot_orders NUMBER; 

FUNCTION total_calc(p_order in NUMBER) 
RETURN NUMBER 
IS 
    c_price product.unit_price%type; 
    c_prod_desc product.product_desc%type; 
    v_total_cost NUMBER := 0; 
    CURSOR c1 IS 
     SELECT product_desc, unit_price 
     FROM product 
     WHERE product_id IN (SELECT fk2_product_id 
          FROM order_line 
          WHERE fk1_order_id = p_order); 
BEGIN 
    OPEN c1; 
    LOOP 
     FETCH c1 into c_prod_desc, c_price; 
     v_total_cost := v_total_cost + c_price; 
     EXIT WHEN c1%notfound; 
    END LOOP; 
    CLOSE c1; 
    return v_total_cost; 
END; 

從這個觸發器:

CREATE OR REPLACE TRIGGER trg_order_total 
BEFORE DELETE ON placed_order 
FOR EACH ROW 
DECLARE 
v_old_order NUMBER := :old.order_id; 
BEGIN 
total_calc(v_old_order); 
END; 

,但我不斷收到此錯誤,注意有沒有錯誤號剛這樣的:

行錯誤4:PL/SQL:語句被忽略

  1. BEFORE DELETE ON placed_order
  2. FOR EACH ROW
  3. DECLARE
  4. v_old_order NUMBER:=:old.order_id;
  5. BEGIN

進出口新的PL/SQL,只是不知道是什麼原因造成的問題。當用戶從訂單表中刪除訂單時,觸發器應該調用該函數以將訂單上的所有產品相加。

謝謝

+0

你已經證明根本不能稱之爲'add_order_func'功能觸發代碼。你的意思是你從當前的觸發代碼中得到了這個錯誤,或者當你試圖改變它來調用這個函數時,你會得到這個錯誤?如果前者,那麼問題可能在於你所調用的'total_calc'程序。如果是後者,則顯示實際嘗試調用函數的觸發器代碼。 – 2013-05-03 20:56:27

+0

嗨,謝謝你的回覆,抱歉我表現出錯誤的功能,我現在已經工作了好幾個小時,我的大腦關閉了。我基本上試圖使功能執行時發生刪除,並且傳遞給函數的參數應該是行 – user2241161 2013-05-03 21:18:57

+0

的order_id(PK),我們錯過了實際的錯誤描述(ORA-XXXXX:bla bla bla ..) – Sebas 2013-05-03 21:22:45

回答

1

(考慮到你的包,沒有錯誤編譯)使用 -

ret_val:= orders_salary_manage2.total_calc(v_old_order); 

ret_val必須是因爲total_calc返回NUMBER包功能NUMBER。函數必須總是返回一個變量(如ret_val),這取決於必須聲明變量的數據類型的返回值的類型。

調用Pacakaged過程和函數的語法 -

<RETURN_VARIABLE> := PACKAGE_NAME.<FUNCTION_NAME>(); 
PACKAGE_NAME.<PROCEDURE_NAME>(); --Since Procedure never returns 

還要注意的是,如果你的包是在一個不同的模式,並沒有PUBLIC SYNONYM,那麼你將有前綴的架構名稱,如<SCHEMA>.PACKAGE_NAME.<FUNCTION_NAME>()(考慮調用模式對包有執行權限)。

所以,

CREATE OR REPLACE TRIGGER trg_order_total 
BEFORE DELETE ON placed_order 
FOR EACH ROW 
DECLARE 
    v_old_order NUMBER := :old.order_id; 
    v_ret_val NUMBER := 0; 
BEGIN 
    v_ret_val := orders_salary_manage2.total_calc(v_old_order); 
    --...Do stuff with v_ret_val 
END; 
+0

嗨annjawn我設法昨晚弄明白以及與此想出了: CREATE OR REPLACE TRIGGER trg_order_total 之前刪除placed_order FOR EACH ROW DECLARE v_old_order編號:=:老。ORDER_ID; v_total NUMBER; BEGIN v_total:= total_calc(v_old_order); DELETE FROM order_line WHERE fk1_order_id = v_old_order; dbms_output.put_line(v_total); END; 謝謝你的回覆!你的權利我需要將func的結果存儲在一個變量中! – user2241161 2013-05-04 11:39:34