mysql使用游标遍历数据进行批量针对性更新数据,急求mysql大神解答

作者&投稿:魏影 (若有异议请与网页底部的电邮联系)
MYSQL游标循环 最后多了一行一模一样的数据~

是用sql处理么,问题有点不清楚,为什么循环一次后还要在再循环?要是这样的话再写一次循环就行了啊,还是要处理循环中每条数据,如果是这样的话用游标就可以的

mysql 3张表关联批量更新:
mysql更新语句很简单,更新一条数据的某个字段,一般这样写:
代码如下:
UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';
如果更新同一字段为同一个值,mysql也很简单,修改下where即可:
代码如下:
UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values');
这里注意 ‘other_values' 是一个逗号(,)分隔的字符串,如:1,2,3

根据你的资料,正确的答案应该如下:望采纳

CREATE DEFINER=`root`@`localhost` PROCEDURE `P_updateUd18`(`Param` int(11))
BEGIN
declare Rcount,i,j,k,Rparentid,myId int(11) default 0;
declare Robjname,Robjname23,Robjname45,Robjname67,Robjname89 varchar(9) default "";
select count(id) into Rcount from ud18;

repeat
select id,objname into myId,Robjname from ud18 order by id limit i,1;
set Robjname23=SUBSTRING(Robjname,2,2);
set Robjname45=SUBSTRING(Robjname,4,2);
set Robjname67=SUBSTRING(Robjname,6,2);
set Robjname89=SUBSTRING(Robjname,8,2);

if Robjname89>0 then
set @sql=concat("select id into @abc from ud18 where objname like '",left(Robjname,7),"00","'");
prepare stmt from @sql;
EXECUTE stmt;
set Rparentid=@abc;
update ud18 set parentid=Rparentid where id=myId;

elseif Robjname67>0 then
set @sql=concat("select id into @abc from ud18 where objname like '",left(Robjname,5),"0000","'");
prepare stmt from @sql;
EXECUTE stmt;
set Rparentid=@abc;
update ud18 set parentid=Rparentid where id=myId;
elseif Robjname45>0 then
set @sql=concat("select id into @abc from ud18 where objname like '",left(Robjname,3),"000000","'");
prepare stmt from @sql;
EXECUTE stmt;
set Rparentid=@abc;
update ud18 set parentid=Rparentid where id=myId;
elseif Robjname23>0 then
-- set @sql=concat("select id into @abc from ud18 where objname like '",left(Robjname,1),"00000000","'");
-- prepare stmt from @sql;
-- EXECUTE stmt;
-- set Rparentid=@abc;
update ud18 set parentid=0 where id=myId;

else
set j=0;
end if;

set i=i+1;
until i>Rcount end repeat;

END;

1、游标是数据库的一个缓冲区,游标标识这个缓冲区的地址。这个缓冲区的访问是连续的,也可以理解为数据存放是连续的,所以使用游标访问速度快,不需要离散式的寻址,一个接着一个的处理数据即可,省去寻址时间。
2、游标使用的时候,需要设置,也就是把需要处理的数据放入缓冲区中,也就是用条件语句选取数据集,设置好后,游标自然指向第一个数据项的地址,可以用fetch指令进行取数据操作。对于你来说,就是将用like匹配的七位、五位、三位放入缓冲区。游标使用语法,就不多说了,网上多的是。
3、对于父亲节点的描述,感觉没有描述清楚。根据你的描述,不必进行三位、五位、七位的遍历,直接根据前三位就把所有匹配的数据项都赋给同一个parentid了。但是根据你领导所说,好像不是这样,也就是你说的转换关系与你领导意图不同,你领导的意图是同一个儿子的parentid指向同一个父亲,也就是父亲节点的ID。如果这样的话,需要从叶子节点向上遍历,也就是你领导说的先七位,再五位,再三位。
4、写个例子,可以参考。参数可以依次是七位、五位、三位。
/*建立 存储过程 create */

CREATE PROCEDURE useCursor( parent vachar(9))
BEGIN
/*局部变量的定义 declare*/
declare ID varchar(20) default '' ;
declare temp ID (255) default '' ;
declare parentVchar varchar(9);
set parentVchar=parent;
declare cur1 CURSOR FOR SELECT id FROM tud18 where parented like parentVchar order by id;
/*开游标*/
OPEN cur1;
/*游标向下走一步*/
FETCH cur1 INTO ID;
WHILE (tempID is not null) DO
Update tud18 set parentid = ID ;
/*游标向下走一步*/
FETCH cur1 INTO tempID;
END WHILE;
CLOSE cur1;
END;//

DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `P_UPDATEud18`(i_Param bigint)
label_proc:
BEGIN

declare v_pid bigint;
declare v_i bigint;
declare v_pre bigint;
declare v_ar bigint;
declare v_ae bigint;

declare OE CURSOR FOR select left(objname,7) from ud18;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1;

open OE ;
REPEAT
FETCH OE INTO v_i;

select id into v_pid from ud18 where substring(v_i,7,1)=0;
select id into v_ae from ud18 where substring(v_i,5,1)=0;
select left(v_i,3) into v_pre;
select left(v_i,5) into v_ar;

update ud18 set parentid=v_ae where v_pre=left(objname,3);
update ud18 set parentid=v_pid where v_ar=left(objname,5);

UNTIL no_more_departments
END REPEAT;
close OE;

END


mysql使用游标遍历数据进行批量针对性更新数据,急求mysql大神解答_百度...
CREATE DEFINER=`root`@`localhost` PROCEDURE `P_updateUd18`(`Param` int(11))BEGIN declare Rcount,i,j,k,Rparentid,myId int(11) default 0;declare Robjname,Robjname23,Robjname45,Robjname67,Robjname89 varchar(9) default "";select count(id) into Rcount from ud18;repeat se...

Mysql技术内幕—游标
1.创建游标 使用DECLARE语句创建一个名为ORDERNUMBERS的游标:2.打开和关闭游标 使用OPEN CURSOR打开游标 游标使用完成后关闭游标 CLOSE释放游标使用,关闭内部所有的内存和资源。3.使用游标数据 游标打开之后,可以使用FETCH语句分别访问它的每一行。FETCH用来检索当前行的order_num列 ,并且把结果存储到声明...

简述在MySQL中使用游标的原因。
由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

MySQL 游标的定义与使用
1、声明游标 SELECT 语句就是正常的查询语句,例如:SELECT id,age FROM table;2、打开游标 在打开游标之前,游标定义的 SQL 语句是不执行的。3、取出记录 将当前的记录数据存入变量。当 FETCH 没有找到记录时会抛出异常,异常的定义需要下面的 HANDLER FOR 语句。声明游标语句中的 SELECT 如果有多个字...

mysql之游标
创建游标: CREATE FUNCTION 函数名称 (参数)RETURNS 数据类型 程序体 存储函数与存储过程很像,但有几个不同点: 1、存储函数必须返回一个值或者数据表,存储过程可以不返回。 2、存储过程可以通过CALL语句调用,存储函数不可以 3、存储函数可以放在查询语句中使用,存储过程不可以 4、...

请问为什么MySQL使用游标进行insert操作时,末行会被插入两次?下附代码...
最后一条的cur能取得,然后正确插入,然后取下一条,出错,你的错误控制设置了done然后让它继续做,那么下面的insert就会执行,而且是最后一条,之后不满足循环条件,程序结束

mysql 查询每门成绩的前十名
mysql 查询每门成绩的前十名 create table sc (sno int,cno int,score);insert into sc values (1,1,100);insert into sc values (2,1,80);insert into sc values (3,1,25);insert into sc values (4,1,45);insert into sc values (5,1,67);insert into sc values (1,2,25);i...

求助大神 mybatis 使用Mysql 的存储过程 怎么返回多个结果集_百度知 ...
如何通过MyBatis获取mysql存储过程返回的不确定个数的多个结果集 如果对select 返回的结果行都需要处理,使用游标。如果只想取得返回多行中的一行,使用limit。

mysql 存储过程的执行速度不快
大致看了下,用了2个游标,2个临时表,n个insert、update操作。。。游标是不推荐使用的,慢,如果真得用,那还是放到后台php去循环好。主要是没弄懂你要做的操作和逻辑,不然mysql用join来操作,把游标去掉,换成mysql自己每行去遍历,估计也就毫秒级。(估计你目前整个表的数据也就几万而已)

mysql一次更新几十万条数据
写一个存储过程,用游标小批量的更新,更新时注意不要锁全表就可以了。或者写个脚本一部分一部分更新

芝罘区18226239126: mysql里怎样循环遍历游标 -
缑蝶保法: 传入id,输出name和sex的存储过程,这里同个id有多条数据,所以需要用到游标.DELIMITER // CREATE PROCEDURE p5(IN v_id INT) BEGIN DECLARE nodata INT DEFAULT 0;#注意:这个变量声明必须放在游标声明前面DECLARE v_...

芝罘区18226239126: mysql 3张表关联批量更新 -
缑蝶保法: mysql 3张表关联批量更新: mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新同一字段为同一个值,mysql也很简单,修改下where即可: 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values'); 这里注意 'other_values' 是一个逗号(,)分隔的字符串,如:1,2,3

芝罘区18226239126: mysql的游标怎么使用 -
缑蝶保法: 这个语句声明一个游标.也可以在子程序中定义多个游标,但是一个块中的每一个游标必须有唯一的名字.声明游标后也是单条操作的,但是不能用SELECT语句不能有INTO子句.2. 游标OPEN语句OPEN cursor_name 这个语句用指定的打开游...

芝罘区18226239126: 在sqlServer中怎么用游标遍历表 -
缑蝶保法: 定义变量 定义游标查你的表 打开游标 取游标到变量Fecth Next 循环取游标数据到变量Fecth Next begin 这里就是在遍历啦 end 关闭游标 销毁游标

芝罘区18226239126: 100分 求教SQLSERVER中的用游标遍历表中的列并实现累加输出. -
缑蝶保法: 你逻辑流程有问题 ,下面是你的逻辑流程,读取下一条→加值→[判断是否结尾→读取下一条→加值](循环) 而@@FETCH_STATUS返回3种状态,0 FETCH 语句成功. -1 FETCH 语句失败或此行不在结果集中. -2 被提取的行不存在. 这样...

芝罘区18226239126: mysql中游标 -
缑蝶保法: 下面是一个 MySQL 的 游标处理的 例子代码. 你参考参考看看.mysql> DELIMITER // mysql> CREATE PROCEDURE TestCursor() -> BEGIN -> -> DECLARE v_id INT; -> DECLARE v_value VARCHAR(10); -> -> -- 游标控制的标志 -> ...

芝罘区18226239126: 求mysql的游标用法详细说明,最好有例子!!
缑蝶保法: 先声明一个游标,语法: DECLARE v_1 VARCHAR(16); DECLARE v_2 VARCHAR(16); DECLARE c_XXX CURSOR FOR SELECT c_1, c_2 FROM t_1; 同时声明一个布尔型的变量FOUND,当循环的条件不成立时,结束循环用的. ...

芝罘区18226239126: mysql怎么使用游标和数据表实现数组功能 -
缑蝶保法: 有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具.前者使用起来比较简便.推荐使用. 1. check table 和 repair table 登陆mysql 终端: mysql -...

芝罘区18226239126: mysql数据库,一次遍历全部几万条数据.怎么处理才好? -
缑蝶保法: 其实就跟分页获取数据类似,网上这种例子就比较多了,分段获取你可以把当前获取的最大的自增id存储在文件、数据库或者memcache中,下一段用大于这个做条件,然后遍历完再更新这个数就行了.

芝罘区18226239126: SQL游标的使用 -
缑蝶保法: 1、甲骨文公司的Oracle、甲骨文公司的开源项目MySql、微软公司的SQL Server、IBM公司的DB2都有游标机制.2、上下左右遍历属性值.仿佛你在使用方向键控制单元格.3、需要遍历每个属性值时,游标能任意取出行任意取出列的值.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网