【问题标题】:"Execute stmt" In stored proc -- no Errors but no inserted records“执行 stmt”在存储过程中——没有错误但没有插入记录
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-13
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2016-09-04
      • 2019-03-16
      • 1970-01-01
      相关资源
      最近更新 更多