PL / SQL存储和调用过程

时间:2013-04-24 19:13:38

标签: sql plsql

我目前正在研究一个PL / SQL问题,我必须在一个程序中创建一个游标,为给定项目提供适当的折扣(价格为10%=> 100美元,价格为5%> = $ 10)。当我必须调用该程序时,我需要在特定订单号的折扣后显示订单号,客户名字,姓氏和物品的总净成本(在这种情况下,我需要显示订单号2)。我无法显示此信息。

这是我到目前为止用游标创建过程的代码。

CREATE OR REPLACE PROCEDURE ComputeOrderTotal
(no_id IN orders.o_id%TYPE,
cfirst IN customer.c_first%TYPE,
clast IN customer.c_last%TYPE,
TotalNetCost OUT orders.ordertotal%TYPE) IS

CURSOR OrderCursor IS
  SELECT order_line.inv_id, inv_price, ol_quantity, inv_price*ol_quantity AS ExtPrice,
  CASE
    WHEN inv_price*ol_quantity >= 100 THEN 0.9*(inv_price*ol_quantity)
    WHEN inv_price*ol_quantity >= 10 THEN 0.95*(inv_price*ol_quantity)
    ELSE
    inv_price*ol_quantity
    END AS NetCost
  FROM inventory, order_line, orders, customer
  WHERE orders.o_id = customer.c_id;
OrderRow OrderCursor%ROWTYPE;

BEGIN
OPEN OrderCursor;
LOOP 
  FETCH OrderCursor INTO OrderRow;
  EXIT WHEN OrderCursor%NOTFOUND;
    TotalNetCost :=TotalNetCost + OrderRow.NetCost;  

END LOOP; 


DBMS_OUTPUT.PUT_LINE('Order Number:  ' || no_id || 'First Name: ' || cfirst  || 'Last Name:  ' ||
clast || 'Total Net Cost: ' || TO_CHAR(TotalNetCost, '$0999.99'));

END;

这是我调用程序的代码。

DECLARE
no_id orders.o_id%TYPE;
cfirst customer.c_first%TYPE;
clast customer.c_last%TYPE;
TotalNetCost orders.ordertotal%TYPE;

BEGIN
ComputeOrderTotal(2, cfirst, clast, TotalNetCost);    
END;

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我不确定,但你的情况可能是问题,因为你的第二个条件与第一个条件相矛盾。例如,110满足第一个条件,但它也满足第二个条件。

WHEN inv_price*ol_quantity >= 100 THEN 0.9*(inv_price*ol_quantity)
WHEN inv_price*ol_quantity >= 10 THEN 0.95*(inv_price*ol_quantity)

我建议将第二个条件改为< 100和> = 10

答案 1 :(得分:0)

将此行添加到调用该过程的代码的顶部。

更改会话集serveroutput on;