mysql - 如何在 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 有什么问题?
解决方案
您必须在程序之前先使用 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 ;
推荐阅读
- flutter - 如何在颤动中设置 showModalBottomSheet 宽度
- r - For循环以子集数据帧列表
- python - 如何在 keras 损失函数中正确使用 from_logits 进行二进制分类?
- gcc - 将外部 DPVS 应用程序(使用 Makefile)与使用 Meson 构建的 DPDK 链接
- c++ - 在紧密循环中哪个更快?[swich-cast, if-else, goto-label]
- objective-c - 具有按顺序运行的完成块的 GCD 队列
- android - 在android Webview中折叠html加载
- typescript - 如何避免 TypeScript 模板文字类型推断中的歧义?
- c++ - 声明没有定义的静态成员
- linux - 使用 qemu 和 gdb 调试内核,断点不起作用?