Mysql procédure Stockée à l'aide du curseur
Mysql curseur problème?
J'ai écrit une procédure stockée qui voyage d'un enregistrement d'une table et d'insérer des personnes en 2-3 tables différentes
à l'aide des instructions insert.
Problème est que je suis de vérifier si l'enregistrement n'est pas existe dans le tableau 1, puis je suis insertion d'enregistrement de temptable à table1 ,table2 de manière séquentielle
mais la condition est d'avoir quelques un problème, je ne sais pas sa va toujours dans le reste de la partie.
Exemple de Code est comme suit:
CREATE PROCEDURE `insertData`(In clientNo INT,In usedID INT)
BEGIN
declare mame varchar(100);
declare address varchar(100);
declare city varchar(50);
declare IdentityNO1 varchar(20)
declare cur1 cursor for select * from temptable;
declare continue handler for not found set done=1;
SET @clientNo = clientNO;
SET @userID = userID;
set done = 0;
open cur1;
igmLoop: loop
fetch cur1 into Name,Address,City,IdentityNO1,clientNo;
if done = 1 then leave igmLoop; end if;
//If no record exists in some records table1,table2.
IF ( (SELECT COUNT(*) FROM table1
WHERE IndentityNo=IdentityNo1
AND clientNo=@clientNo) < = 0)
INSERT INTO table1 (Name,IdentityNO) VALUES (name,IdentityNO1);
INSERT INTO table2 (Address,City) VALUES(address,city);
ELSE
INSERT INTO tblexceptional(Name,Address,City,IdentityNo)
VALUES(name,address,city,IdentityNo1);
end loop igmLoop;
close cur1;
END
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de
THEN
niEND IF
mots-clés, la procédure ne peut pas compiler.Suivez ce lien pour la syntaxe correcte de
IF
déclaration: http://dev.mysql.com/doc/refman/5.7/en/if.htmlUtilisation
EXIST
opérateur au lieu de(SELECT count(*)... ) <=0
,lire ce lien pour connaître la raison: http://sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/exists-vs-count-the-battle-never-ends.aspx
Je recommande l'utilisation de certains préfixes pour des arguments de procédure et les noms de variables pour éviter toute ambiguïté, par exemple, utiliser
p_
pour les paramètres et lesv_
pour les variables. Il est difficile de deviner, en regardant ce code, dont le nom est le nom d'une colonne, d'une variable ou d'un paramètre de la procédure. Cela peut conduire à des erreurs et des erreurs.Évitez d'utiliser des
SELECT *
- ce code suivant ne fonctionnera pas si quelqu'un va modifier la structure de la table. Explicitement la liste des colonnes requises dans la déclaration de curseur:Le corrigé procédure pourrait ressembler à ceci:
NOT exists(...)
au conditionnel insérer la clause.