2012-07-19 3 views
0

Je dois créer une table basée sur le dernier id inséré dans une autre table principale, pour ce que j'ai créé la procédure stockée suivante:Mysql utiliser LAST_INSERT_ID procédure stockée

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 

Mais le problème est que insère seulement premier enregistrement et ne parvient pas à créer la table. Où suis-je en train d'échouer?

+0

-t-il jeter une erreur? Quelle est la sortie de 'select p_return_code;'? Ou commentez le bloc 'sqlexception handler' et voyez ce qu'il se passe. –

+0

J'ai commenté SQLException et j'ai ajouté: "SELECT p_return_code," à la fin. Mais je ne retourne rien! seulement: "Temps: 0.000ms Procédure Exécutée avec succès Rangées affectées: 0" – csotelo

Répondre

0

si vous utilisez SET vous avez besoin = au lieu de :=

+0

J'ai essayé avec "=" y ": =" et c'est le même résultat – csotelo

0

Deux choses:

  1. sera implicitement DROP exécution COMMIT votre transaction.

  2. Essayez d'ajouter

    DEALLOCATE PREPARE stm;

après chaque instruction EXECUTE.

+0

J'obtiens le même résultat. Le problème principal est d'obtenir le dernier ID. J'utilise la même procédure stockée pour insérer directement d'autres enregistrements directement à l'ID le plus récent, mais ne fonctionne toujours pas. Sera pour la transaction? – csotelo

+1

Si db_campaign est MyISAM, vous pouvez supprimer les commandes 'START TRANSACTION;', 'COMMIT; 'et' ROLLBACK;', car ce sont effectivement des NOOP. Vous pouvez ajouter un peu de journalisation, quelque chose comme 'INSERT INTO syslog SET script = 'myscript', ligne = 'lineno', message = CONCAT ('last_insert_id() =', LAST_INSERT_ID());' –

+0

Ouais, vous avez raison. L'analyse de la base de données MyISAM ne prend pas en charge les transactions. – csotelo

1

Remplacer cette ligne: SET p_campaign := LAST_INSERT_ID();

Avec celui-ci: SELECT LAST_INSERT_ID() INTO p_campaign ;