【问题标题】:MySQL ROW_COUNT() not working in Prepare statementMySQL ROW_COUNT() 在 Prepare 语句中不起作用
【发布时间】:2025-11-22 18:05:01
【问题描述】:

我在做什么。

我有一个删除行的过程。

我将var_SelectedIds 作为, 分隔UUID()

然后

SET     @var_SQLStr = '';   
SET     @var_SQLStr = CONCAT(@var_SQLStr ,'Delete ');
SET     @var_SQLStr = CONCAT(@var_SQLStr ,'FROM DemoTable');        
SET     @var_SQLStr = CONCAT(@var_SQLStr ,'WHERE DemoTableId IN (''',Replace(var_SelectedIds,',',''','''),'''); ');

-- SELECT @var_SQLStr;
PREPARE stmt FROM @var_SQLStr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我已经尝试过了。

// This is throwing SQL Syntax ERROR.

SET     @var_SQLStr = '';   
SET     @var_SQLStr = CONCAT(@var_SQLStr ,'Delete ');
SET     @var_SQLStr = CONCAT(@var_SQLStr ,'FROM DemoTable');        
SET     @var_SQLStr = CONCAT(@var_SQLStr ,'WHERE DemoTableId IN (''',Replace(var_SelectedIds,',',''','''),'''); ');
SET     @var_SQLStr = CONCAT(@var_SQLStr ,' SELECT ROWS_COUNT() INTO @var_AffectedRows; ');

-- SELECT @var_SQLStr;
PREPARE stmt FROM @var_SQLStr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

MySQL Reference

文本必须代表单个语句,而不是多个语句。

我也试过了

START TRANSACTION;

-- Other statements here

SET     @var_SQLStr = '';   
SET     @var_SQLStr = CONCAT(@var_SQLStr ,'Delete ');
SET     @var_SQLStr = CONCAT(@var_SQLStr ,'FROM DemoTable');        
SET     @var_SQLStr = CONCAT(@var_SQLStr ,'WHERE DemoTableId IN (''',Replace(var_SelectedIds,',',''','''),'''); ');

-- SELECT @var_SQLStr;
PREPARE stmt FROM @var_SQLStr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SELECT ROW_COUNT() INTO @var_AffectedRows
COMMIT;

SELECT @var_AffectedRows AS NoOfRowsDeleted; // 0 output

我不知道行是如何被删除的。

【问题讨论】:

    标签: mysql stored-procedures rowcount rows-affected


    【解决方案1】:

    你需要在EXECUTE之后和DEALLOCATE...之前执行SELECT ROW_COUNT()

    START TRANSACTION;
    
    -- Other statements here
    
    SET     @var_SQLStr = '';   
    SET     @var_SQLStr = CONCAT(@var_SQLStr ,'Delete ');
    SET     @var_SQLStr = CONCAT(@var_SQLStr ,'FROM DemoTable');        
    SET     @var_SQLStr = CONCAT(@var_SQLStr ,' WHERE DemoTableId IN (''',Replace(var_SelectedIds,',',''','''),'''); ');
    /*you need an additional whitespace here---^ */
    
    
    -- SELECT @var_SQLStr;
    PREPARE stmt FROM @var_SQLStr;
    EXECUTE stmt;
    SELECT ROW_COUNT() INTO @var_AffectedRows;
    DEALLOCATE PREPARE stmt;
    
    SELECT @var_AffectedRows; /*TADAAA!*/
    
    COMMIT;
    

    【讨论】:

    • 知道如何在没有 found_rows 的情况下获取选择语句查询计数吗?..因为 row_count 对选择语句返回 -1