首页 > 解决方案 > 如何在 MySQL 存储过程中返回 @declared 值?

问题描述

我正在尝试创建代码,该代码将使用存储过程将新订单添加到订单列表中,并尝试这样调用该过程: CALL test_order(20,12,1, @order);

我在@order_id/order_id 周围不断收到错误,代码如下。我能够创建存储过程,但值不会返回。

使用下面的代码时,我收到错误:

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 '@order_id INT) BEGIN DECLARE order_id INT; 附近使用正确的语法;声明 storeID VARCHAR(255); 声明'在第 1 行

CREATE PROCEDURE test_order(IN customerID INT,IN productID INT,IN qty INT, OUT @order_id INT)
BEGIN
    DECLARE order_id INT;
    DECLARE storeID VARCHAR(255);
    DECLARE staffID INT;
    DECLARE listPrice DECIMAL(10,2);

START TRANSACTION;

/*storeID */
SELECT s.store_id FROM stocks as s INNER JOIN products as p USING(product_id) WHERE p.product_ID = productID ORDER BY s.quantity DESC LIMIT 1 INTO storeID;

/* Next Order */
SELECT max(order_id) + 1 FROM orders INTO @order_id;

/* Staff */
SELECT staff_id FROM staffs where store_id = storeID limit 1 INTO staffID;

/* Order */
INSERT INTO orders VALUES (@order_id, customerID, 1, CURDATE(), ADDDATE(CURDATE(), interval 7 day), NULL, storeID, staffID);

/* Price */
SELECT list_price FROM products WHERE product_id = productID INTO listPrice;

/* Item Row */
INSERT INTO order_items VALUES (@orderId, 1, productID, qty, listPrice, 0);

END //

当我从过程中取出 @ 符号时,我能够创建过程,但 order_id 为“null”。例如:CREATE PROCEDURE test_order(IN customerID INT,IN productID INT,IN qty INT,OUT order_id INT)

@order_id 有什么问题?

标签: mysqlsqlstored-proceduresrelational-database

解决方案


您必须在程序之前先使用 DELIMITER $$,然后使用 END$$ 和 DELIMITER 结束此程序;. 我在 MySQL 工作台上检查并运行了这个过程。现在您选择您的数据库、表并检查此过程。

 DELIMITER $$

    CREATE PROCEDURE test_order(IN customerID INT,IN productID INT,IN qty INT, OUT order_id INT)
    BEGIN
        DECLARE order_id INT;
        DECLARE storeID VARCHAR(255);
        DECLARE staffID INT;
        DECLARE listPrice DECIMAL(10,2);

    START TRANSACTION;

    /*storeID */
    SELECT s.store_id FROM stocks as s INNER JOIN products as p USING(product_id) WHERE p.product_ID = productID ORDER BY s.quantity DESC LIMIT 1 INTO storeID;

    /* Next Order */
    SELECT max(order_id) + 1 FROM orders INTO @order_id;

    /* Staff */
    SELECT staff_id FROM staffs where store_id = storeID limit 1 INTO staffID;

    /* Order */
    INSERT INTO orders VALUES (@order_id, customerID, 1, CURDATE(), ADDDATE(CURDATE(), interval 7 day), NULL, storeID, staffID);

    /* Price */
    SELECT list_price FROM products WHERE product_id = productID INTO listPrice;

    /* Item Row */
    INSERT INTO order_items VALUES (@orderId, 1, productID, qty, listPrice, 0);

    END$$

    DELIMITER ;

推荐阅读