存储过程 DEALLOCATE PREPARE 查出来的总数赋值给变量
时间: 2023-06-29 10:10:18 浏览: 59
在 MySQL 中,可以使用以下代码将 DEALLOCATE PREPARE 执行的语句数量赋值给一个变量:
```
DECLARE stmt_count INT;
SELECT ROW_COUNT() INTO stmt_count;
```
首先,声明一个名为 stmt_count 的整型变量。然后,在执行 DEALLOCATE PREPARE 语句后,使用 ROW_COUNT() 函数获取受影响的行数,即语句数量,并将其赋值给 stmt_count 变量。
相关问题
在mysql的存储过程中我执行了下面的一段 OPEN C_COUNT_LIST; LOOP FETCH C_COUNT_LIST INTO CUSTOMER_PROV, C_COUNT; EXIT WHEN C_COUNT_LIST%NOTFOUND; set @RPT_SQL :='UPDATE RPT_BL_LINE_COUNT T SET T.N_MONTH = ' || C_COUNT ||' ' ' WHERE T.PROV_CODE= ' || CUSTOMER_PROV || ' AND T.PAY_CDDE=''01'' AND T.FEETYPE=''0'' ' ' AND T.VERSION= ' || G_VERSION || ' AND T.SETTLEMONTH= ' || RPT_SETTLEMONTH || ' '; SELECT @RPT_SQL; PREPARE STMT FROM @RPT_SQL; EXECUTE STMT; DEALLOCATE PREPARE STMT; END LOOP; CLOSE C_COUNT_LIST; 我发现FETCH C_COUNT_LIST INTO CUSTOMER_PROV, C_COUNT;这段并没有给CUSTOMER_PROV和C_COUNT赋值 导致两个变量的值为空 当然我在存储过程开始已经定义了CUSTOMER_PROV和C_COUNT变量 帮我分析并解决
根据你提供的代码,我看到在存储过程开始时定义了CUSTOMER_PROV和C_COUNT变量,但是在循环开始前并没有给它们赋初值。因此,在第一次进入循环时,FETCH语句无法将结果集中的值赋给这两个变量,导致它们的值为空。
解决这个问题的方法是在循环开始前给它们赋一个初始值。例如,可以将定义变量的语句改成:
DECLARE CUSTOMER_PROV VARCHAR(20) DEFAULT '';
DECLARE C_COUNT INT DEFAULT 0;
这样,在循环开始前,CUSTOMER_PROV和C_COUNT就会有一个默认值,避免了空值的问题。
另外,你在拼接SQL语句时,建议使用参数绑定的方式,而不是直接拼接字符串。这可以避免SQL注入攻击,并且可以提高性能和可读性。例如:
SET @RPT_SQL = 'UPDATE RPT_BL_LINE_COUNT T SET T.N_MONTH = ? WHERE T.PROV_CODE= ? AND T.PAY_CDDE=''01'' AND T.FEETYPE=''0'' AND T.VERSION= ? AND T.SETTLEMONTH= ?';
然后,使用PREPARE语句和EXECUTE语句执行动态SQL,并使用参数绑定将变量传递给它。例如:
PREPARE STMT FROM @RPT_SQL;
EXECUTE STMT USING C_COUNT, CUSTOMER_PROV, G_VERSION, RPT_SETTLEMONTH;
DEALLOCATE PREPARE STMT;
这样可以更加安全和高效地执行动态SQL语句。
mysql存储过程动态创建表
要在MySQL存储过程中动态创建表,可以使用以下步骤:
1. 使用CREATE TABLE语句来定义表结构和列。
2. 使用PREPARE语句来准备动态SQL语句,其中包括CREATE TABLE语句。
3. 使用EXECUTE语句来执行动态SQL语句,从而创建表。
4. 使用DEALLOCATE PREPARE语句来释放预处理语句的资源。
下面是一个示例存储过程,它动态创建一个名为new_table的表:
```
DELIMITER //
CREATE PROCEDURE create_table()
BEGIN
DECLARE sql_query VARCHAR(1000);
SET sql_query = 'CREATE TABLE new_table (id INT, name VARCHAR(50))';
PREPARE stmt FROM sql_query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
```
在这个示例中,我们使用了DECLARE语句来定义一个名为sql_query的字符串变量,它将包含动态SQL语句。然后,我们使用SET语句将CREATE TABLE语句赋值给变量。
接下来,我们使用PREPARE语句来准备动态SQL语句,其中包括变量sql_query。然后,我们使用EXECUTE语句来执行动态SQL语句,从而创建表。最后,我们使用DEALLOCATE PREPARE语句释放预处理语句的资源。
要调用这个存储过程,只需使用以下语句:
```
CALL create_table();
```
这将创建一个名为new_table的表,其中包含id和name两列。