【发布时间】:2020-10-18 21:22:00
【问题描述】:
我之前有一个问题已关闭...但我设法解决了我的错误,所以希望这是一个更具体的问题。
在我的过程中,我通过在多个迭代组上连接字符串来生成包含 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
....
如果为真,那么除了应该发生的插入之外,迭代计数也会减少一:
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 块中启动和提交事务,结果是一样的。
【问题讨论】:
标签: mysql stored-procedures error-handling