生成唯一编号(防止高并发重复).sql

生成唯一编号(防止高并发重复),并且有demo,示范如何批量更新历史数据的编号
This commit is contained in:
wintsa 2025-06-27 16:35:46 +08:00
parent 7284f7014e
commit f01e772b06

View File

@ -0,0 +1,111 @@
call SP_GENERATE_FORMATTED_SEQUENCE( 'JSXMlxdj' --key ,
'{?REQUESTID}' -- ,
'{?sqrq}' --,2025-02-11,
'formtable_main_1576' --update的表单名称 ,
'jsxmbh' --update的字段名称 ,
'requestid' --update的where条件的字段名,
'#P-#Y-#S4' --,#S4代表补位4个比如0014。排列也可以是'[#p-#Y]/#S',输出结果是[JSXM-2025]/1,
'JSXM' --#p )
--
DECLARE
v_count NUMBER := 0;
v_error_count NUMBER := 0;
v_total_count NUMBER := 0;
-- 游标获取所有需要更新的记录按ID排序
CURSOR c_records IS
SELECT xglc, djrq
FROM uf_gcxx
WHERE xglc IS not NULL -- 只更新空编号的记录
ORDER BY xglc; -- 按ID排序
BEGIN
-- 统计总记录数
SELECT COUNT(*) INTO v_total_count
FROM uf_gcxx
WHERE xglc IS not NULL;
DBMS_OUTPUT.PUT_LINE('开始批量更新历史数据...');
DBMS_OUTPUT.PUT_LINE('需要更新的记录总数: ' || v_total_count);
DBMS_OUTPUT.PUT_LINE('----------------------------------------');
-- 遍历每条记录
FOR rec IN c_records LOOP
BEGIN
-- 调用存储过程为每条记录生成编号
SP_GENERATE_FORMATTED_SEQUENCE(
'JSXMlxdj', -- 序列键
rec.xglc, -- 请求ID/记录ID
rec.djrq, -- 日期值
'uf_gcxx', -- 目标表名
'gcbhz', -- 目标字段名
'xglc', -- 记录ID字段名
'#P-#Y-#S4', -- 编号格式模式
'JSXM' -- 前缀
);
v_count := v_count + 1;
-- 每处理100条记录显示一次进度
IF MOD(v_count, 100) = 0 THEN
DBMS_OUTPUT.PUT_LINE('已处理: ' || v_count || '/' || v_total_count || ' 条记录');
END IF;
EXCEPTION
WHEN OTHERS THEN
v_error_count := v_error_count + 1;
DBMS_OUTPUT.PUT_LINE('处理记录失败 - ID: ' || rec.xglc || ', 日期: ' || rec.djrq || ', 错误: ' || SQLERRM);
-- 如果错误太多,停止处理
IF v_error_count > 50 THEN
DBMS_OUTPUT.PUT_LINE('错误过多,停止处理');
EXIT;
END IF;
END;
END LOOP;
DBMS_OUTPUT.PUT_LINE('----------------------------------------');
DBMS_OUTPUT.PUT_LINE('批量更新完成!');
DBMS_OUTPUT.PUT_LINE('成功更新: ' || v_count || ' 条记录');
DBMS_OUTPUT.PUT_LINE('失败记录: ' || v_error_count || ' 条记录');
-- 验证更新结果
DECLARE
v_updated_count NUMBER;
v_empty_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_updated_count
FROM uf_gcxx
WHERE gcbhz IS NOT NULL AND gcbhz != '';
SELECT COUNT(*) INTO v_empty_count
FROM uf_gcxx
WHERE gcbhz IS NULL OR gcbhz = '';
DBMS_OUTPUT.PUT_LINE('----------------------------------------');
DBMS_OUTPUT.PUT_LINE('验证结果:');
DBMS_OUTPUT.PUT_LINE('已有编号的记录: ' || v_updated_count);
DBMS_OUTPUT.PUT_LINE('仍为空编号的记录: ' || v_empty_count);
END;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('批量更新过程出错: ' || SQLERRM);
ROLLBACK;
END;
--使update同步到流程表单
UPDATE formtable_main_1576 a
SET jsxmbh = (
SELECT gcbhz
FROM uf_gcxx
WHERE xglc = a.requestid
)
WHERE EXISTS (
SELECT 1
FROM uf_gcxx
WHERE xglc = a.requestid
);