使用游标进行批量数据更新的实用指南
一、SQL Server 方案
DECLARE @Id INT, @NewValue VARCHAR(100);
DECLARE cur CURSOR FOR
SELECT Id FROM dbo.YourTable WHERE /* 你的条件 */;
OPEN cur;
FETCH NEXT FROM cur INTO @Id;
WHILE @@FETCH_STATUS = 0
BEGIN
-- TODO: 根据业务计算 @NewValue
UPDATE dbo.YourTable
SET ColumnName = @NewValue
WHERE Id = @Id;
FETCH NEXT FROM cur INTO @Id;
END
CLOSE cur;
DEALLOCATE cur;
二、Oracle 方案(PL/SQL 批量收集 + FORALL)
DECLARE
CURSOR cur IS
SELECT id FROM your_table WHERE /* 条件 */;
TYPE t_ids IS TABLE OF your_table.id%TYPE;
v_ids t_ids;
BEGIN
OPEN cur;
LOOP
FETCH cur BULK COLLECT INTO v_ids LIMIT 1000;
EXIT WHEN v_ids.COUNT = 0;
FORALL i IN 1..v_ids.COUNT
UPDATE your_table
SET column_name = 'new_value'
WHERE id = v_ids(i);
COMMIT; -- 按批提交,控制事务大小
END LOOP;
CLOSE cur;
COMMIT;
END;
/
三、Android 内容提供者 Cursor 批量更新
String[] projection = { BaseColumns._ID, "column_name" };
String selection = "column_name = ?";
String[] selectionArgs = { "old_value" };
Cursor c = getContentResolver().query(
YourProvider.CONTENT_URI, projection, selection, selectionArgs, null);
if (c != null && c.moveToFirst()) {
do {
long id = c.getLong(c.getColumnIndexOrThrow(BaseColumns._ID));
ContentValues cv = new ContentValues();
cv.put("column_name", "new_value");
getContentResolver().update(
ContentUris.withAppendedId(YourProvider.CONTENT_URI, id),
cv, null, null);
} while (c.moveToNext());
c.close();
}
四、实践建议与风险控制
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。