Хранимая процедура, не возвращающая никакого значения, когда это необходимо (MySQL) - PullRequest
0 голосов
/ 10 октября 2019

У меня есть эта хранимая процедура, которую я хочу, чтобы она возвращала значение (lastinsertid). Все, что он возвращает, это 0. Мой вопрос, что не так с кодом ниже?

CREATE PROCEDURE my_stored_procedure(
    IN inCartId int
)
BEGIN

    DECLARE orderId INT;

    -- Insert a new record into orders and obtain the new order ID
    INSERT INTO orders (created_on) VALUES (NOW());

    -- Obtain the new Order ID
    SELECT LAST_INSERT_ID() INTO orderId;

    -- Insert order details in order_detail table
    INSERT INTO order_detail (
        order_id, product_id, attributes, product_name, quantity, unit_cost
    )
    SELECT
        orderId,
        p.id,
        sc.attributes,
        p.name,
        sc.quantity,
        COALESCE( NULLIF( p.discounted_price, 0 ), p.price ) AS unit_cost
    FROM
        shopping_cart sc
        INNER JOIN products p ON sc.product_id = p.id
    WHERE
        sc.cart_id = inCartId
        AND
        sc.buy_now;

    -- Save the order's total amount
    UPDATE
        orders
    SET
        total_amount = (
            SELECT
                SUM( unit_cost * quantity )
            FROM
                order_detail
            WHERE
                order_id = orderId
        )
    WHERE
        id = orderId;

    -- Clear the shopping cart
    CALL shopping_cart_empty( inCartId );

END

1 Ответ

1 голос
/ 10 октября 2019
  • В большинстве систем баз данных, таких как MySQL / MariaDB и MS SQL Server, хранимые процедуры не имеют «возвращаемых значений» так же, как функции.

  • Вместо этого хранимые процедуры возвращают данные вызывающей стороне через Выходные параметры .

    • В MySQL FUNCTION действительно возвращает значение , ноFUNCTION отличается от хранимой процедуры, и поясняющие различия лучше всего сделать в отдельном вопросе .
  • (В Microsoft SQL Server и Sybase хранимые процедуры делаютвсе возвращают одно int значение «кода возврата», однако это значение указывает на состояние (например, как исполняемые программы имеют код завершения) и не предназначено для использования для возврата данных из вашей базы данных.)

  • Чтобы использовать выходные параметры в MySQL и MariaDB, используйте ключевое слово OUT вместо ключевого слова IN, а затем присвойте этому параметру.

Inв вашем случае замените локальную переменную orderId с параметром OUT newOrderId, который я добавил в список параметров хранимой процедуры. Никаких других изменений не требуется.

CREATE PROCEDURE my_stored_procedure(
    IN inCartId int,
    OUT newOrderId int
)
BEGIN

    -- Insert a new record into orders and obtain the new order ID
    INSERT INTO orders (created_on) VALUES (NOW());

    -- Obtain the new Order ID
    SELECT LAST_INSERT_ID() INTO newOrderId;

    -- Insert order details in order_detail table
    INSERT INTO order_detail (
        order_id, product_id, attributes, product_name, quantity, unit_cost
    )
    SELECT
        orderId,
        p.id,
        sc.attributes,
        p.name,
        sc.quantity,
        COALESCE( NULLIF( p.discounted_price, 0 ), p.price ) AS unit_cost
    FROM
        shopping_cart sc
        INNER JOIN products p ON sc.product_id = p.id
    WHERE
        sc.cart_id = inCartId
        AND
        sc.buy_now;

    -- Save the order's total amount
    UPDATE
        orders
    SET
        total_amount = (
            SELECT
                SUM( unit_cost * quantity )
            FROM
                order_detail
            WHERE
                order_id = orderId
        )
    WHERE
        id = orderId;

    -- Clear the shopping cart
    CALL shopping_cart_empty(inCartId);

END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...