[RESOLU][MYSQL] variable dans procédure stockée toujours NULL

variable dans procédure stockée toujours NULL [RESOLU][MYSQL] - SQL/NoSQL - Programmation

Marsh Posté le 16-04-2008 à 22:31:16    

Bonjour,
 
j'ai un problème avec une procédure stockée sous MYSQL
 

Code :
  1. Version du serveur: 5.0.45-community-nt
  2. Version du protocole: 10


 
J'ai une table dans laquelle je stocke des données temporairement (pas une table temporaire), puis lorsque je veux valider mes données, je veux lancer une procédure stockée qui copie les données de ma première table vers une autre en y ajoutant quelques infos supplémentaire lors de cette validation.
 
Je passe donc en paramètre l'id de mon enregistrement à copier à ma procédure stockée qui enregistre ses champs dans des variables, variables que j'utilise dans une requète d'insertion dans l'autre table.
 
Hors j'ai des champs qui refusent la valeur NULL, et malgré qu'aucun de mes champs ne soient nuls, lors de l'exécution de ma procédure, je reçoit l'erreur suivante :

Code :
  1. #1048 - Column 'commande_internet' cannot be null


 
Mon SELECT qui remplit les variables ne me renvoi aucune valeur NULL lorsque je l'exécute directement.
 
Voici à quoi ressemble tout ce petit monde :
 

Code :
  1. CREATE TABLE `commandes_temporaires` (
  2.   `id_commande_temporaire` int(10) unsigned NOT NULL auto_increment,
  3.   `commentaire_commande` varchar(512) character set utf8 collate utf8_bin default NULL,
  4.   `commande_internet` tinyint(1) NOT NULL default '0',
  5.   `id_destinataire` int(10) unsigned NOT NULL,
  6.   `id_auteur` tinyint(3) unsigned NOT NULL,
  7.   `id_responsable` tinyint(3) unsigned NOT NULL,
  8.   `id_affaire` int(10) unsigned NOT NULL,
  9.   `livraison_commande` tinyint(1) NOT NULL,
  10.   PRIMARY KEY  (`id_commande_temporaire`),
  11.   KEY `FK_commandes_destinataire` (`id_destinataire`),
  12.   KEY `FK_commandes_auteur` (`id_auteur`),
  13.   KEY `FK_commandes_responsable` (`id_responsable`),
  14.   KEY `FK_commandes_id_affaire` (`id_affaire`)
  15. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
  16. --
  17. -- Contenu de la table `commandes_temporaires`
  18. --
  19. INSERT INTO `commandes_temporaires` (`id_commande_temporaire`, `commentaire_commande`, `commande_internet`, `id_destinataire`, `id_auteur`, `id_responsable`, `id_affaire`, `livraison_commande`) VALUES
  20. (1, 'test', 0, 2, 1, 1, 13, 1);


 
table d'arrivée :

Code :
  1. CREATE TABLE `commandes` (
  2.   `id_commande` int(10) unsigned NOT NULL auto_increment,
  3.   `date_commande` date default NULL,
  4.   `reference_commande` char(13) character set utf8 collate utf8_bin default NULL,
  5.   `envoyee` tinyint(1) NOT NULL default '0',
  6.   `cloture_commande` tinyint(1) NOT NULL default '0',
  7.   `reference_confirmation_de_commande` varchar(32) character set utf8 collate utf8_bin default NULL,
  8.   `commentaire_commande` varchar(512) character set utf8 collate utf8_bin default NULL,
  9.   `commande_internet` tinyint(1) NOT NULL default '0',
  10.   `commande_complete` tinyint(1) NOT NULL default '0',
  11.   `id_destinataire` int(10) unsigned NOT NULL,
  12.   `id_auteur` tinyint(3) unsigned NOT NULL,
  13.   `id_responsable` tinyint(3) unsigned NOT NULL,
  14.   `id_affaire` int(10) unsigned NOT NULL,
  15.   `livraison_commande` tinyint(1) NOT NULL,
  16.   PRIMARY KEY  (`id_commande`),
  17.   KEY `FK_commandes_destinataire` (`id_destinataire`),
  18.   KEY `FK_commandes_auteur` (`id_auteur`),
  19.   KEY `FK_commandes_responsable` (`id_responsable`),
  20.   KEY `FK_commandes_id_affaire` (`id_affaire`)
  21. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


 
et la procédure :

Code :
  1. drop procedure if exists validate_commande $$
  2. CREATE PROCEDURE validate_commande ( id_commande_temporaire int(10) )
  3. BEGIN
  4. DECLARE id_destinataire, id_auteur, id_responsable, id_affaire int;
  5. DECLARE commentaire_commande varchar(512);
  6. DECLARE commande_internet bool;
  7. select
  8. `commentaire_commande` ,
  9. `commande_internet` ,
  10. `id_destinataire` ,
  11. `id_auteur` ,
  12. `id_responsable` ,
  13. `id_affaire`
  14. into
  15. commentaire_commande,
  16. commande_internet,
  17. id_destinataire,
  18. id_auteur,
  19. id_responsable,
  20. id_affaire
  21. from `commandes_temporaires` where `id_commande_temporaire` = id_commande_temporaire LIMIT 1;
  22. INSERT INTO `commandes` (
  23. `date_commande` ,
  24. `reference_commande` ,
  25. `commentaire_commande` ,
  26. `commande_internet` ,
  27. `id_destinataire` ,
  28. `id_auteur` ,
  29. `id_responsable` ,
  30. `id_affaire`
  31. )
  32. VALUES (
  33. date( now( ) ) ,
  34. 'Tb',
  35. commentaire_commande,
  36. commande_internet,
  37. id_destinataire,
  38. id_auteur,
  39. id_responsable,
  40. id_affaire
  41. );
  42. END$$


 
et enfin l'appel :

Code :
  1. call validate_commande( 1 )


 
Il semblerait que ma requete SELECT ne remplisse pas les variables, pourtant je ne voit pas où est la différence avec les docs et autres exemples que j'ai pu trouver sur le net.
 
Quelqu'un saurait-il où est mon erreur ?
 
Merci


Message édité par uncle buzz le 17-04-2008 à 20:47:15
Reply

Marsh Posté le 16-04-2008 à 22:31:16   

Reply

Marsh Posté le 17-04-2008 à 09:03:16    

je ne fais pas de mysql, mais tu as essayé de mettre ta variable commande_internet du même type que celui de la colonne?
 
et de nouveau je ne sais pas si ca existe ou pas en mysql mais en oracle tu aurais pu attribuer le type en faisant commandes_temporaires.commande_internet%TYPE, ce qui est plutot pas mal.

Reply

Marsh Posté le 17-04-2008 à 09:45:12    

Bonjour,
 
le problème n'est pas lié à ma variable commande_internet spécifiquement, mais à toutes mes variables.
 
J'ai déjà essayé de déclarer celle-ci en bool, int(1), tinyint(1) sans aucune différence. En fait à la création elle est déclarée en bool, mais le script que phpmyadmin me renvoit pour la sauvegarde de la structure la déclare en tinyint(1) (d'où la différence de type dans les extraits que j'ai mis), ce qui ne doit pas jouer sur le fonctionnement en interne, je pense que MYSQL gère un bool comme un int de taille 1, d'où la transformation en tinyint par phpmyadmin.
 
De toute façon je l'ai aussi "court-circuitée" en la remplaçant par une valeur en "dur" dans la requête d'insertion, et alors l'erreur passe à la variable suivante où une valeur NULL est interdite.
 
Le fait est que toutes mes variables semble avoir la valeur NULL dans ma requête d'insertion alors qu'il me semble avoir repris exactement la syntaxe de INSERT ... INTO ... FROM
 
Certains exemples rajoutent un SELECT simple avec les variables à la suite, hors lorsque j'ai essayé ceci, MYSQL m'a répondu qu'une procédure ne peut rien retourner comme valeur (SELECT = RETURN ? )
 

Reply

Marsh Posté le 17-04-2008 à 20:46:43    

Pour ceux à qui ça arriverai, mettre les champs entre `` permet de bien les différencier des variables du même nom...
 
Cependant il s'avère que dans un select, stocké les résultats des champs dans des variables du même nom que les champs ne marche pas. Utiliser des alias pour les champs ne suffit pas, il faut impérativement que les variables aient des noms différents de ceux des champs.
 
Voilà ce qui arrive quand on manque de rigueur et qu'on fait tout ce qu'on peut pour user et abuser du copier/coller :D

Reply

Marsh Posté le 18-04-2008 à 10:12:25    

j'y avais pensé mais je ne sais plus pourquoi je ne l'avais pas posté :/
 
perso je préfixe toutes mes entrées d'une certaine manière, et toutes mes variables d'une autre, ca permet de ne pas laisser d'ambiguité, et aussi pour la lisibilité tu visualises plus vite ce que tu fais.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed