Как мне вернуть @declared значение в хранимой процедуре MySQL? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь создать код, который добавит новый заказ в список заказов с помощью хранимой процедуры, и пытаюсь вызвать процедуру как таковую: 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); DECLARE 'в строке 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?

1 Ответ

0 голосов
/ 06 мая 2020

Вы должны использовать 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 ;
...