mysql cursor

use pcdata;
DELIMITER $$

DROP PROCEDURE IF EXISTS `curdemo1` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `curdemo1`()
BEGIN
  DECLARE a int(11);
  DECLARE b varchar(45);
  declare  CreateStr varchar(2000);
  DECLARE done INT DEFAULT 0;
  DECLARE cur1 CURSOR FOR SELECT distinct curcekey FROM pcdata.curcevalue;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  OPEN cur1;
  REPEAT
   FETCH cur1 INTO a;
     IF NOT done THEN
       set b=CONCAT('curcevalue_',a);
       INSERT INTO pcdata.t2 VALUES (a,b);
       set CreateStr=concat('insert into ', b,' select * from curcevalue where curcekey=',a);
       set @sqlcounts = CreateStr;
       prepare stmt from @sqlcounts;
       execute stmt;
     end if;
  UNTIL done END REPEAT;
  CLOSE cur1;
END $$

DELIMITER ;

 

DELIMITER $$

DROP PROCEDURE IF EXISTS `AddRandData` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `AddRandData`()
BEGIN
  declare StartDate datetime;
DECLARE v1 INT DEFAULT 5;
declare temp1sk float;
declare temp1rf float;
declare speed1  float;
declare press1  float;
set StartDate=Date_Add(now(),Interval -30 day);
  WHILE v1 < 43200 DO
   set StartDate=Date_Add(StartDate,Interval 1 minute);
   select round(round(rand(),4)*100,1) into temp1sk;
   if temp1sk>50 or temp1sk<40 then
    set temp1sk=45;
   end if;
 insert into curcevalue(CurceKey,CurceValues,CurceDate,Ptype,OperatorName,roomid)
 values(1657,temp1sk,StartDate,'admin1',3);

 select round(round(rand(),4)*100,1) into temp1rf;
   if temp1rf>60 or temp1rf<40 then
    set temp1rf=50;
   end if;
 insert into curcevalue(CurceKey,CurceValues,CurceDate,Ptype,OperatorName,roomid)
 values(1663,temp1rf,StartDate,'admin1',7);

select round(round(rand(),4)*10000,0) into speed1;
   if speed1>3500 or speed1<2000 then
    set speed1=3000;
   end if;
 insert into curcevalue(CurceKey,CurceValues,CurceDate,Ptype,OperatorName,roomid)
 values(1669,speed1,StartDate,'admin1',1);
select round(round(rand(),4)*10,1) into press1;
   if press1>3.5 or press1<1 then
    set press1=2.0;
   end if;
 insert into curcevalue(CurceKey,CurceValues,CurceDate,Ptype,OperatorName,roomid)
 values(1643,press1,StartDate,'admin1',3);
   SET v1 = v1 + 1;

   END WHILE;
END $$

DELIMITER ;

 

### 关于 `mysqlcursor.close` 的使用方法 在 MySQL 数据库操作中,`cursor` 是一个重要的对象,用于执行 SQL 查询并获取结果。当完成对数据库的操作后,关闭游标(`cursor.close()`)是一个良好的实践,可以释放资源并避免潜在的内存泄漏[^1]。 调用 `cursor.close()` 方法会关闭当前游标对象,并使其无法再用于执行查询或获取结果。如果尝试在关闭后的游标上调用方法,通常会引发异常。以下是一些关键点: - **关闭时机**:建议在完成所有与游标相关的操作后立即关闭它。例如,在循环遍历结果集后,或者在插入、更新或删除操作完成后。 - **自动关闭**:如果使用了上下文管理器(`with` 语句),则无需手动调用 `close()`,因为上下文管理器会在退出时自动关闭游标[^4]。 ```python # 示例:手动关闭游标 import mysql.connector connection = mysql.connector.connect(host="localhost", user="root", password="password", database="testdb") cursor = connection.cursor() try: cursor.execute("SELECT * FROM table_name") for row in cursor: print(row) finally: cursor.close() # 手动关闭游标 ``` ```python # 示例:使用上下文管理器自动关闭游标 import mysql.connector connection = mysql.connector.connect(host="localhost", user="root", password="password", database="testdb") with connection.cursor() as cursor: cursor.execute("SELECT * FROM table_name") for row in cursor: print(row) # 游标在此处自动关闭 ``` 如果遇到 `cursor.close()` 相关的问题,可能的原因包括: 1. **重复关闭**:尝试对已经关闭的游标再次调用 `close()` 会导致错误。确保每个游标只关闭一次[^3]。 2. **连接问题**:如果数据库连接已断开,则关闭游标可能会失败。确保在调用 `cursor.close()` 之前,数据库连接仍然有效。 3. **多线程环境**:在多线程环境中,多个线程共享同一个游标可能导致不可预测的行为。建议为每个线程创建独立的游标[^5]。 ### 示例代码 以下是一个完整的示例,展示如何正确使用 `cursor.close()`: ```python import mysql.connector # 建立数据库连接 connection = mysql.connector.connect( host="localhost", user="root", password="password", database="testdb" ) try: # 创建游标 cursor = connection.cursor() # 执行查询 cursor.execute("SELECT * FROM table_name") rows = cursor.fetchall() # 处理结果 for row in rows: print(row) finally: # 确保游标关闭 if cursor: cursor.close() ``` ### 注意事项 - 如果在执行 SQL 操作时发生异常,确保在 `finally` 块中关闭游标以避免资源泄漏。 - 在使用多语句查询时(如 `multi=True`),确保处理完所有结果后再关闭游标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值