2012-07-19 84 views
0

我需要根据插入到另一个主表,这样做的最后一个ID创建一个表,我创建了以下存储过程:使用mysql LAST_INSERT_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 

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

如果使用
+0

它是否抛出任何错误? 'select p_return_code;'的输出是什么?或评论'sqlexception处理程序'块,看看会发生什么。 – 2012-07-19 17:28:06

+0

我评论了SQLException,并在最后添加了:“SELECT p_return_code”。但我什么都没有回报!只有:“时间:0.000ms过程已成功执行受影响的行:0” – csotelo 2012-07-19 17:54:54

回答

0

SET你需要的=代替:=

+0

我试过了“=”y“:=”并且结果相同 – csotelo 2012-07-19 15:42:07

0

两件事情:

  1. 执行DROP会隐COMMIT您的交易。

  2. 尝试每个EXECUTE语句后加入

    DEALLOCATE PREPARE stm;

+0

我得到了相同的结果。主要问题是获取最后一个ID。我使用相同的存储过程直接将其他记录直接插入最新的ID,但仍然无法工作。将用于交易? – csotelo 2012-07-19 15:53:46

+1

如果db_campaign是MyISAM,您可以删除'START TRANSACTION;','COMMIT;'和'ROLLBACK;',因为它们实际上是NOOP。你可以添加一些日志记录,比如'INSERT INTO syslog SET script ='myscript',line ='lineno',message = CONCAT('last_insert_id()=',LAST_INSERT_ID());' – 2012-07-19 22:01:59

+0

是的。调查MyISAM数据库不支持事务。 – csotelo 2012-07-20 14:07:29

1

替换此行:SET p_campaign := LAST_INSERT_ID();

有了这一个:SELECT LAST_INSERT_ID() INTO p_campaign ;