我有一个先前的问题已关闭...但是我设法解决了我的错误,因此希望这是一个更具体的问题。
在我的过程中,我通过在多个迭代组上串联字符串来生成包含1000条记录的插入语句。
....
....
SET svalue = CONCAT('(',QUOTE(fHash), ',', QUOTE(cName), ',', QUOTE(fDescription), ',', QUOTE(fName), ',', QUOTE(fSize), ',', QUOTE(fVersion), ',', QUOTE(pLanguage), ',', QUOTE(pName), ',', QUOTE(pVersion), ',', QUOTE(sig),'),');
SET svalues = CONCAT(COALESCE(svalues, ''), svalue);
迭代组中的最后一个字符串不包含“,”。 在我的代码中,我跟踪迭代的记录数以及所需的迭代总数。
SELECT CEILING(CAST(@rec_count as float)/1000) INTO l_icnt;
SET l_cnt = @rec_count ;
@rec_count =选择计数(*)。循环l_cnt中的每个迭代都减去1,并且每次迭代都会进行检查:
IF CEILING(CAST(l_cnt as float)/1000) = l_icnt - 1 THEN
....
如果为true,则除了应执行的插入操作外,迭代计数还减少一:
IF .... THEN
SET svalue = CONCAT('(',QUOTE(fHash), ',', QUOTE(cName), ',', QUOTE(fDescription), ',', QUOTE(fName), ',', QUOTE(fSize), ',', QUOTE(fVersion), ',', QUOTE(pLanguage), ',', QUOTE(pName), ',', QUOTE(pVersion), ',', QUOTE(sig),')');
SET svalues = CONCAT(COALESCE(svalues, ''), svalue);
SET @s = CONCAT('INSERT INTO scanfiles.ud_distinctfiles2(fileId, companyName, fileDescription, fileName, fileSize, fileVersion, productLanguage, productName, productVersion, signature) VALUES', svalues);
call debug_msg(TRUE, CONCAT('insert statement is ', @s));
prepare stmt from @s;
execute stmt;
deallocate prepare stmt;
SET @s = NULL;
SET svalues = NULL;
SET l_icnt = l_icnt -1 ;
ELSE
...
我的问题是,当该过程运行时,不会发生错误,但是不会插入任何行。在插入发生之前,我捕获了最终语句并将其记录到表中。当我检查该行时,我看到该语句。我可以将其复制并粘贴到Workbench中并执行它。
在之前的测试中,我发现直到为sqlexception声明退出处理程序之前,事情都以静默方式失败:
DECLARE exit handler for sqlexception
BEGIN
SHOW ERRORS;
GET DIAGNOSTICS CONDITION 1
@p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
SELECT @p1 as RETURNED_SQLSTATE , @p2 as MESSAGE_TEXT;
ROLLBACK;
END;
DECLARE exit handler for sqlwarning
BEGIN
GET DIAGNOSTICS CONDITION 1
@p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
SELECT @p1 as RETURNED_SQLSTATE , @p2 as MESSAGE_TEXT;
ROLLBACK;
END;
我是否缺少其他声明来捕获所有错误?请注意,我也尝试过在IF块中启动和提交事务,结果是相同的。
答案 0 :(得分:0)
好吧,似乎局部变量不能与准备好的语句一起使用。我不确定这是在MySQL文档中明确声明的,但在MariaDB文档中确实如此。将变量svalues更改为用户定义的变量,该过程现在将填充表。