存储过程中的“ Execute stmt”-没有错误,但是没有插入的记录

时间:2020-06-28 17:14:19

标签: mysql stored-procedures error-handling

我有一个先前的问题已关闭...但是我设法解决了我的错误,因此希望这是一个更具体的问题。

在我的过程中,我通过在多个迭代组上串联字符串来生成包含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块中启动和提交事务,结果是相同的。

1 个答案:

答案 0 :(得分:0)

好吧,似乎局部变量不能与准备好的语句一起使用。我不确定这是在MySQL文档中明确声明的,但在MariaDB文档中确实如此。将变量svalues更改为用户定义的变量,该过程现在将填充表。