【问题标题】:Unable to get correct Output from MySQL Procedure无法从 MySQL 过程中获得正确的输出
【发布时间】:2016-04-26 09:33:56
【问题描述】:
DELIMITER $$

CREATE PROCEDURE `create_Publisher`(IN userGuid VARCHAR(36), IN pubEmail VARCHAR(120), IN passwd VARCHAR(120), IN pubGuid VARCHAR(36), IN pubName VARCHAR(120), IN cat VARCHAR(500), OUT isSuccess TINYINT)
BEGIN

    DECLARE `_rollback` BOOL DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
    SET isSuccess = 1;
    START TRANSACTION;

    INSERT INTO users (guid,email,password,role) VALUES (userGuid,pubEmail,passwd,'publisher');
    SELECT @userid := id FROM users WHERE email=pubEmail;
    INSERT INTO publisher (guid,name,cat,status,user_id) VALUES (pubGuid,pubName,cat,'pause',@userid);

    IF `_rollback` THEN
        SET isSuccess = 0;
        ROLLBACK;
    ELSE
        SET isSuccess = 1;
        COMMIT;
    END IF;
END$$

DELIMITER ;

这是我正在处理的程序。目的是创建一个新的Publisher。是否创建了新发布者,这由 isSuccess 变量知道,它是一个 OUT 参数。即使正在创建发布者,它总是给我 0。

我正在使用 MySQL 5.7.12,在 MySQL WorkBench 上工作。 通过以下几行检查程序:

CALL create_Publisher('U_GUID20','r@r.com','Hahaha','P_GUID20','ThePublisher',NULL, @isSucess);

SELECT @isSuccess;

【问题讨论】:

    标签: mysql stored-procedures transactions


    【解决方案1】:

    从 MySQL 命令行尝试:

    mysql> SELECT VERSION()//
    +-----------+
    | VERSION() |
    +-----------+
    | 5.7.12    |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> DROP TABLE IF EXISTS `users`//
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> DROP TABLE IF EXISTS `publisher`//
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> DROP PROCEDURE IF EXISTS `create_Publisher`//
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> CREATE TABLE IF NOT EXISTS `users` (
        ->   `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        ->   `guid` VARCHAR(36) NOT NULL,
        ->   `email` VARCHAR(120),
        ->   `password` VARCHAR(120),
        ->   `role` VARCHAR(12)
        -> )//
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> CREATE TABLE IF NOT EXISTS `publisher` (
        ->   `guid` VARCHAR(36) NOT NULL,
        ->   `name` VARCHAR(120),
        ->   `cat` VARCHAR(500),
        ->   `status` VARCHAR(12),
        ->   `user_id` VARCHAR(12)
        -> )//
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> CREATE PROCEDURE `create_Publisher`(
        ->   `userGuid` VARCHAR(36),
        ->   `pubEmail` VARCHAR(120),
        ->   `passwd` VARCHAR(120),
        ->   `pubGuid` VARCHAR(36),
        ->   `pubName` VARCHAR(120),
        ->   `cat` VARCHAR(500),
        ->   OUT `isSuccess` TINYINT
        -> )
        -> BEGIN
        ->   DECLARE `_rollback` BOOL DEFAULT 0;
        ->   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` := 1;
        ->   SET `isSuccess` := 1;
        ->   START TRANSACTION;
        -> 
        ->   INSERT INTO `users` (
        ->     `guid`,
        ->     `email`,
        ->     `password`,
        ->     `role`
        ->   ) VALUES (
        ->     `userGuid`,
        ->     `pubEmail`,
        ->     `passwd`,
        ->     'publisher'
        ->   );
        ->   SELECT @`userid` := `id`
        ->   FROM `users`
        ->   WHERE `email` = `pubEmail`;
        -> 
        ->   INSERT INTO `publisher` (
        ->     `guid`,
        ->     `name`,
        ->     `cat`,
        ->     `status`,
        ->     `user_id`
        ->   ) VALUES (
        ->     `pubGuid`,
        ->     `pubName`,
        ->     `cat`,
        ->     'pause',
        ->     @`userid`
        ->   );
        -> 
        ->   IF `_rollback` THEN
        ->     SET `isSuccess` := 0;
        ->       ROLLBACK;
        ->   ELSE
        ->     SET `isSuccess` := 1;
        ->     COMMIT;
        ->   END IF;
        -> END//
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> DELIMITER ;
    
    mysql> CALL `create_Publisher`(
        ->   'U_GUID20',
        ->   'r@r.com',
        ->   'Hahaha',
        ->   'P_GUID20',
        ->   'ThePublisher',
        ->   NULL,
        ->   @`isSucess`
        -> );
    +-------------------+
    | @`userid` := `id` |
    +-------------------+
    |                 1 |
    +-------------------+
    1 row in set (0.01 sec)
    
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> SELECT @`isSucess`;
    +-------------+
    | @`isSucess` |
    +-------------+
    |           1 |
    +-------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT
        ->   `guid`,
        ->   `email`,
        ->   `password`,
        ->   `role`
        -> FROM
        ->   `users`;
    +----------+---------+----------+-----------+
    | guid     | email   | password | role      |
    +----------+---------+----------+-----------+
    | U_GUID20 | r@r.com | Hahaha   | publisher |
    +----------+---------+----------+-----------+
    1 row in set (0.00 sec)
    
    mysql> SELECT
        ->   `guid`,
        ->   `name`,
        ->   `cat`,
        ->   `status`,
        ->   `user_id`
        -> FROM
        ->   `publisher`;
    +----------+--------------+------+--------+---------+
    | guid     | name         | cat  | status | user_id |
    +----------+--------------+------+--------+---------+
    | P_GUID20 | ThePublisher | NULL | pause  | 1       |
    +----------+--------------+------+--------+---------+
    1 row in set (0.00 sec)
    
    mysql> -- FAIL
    mysql> CALL `create_Publisher`(
        ->   'U_GUID21',
        ->   'r1@r.com',
        ->   'Hahaha1',
        ->   NULL,           -- <<<< SQLEXCEPTION >>>>
        ->   'ThePublisher1',
        ->   NULL,
        ->   @`isSucess`
        -> );
    +-------------------+
    | @`userid` := `id` |
    +-------------------+
    |                 2 |
    +-------------------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @`isSucess`;
    +-------------+
    | @`isSucess` |
    +-------------+
    |           0 |
    +-------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT
        ->   `guid`,
        ->   `email`,
        ->   `password`,
        ->   `role`
        -> FROM
        ->   `users`;
    +----------+---------+----------+-----------+
    | guid     | email   | password | role      |
    +----------+---------+----------+-----------+
    | U_GUID20 | r@r.com | Hahaha   | publisher |
    +----------+---------+----------+-----------+
    1 row in set (0.00 sec)
    
    mysql> SELECT
        ->   `guid`,
        ->   `name`,
        ->   `cat`,
        ->   `status`,
        ->   `user_id`
        -> FROM
        ->   `publisher`;
    +----------+--------------+------+--------+---------+
    | guid     | name         | cat  | status | user_id |
    +----------+--------------+------+--------+---------+
    | P_GUID20 | ThePublisher | NULL | pause  | 1       |
    +----------+--------------+------+--------+---------+
    1 row in set (0.00 sec)
    

    在您的存储过程中,您可以更改以下内容:

    .
    .
    .
    DECLARE `userid` INT UNSIGNED;
    .
    .
    .
    
    /*
    SELECT @`userid` := `id`
    FROM `users`
    WHERE `email` = `pubEmail`;
    */
    SET `userid` := LAST_INSERT_ID();
    
    INSERT INTO `publisher` (
      `guid`,
      `name`,
      `cat`,
      `status`,
      `user_id`
    ) VALUES (
      `pubGuid`,
      `pubName`,
      `cat`,
      'pause',
      `userid`
    );
    .
    .
    .
    

    【讨论】:

    • 你能指出错误吗?错误是由于 WorkBench 造成的吗?
    • @gagangupt16:您使用的是什么版本的 MySQL Workbench?我正在使用 MySQL Workbench 6.3.6 并且无法重现该问题。
    • 我正在使用 WorkBench 6.0.8
    • @gagangupt16:使用 MySQL Workbench 6.0.8 和 MySQL Server 5.7.12,我无法重现问题,上面的脚本没有问题。
    • @gagangupt16:当心错字。 @isSucess != @isSuccess.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2017-03-14
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多