PG数据库利用游标遍历处理表数据

如下SQL所示,先将有问题的表id找出来,id跟entryid的关系是一对多,下面SQL解决的是同一个id下按照entryid进行seq从1到N的修改。

do
$BODY$
declare
	fenteryid_cursor refcursor;
	v_fid bigint;
	v_fentryid bigint;
	v_seq int;
fid_cursor cursor for
	-- 找出有问题的id:最大的seq不等于总的分录数时
	select id from (
		select tio.fid as id, max(fseq) as maxSeq, count(fentryid) as entryCount
		from t_target_table tio
		group by tio.fid ) temp
	where maxSeq != entryCount ;

begin 
	-- 开启id游标
	open fid_cursor;
	loop 
		fetch fid_cursor into v_fid;
	exit when not found;
		-- 开启分录游标
		open fenteryid_cursor for
			select fentryid from t_target_table where fid = v_fid order by fentryid asc, fmaterialid ;
			v_seq := 1;
		loop 
			fetch fenteryid_cursor into v_fentryid;
		if found then 
			-- 将seq+1
			update t_target_table set fseq = v_seq where fid = v_fid and fentryid = v_fentryid;
 			v_seq := v_seq + 1;
		else exit;
		end if;
		end loop;
		close fenteryid_cursor ;
	end loop;
	close fid_cursor;
end;

$BODY$ language plpgsql;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL 中,可以使用游标(CURSOR)来遍历整张表。游标可以在查询结果集上进行操作,类似于在程序中使用指针来遍历数据。 以下是一个遍历整张表的示例: ```sql DECLARE @id INT, @name VARCHAR(50) DECLARE cursor_name CURSOR FOR SELECT id, name FROM table_name OPEN cursor_name FETCH NEXT FROM cursor_name INTO @id, @name WHILE @@FETCH_STATUS = 0 BEGIN -- 执行需要循环的操作 PRINT 'id: ' + CONVERT(VARCHAR, @id) + ', name: ' + @name FETCH NEXT FROM cursor_name INTO @id, @name END CLOSE cursor_name DEALLOCATE cursor_name ``` 以上代码中,首先使用 DECLARE 语句声明了两个变量 `@id` 和 `@name`,用于存储查询结果中的 `id` 和 `name`。然后使用 DECLARE CURSOR 语句声明一个游标 `cursor_name`,并使用 SELECT 语句查询整张表中的数据。接着使用 OPEN 语句打开游标,并使用 FETCH NEXT 语句将游标定位到第一行数据,将查询结果中的 `id` 和 `name` 分别赋值给变量 `@id` 和 `@name`。 在 WHILE 循环中,首先判断当前 FETCH 语句的执行状态 `@@FETCH_STATUS` 是否为 0,如果是,则继续执行循环体内的操作。在循环体内,可以执行需要循环的操作,例如打印当前行数据。然后使用 FETCH NEXT 语句将游标定位到下一行数据,再次将查询结果中的 `id` 和 `name` 分别赋值给变量 `@id` 和 `@name`。 在循环结束后,需要使用 CLOSE 语句关闭游标,并使用 DEALLOCATE 语句释放游标所占用的资源。 需要注意的是,游标的使用可能会影响查询性能,所以在实际应用中需要谨慎使用。同时,游标的语法和使用方法可能会因不同的数据库而有差异,以上代码仅供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值