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