Mysql在存储过程中使用最后一个插入ID

Mysql在存储过程中使用最后一个插入ID,mysql,stored-procedures,last-insert-id,Mysql,Stored Procedures,Last Insert Id,我需要根据插入到另一个主表中的最后一个id创建一个表,为此我创建了以下存储过程: CREATE PROCEDURE `sp_create_campaign` ( IN p_vName VARCHAR(70), IN p_iIdOper INT(11), IN p_iIdCount INT(11), IN p_iIdMoney INT(11), IN p_cPr

我需要根据插入到另一个主表中的最后一个id创建一个表,为此我创建了以下存储过程:

CREATE PROCEDURE `sp_create_campaign`
(
        IN  p_vName         VARCHAR(70),
        IN  p_iIdOper       INT(11),
        IN  p_iIdCount      INT(11),
        IN  p_iIdMoney      INT(11),
        IN  p_cPrefix       CHAR(2),
        IN  p_tComment      TINYTEXT,
        IN  p_iIdUser       VARCHAR(32),
        OUT p_return_code   TINYINT UNSIGNED
)
BEGIN

    DECLARE p_campaign INT(11);

    DECLARE exit handler for sqlexception
    BEGIN
        -- ERROR
            set p_return_code = 1;
            rollback;
    END;

    DECLARE exit handler for sqlwarning
    BEGIN
            -- WARNING
            set p_return_code = 2;
            rollback;
    END;

    START TRANSACTION;

        -- Campaign
        INSERT INTO `db_campaign` 
            (`vName`, `iIdOper`, `iIdCount`, `iIdMoney`, `cPrefix`, `tComment`, `iIdUser`, `dRegister`)
            VALUES
            (p_vName, p_iIdOper, p_iIdCount, p_iIdMoney, p_cPrefix, p_tComment, p_iIdUser, NOW());

        SET p_campaign := LAST_INSERT_ID();

        -- Sales
        SET @s = CONCAT('DROP TABLE IF EXISTS ', 'db_sale_', p_campaign);
        PREPARE stm FROM @s;
        EXECUTE stm;

        SET @x = CONCAT(
                'CREATE TABLE ',
                'db_sale_', p_campaign,
                "(
                `iIdSale`           INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
                `dDate`             DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
                `dSubtotal`         DECIMAL(7,2) UNSIGNED NOT NULL DEFAULT '00.00',
                `dTax`              DECIMAL(7,2) UNSIGNED NOT NULL DEFAULT '00.00',
                `dTotal`            DECIMAL(7,2) UNSIGNED NOT NULL DEFAULT '00.00',
                `iIdMoney`          INT(11) UNSIGNED NOT NULL,
                `iIdOper`           INT(11) UNSIGNED NOT NULL,
                `iIdBankCount`      INT(11) UNSIGNED NOT NULL,
                `iIdGroup`          INT(11) UNSIGNED NOT NULL,
                `iIdUser`           INT(11) UNSIGNED NOT NULL,
                `iIdUserReg`        VARCHAR(32) NOT NULL,
                `dRegister`         DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
                PRIMARY KEY (`iIdSale`)
                ) ENGINE=MyISAM DEFAULT CHARSET=utf8;");        

        PREPARE stm FROM @x;
        EXECUTE stm;

    COMMIT;

    -- SUCCESS
    set p_return_code = 0;

END

但问题是只插入第一条记录,无法创建表。我在哪里失败了?

如果您使用
设置
,您需要
=
而不是
:=
两件事:

  • 执行
    DROP
    将隐式地
    COMMIT
    您的事务

  • 尝试添加

    解除分配准备stm


  • 在每个
    语句之后执行
    语句。

    替换此行:
    设置p_活动:=LAST_INSERT_ID()


    使用此选项:
    SELECT LAST_INSERT_ID()进入p_活动

    根据的MySQL文档

    如果存储过程执行的语句更改了LAST_INSERT_ID()的值,则过程调用后的语句将看到更改后的值

    使用类似于:

    根据id DESC LIMIT 1从db_活动订单中选择id进入p_活动

    或:


    从db_活动选择max(id)进入p_活动

    我得到了相同的结果。主要问题是获取最后一个ID。我使用相同的存储过程将其他记录直接插入到最新的ID中,但仍然不起作用。将用于事务?如果db_活动是MyISAM,则可以删除
    启动事务
    提交
    回滚s,因为它们实际上是NOOPs。您可以添加一些日志记录,比如
    INSERT到syslog SET script='myscript',line='lineno',message=CONCAT('last_INSERT_id()=',last_INSERT_id())是的,你是对的。调查MyISAM数据库不支持事务。它是否引发任何错误?
    选择p\u return\u code的输出是什么?或者注释
    sqlexception处理程序
    块,看看会发生什么。我注释了sqlexception,并在末尾添加了:“selectp_return_code”。但我什么都不退!仅限:“时间:0.000ms已成功执行过程影响行:0”