0

我正在尝试将此过程实现到一个包中,但是由于某种原因,该包不允许我使用光标。任何人都可以帮忙吗?谢谢你。

此外,当我尝试将程序放入我的包中时,会出现一个“输入绑定变量”框减去输入绑定变量的任何位置,并且出现此错误

Not found
The requested URL /apex/wwv_flow.show was not found on this server

我的代码是

  PROCEDURE total_calc(p_order NUMBER)
IS
   c_price product.unit_price%type;
   c_prod_desc product.product_desc%type;
   v_total_cost NUMBER := 0;
   v_c1 REFCURSOR;
   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;
      dbms_output.put_line(c_prod_desc || ': ' || c_price);
      v_total_cost := v_total_cost + c_price;
      EXIT WHEN c1%notfound;
   END LOOP;
   CLOSE c1;
   dbms_output.put_line('Total Cost:' || v_total_cost);
END;

这是软件包其余部分的代码

CREATE OR REPLACE PACKAGE orders_salary_manage AS
  FUNCTION tax_func (p_sal IN NUMBER)
  RETURN NUMBER;
  PROCEDURE reduce_price(p_product_id NUMBER, p_sub_price NUMBER);
  PROCEDURE increase_price(p_product_id NUMBER, p_add_price NUMBER);
  PROCEDURE remove_order(p_order_id NUMBER);  
  PROCEDURE add_order(p_order_id NUMBER,
                                      p_order_date VARCHAR2,
                                      p_delivery_date VARCHAR2,
                                      p_customer_id NUMBER,
                                      p_employee_id NUMBER,
                                      p_order_type_id NUMBER);
END orders_salary_manage;

CREATE OR REPLACE PACKAGE BODY orders_salary_manage AS
  tot_orders NUMBER;

FUNCTION tax_func (p_sal IN NUMBER)
   RETURN NUMBER
IS
   tax_rate NUMBER := 0;
   v_netsal   NUMBER := 0;
   v_sal    NUMBER;
BEGIN
   v_sal := p_sal;
IF v_sal > 70000 THEN
   tax_rate := (v_sal * 0.4);
   v_netsal := v_sal - tax_rate;
END IF;
IF v_sal < 70000 THEN
   tax_rate := (v_sal * 0.2);
   v_netsal := v_sal - tax_rate;
END IF;

RETURN v_netsal;
END;


PROCEDURE reduce_price(p_product_id NUMBER, p_sub_price NUMBER)
IS v_price NUMBER;
   e_invalid_price EXCEPTION;
BEGIN
  SELECT unit_price
  INTO v_price
  FROM product
  WHERE product_id = p_product_id;

  v_price := v_price - p_sub_price;

  IF v_price < 1 THEN
    RAISE e_invalid_price;
  ELSE
      UPDATE product SET unit_price = v_price WHERE product_id = p_product_id; 
  END IF;

END;

PROCEDURE increase_price(p_product_id NUMBER, p_add_price NUMBER)
IS v_price NUMBER;
BEGIN
  SELECT unit_price
  INTO v_price
  FROM product
  WHERE product_id = p_product_id;

  v_price := v_price + p_add_price;

  UPDATE product SET unit_price = v_price WHERE product_id = p_product_id; 

END;

PROCEDURE remove_order(p_order_id NUMBER)
IS 
BEGIN

  DELETE FROM placed_order WHERE order_id = p_order_id;
  DELETE FROM order_line WHERE fk1_order_id = p_order_id; 

END;

PROCEDURE add_order(p_order_id NUMBER,
                                      p_order_date VARCHAR2,
                                      p_delivery_date VARCHAR2,
                                      p_customer_id NUMBER,
                                      p_employee_id NUMBER,
                                      p_order_type_id NUMBER)
IS new_order NUMBER;
BEGIN


  INSERT INTO placed_order (order_id, order_date, delivery_date, fk1_customer_id, fk2_employee_id, fk3_order_type_id)
  VALUES (p_order_id, p_order_date, p_delivery_date, p_customer_id, p_employee_id, p_order_type_id);

END;
END;
4

1 回答 1

0

这真的很令人困惑。

首先 - dbms_output 需要对环境进行特殊设置才能工作。并且调用DBMS_OUTPUT.ENABLE, plus 包确实可以访问终端。包没有您的进程上下文,它们在 db 的进程上下文中运行——它在没有控制终端的情况下运行。如果您必须编写一些东西,请使用文件——UTL_FILE包就是为此而生的。

Next 由于您基本上是在添加订单,因此您需要一个函数来返回值。一个程序是行不通的。正如你编码的那样。

Next v_C1未使用,对您的代码没有任何意义。您没有返回 refcursor。

Next 您应该考虑为具有通用表名的表使用模式,例如当您贴标变量时。

例子:

v_foo schema_owner.table_name.column_name%type;

考虑一下:

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;
   --  lose this:  v_c1 REFCURSOR;
   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;
     -- lose this line: dbms_output.put_line(c_prod_desc || ': ' || c_price);
      v_total_cost := v_total_cost + c_price;
      EXIT WHEN c1%notfound;
   END LOOP;
   CLOSE c1;
   -- lose this line:  dbms_output.put_line('Total Cost:' || v_total_cost);
   return v_total_cost;
END;

为了使它起作用,它必须在 CREATE OR REPLACE FUNCTION一个语句中。然后 - 由具有正确创建权限的用户添加到 db 架构中。

毕竟,你可以运行它。此外,如果有人需要从SQLPLUS.

于 2013-04-27T22:19:38.117 回答