Mysql 创建存储过程调试

Mysql 创建存储过程调试,mysql,stored-procedures,Mysql,Stored Procedures,使用此站点的数据和架构:使用此站点的数据: 我得到提示: 创建一个名为placeOrder()的存储过程,可以调用该存储过程在数据库中插入新的顺序。它将接收customerId作为INT,productId作为INT,qty作为INT,并返回(作为输出参数)表orders中创建的新行的order\u id 此存储过程将查找具有该特定产品最大库存的存储,并将该存储分配给订单。订单_状态应设置为1(即待定),当前系统日期(参见功能CURDATE)将分配给订单_日期,列所需_日期将从当前系统日期(参见

使用此站点的数据和架构:使用此站点的数据:

我得到提示:

创建一个名为placeOrder()的存储过程,可以调用该存储过程在数据库中插入新的顺序。它将接收customerId作为INT,productId作为INT,qty作为INT,并返回(作为输出参数)表orders中创建的新行的order\u id

此存储过程将查找具有该特定产品最大库存的存储,并将该存储分配给订单。订单_状态应设置为1(即待定),当前系统日期(参见功能CURDATE)将分配给订单_日期,列所需_日期将从当前系统日期(参见功能ADDDATE)起7天,列staff_id将分配给在所选商店工作的任何人(根据以前的要求)。因为order_id列不是一个自动递增的列,所以需要计算它的值。您可以使用max(order_id)查找表中的最高order_id

订单项目行应设置为传递给存储过程的productId和数量。item_id应设置为1(因为此订单只有一个item)。应使用传递的productId从products表中检索标价。折扣值应设置为0

如果我正确理解了提示,我需要首先输入商店id,它包含了特定产品的大部分内容。一旦我有了那个存储,我需要在表“orders”中插入一行新的数据,基本数据是order\u id、customer\u id、order\u status、order\u date、required、date和staff\u id。我不明白问题的最后一部分是什么/如何解决。

这是我当前的代码,但我几乎可以肯定这是一个充满错误、注释和缺失片段的粉笔,因此请帮助我找出您可以:

DELIMITER //
CREATE procedure placeOrder (IN customerID INT, IN productID INT, IN QTY INT, OUT order_id INT)
BEGIN
DECLARE customerID INT;
DECLARE produtcID INT;
DECLARE quantity INT;

SELECT customer_id INTO customerID from customers where customer_id = customerID;
SELECT product_id INTO productID from  order_items where product_id = productID;
SELECT quantity INTO qty from order_items where quantity = qty; 

/**find store id with max stocks of product**/
select st.store_name, sk.store_id from stocks as sk
INNER JOIN
stores as st
ON sk.store_id = st.store_id
WHERE max(sk.quantity)
GROUP by sk.product_id;

select st.store_id from stores as st
INNER JOIN orders as o
ON st.store_id= o.store_id

Insert into orders (order_id, customer_id, order_status, order_date, required_date, staff_id)
WHERE order_status = '1',
AND order_date = select(curdate()),
AND required_date = adddate('order_date' +7),
AND staff_id = /**ANYONE from store listed in precious query (how do I relate these two queries)**



END
  • 不要重新声明函数参数
  • 您不需要使用
    SELECT
    查询来设置参数中已设置的变量
  • 您没有正确获取最大数量的商店。按sk使用
    订单。数量描述限制1
  • 您需要在查询中使用
    INTO
    ,以设置查询中的变量。如果不这样做,查询的结果将转换为过程的结果,这在这里是不需要的
  • INSERT
    语句中不使用
    WHERE
    <代码>其中用于查找符合条件的现有行,而
    插入
    用于创建新行。您可以使用
    VALUES()
    列出应分配给指定列的所有值

  • 您不能使用
    DECLARE
    来声明过程参数。它们已经在参数列表中声明了。不需要像从customer\u id=customerID的客户中将customer\u id选择为customerID这样的语句变量中已经有
    customerID
    ,这只是将其设置为相同的值。
    其中max(sk.quantity)
    不是找到最大数量商店的方式。使用
    选择前1名。。。ORDER BY sk.quantity DESC
    3天前,您在使用MySQL时遇到了一个类似的过程(同一教程)。现在,神秘的是,您正在使用SQL Server?你确定你知道你在用哪一个吗?语法和功能不同。@Barmar,非常感谢您的反馈。我正在尽我最大的努力跟随讲座和笔记,有时教授有“声明”,有时他没有,所以我认为安全总比抱歉好-我已经删除了
    DECLARE
    行-您是否建议我完全删除前3行select行?我不需要把
    放到某个地方的
    子句中吗?哇,这太棒了!我一直在研究代码,看看我是否能理解/复制它。如果你不介意我问的话,我有几个问题要问你,这样我可以更好地学习?1-对于程序开始时的输入,这与我上面的问题有关-我是否需要将ex:customer_id(从表)关联到customerID(从程序输入行)?什么时候或者什么时候我不能那样做?我想确保数据查询正确。2-因此您只声明了topStoreId和staffID,因为它们不在/Outputs中的过程中,是吗?3-在第一个查询结束时“INTO topStoreId”-我可以假设它被用作别名吗?所以整个查询结果都是从这个“topStoreId”中提取出来的?4-我从未见过IMAX函数。你能详细说明你为什么把它放在那里/它的作用吗?5-我是否必须在代码的插入部分将任何空值指定为OK?1。如果输入是产品名称,则可能需要使用查询将其与产品ID关联。或者可能需要使用查询验证产品ID是否确实存在。2。是的,这些是在过程中引入的局部变量,它们需要声明。这是对
    MAX
    的打字错误。5.在
    插入中未指定的任何列将获得其默认值,如果没有默认值,则为
    NULL
    。如果它们没有默认值,并且不可为null,您将得到一个错误。
    CREATE procedure placeOrder (IN customerID INT, IN productID INT, IN QTY INT, OUT orderId INT)
    BEGIN
    
    DECLARE topStoreId INT;
    DECLARE staffId INT;
    
    /**find store id with max stocks of product**/
    select sk.store_id 
    from stocks as sk
    INNER JOIN stores as st
    ON sk.store_id = st.store_id
    WHERE sk.product_id = productID
    ORDER BY sk.quantity DESC
    LIMIT 1
    INTO topStoreId;
    
    /* Pick an arbitrary staff from the selected store */
    SELECT staff_id
    FROM staffs
    WHERE store_id = topStoreId
    LIMIT 1
    INTO staffId;
    
    SELECT MAX(order_id)
    FROM orders AS o
    INTO orderId;
    
    Insert into orders (order_id, customer_id, order_status, order_date, required_date, staff_id, store_id)
    VALUES (orderId, customerId, 1, CURDATE(), DATE_ADD(CURDATE(), INTERVAL 1 WEEK), staffId, topStoreId);
    
    END