2013-05-03 143 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