Oracle 在删除前触发器中调用函数

Oracle 在删除前触发器中调用函数,oracle,plsql,triggers,Oracle,Plsql,Triggers,我想调用这个函数: 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 N

我想调用这个函数:

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:语句被忽略

  • 在删除已下订单之前
  • 每行
  • 申报
  • v_旧订单号:=:old.order_id
  • 开始
  • 我是pl/sql新手,只是不确定是什么导致了这个问题。当用户从orders表中删除订单时,触发器应调用该函数,将订单上的所有产品相加

    谢谢

    (考虑到您编译的包没有错误)使用-

    ret_val
    必须是一个
    数字
    ,因为包函数
    total_calc
    返回一个
    数字
    。函数必须始终将其输出值返回给变量(如
    ret_val
    ),这取决于返回值的类型。必须声明变量的数据类型

    调用打包过程和函数的语法如下-

    <RETURN_VARIABLE> := PACKAGE_NAME.<FUNCTION_NAME>();
    PACKAGE_NAME.<PROCEDURE_NAME>(); --Since Procedure never returns
    
    (考虑到编译的包没有错误)使用-

    ret_val
    必须是一个
    数字
    ,因为包函数
    total_calc
    返回一个
    数字
    。函数必须始终将其输出值返回给变量(如
    ret_val
    ),这取决于返回值的类型。必须声明变量的数据类型

    调用打包过程和函数的语法如下-

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

    您显示的触发器代码根本不调用
    add\u order\u func
    函数。您的意思是,您是从当前触发器代码中获得错误,如图所示,还是在尝试将其更改为调用函数时获得错误?如果是前者,那么问题可能在于您调用的
    total\u calc
    过程。如果是后者,则显示实际尝试调用该函数的触发代码。您好,谢谢您的回复,对不起,我显示了错误的函数,我已经工作了几个小时,我的大脑关闭了。我基本上是想让函数在发生删除时执行,传递给函数的参数应该是行的order_id(PK)。我们没有看到实际的错误描述(ORA-XXXXX:bla-bla-bla…)您显示的触发代码根本没有调用
    add_order_-func
    函数。您的意思是,您是从当前触发器代码中获得错误,如图所示,还是在尝试将其更改为调用函数时获得错误?如果是前者,那么问题可能在于您调用的
    total\u calc
    过程。如果是后者,则显示实际尝试调用该函数的触发代码。您好,谢谢您的回复,对不起,我显示了错误的函数,我已经工作了几个小时,我的大脑关闭了。我基本上是想让函数在发生删除时执行,传递给函数的参数应该是行的order_id(PK),因为我们错过了实际的错误描述(ORA-XXXXX:bla bla bla..)嗨,annjawn,我昨晚设法弄明白了这一点,并想出了这样一个办法:在删除每行已下订单之前创建或替换触发器trg_order_total声明v_old_订单号:=:old.order_id;v_总数;开始v_总计:=总计计算(v_旧订单);从订单行中删除,其中fk1_order_id=v_old_order;dbms_输出。输出线(v_总数);结束;谢谢你的回复!您的权利我需要将func的结果存储在变量中!嗨,annjawn,我昨晚设法弄明白了这一点,并想出了这样一个办法:在删除每行已下订单之前创建或替换触发器trg_order_total声明v_old_订单号:=:old.order_id;v_总数;开始v_总计:=总计计算(v_旧订单);从订单行中删除,其中fk1_order_id=v_old_order;dbms_输出。输出线(v_总数);结束;谢谢你的回复!您的权利我需要将func的结果存储在变量中!
    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;