带有数组参数的mysql SP出错

时间:2017-06-23 13:09:53

标签: mysql node.js stored-procedures

我编写了一个用于将数据插入表中的存储过程。但现在让我们说,我想使用存储过程同时插入多行。我怎么能去做呢?一种方法是使用一个循环,但这意味着多次调用存储过程效率不高。这是我尝试但我一直收到以下错误

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。

2 个答案:

答案 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并执行该语句。这不是一个好习惯。