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 )


--批量更新历史表单的编号

--更新前先把YEARLY_SEQUENCE的最大值记录清空 
update YEARLY_SEQUENCE set MAX_SEQ=0 where SEQ_KEY='ZHTDJ202507'

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
);
