【问题标题】:PL/SQL Storing and calling procedurePL/SQL 存储和调用过程
【发布时间】:2013-04-24 19:13:37
【问题描述】:

我目前正在处理一个 PL/SQL 问题,我必须在一个过程中创建一个游标,该游标将为给定项目提供适当的折扣(价格 >= 100 美元为 10%,价格 >= 10 美元为 5%) .当我必须调用该程序时,我需要显示特定订单号的订单号、客户名字、姓氏和折扣后商品的总净成本(在这种情况下,我需要显示订单号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 的名字、姓氏和价格
  • plsql 和mysql 有什么关系?
  • 你是在sqlplus里做这个吗?您可能需要在您使用的任何工具中执行“设置服务器输出”或等效操作。
  • 我觉得奇怪的是,您在 orders.o_id = customers.c_id 上加入了订单和客户。这可能会产生结果,但很可能是错误。此外,您有加入 (order_line,inventory) 的表,这些表没有指定连接条件,因此将产生笛卡尔连接 - 即每个表中的每一行都连接在一起。可能不是你想的那样。努力找出表格之间的正确关系,更新您的帖子,也许我们将能够提供更多帮助。分享和享受。

标签: sql plsql


【解决方案1】:

我不确定,但您的条件可能是问题,因为您的第二个条件与第一个条件相矛盾。例如 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)

我建议将第二个条件更改为 =10

【讨论】:

  • 你这是什么意思?
  • 这个问题是在 4 月份提出的。
【解决方案2】:

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

改变会话设置服务器输出;

【讨论】:

    猜你喜欢
    • 2014-05-11
    • 2017-04-13
    • 1970-01-01
    • 2022-01-18
    • 2018-04-05
    • 2011-10-12
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    相关资源
    最近更新 更多