2017-06-23 1 views
0

J'ai écrit une procédure stockée pour insérer des données dans la table. Mais disons maintenant, je veux insérer plusieurs lignes en même temps en utilisant la procédure stockée. Comment puis-je aller à ce sujet? Une façon serait d'utiliser une boucle, mais cela voudrait dire appeler plusieurs fois la procédure stockée qui n'est pas efficient.This est ce que j'ai essayé, mais je continue à recevoir la Erro suivanteErreur dans mysql SP avec le paramètre de tableau

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; 
     check the manual that corresponds to your MariaDB server version for the right 
     syntax to use near '?,?,?,@output); select @output' at line 1 

p_insertarticleBEGIN

insert into rsscontent (title,link,date,count) values (a_title,a_link,a_date,a_count); 

    SET status = '001'; 
END 
noeud

js

var sql = "CALL p_insertarticle(?,?,?,?,@output); select @output"; 
var values = [ 
    ['demian', '[email protected]', 1,2], 
    ['john', '[email protected]', 2,4], 
    ['mark', '[email protected]', 3,5], 
    ['pete', '[email protected]', 4,6] 
]; 

con.query(sql, [values], function(err) { 
    if (err) throw err; 
    conn.end(); 
}); 

Est-il possible d'insérer plusieurs lignes à l'intérieur de la procédure stockée. J'utilise mysql et Xampp.

Répondre

0

Il n'y a aucun moyen sur terre que cela fonctionne.

Tout d'abord, vous essayez de transmettre un tableau ou une collection à une procédure stockée qui attend un seul ensemble de valeurs. Deuxièmement, même s'il était possible de passer dans un tableau de cette manière, votre sql serait en effet invalide. Les instructions à instructions multiples sont exécutées comme suit:

insert into rsscontent (title, link, date, count) 
values 
    (a_title,a_link,a_date,a_count), 
    (a_title2, a_link2, a_date2, a_count2), 
    (a_title3, a_link3, a_date3, a_count3); 

Et ainsi de suite.

L'utilisation d'une procédure stockée est exagérée pour cet exemple simple. Il serait préférable, et plus facile à gérer, de construire l'instruction sql dynamiquement dans node.js et de l'exécuter dès le départ.

Quelque chose comme ceci (code pseudo-ish, désolé, je ne suis pas expert js):

var sql = "insert into rsscontent (title,link, date,count) values"; 
var values = [ 
    ['demian', '[email protected]', 1,2], 
    ['john', '[email protected]', 2,4], 
    ['mark', '[email protected]', 3,5], 
    ['pete', '[email protected]', 4,6] 
]; 

for (var x in values){ 
    sql += "('" + val[x,0] + "', '" + val[x,1] + "', " + val[x,2] + ", " + val[x,3] + "),"; 
} 

Il y a probablement une belle façon d'utiliser values.push et values.join pour construire la chaîne beaucoup plus rapide . Vous devez également déterminer comment supprimer la virgule finale finale, ce qui invalidera le sql et le remplacer par un point-virgule.

Ceci est pour un javascript whizzkid pour comprendre!

+1

"supprimer la virgule finale finale" utiliser tranche de 0 à arr.length - 1 –

+0

Merci @ AndréDosSantos –

0

Je cherchais moi-même une solution et le meilleur moyen que j'ai trouvé était le suivant, je ne l'aime pas, mais ça marche.

JS:

var values = " 
('demian', '[email protected]', 1,2), 
('john', '[email protected]', 2,4)"; 

'CALL p_insertarticle(?)',values 

SQL:

IN values VARCHAR(5000) 

set @sql = concat("insert into rsscontent (title,link,date,count) values ",values,""); 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 

Comme vous pouvez le voir ci-dessus les valeurs sont transmises sous forme de chaîne à la SP, puis faire un simple concat et exécuter l'instruction. Ce n'est pas une bonne pratique.