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. 删除前已放置的订单
  2. 每一行
  3. 宣布
  4. v_old_order NUMBER := :old.order_id;
  5. 开始

我是 pl/sql 的新手,只是不确定是什么导致了问题。当用户从订单表中删除订单时,触发器应调用该函数以将订单上的所有产品相加。

谢谢

4

1 回答 1

1

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

ret_val:= orders_salary_manage2.total_calc(v_old_order);

ret_val必须是 a因为NUMBER包函数total_calc返回 a NUMBER。函数必须始终将其结果返回给变量(如ret_val),具体取决于返回值的类型,必须声明变量的数据类型。

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

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

另请注意,如果您的包在不同的 SCHEMA 中并且没有 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;
于 2013-05-03T22:23:34.987 回答