我编写了一个用于将数据插入表中的存储过程。但现在让我们说,我想使用存储过程同时插入多行。我怎么能去做呢?一种方法是使用一个循环,但这意味着多次调用存储过程效率不高。这是我尝试但我一直收到以下错误
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
节点js
var sql = "CALL p_insertarticle(?,?,?,?,@output); select @output";
var values = [
['demian', 'demian@gmail.com', 1,2],
['john', 'john@gmail.com', 2,4],
['mark', 'mark@gmail.com', 3,5],
['pete', 'pete@gmail.com', 4,6]
];
con.query(sql, [values], function(err) {
if (err) throw err;
conn.end();
});
有没有办法在存储过程中插入多行。我正在使用mysql和Xampp。
答案 0 :(得分:0)
地球上没有办法可行。
首先,您尝试将数组或集合传递给期望一组值的存储过程。
其次,即使有可能以这种方式传入数组,你的sql确实会失效。多插入语句如下所示:
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);
等等。
对于这个简单的例子,使用存储过程是过度的。在node.js中动态构建sql语句并直接执行它会更好,更易于维护。
像这样的东西(伪代码,抱歉,我不是js专家):
var sql = "insert into rsscontent (title,link, date,count) values";
var values = [
['demian', 'demian@gmail.com', 1,2],
['john', 'john@gmail.com', 2,4],
['mark', 'mark@gmail.com', 3,5],
['pete', 'pete@gmail.com', 4,6]
];
for ( var x in values ){
sql += "('" + val[x,0] + "', '" + val[x,1] + "', " + val[x,2] + ", " + val[x,3] + "),";
}
使用values.push和values.join可能有一种简洁的方法可以更快地构建字符串。 您还需要弄清楚如何删除最终的尾随逗号,这将使sql无效,并用分号替换它。
这是一个javascript whizzkid想出来的!
答案 1 :(得分:0)
我一直在寻找解决方案,我找到的最好方法是以下,我不喜欢它,但它确实有用。
JS:
var values = "
('demian', 'demian@gmail.com', 1,2),
('john', 'john@gmail.com', 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;
正如您在上面看到的那样,值作为字符串传递给SP,然后只做一个简单的concat并执行该语句。这不是一个好习惯。