-- ============================================================
-- 安灯模块序列检查与同步脚本
-- 适用数据库：Oracle 11g
-- 生成时间：2026-03-19
-- 说明：检查安灯相关序列是否存在，
--       存在则根据表中最大主键值重建（同步），
--       不存在则直接创建。
-- 执行方式：以 DBA 或拥有 CREATE SEQUENCE 权限的用户执行
-- 注意：若使用 SQL*Plus，请在执行前手动运行：SET SERVEROUTPUT ON SIZE UNLIMITED
--       DBeaver / SQL Developer 等工具无需此命令，在会话/输出设置中启用即可
-- ============================================================

DECLARE
    v_count     NUMBER;
    v_max_id    NUMBER;
    v_start_val NUMBER;

    -- 辅助过程：检查并创建/重建序列
    PROCEDURE sync_sequence(
        p_seq_name  IN VARCHAR2,
        p_table     IN VARCHAR2,
        p_col       IN VARCHAR2
    ) IS
        v_cnt  NUMBER;
        v_max  NUMBER;
        v_start NUMBER;
        v_sql  VARCHAR2(500);
    BEGIN
        -- 1. 检查序列是否已存在
        SELECT COUNT(*) INTO v_cnt
        FROM USER_SEQUENCES
        WHERE SEQUENCE_NAME = UPPER(p_seq_name);

        -- 2. 获取当前表最大主键值，计算下一个起始值
        BEGIN
            EXECUTE IMMEDIATE
                'SELECT NVL(MAX(' || p_col || '), 0) + 1 FROM ' || p_table
            INTO v_max;
        EXCEPTION
            WHEN OTHERS THEN
                v_max := 1; -- 表不存在或无数据时默认从1开始
        END;
        v_start := GREATEST(v_max, 1);

        IF v_cnt = 0 THEN
            -- 序列不存在：直接创建
            v_sql := 'CREATE SEQUENCE ' || p_seq_name
                     || ' START WITH ' || v_start
                     || ' INCREMENT BY 1 MINVALUE 1 NOCACHE NOCYCLE NOORDER';
            EXECUTE IMMEDIATE v_sql;
            DBMS_OUTPUT.PUT_LINE('[创建] ' || p_seq_name
                || ' → START WITH ' || v_start);
        ELSE
            -- 序列已存在：删除后以新起点重建（Oracle 11g 不支持 RESTART WITH）
            EXECUTE IMMEDIATE 'DROP SEQUENCE ' || p_seq_name;
            v_sql := 'CREATE SEQUENCE ' || p_seq_name
                     || ' START WITH ' || v_start
                     || ' INCREMENT BY 1 MINVALUE 1 NOCACHE NOCYCLE NOORDER';
            EXECUTE IMMEDIATE v_sql;
            DBMS_OUTPUT.PUT_LINE('[更新] ' || p_seq_name
                || ' → 重建，START WITH ' || v_start);
        END IF;

    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('[错误] 处理序列 ' || p_seq_name
                || ' 时发生异常：' || SQLERRM);
    END sync_sequence;

BEGIN
    DBMS_OUTPUT.PUT_LINE('===== 安灯模块序列检查与同步开始 =====');
    DBMS_OUTPUT.PUT_LINE('');

    -- ① 看板配置序列
    sync_sequence(
        p_seq_name => 'ANDON_BOARD_CONFIG_SEQ',
        p_table    => 'ANDON_BOARD_CONFIG',
        p_col      => 'BOARD_ID'
    );

    -- ② 安灯事件序列
    sync_sequence(
        p_seq_name => 'ANDON_EVENT_SEQ',
        p_table    => 'ANDON_EVENT',
        p_col      => 'EVENT_ID'
    );

    -- ③ 安灯事件分配序列
    sync_sequence(
        p_seq_name => 'ANDON_EVENT_ASSIGNMENT_SEQ',
        p_table    => 'ANDON_EVENT_ASSIGNMENT',
        p_col      => 'ASSIGNMENT_ID'
    );

    -- ④ 安灯事件日志序列
    sync_sequence(
        p_seq_name => 'ANDON_EVENT_LOG_SEQ',
        p_table    => 'ANDON_EVENT_LOG',
        p_col      => 'LOG_ID'
    );

    -- ⑤ 安灯规则序列
    sync_sequence(
        p_seq_name => 'ANDON_RULE_SEQ',
        p_table    => 'ANDON_RULE',
        p_col      => 'RULE_ID'
    );

    DBMS_OUTPUT.PUT_LINE('');
    DBMS_OUTPUT.PUT_LINE('===== 安灯模块序列检查与同步完成 =====');

END;
/

-- 验证：查询所有安灯序列当前状态
SELECT
    SEQUENCE_NAME,
    MIN_VALUE,
    MAX_VALUE,
    INCREMENT_BY,
    LAST_NUMBER,
    CACHE_SIZE,
    CYCLE_FLAG,
    ORDER_FLAG
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME IN (
    'ANDON_BOARD_CONFIG_SEQ',
    'ANDON_EVENT_SEQ',
    'ANDON_EVENT_ASSIGNMENT_SEQ',
    'ANDON_EVENT_LOG_SEQ',
    'ANDON_RULE_SEQ'
)
ORDER BY SEQUENCE_NAME;
