2012-07-19 50 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 ;