存儲過程-恆字系列和非恆字系列期報提示生成

恆字系列渠道系列項目根據披露配置生產期報提示

CREATE OR REPLACE PROCEDURE P_REVEAL_PROJECT_TYPE_SCHEME(v_res       OUT NUMBER,
                                                         v_errorCode OUT NVARCHAR2,
                                                         v_errorMsg  OUT NVARCHAR2) IS
  /* 渠道系列項目根據披露配置生產期報提示 */
  /* 期報開始日期 */
  d_revealStartDate DATE;
  c_revealStartYear NVARCHAR2(4);
  /* 期報結束日期 */
  d_revealEndDate DATE;
  /*家族系統產品受益級別信息數組下標*/
  v_count number := 0;
  /* 定義截取的配置信息的日期 */
  type reveal_end_date_list is record(
    revealEndStr t_reveal_project_type_scheme.c_month_date_str%type);
  /*期間管理報告提示期報結束日信息變量*/
  v_revealEndStr t_reveal_project_type_scheme.c_month_date_str%type;
  /*定義數組類型*/
  type reveal_end_date_arr_type is table of reveal_end_date_list index by binary_integer;
  /* 期間管理報告提示期報結束日數組 */
  reveal_end_date_arr reveal_end_date_arr_type;
  /*動態遊標*/
  type sync_cursor is ref cursor;
  /* 期間管理報告協議類型期報提示的披露頻率日期格式動態遊標變量 */
  familyProjectRateInfos sync_cursor;
  /* 查詢是否存在的提示數據的個數 */
  v_reveal_tip_count NUMBER(2) := 0;

  /* 查詢家族信託期報披露頻率配置表 */
  cursor projectTypeSchemes is
    select t.c_co_institution      as cropNo,
           t.c_reveal_type_name    as revealTypeName,
           t.reveal_rate           as revealRate,
           t.c_month_date_str      as monthDateStr,
           t.c_reveal_due_time     as revealDueTime,
           t.c_reveal_due_end_time as revealDueEndTime,
           t.c_notice_due_time     as noticeDueTime,
           t.c_remark              as remark,
           t.c_report_template_id  as reportTemplateId
      from t_reveal_project_type_scheme t
     where t.delete_flag = '0';

  /* 查詢家族信託項目包含最近期間管理報告的數據 */
  cursor projectRevealTips(cropNo NVARCHAR2, revealTypeName NVARCHAR2) is
    select t1.project_code as projectCode,
           t1.d_setupdate as setupDate,
           nvl(t1.d_actual_enddate, to_date('9999-12-31', 'yyyy-MM-dd')) as actualEndDate, --項目實際結束日期
           t2.c_period_date_start as periodDateStart, --已存在的期報開始日期
           t2.c_period_date_end as periodDateEnd --已存在的期報結束日期
      from t_family_project t1
      left join (select row_number() over(partition by prr.project_code order by prr.c_period_date_end desc) rn,
                        prr.project_code,
                        prr.delete_flag,
                        prr.c_report_status,
                        prr.c_period_date_start,
                        prr.c_period_date_end
                   from t_project_reveal_report prr) t2
        on t1.project_code = t2.project_code
       and t2.rn = 1 --移至這裏,不影響主表查詢
       and t2.delete_flag = '0'
     where 1 = 1
       and t1.project_shortname like '%' || revealTypeName || '%' --配置表的參數
       and t1.c_co_institution = cropNo --配置表的參數
       and t1.delete_flag = '0'
       and t1.c_projectphase <> '03' --除清算階段外 01-成立階段; 02-期間管理階段; 03-清算階段
       --and t1.project_code = '201910804021'
       ;

BEGIN
  --================================================================================
  -------------------------------【執行sql文】--------------------------------------
  --================================================================================
  DBMS_OUTPUT.ENABLE(buffer_size => null); --表示輸出buffer不受限制
  /* 渠道系列項目根據披露配置生產期報提示 Start */
  /* 循環項目協議披露頻率配置信息 */
  for projectTypeScheme in projectTypeSchemes loop
    --循環開始數組下標置0
    v_count := 0;
    -- 打開指定家族系統產品的受益級別信息遊標
    open familyProjectRateInfos for
      select regexp_substr(t.c_month_date_str, '[^;]+', 1, level) value
        from t_reveal_project_type_scheme t
       where 1 = 1
         and t.c_co_institution = projectTypeScheme.Cropno
         and t.c_reveal_type_name = projectTypeScheme.Revealtypename
      connect by level <= regexp_count(t.c_month_date_str, '[^;]+')
       order by value asc;
    /*取一個家族系統產品的受益級別進行同步處理*/
    loop
      fetch familyProjectRateInfos
        into v_revealEndStr;
      exit when familyProjectRateInfos%notfound;
      reveal_end_date_arr(v_count).revealEndStr := v_revealEndStr;
      -- 數組下標+1
      v_count := v_count + 1;
    end loop;
  
    /* 查詢家族信託項目包含最近期間管理報告的數據 */
    for projectRevealTip IN projectRevealTips(projectTypeScheme.Cropno,
                                              projectTypeScheme.Revealtypename) loop
      --DBMS_OUTPUT.put_line(c_N || '、項目名稱:' || projectRevealTip.projectCode);
      -- 1、確定期報開始日期
      -- 判斷是否存存在期間管理報告
      if projectRevealTip.periodDateStart is not null and
         projectRevealTip.periodDateEnd is not null then
        -- 存在上期期報,期報開始日:上期報結束日 + 1
        d_revealStartDate := trunc(projectRevealTip.periodDateEnd + 1, 'dd');
        DBMS_OUTPUT.put_line('存在上期期報,項目名稱:' ||
                             projectRevealTip.projectCode || ',成立日期:' ||
                             to_char(projectRevealTip.setupDate,
                                     'yyyy-MM-dd') || ',上期期報結束日:' ||
                             to_char(projectRevealTip.periodDateEnd,
                                     'yyyy-MM-dd') || ',期報開始日期:' ||
                             to_char(d_revealStartDate, 'yyyy-MM-dd'));
      else
      
        -- 不存在上期期報,期報開始日:成立日
        d_revealStartDate := trunc(projectRevealTip.setupDate, 'dd');
        DBMS_OUTPUT.put_line('不存在上期期報,項目名稱:' ||
                             projectRevealTip.projectCode || ',成立日期:' ||
                             to_char(projectRevealTip.setupDate,
                                     'yyyy-MM-dd') || ',期報開始日期:' ||
                             to_char(d_revealStartDate, 'yyyy-MM-dd'));
      
      end if;
      -- 1.2、確定期報結束日期
      if reveal_end_date_arr.count > 0 then
        -- 期報開始日期的年份
        c_revealStartYear := to_char(d_revealStartDate, 'yyyy');
        loop
          for i in reveal_end_date_arr.first .. reveal_end_date_arr.last loop
            -- 期報結束日,節假日順延
            d_revealEndDate := fun_get_workdate(to_date(c_revealStartYear || '-' || reveal_end_date_arr(i).revealEndStr,
                                                        'yyyy-MM-dd'),
                                                0);
            DBMS_OUTPUT.put_line('計算的期報結束日:' ||
                                 to_char(d_revealEndDate, 'yyyy-MM-dd'));
            -- 期報開始日 < 期報結束日 <= 系統日期
            if d_revealEndDate > add_months(d_revealStartDate, 2) and
               d_revealEndDate <= trunc(sysdate, 'dd') then
              DBMS_OUTPUT.put_line('確認的期報結束日期:' ||
                                   to_char(d_revealEndDate, 'yyyy-MM-dd'));
              -- 新增期報提示表
              -- 根據項目編號、期報開始結束日期,查詢期報披露提示表是否存在,不存在則新增
              select count(*)
                into v_reveal_tip_count
                from t_reveal_report_clear_tip t
               where 1 = 1
                 and t.delete_flag = '0'
                 and t.c_project_code = projectRevealTip.projectCode
                 and t.d_reveal_start_date = d_revealStartDate
                 and t.d_reveal_end_date = d_revealEndDate;
              if v_reveal_tip_count = 0 then
                -- 如果不存在,則新增期報提示表
                insert into t_reveal_report_clear_tip
                  (c_reveal_report_clear_tip_id,
                   c_project_code,
                   d_reveal_date,
                   c_reveal_rate,
                   d_reveal_start_date,
                   d_reveal_end_date,
                   C_REVEAL_DUE_TIME,
                   C_REVEAL_DUE_END_TIME,
                   C_NOTICE_DUE_TIME,
                   C_ISAUTO_REPORT, --是否自動生成期報標識 1-是 0-否
                   delete_flag,
                   create_time,
                   create_user_id,
                   c_report_template_id)
                values
                  ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                   SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                   projectRevealTip.projectCode,
                   d_revealEndDate + 1,
                   projectTypeScheme.Revealrate,
                   d_revealStartDate,
                   d_revealEndDate,
                   projectTypeScheme.Revealduetime,
                   projectTypeScheme.Revealdueendtime,
                   projectTypeScheme.Noticeduetime,
                   '1',
                   '0',
                   SYSDATE,
                   'admin',
                   projectTypeScheme.Reporttemplateid);
                d_revealStartDate := d_revealEndDate + 1;
              end if;
            end if;
          end loop;
        
          if d_revealEndDate >= trunc(sysdate, 'dd') then
            exit;
          end if;
          -- 給下一期期報賦值 = 本期報結束日 + 1
          c_revealStartYear := c_revealStartYear + 1;
        end loop;
      end if;
    end loop;
  end loop;
  /* 渠道系列項目根據披露配置生產期報提示 End */
  v_res       := 0;
  v_errorCode := SQLCODE;
  v_errorMsg  := 'P_REVEAL_PROJECT_TYPE_SCHEME' || ':' || TO_CHAR(SQLERRM);
  DBMS_OUTPUT.put_line('----------------end------------------');
  /* 提交 */
  commit;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    v_res       := -1;
    v_errorCode := SQLCODE;
    v_errorMsg  := 'P_REVEAL_PROJECT_TYPE_SCHEME' || ':' ||
                   TO_CHAR(SQLERRM);
    DBMS_OUTPUT.put_line('P_REVEAL_PROJECT_TYPE_SCHEME' || ':' || '異常錯誤爲:' ||
                         sqlerrm || '--' || sqlcode || '--' ||
                         dbms_utility.format_error_backtrace);
END P_REVEAL_PROJECT_TYPE_SCHEME;

根據期間管理報告披露頻率生成期間管理報告的披露日期

CREATE OR REPLACE PROCEDURE P_REVEAL_REPORT_CLEAR_TIP(v_res       OUT NUMBER,
                                                      v_errorCode OUT NVARCHAR2,
                                                      v_errorMsg  OUT NVARCHAR2) IS
  --根據期間管理報告披露頻率生成期間管理報告的披露日期
  v_reveal_tip_num  NUMBER(8) := 0; -- 查詢是否存在的提示數據的個數
  c_N               NUMBER(10) := 1; -- 計算使用的倍數,從0開始
  c_clearDate       NVARCHAR2(10); -- 披露日期
  c_firstClearDate  NVARCHAR2(10); -- 第一次生成的提示日期
  c_quarter         NVARCHAR2(1); -- 第幾季度
  c_alloMonth       NVARCHAR2(10); -- 特定週期月
  c_alloDay         NVARCHAR2(10); -- 特定週期日
  d_revealStartDate DATE; -- 披露起始日期
  d_revealEndDate   DATE; -- 披露結束日期
  c_startDate       DATE; --期報開始日期

  --刪除的披露頻率,並重新生成提示(提示狀態爲未處理的全部先刪除)
  CURSOR create_reveal_infos IS
  
    SELECT trr.project_code       AS projectCode, --項目編號
           trr.reveal_rate        AS revealRate, --披露頻率
           tfp.d_setupdate        AS setupDate, --項目成立日期
           trr.c_reveal_due_time  AS revealDueTime, --披露日期期限
           trr.c_notice_due_time  AS noticeDueTime, --通知期限
           t2.c_period_date_start AS periodDateStart, --已存在的期報開始日期
           t2.c_period_date_end   AS periodDateEnd --已存在的期報結束日期
      FROM t_reveal_report_scheme trr
     INNER JOIN t_family_project tfp
        on tfp.project_code = trr.project_code
       AND tfp.delete_flag = '0'
       AND tfp.d_setupdate is not null
      left join (select row_number() over(partition by prr.project_code order by prr.c_period_date_end desc) rn,
                        prr.project_code,
                        prr.delete_flag,
                        prr.c_report_status,
                        prr.c_period_date_start,
                        prr.c_period_date_end
                   from t_project_reveal_report prr) t2
        on tfp.project_code = t2.project_code
       and t2.rn = 1 --移至這裏,不影響主表查詢
       and t2.delete_flag = '0'
     WHERE 1 = 1
       AND trr.delete_flag = '0'
       and tfp.c_projectphase <> '03' --除清算階段外 01-成立階段; 02-期間管理階段; 03-清算階段
       and tfp.project_shortname not like '恆字'
    --and tfp.project_code = '201810804082'
    ;

BEGIN
  --================================================================================
  -------------------------------【執行sql文】--------------------------------------
  --================================================================================

  /* 期間管理報告清算提示 Start */

  -- 1.從合同信息中生成頻率規則實時調用生成提示信息
  -- 生成期間管理報告清算提示的披露日期
  FOR create_reveal_info IN create_reveal_infos LOOP
    -- 從期報開始日開始
    if create_reveal_info.perioddateend is null then
      -- 如果不存在期報,則以成立日開始
      c_startDate := create_reveal_info.setupdate;
    else
      -- 如果存在最新一期期報結束日,則開始日爲期報結束日+1
      c_startDate := create_reveal_info.perioddateend + 1;
    end if;
  
    -- 每次循環初始化計算倍數
    c_N := 1;
    -- 自然年
    IF (create_reveal_info.revealRate IS NOT NULL) AND
       (create_reveal_info.revealRate = 'Y') THEN
      -- 生成第一次提示日期
      SELECT extract(YEAR FROM c_startDate) || '-' || '01' || '-' || '01'
        INTO c_firstClearDate
        FROM dual;
      c_clearDate := c_firstClearDate;
      -- 進入循環獲取披露日期
      LOOP
        -- 生成披露日期小於等系統日期的提示數據
        IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
          -- 查詢是否存在該提示
          SELECT COUNT(*)
            INTO v_reveal_tip_num
            from t_reveal_report_clear_tip trc
           where trc.c_project_code = create_reveal_info.projectCode
             and trc.c_reveal_rate = create_reveal_info.revealRate
             and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
             and trc.delete_flag = '0';
          -- 若不存在,則生成提示信息
          IF v_reveal_tip_num = 0 THEN
            -- 期報開始日期
            d_revealStartDate := c_startDate;
            --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -12) into d_revealStartDate FROM dual;
            -- 期報結束日期
            select to_date(c_clearDate, 'yyyy-MM-dd') - 1
              into d_revealEndDate
              from dual;
            -- 期報結束日大於等於開始日+2個月
            if add_months(d_revealStartDate, 2) <= d_revealEndDate then
              -- 直接生成期間管理報告清算提示信息
              INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                (C_REVEAL_REPORT_CLEAR_TIP_ID,
                 C_PROJECT_CODE,
                 D_REVEAL_DATE,
                 C_REVEAL_RATE,
                 C_ISAUTO_REPORT,
                 DELETE_FLAG,
                 CREATE_TIME,
                 CREATE_USER_ID,
                 UPDATE_TIME,
                 UPDATE_USER_ID,
                 C_REVEAL_DUE_TIME,
                 C_NOTICE_DUE_TIME,
                 D_REVEAL_START_DATE,
                 D_REVEAL_END_DATE)
              VALUES
                ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                 SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                 create_reveal_info.projectCode,
                 to_date(c_clearDate, 'yyyy-MM-dd'),
                 create_reveal_info.revealRate,
                 '0',
                 '0',
                 SYSDATE,
                 'admin',
                 SYSDATE,
                 'admin',
                 create_reveal_info.revealduetime,
                 create_reveal_info.noticeduetime,
                 d_revealStartDate,
                 d_revealEndDate);
              -- 賦值下一期期報開始日
              c_startDate := d_revealEndDate + 1;
            end if;
          END IF;
        else
          exit;
        END IF;
        -- 用第一次提示日期計算下一次的提示日期
        SELECT to_char(add_months(to_date(c_firstClearDate, 'yyyy-mm-dd'),
                                  c_N * 12),
                       'yyyy-MM-') || '01'
          INTO c_clearDate
          FROM dual;
        -- 生成小於系統日期的提示
        if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
          EXIT;
        end if;
        c_N := c_N + 1;
      END LOOP;
    
      -- 自然半年(每年的7月1日)
    ELSIF (create_reveal_info.revealRate IS NOT NULL) AND
          (create_reveal_info.revealRate = 'H') THEN
      --系統日期同7月份進行比較
      IF (to_char(c_startDate, 'mmdd') > '0101') AND
         (to_char(c_startDate, 'mmdd') <= '0701') THEN
        SELECT extract(YEAR FROM c_startDate) || '-' || '07' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      ELSE
        SELECT extract(YEAR FROM c_startDate) || '-' || '01' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      END IF;
      c_clearDate := c_firstClearDate;
      -- 進入循環獲取披露日期
      LOOP
        -- 當披露日期大於系統日期,得生成期間管理報告清算提示信息
        IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
          -- 查詢是否存在該提示
          SELECT COUNT(*)
            INTO v_reveal_tip_num
            from t_reveal_report_clear_tip trc
           where trc.c_project_code = create_reveal_info.projectCode
             and trc.c_reveal_rate = create_reveal_info.revealRate
             and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
             and trc.delete_flag = '0';
          -- 若不存在,則生成提示信息
          IF v_reveal_tip_num = 0 THEN
            -- 期報開始日期
            d_revealStartDate := c_startDate;
            --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -6) into d_revealStartDate FROM dual;
            -- 期報結束日期
            select to_date(c_clearDate, 'yyyy-MM-dd') - 1
              into d_revealEndDate
              from dual;
            -- 期報結束日大於等於開始日+2個月
            if add_months(d_revealStartDate, 2) <= d_revealEndDate then
              -- 直接生成期間管理報告清算提示信息
              INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                (C_REVEAL_REPORT_CLEAR_TIP_ID,
                 C_PROJECT_CODE,
                 D_REVEAL_DATE,
                 C_REVEAL_RATE,
                 C_ISAUTO_REPORT,
                 DELETE_FLAG,
                 CREATE_TIME,
                 CREATE_USER_ID,
                 UPDATE_TIME,
                 UPDATE_USER_ID,
                 C_REVEAL_DUE_TIME,
                 C_NOTICE_DUE_TIME,
                 D_REVEAL_START_DATE,
                 D_REVEAL_END_DATE)
              VALUES
                ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                 SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                 create_reveal_info.projectCode,
                 to_date(c_clearDate, 'yyyy-MM-dd'),
                 create_reveal_info.revealRate,
                 '0',
                 '0',
                 SYSDATE,
                 'admin',
                 SYSDATE,
                 'admin',
                 create_reveal_info.revealduetime,
                 create_reveal_info.noticeduetime,
                 d_revealStartDate,
                 d_revealEndDate);
              -- 賦值下一期期報開始日
              c_startDate := d_revealEndDate + 1;
            end if;
          END IF;
        END IF;
        -- 用第一次提示日期計算下一次的提示日期
        SELECT to_char(add_months(to_date(c_firstClearDate, 'yyyy-mm-dd'),
                                  c_N * 12),
                       'yyyy-MM-dd')
          INTO c_clearDate
          FROM dual;
        -- 生成小於系統日期的提示
        if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
          EXIT;
        end if;
        c_N := c_N + 1;
      END LOOP;
    
      -- 自然季度(1月1日,4月1日,7月1日,10月1日)
    ELSIF (create_reveal_info.revealRate IS NOT NULL) AND
          (create_reveal_info.revealRate = 'Q') THEN
      -- 通過傳入日期,計算出當前所在季度
      SELECT to_char(c_startDate, 'Q') INTO c_quarter FROM dual;
      IF c_quarter = '1' THEN
        SELECT extract(YEAR FROM c_startDate) || '-' || '01' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      ELSIF c_quarter = '2' THEN
        SELECT extract(YEAR FROM c_startDate) || '-' || '04' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      ELSIF c_quarter = '3' THEN
        SELECT extract(YEAR FROM c_startDate) || '-' || '07' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      ELSIF c_quarter = '4' THEN
        SELECT extract(YEAR FROM c_startDate) || '-' || '10' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      END IF;
      c_clearDate := c_firstClearDate;
      -- 進入循環獲取披露日期
      LOOP
        -- 當披露日期大於系統日期,得生成期間管理報告清算提示信息
        IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
          -- 查詢是否存在該提示
          SELECT COUNT(*)
            INTO v_reveal_tip_num
            from t_reveal_report_clear_tip trc
           where trc.c_project_code = create_reveal_info.projectCode
             and trc.c_reveal_rate = create_reveal_info.revealRate
             and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
             and trc.delete_flag = '0';
          -- 若不存在,則生成提示信息
          IF v_reveal_tip_num = 0 THEN
            -- 生成披露起始日期
            d_revealStartDate := c_startDate;
            --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -3) into d_revealStartDate FROM dual;
            -- 生成披露結束日期
            select to_date(c_clearDate, 'yyyy-MM-dd') - 1
              into d_revealEndDate
              from dual;
            -- 期報結束日大於等於開始日+2個月
            if add_months(d_revealStartDate, 2) <= d_revealEndDate then
              -- 直接生成期間管理報告清算提示信息
              INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                (C_REVEAL_REPORT_CLEAR_TIP_ID,
                 C_PROJECT_CODE,
                 D_REVEAL_DATE,
                 C_REVEAL_RATE,
                 C_ISAUTO_REPORT,
                 DELETE_FLAG,
                 CREATE_TIME,
                 CREATE_USER_ID,
                 UPDATE_TIME,
                 UPDATE_USER_ID,
                 C_REVEAL_DUE_TIME,
                 C_NOTICE_DUE_TIME,
                 D_REVEAL_START_DATE,
                 D_REVEAL_END_DATE)
              VALUES
                ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                 SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                 create_reveal_info.projectCode,
                 to_date(c_clearDate, 'yyyy-MM-dd'),
                 create_reveal_info.revealRate,
                 '0',
                 '0',
                 SYSDATE,
                 'admin',
                 SYSDATE,
                 'admin',
                 create_reveal_info.revealduetime,
                 create_reveal_info.noticeduetime,
                 d_revealStartDate,
                 d_revealEndDate);
              -- 賦值下一期期報開始日
              c_startDate := d_revealEndDate + 1;
            end if;
          END IF;
        END IF;
        -- 用第一次提示日期計算下一次的提示日期
        SELECT to_char(add_months(to_date(c_firstClearDate, 'yyyy-mm-dd'),
                                  c_N * 3),
                       'yyyy-MM-dd')
          INTO c_clearDate
          FROM dual;
        -- 生成小於系統日期的提示
        if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
          EXIT;
        end if;
        c_N := c_N + 1;
      END LOOP;
    
      -- 信託年
    ELSIF (create_reveal_info.revealRate IS NOT NULL) AND
          (create_reveal_info.revealRate = 'TY') THEN
      -- 當成立日不爲空時生成提示信息
      IF create_reveal_info.setupdate IS NOT NULL THEN
        -- 獲取成立日期
        SELECT to_char(create_reveal_info.setupdate, '-mm')
          INTO c_alloMonth
          FROM dual;
        SELECT to_char(create_reveal_info.setupdate, '-dd')
          INTO c_alloDay
          FROM dual;
        -- 得到第一次披露日期
        select to_char(c_startDate, 'yyyy') || c_alloMonth || c_alloDay
          INTO c_firstClearDate
          FROM dual;
        c_clearDate := c_firstClearDate;
        -- 如果生成日期不是有效日期,則取當月最後一天日期
        IF is_date(c_clearDate) = 0 THEN
          SELECT to_char(last_day(to_date(substr(c_clearDate, 0, 7) ||
                                          '-01',
                                          'yyyy-mm-dd')),
                         'yyyy-mm-dd')
            INTO c_clearDate
            FROM dual;
        END IF;
        -- 進入循環獲取披露日期
        LOOP
          -- 當披露日期大於系統日期,得生成期間管理報告清算提示信息
          IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
            -- 查詢是否存在該提示
            SELECT COUNT(*)
              INTO v_reveal_tip_num
              from t_reveal_report_clear_tip trc
             where trc.c_project_code = create_reveal_info.projectCode
               and trc.c_reveal_rate = create_reveal_info.revealRate
               and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
               and trc.delete_flag = '0';
            -- 若不存在,則生成提示信息
            IF v_reveal_tip_num = 0 THEN
              -- 期報開始日期
              d_revealStartDate := c_startDate;
              --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -12) into d_revealStartDate FROM dual;
              -- 期報結束日期
              select to_date(c_clearDate, 'yyyy-MM-dd') - 1
                into d_revealEndDate
                from dual;
              -- 期報結束日大於等於開始日+2個月
              if add_months(d_revealStartDate, 2) <= d_revealEndDate then
                -- 新增期報披露提示表
                INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                  (C_REVEAL_REPORT_CLEAR_TIP_ID,
                   C_PROJECT_CODE,
                   D_REVEAL_DATE,
                   C_REVEAL_RATE,
                   C_ISAUTO_REPORT,
                   DELETE_FLAG,
                   CREATE_TIME,
                   CREATE_USER_ID,
                   UPDATE_TIME,
                   UPDATE_USER_ID,
                   C_REVEAL_DUE_TIME,
                   C_NOTICE_DUE_TIME,
                   D_REVEAL_START_DATE,
                   D_REVEAL_END_DATE)
                VALUES
                  ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                   SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                   create_reveal_info.projectCode,
                   to_date(c_clearDate, 'yyyy-MM-dd'),
                   create_reveal_info.revealRate,
                   '0',
                   '0',
                   SYSDATE,
                   'admin',
                   SYSDATE,
                   'admin',
                   create_reveal_info.revealduetime,
                   create_reveal_info.noticeduetime,
                   d_revealStartDate,
                   d_revealEndDate);
                -- 賦值下一期期報開始日
                c_startDate := d_revealEndDate + 1;
              end if;
            END IF;
          ELSE
            EXIT;
          END IF;
          -- 用第一次提示日期計算下一次的提示日期
          -- 如果第一次提示日期不是有效日期,則取當月最後一天日期
          IF is_date(c_firstClearDate) = 0 THEN
            -- 先將第一次日期變爲有效日期
            SELECT to_char(last_day(to_date(substr(c_firstClearDate, 0, 7) ||
                                            '-01',
                                            'yyyy-mm-dd')),
                           'yyyy-mm-dd')
              INTO c_firstClearDate
              FROM dual;
            -- 再生成下一次日期
            SELECT to_char(add_months(to_date(c_firstClearDate,
                                              'yyyy-mm-dd'),
                                      c_N * 12),
                           'yyyy-MM-dd')
              INTO c_clearDate
              FROM dual;
          ELSE
            -- 如果是有效日期,則直接生成下一次日期
            SELECT to_char(add_months(to_date(c_firstClearDate,
                                              'yyyy-mm-dd'),
                                      c_N * 12),
                           'yyyy-MM-dd')
              INTO c_clearDate
              FROM dual;
          END IF;
          -- 如果生成日期不是有效日期,則取當月最後一天日期
          IF is_date(c_clearDate) = 0 THEN
            SELECT to_char(last_day(to_date(substr(c_clearDate, 0, 7) ||
                                            '-01',
                                            'yyyy-mm-dd')),
                           'yyyy-mm-dd')
              INTO c_clearDate
              FROM dual;
          END IF;
          -- 生成小於系統日期的提示
          if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
            EXIT;
          end if;
          c_N := c_N + 1;
        END LOOP;
      END IF;
    
      -- 信託半年
    ELSIF (create_reveal_info.revealRate IS NOT NULL) AND
          (create_reveal_info.revealRate = 'TH') THEN
      -- 當成立日不爲空時生成提示信息
      IF create_reveal_info.setupdate IS NOT NULL THEN
        -- 變量賦值
        SELECT to_char(create_reveal_info.setupdate, 'yyyy-MM-dd')
          INTO c_firstClearDate
          FROM dual;
        SELECT to_char(create_reveal_info.setupdate, 'yyyy-MM-dd')
          INTO c_clearDate
          FROM dual;
        -- 進入循環獲取披露日期
        LOOP
          -- 當披露日期大於系統日期,得生成期間管理報告清算提示信息
          IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
            -- 查詢是否存在該提示
            SELECT COUNT(*)
              INTO v_reveal_tip_num
              from t_reveal_report_clear_tip trc
             where trc.c_project_code = create_reveal_info.projectCode
               and trc.c_reveal_rate = create_reveal_info.revealRate
               and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
               and trc.delete_flag = '0';
            -- 若不存在,則生成提示信息
            IF v_reveal_tip_num = 0 THEN
              -- 期報開始日期
              d_revealStartDate := c_startDate;
              --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -6) into d_revealStartDate FROM dual;
              -- 期報結束日期
              select to_date(c_clearDate, 'yyyy-MM-dd') - 1
                into d_revealEndDate
                from dual;
              -- 期報結束日大於等於開始日+2個月
              if add_months(d_revealStartDate, 2) <= d_revealEndDate then
                -- 新增期報披露提示表
                INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                  (C_REVEAL_REPORT_CLEAR_TIP_ID,
                   C_PROJECT_CODE,
                   D_REVEAL_DATE,
                   C_REVEAL_RATE,
                   C_ISAUTO_REPORT,
                   DELETE_FLAG,
                   CREATE_TIME,
                   CREATE_USER_ID,
                   UPDATE_TIME,
                   UPDATE_USER_ID,
                   C_REVEAL_DUE_TIME,
                   C_NOTICE_DUE_TIME,
                   D_REVEAL_START_DATE,
                   D_REVEAL_END_DATE)
                VALUES
                  ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                   SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                   create_reveal_info.projectCode,
                   to_date(c_clearDate, 'yyyy-MM-dd'),
                   create_reveal_info.revealRate,
                   '0',
                   '0',
                   SYSDATE,
                   'admin',
                   SYSDATE,
                   'admin',
                   create_reveal_info.revealduetime,
                   create_reveal_info.noticeduetime,
                   d_revealStartDate,
                   d_revealEndDate);
                -- 賦值下一期期報開始日
                c_startDate := d_revealEndDate + 1;
              end if;
            END IF;
          END IF;
          -- 用第一次獲取的成立日期計算下一次的提示日期(不需要對成立日期做判斷日期是否有效)
          SELECT to_char(add_months(to_date(c_firstClearDate, 'yyyy-mm-dd'),
                                    c_N * 6),
                         'yyyy-MM-dd')
            INTO c_clearDate
            FROM dual;
          -- 如果生成日期不是有效日期,則取當月最後一天日期
          IF is_date(c_clearDate) = 0 THEN
            SELECT to_char(last_day(to_date(substr(c_clearDate, 0, 7) ||
                                            '-01',
                                            'yyyy-mm-dd')),
                           'yyyy-mm-dd')
              INTO c_clearDate
              FROM dual;
          END IF;
          -- 生成小於系統日期的提示
          if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
            EXIT;
          end if;
          c_N := c_N + 1;
        END LOOP;
      END IF;
    
      -- 信託季度
    ELSIF (create_reveal_info.revealRate IS NOT NULL) AND
          (create_reveal_info.revealRate = 'TQ') THEN
      -- 當成立日不爲空時生成提示信息
      IF create_reveal_info.setupdate IS NOT NULL THEN
        -- 變量賦值
        SELECT to_char(create_reveal_info.setupdate, 'yyyy-MM-dd')
          INTO c_firstClearDate
          FROM dual;
        SELECT to_char(create_reveal_info.setupdate, 'yyyy-MM-dd')
          INTO c_clearDate
          FROM dual;
        -- 進入循環獲取披露日期
        LOOP
          -- 當披露日期大於系統日期,得生成期間管理報告清算提示信息
          IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
            -- 查詢是否存在該提示
            SELECT COUNT(*)
              INTO v_reveal_tip_num
              from t_reveal_report_clear_tip trc
             where trc.c_project_code = create_reveal_info.projectCode
               and trc.c_reveal_rate = create_reveal_info.revealRate
               and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
               and trc.delete_flag = '0';
            -- 若不存在,則生成提示信息
            IF v_reveal_tip_num = 0 THEN
              -- 期報開始日期
              d_revealStartDate := c_startDate;
              --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -3) into d_revealStartDate FROM dual;
              -- 期報結束日期
              select to_date(c_clearDate, 'yyyy-MM-dd') - 1
                into d_revealEndDate
                from dual;
              -- 期報結束日大於等於開始日+2個月
              if add_months(d_revealStartDate, 2) <= d_revealEndDate then
                -- 新增期報披露提示表
                INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                  (C_REVEAL_REPORT_CLEAR_TIP_ID,
                   C_PROJECT_CODE,
                   D_REVEAL_DATE,
                   C_REVEAL_RATE,
                   C_ISAUTO_REPORT,
                   DELETE_FLAG,
                   CREATE_TIME,
                   CREATE_USER_ID,
                   UPDATE_TIME,
                   UPDATE_USER_ID,
                   C_REVEAL_DUE_TIME,
                   C_NOTICE_DUE_TIME,
                   D_REVEAL_START_DATE,
                   D_REVEAL_END_DATE)
                VALUES
                  ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                   SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                   create_reveal_info.projectCode,
                   to_date(c_clearDate, 'yyyy-MM-dd'),
                   create_reveal_info.revealRate,
                   '0',
                   '0',
                   SYSDATE,
                   'admin',
                   SYSDATE,
                   'admin',
                   create_reveal_info.revealduetime,
                   create_reveal_info.noticeduetime,
                   d_revealStartDate,
                   d_revealEndDate);
                -- 賦值下一期期報開始日
                c_startDate := d_revealEndDate + 1;
              end if;
            END IF;
          END IF;
          -- 用第一次獲取的成立日期計算下一次的提示日期(不需要對成立日期做判斷日期是否有效)
          SELECT to_char(add_months(to_date(c_firstClearDate, 'yyyy-mm-dd'),
                                    c_N * 3),
                         'yyyy-MM-dd')
            INTO c_clearDate
            FROM dual;
          -- 如果生成日期不是有效日期,則取當月最後一天日期
          IF is_date(c_clearDate) = 0 THEN
            SELECT to_char(last_day(to_date(substr(c_clearDate, 0, 7) ||
                                            '-01',
                                            'yyyy-mm-dd')),
                           'yyyy-mm-dd')
              INTO c_clearDate
              FROM dual;
          END IF;
          -- 生成小於系統日期的提示
          if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
            EXIT;
          end if;
          c_N := c_N + 1;
        END LOOP;
      END IF;
    END IF;
  END LOOP;

  --輸出放回狀態信息
  v_res       := 0;
  v_errorCode := SQLCODE;
  v_errorMsg  := 'P_REVEAL_REPORT_CLEAR_TIP' || ':' || TO_CHAR(SQLERRM);
  COMMIT;

  /* 期間管理報告清算提示 End */

  --異常處理
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    v_res       := -1;
    v_errorCode := SQLCODE;
    v_errorMsg  := 'P_REVEAL_REPORT_CLEAR_TIP' || ':' || TO_CHAR(SQLERRM);
    DBMS_OUTPUT.put_line('P_REVEAL_REPORT_CLEAR_TIP' || ':' || '異常錯誤爲:' ||
                         sqlerrm || '--' || sqlcode || '--' ||
                         dbms_utility.format_error_backtrace);
END P_REVEAL_REPORT_CLEAR_TIP;

合併之後的結果

CREATE OR REPLACE PROCEDURE P_REVEAL_REPORT_CLEAR_TIP(v_res       OUT NUMBER,
                                                      v_errorCode OUT NVARCHAR2,
                                                      v_errorMsg  OUT NVARCHAR2) IS
  --根據期間管理報告披露頻率生成期間管理報告的披露日期
  v_reveal_tip_num  NUMBER(8) := 0; -- 查詢是否存在的提示數據的個數
  c_N               NUMBER(10) := 1; -- 計算使用的倍數,從0開始
  c_clearDate       NVARCHAR2(10); -- 披露日期
  c_firstClearDate  NVARCHAR2(10); -- 第一次生成的提示日期
  c_quarter         NVARCHAR2(1); -- 第幾季度
  c_alloMonth       NVARCHAR2(10); -- 特定週期月
  c_alloDay         NVARCHAR2(10); -- 特定週期日
  d_revealStartDate DATE; -- 披露起始日期
  d_revealEndDate   DATE; -- 披露結束日期
  c_startDate       DATE; --期報開始日期

  /* 恆字系列期報開始日期 */
  d_revealTreatyStartDate DATE;
  /* 恆字系列期報結束日期 */
  d_revealTreatyEndDate DATE;
  /* 期報開始日期年份 */
  c_revealStartYear NVARCHAR2(4);
  /*家族系統產品受益級別信息數組下標*/
  v_count number := 0;
  /* 定義截取的配置信息的日期 */
  type reveal_end_date_list is record(
    revealEndStr t_reveal_project_type_scheme.c_month_date_str%type);
  /*期間管理報告提示期報結束日信息變量*/
  v_revealEndStr t_reveal_project_type_scheme.c_month_date_str%type;
  /*定義數組類型*/
  type reveal_end_date_arr_type is table of reveal_end_date_list index by binary_integer;
  /* 期間管理報告提示期報結束日數組 */
  reveal_end_date_arr reveal_end_date_arr_type;
  /*動態遊標*/
  type sync_cursor is ref cursor;
  /* 期間管理報告協議類型期報提示的披露頻率日期格式動態遊標變量 */
  familyProjectRateInfos sync_cursor;
  /* 查詢是否存在的提示數據的個數 */
  v_reveal_tip_count NUMBER(2) := 0;

  --刪除的披露頻率,並重新生成提示(提示狀態爲未處理的全部先刪除)
  CURSOR create_reveal_infos IS
    SELECT trr.project_code       AS projectCode, --項目編號
           trr.reveal_rate        AS revealRate, --披露頻率
           tfp.d_setupdate        AS setupDate, --項目成立日期
           trr.c_reveal_due_time  AS revealDueTime, --披露日期期限
           trr.c_notice_due_time  AS noticeDueTime, --通知期限
           t2.c_period_date_start AS periodDateStart, --已存在的期報開始日期
           t2.c_period_date_end   AS periodDateEnd --已存在的期報結束日期
      FROM t_reveal_report_scheme trr
     INNER JOIN t_family_project tfp
        on tfp.project_code = trr.project_code
       AND tfp.delete_flag = '0'
       AND tfp.d_setupdate is not null
      left join (select row_number() over(partition by prr.project_code order by prr.c_period_date_end desc) rn,
                        prr.project_code,
                        prr.delete_flag,
                        prr.c_report_status,
                        prr.c_period_date_start,
                        prr.c_period_date_end
                   from t_project_reveal_report prr) t2
        on tfp.project_code = t2.project_code
       and t2.rn = 1 --移至這裏,不影響主表查詢
       and t2.delete_flag = '0'
     WHERE 1 = 1
       AND trr.delete_flag = '0'
       and tfp.c_projectphase <> '03' --除清算階段外 01-成立階段; 02-期間管理階段; 03-清算階段
       and tfp.project_shortname not like '恆字'
    --and tfp.project_code = '201810804082'
    ;

  /* 查詢家族信託期報披露頻率配置表 */
  cursor projectTypeSchemes is
    select t.c_co_institution      as cropNo,
           t.c_reveal_type_name    as revealTypeName,
           t.reveal_rate           as revealRate,
           t.c_month_date_str      as monthDateStr,
           t.c_reveal_due_time     as revealDueTime,
           t.c_reveal_due_end_time as revealDueEndTime,
           t.c_notice_due_time     as noticeDueTime,
           t.c_remark              as remark,
           t.c_report_template_id  as reportTemplateId
      from t_reveal_project_type_scheme t
     where t.delete_flag = '0';

  /* 查詢家族信託項目包含最近期間管理報告的數據 */
  cursor projectRevealTips(cropNo NVARCHAR2, revealTypeName NVARCHAR2) is
    select t1.project_code as projectCode,
           t1.d_setupdate as setupDate,
           nvl(t1.d_actual_enddate, to_date('9999-12-31', 'yyyy-MM-dd')) as actualEndDate, --項目實際結束日期
           t2.c_period_date_start as periodDateStart, --已存在的期報開始日期
           t2.c_period_date_end as periodDateEnd --已存在的期報結束日期
      from t_family_project t1
      left join (select row_number() over(partition by prr.project_code order by prr.c_period_date_end desc) rn,
                        prr.project_code,
                        prr.delete_flag,
                        prr.c_report_status,
                        prr.c_period_date_start,
                        prr.c_period_date_end
                   from t_project_reveal_report prr) t2
        on t1.project_code = t2.project_code
       and t2.rn = 1 --移至這裏,不影響主表查詢
       and t2.delete_flag = '0'
     where 1 = 1
       and t1.project_shortname like '%' || revealTypeName || '%' --配置表的參數
       and t1.c_co_institution = cropNo --配置表的參數
       and t1.delete_flag = '0'
       and t1.c_projectphase <> '03' --除清算階段外 01-成立階段; 02-期間管理階段; 03-清算階段
    --and t1.project_code = '201910804021'
    ;

BEGIN
  --================================================================================
  -------------------------------【執行sql文】--------------------------------------
  --================================================================================

  DBMS_OUTPUT.ENABLE(buffer_size => null); --表示輸出buffer不受限制
  /* 期間管理報告清算提示 Start */

  -- 1.從合同信息中生成頻率規則實時調用生成提示信息
  -- 生成期間管理報告清算提示的披露日期
  FOR create_reveal_info IN create_reveal_infos LOOP
    -- 從期報開始日開始
    if create_reveal_info.perioddateend is null then
      -- 如果不存在期報,則以成立日開始
      c_startDate := create_reveal_info.setupdate;
    else
      -- 如果存在最新一期期報結束日,則開始日爲期報結束日+1
      c_startDate := create_reveal_info.perioddateend + 1;
    end if;
  
    -- 每次循環初始化計算倍數
    c_N := 1;
    -- 自然年
    IF (create_reveal_info.revealRate IS NOT NULL) AND
       (create_reveal_info.revealRate = 'Y') THEN
      -- 生成第一次提示日期
      SELECT extract(YEAR FROM c_startDate) || '-' || '01' || '-' || '01'
        INTO c_firstClearDate
        FROM dual;
      c_clearDate := c_firstClearDate;
      -- 進入循環獲取披露日期
      LOOP
        -- 生成披露日期小於等系統日期的提示數據
        IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
          -- 查詢是否存在該提示
          SELECT COUNT(*)
            INTO v_reveal_tip_num
            from t_reveal_report_clear_tip trc
           where trc.c_project_code = create_reveal_info.projectCode
             and trc.c_reveal_rate = create_reveal_info.revealRate
             and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
             and trc.delete_flag = '0';
          -- 若不存在,則生成提示信息
          IF v_reveal_tip_num = 0 THEN
            -- 期報開始日期
            d_revealStartDate := c_startDate;
            --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -12) into d_revealStartDate FROM dual;
            -- 期報結束日期
            select to_date(c_clearDate, 'yyyy-MM-dd') - 1
              into d_revealEndDate
              from dual;
            -- 期報結束日大於等於開始日+2個月
            if add_months(d_revealStartDate, 2) <= d_revealEndDate then
              -- 直接生成期間管理報告清算提示信息
              INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                (C_REVEAL_REPORT_CLEAR_TIP_ID,
                 C_PROJECT_CODE,
                 D_REVEAL_DATE,
                 C_REVEAL_RATE,
                 C_ISAUTO_REPORT,
                 DELETE_FLAG,
                 CREATE_TIME,
                 CREATE_USER_ID,
                 C_REVEAL_DUE_TIME,
                 C_NOTICE_DUE_TIME,
                 D_REVEAL_START_DATE,
                 D_REVEAL_END_DATE)
              VALUES
                ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                 SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                 create_reveal_info.projectCode,
                 to_date(c_clearDate, 'yyyy-MM-dd'),
                 create_reveal_info.revealRate,
                 '0',
                 '0',
                 SYSDATE,
                 'admin',
                 create_reveal_info.revealduetime,
                 create_reveal_info.noticeduetime,
                 d_revealStartDate,
                 d_revealEndDate);
              -- 賦值下一期期報開始日
              c_startDate := d_revealEndDate + 1;
            end if;
          END IF;
        else
          exit;
        END IF;
        -- 用第一次提示日期計算下一次的提示日期
        SELECT to_char(add_months(to_date(c_firstClearDate, 'yyyy-mm-dd'),
                                  c_N * 12),
                       'yyyy-MM-') || '01'
          INTO c_clearDate
          FROM dual;
        -- 生成小於系統日期的提示
        if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
          EXIT;
        end if;
        c_N := c_N + 1;
      END LOOP;
    
      -- 自然半年(每年的7月1日)
    ELSIF (create_reveal_info.revealRate IS NOT NULL) AND
          (create_reveal_info.revealRate = 'H') THEN
      --系統日期同7月份進行比較
      IF (to_char(c_startDate, 'mmdd') > '0101') AND
         (to_char(c_startDate, 'mmdd') <= '0701') THEN
        SELECT extract(YEAR FROM c_startDate) || '-' || '07' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      ELSE
        SELECT extract(YEAR FROM c_startDate) || '-' || '01' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      END IF;
      c_clearDate := c_firstClearDate;
      -- 進入循環獲取披露日期
      LOOP
        -- 當披露日期大於系統日期,得生成期間管理報告清算提示信息
        IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
          -- 查詢是否存在該提示
          SELECT COUNT(*)
            INTO v_reveal_tip_num
            from t_reveal_report_clear_tip trc
           where trc.c_project_code = create_reveal_info.projectCode
             and trc.c_reveal_rate = create_reveal_info.revealRate
             and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
             and trc.delete_flag = '0';
          -- 若不存在,則生成提示信息
          IF v_reveal_tip_num = 0 THEN
            -- 期報開始日期
            d_revealStartDate := c_startDate;
            --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -6) into d_revealStartDate FROM dual;
            -- 期報結束日期
            select to_date(c_clearDate, 'yyyy-MM-dd') - 1
              into d_revealEndDate
              from dual;
            -- 期報結束日大於等於開始日+2個月
            if add_months(d_revealStartDate, 2) <= d_revealEndDate then
              -- 直接生成期間管理報告清算提示信息
              INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                (C_REVEAL_REPORT_CLEAR_TIP_ID,
                 C_PROJECT_CODE,
                 D_REVEAL_DATE,
                 C_REVEAL_RATE,
                 C_ISAUTO_REPORT,
                 DELETE_FLAG,
                 CREATE_TIME,
                 CREATE_USER_ID,
                 C_REVEAL_DUE_TIME,
                 C_NOTICE_DUE_TIME,
                 D_REVEAL_START_DATE,
                 D_REVEAL_END_DATE)
              VALUES
                ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                 SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                 create_reveal_info.projectCode,
                 to_date(c_clearDate, 'yyyy-MM-dd'),
                 create_reveal_info.revealRate,
                 '0',
                 '0',
                 SYSDATE,
                 'admin',
                 create_reveal_info.revealduetime,
                 create_reveal_info.noticeduetime,
                 d_revealStartDate,
                 d_revealEndDate);
              -- 賦值下一期期報開始日
              c_startDate := d_revealEndDate + 1;
            end if;
          END IF;
        END IF;
        -- 用第一次提示日期計算下一次的提示日期
        SELECT to_char(add_months(to_date(c_firstClearDate, 'yyyy-mm-dd'),
                                  c_N * 12),
                       'yyyy-MM-dd')
          INTO c_clearDate
          FROM dual;
        -- 生成小於系統日期的提示
        if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
          EXIT;
        end if;
        c_N := c_N + 1;
      END LOOP;
    
      -- 自然季度(1月1日,4月1日,7月1日,10月1日)
    ELSIF (create_reveal_info.revealRate IS NOT NULL) AND
          (create_reveal_info.revealRate = 'Q') THEN
      -- 通過傳入日期,計算出當前所在季度
      SELECT to_char(c_startDate, 'Q') INTO c_quarter FROM dual;
      IF c_quarter = '1' THEN
        SELECT extract(YEAR FROM c_startDate) || '-' || '01' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      ELSIF c_quarter = '2' THEN
        SELECT extract(YEAR FROM c_startDate) || '-' || '04' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      ELSIF c_quarter = '3' THEN
        SELECT extract(YEAR FROM c_startDate) || '-' || '07' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      ELSIF c_quarter = '4' THEN
        SELECT extract(YEAR FROM c_startDate) || '-' || '10' || '-' || '01'
          INTO c_firstClearDate
          FROM dual;
      END IF;
      c_clearDate := c_firstClearDate;
      -- 進入循環獲取披露日期
      LOOP
        -- 當披露日期大於系統日期,得生成期間管理報告清算提示信息
        IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
          -- 查詢是否存在該提示
          SELECT COUNT(*)
            INTO v_reveal_tip_num
            from t_reveal_report_clear_tip trc
           where trc.c_project_code = create_reveal_info.projectCode
             and trc.c_reveal_rate = create_reveal_info.revealRate
             and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
             and trc.delete_flag = '0';
          -- 若不存在,則生成提示信息
          IF v_reveal_tip_num = 0 THEN
            -- 生成披露起始日期
            d_revealStartDate := c_startDate;
            --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -3) into d_revealStartDate FROM dual;
            -- 生成披露結束日期
            select to_date(c_clearDate, 'yyyy-MM-dd') - 1
              into d_revealEndDate
              from dual;
            -- 期報結束日大於等於開始日+2個月
            if add_months(d_revealStartDate, 2) <= d_revealEndDate then
              -- 直接生成期間管理報告清算提示信息
              INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                (C_REVEAL_REPORT_CLEAR_TIP_ID,
                 C_PROJECT_CODE,
                 D_REVEAL_DATE,
                 C_REVEAL_RATE,
                 C_ISAUTO_REPORT,
                 DELETE_FLAG,
                 CREATE_TIME,
                 CREATE_USER_ID,
                 C_REVEAL_DUE_TIME,
                 C_NOTICE_DUE_TIME,
                 D_REVEAL_START_DATE,
                 D_REVEAL_END_DATE)
              VALUES
                ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                 SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                 create_reveal_info.projectCode,
                 to_date(c_clearDate, 'yyyy-MM-dd'),
                 create_reveal_info.revealRate,
                 '0',
                 '0',
                 SYSDATE,
                 'admin',
                 create_reveal_info.revealduetime,
                 create_reveal_info.noticeduetime,
                 d_revealStartDate,
                 d_revealEndDate);
              -- 賦值下一期期報開始日
              c_startDate := d_revealEndDate + 1;
            end if;
          END IF;
        END IF;
        -- 用第一次提示日期計算下一次的提示日期
        SELECT to_char(add_months(to_date(c_firstClearDate, 'yyyy-mm-dd'),
                                  c_N * 3),
                       'yyyy-MM-dd')
          INTO c_clearDate
          FROM dual;
        -- 生成小於系統日期的提示
        if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
          EXIT;
        end if;
        c_N := c_N + 1;
      END LOOP;
    
      -- 信託年
    ELSIF (create_reveal_info.revealRate IS NOT NULL) AND
          (create_reveal_info.revealRate = 'TY') THEN
      -- 當成立日不爲空時生成提示信息
      IF create_reveal_info.setupdate IS NOT NULL THEN
        -- 獲取成立日期
        SELECT to_char(create_reveal_info.setupdate, '-mm')
          INTO c_alloMonth
          FROM dual;
        SELECT to_char(create_reveal_info.setupdate, '-dd')
          INTO c_alloDay
          FROM dual;
        -- 得到第一次披露日期
        select to_char(c_startDate, 'yyyy') || c_alloMonth || c_alloDay
          INTO c_firstClearDate
          FROM dual;
        c_clearDate := c_firstClearDate;
        -- 如果生成日期不是有效日期,則取當月最後一天日期
        IF is_date(c_clearDate) = 0 THEN
          SELECT to_char(last_day(to_date(substr(c_clearDate, 0, 7) ||
                                          '-01',
                                          'yyyy-mm-dd')),
                         'yyyy-mm-dd')
            INTO c_clearDate
            FROM dual;
        END IF;
        -- 進入循環獲取披露日期
        LOOP
          -- 當披露日期大於系統日期,得生成期間管理報告清算提示信息
          IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
            -- 查詢是否存在該提示
            SELECT COUNT(*)
              INTO v_reveal_tip_num
              from t_reveal_report_clear_tip trc
             where trc.c_project_code = create_reveal_info.projectCode
               and trc.c_reveal_rate = create_reveal_info.revealRate
               and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
               and trc.delete_flag = '0';
            -- 若不存在,則生成提示信息
            IF v_reveal_tip_num = 0 THEN
              -- 期報開始日期
              d_revealStartDate := c_startDate;
              --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -12) into d_revealStartDate FROM dual;
              -- 期報結束日期
              select to_date(c_clearDate, 'yyyy-MM-dd') - 1
                into d_revealEndDate
                from dual;
              -- 期報結束日大於等於開始日+2個月
              if add_months(d_revealStartDate, 2) <= d_revealEndDate then
                -- 新增期報披露提示表
                INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                  (C_REVEAL_REPORT_CLEAR_TIP_ID,
                   C_PROJECT_CODE,
                   D_REVEAL_DATE,
                   C_REVEAL_RATE,
                   C_ISAUTO_REPORT,
                   DELETE_FLAG,
                   CREATE_TIME,
                   CREATE_USER_ID,
                   C_REVEAL_DUE_TIME,
                   C_NOTICE_DUE_TIME,
                   D_REVEAL_START_DATE,
                   D_REVEAL_END_DATE)
                VALUES
                  ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                   SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                   create_reveal_info.projectCode,
                   to_date(c_clearDate, 'yyyy-MM-dd'),
                   create_reveal_info.revealRate,
                   '0',
                   '0',
                   SYSDATE,
                   'admin',
                   create_reveal_info.revealduetime,
                   create_reveal_info.noticeduetime,
                   d_revealStartDate,
                   d_revealEndDate);
                -- 賦值下一期期報開始日
                c_startDate := d_revealEndDate + 1;
              end if;
            END IF;
          ELSE
            EXIT;
          END IF;
          -- 用第一次提示日期計算下一次的提示日期
          -- 如果第一次提示日期不是有效日期,則取當月最後一天日期
          IF is_date(c_firstClearDate) = 0 THEN
            -- 先將第一次日期變爲有效日期
            SELECT to_char(last_day(to_date(substr(c_firstClearDate, 0, 7) ||
                                            '-01',
                                            'yyyy-mm-dd')),
                           'yyyy-mm-dd')
              INTO c_firstClearDate
              FROM dual;
            -- 再生成下一次日期
            SELECT to_char(add_months(to_date(c_firstClearDate,
                                              'yyyy-mm-dd'),
                                      c_N * 12),
                           'yyyy-MM-dd')
              INTO c_clearDate
              FROM dual;
          ELSE
            -- 如果是有效日期,則直接生成下一次日期
            SELECT to_char(add_months(to_date(c_firstClearDate,
                                              'yyyy-mm-dd'),
                                      c_N * 12),
                           'yyyy-MM-dd')
              INTO c_clearDate
              FROM dual;
          END IF;
          -- 如果生成日期不是有效日期,則取當月最後一天日期
          IF is_date(c_clearDate) = 0 THEN
            SELECT to_char(last_day(to_date(substr(c_clearDate, 0, 7) ||
                                            '-01',
                                            'yyyy-mm-dd')),
                           'yyyy-mm-dd')
              INTO c_clearDate
              FROM dual;
          END IF;
          -- 生成小於系統日期的提示
          if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
            EXIT;
          end if;
          c_N := c_N + 1;
        END LOOP;
      END IF;
    
      -- 信託半年
    ELSIF (create_reveal_info.revealRate IS NOT NULL) AND
          (create_reveal_info.revealRate = 'TH') THEN
      -- 當成立日不爲空時生成提示信息
      IF create_reveal_info.setupdate IS NOT NULL THEN
        -- 變量賦值
        SELECT to_char(create_reveal_info.setupdate, 'yyyy-MM-dd')
          INTO c_firstClearDate
          FROM dual;
        SELECT to_char(create_reveal_info.setupdate, 'yyyy-MM-dd')
          INTO c_clearDate
          FROM dual;
        -- 進入循環獲取披露日期
        LOOP
          -- 當披露日期大於系統日期,得生成期間管理報告清算提示信息
          IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
            -- 查詢是否存在該提示
            SELECT COUNT(*)
              INTO v_reveal_tip_num
              from t_reveal_report_clear_tip trc
             where trc.c_project_code = create_reveal_info.projectCode
               and trc.c_reveal_rate = create_reveal_info.revealRate
               and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
               and trc.delete_flag = '0';
            -- 若不存在,則生成提示信息
            IF v_reveal_tip_num = 0 THEN
              -- 期報開始日期
              d_revealStartDate := c_startDate;
              --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -6) into d_revealStartDate FROM dual;
              -- 期報結束日期
              select to_date(c_clearDate, 'yyyy-MM-dd') - 1
                into d_revealEndDate
                from dual;
              -- 期報結束日大於等於開始日+2個月
              if add_months(d_revealStartDate, 2) <= d_revealEndDate then
                -- 新增期報披露提示表
                INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                  (C_REVEAL_REPORT_CLEAR_TIP_ID,
                   C_PROJECT_CODE,
                   D_REVEAL_DATE,
                   C_REVEAL_RATE,
                   C_ISAUTO_REPORT,
                   DELETE_FLAG,
                   CREATE_TIME,
                   CREATE_USER_ID,
                   C_REVEAL_DUE_TIME,
                   C_NOTICE_DUE_TIME,
                   D_REVEAL_START_DATE,
                   D_REVEAL_END_DATE)
                VALUES
                  ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                   SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                   create_reveal_info.projectCode,
                   to_date(c_clearDate, 'yyyy-MM-dd'),
                   create_reveal_info.revealRate,
                   '0',
                   '0',
                   SYSDATE,
                   'admin',
                   create_reveal_info.revealduetime,
                   create_reveal_info.noticeduetime,
                   d_revealStartDate,
                   d_revealEndDate);
                -- 賦值下一期期報開始日
                c_startDate := d_revealEndDate + 1;
              end if;
            END IF;
          END IF;
          -- 用第一次獲取的成立日期計算下一次的提示日期(不需要對成立日期做判斷日期是否有效)
          SELECT to_char(add_months(to_date(c_firstClearDate, 'yyyy-mm-dd'),
                                    c_N * 6),
                         'yyyy-MM-dd')
            INTO c_clearDate
            FROM dual;
          -- 如果生成日期不是有效日期,則取當月最後一天日期
          IF is_date(c_clearDate) = 0 THEN
            SELECT to_char(last_day(to_date(substr(c_clearDate, 0, 7) ||
                                            '-01',
                                            'yyyy-mm-dd')),
                           'yyyy-mm-dd')
              INTO c_clearDate
              FROM dual;
          END IF;
          -- 生成小於系統日期的提示
          if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
            EXIT;
          end if;
          c_N := c_N + 1;
        END LOOP;
      END IF;
    
      -- 信託季度
    ELSIF (create_reveal_info.revealRate IS NOT NULL) AND
          (create_reveal_info.revealRate = 'TQ') THEN
      -- 當成立日不爲空時生成提示信息
      IF create_reveal_info.setupdate IS NOT NULL THEN
        -- 變量賦值
        SELECT to_char(create_reveal_info.setupdate, 'yyyy-MM-dd')
          INTO c_firstClearDate
          FROM dual;
        SELECT to_char(create_reveal_info.setupdate, 'yyyy-MM-dd')
          INTO c_clearDate
          FROM dual;
        -- 進入循環獲取披露日期
        LOOP
          -- 當披露日期大於系統日期,得生成期間管理報告清算提示信息
          IF c_clearDate <= to_char(trunc(sysdate, 'dd'), 'yyyy-MM-dd') THEN
            -- 查詢是否存在該提示
            SELECT COUNT(*)
              INTO v_reveal_tip_num
              from t_reveal_report_clear_tip trc
             where trc.c_project_code = create_reveal_info.projectCode
               and trc.c_reveal_rate = create_reveal_info.revealRate
               and trc.d_reveal_date = to_date(c_clearDate, 'yyyy-MM-dd')
               and trc.delete_flag = '0';
            -- 若不存在,則生成提示信息
            IF v_reveal_tip_num = 0 THEN
              -- 期報開始日期
              d_revealStartDate := c_startDate;
              --SELECT add_months(to_date(c_clearDate,'yyyy-MM-dd'), -3) into d_revealStartDate FROM dual;
              -- 期報結束日期
              select to_date(c_clearDate, 'yyyy-MM-dd') - 1
                into d_revealEndDate
                from dual;
              -- 期報結束日大於等於開始日+2個月
              if add_months(d_revealStartDate, 2) <= d_revealEndDate then
                -- 新增期報披露提示表
                INSERT INTO T_REVEAL_REPORT_CLEAR_TIP
                  (C_REVEAL_REPORT_CLEAR_TIP_ID,
                   C_PROJECT_CODE,
                   D_REVEAL_DATE,
                   C_REVEAL_RATE,
                   C_ISAUTO_REPORT,
                   DELETE_FLAG,
                   CREATE_TIME,
                   CREATE_USER_ID,
                   C_REVEAL_DUE_TIME,
                   C_NOTICE_DUE_TIME,
                   D_REVEAL_START_DATE,
                   D_REVEAL_END_DATE)
                VALUES
                  ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                   SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                   create_reveal_info.projectCode,
                   to_date(c_clearDate, 'yyyy-MM-dd'),
                   create_reveal_info.revealRate,
                   '0',
                   '0',
                   SYSDATE,
                   'admin',
                   create_reveal_info.revealduetime,
                   create_reveal_info.noticeduetime,
                   d_revealStartDate,
                   d_revealEndDate);
                -- 賦值下一期期報開始日
                c_startDate := d_revealEndDate + 1;
              end if;
            END IF;
          END IF;
          -- 用第一次獲取的成立日期計算下一次的提示日期(不需要對成立日期做判斷日期是否有效)
          SELECT to_char(add_months(to_date(c_firstClearDate, 'yyyy-mm-dd'),
                                    c_N * 3),
                         'yyyy-MM-dd')
            INTO c_clearDate
            FROM dual;
          -- 如果生成日期不是有效日期,則取當月最後一天日期
          IF is_date(c_clearDate) = 0 THEN
            SELECT to_char(last_day(to_date(substr(c_clearDate, 0, 7) ||
                                            '-01',
                                            'yyyy-mm-dd')),
                           'yyyy-mm-dd')
              INTO c_clearDate
              FROM dual;
          END IF;
          -- 生成小於系統日期的提示
          if to_date(c_clearDate, 'yyyy-MM-dd') >= trunc(sysdate, 'dd') then
            EXIT;
          end if;
          c_N := c_N + 1;
        END LOOP;
      END IF;
    END IF;
  END LOOP;

  /* 渠道系列項目根據披露配置生產期報提示 Start */
  /* 循環項目協議披露頻率配置信息 */
  for projectTypeScheme in projectTypeSchemes loop
    --循環開始數組下標置0
    v_count := 0;
    -- 打開指定家族系統產品的受益級別信息遊標
    open familyProjectRateInfos for
      select regexp_substr(t.c_month_date_str, '[^;]+', 1, level) value
        from t_reveal_project_type_scheme t
       where 1 = 1
         and t.c_co_institution = projectTypeScheme.Cropno
         and t.c_reveal_type_name = projectTypeScheme.Revealtypename
      connect by level <= regexp_count(t.c_month_date_str, '[^;]+')
       order by value asc;
    /*取一個家族系統產品的受益級別進行同步處理*/
    loop
      fetch familyProjectRateInfos
        into v_revealEndStr;
      exit when familyProjectRateInfos%notfound;
      reveal_end_date_arr(v_count).revealEndStr := v_revealEndStr;
      -- 數組下標+1
      v_count := v_count + 1;
    end loop;
  
    /* 查詢家族信託項目包含最近期間管理報告的數據 */
    for projectRevealTip IN projectRevealTips(projectTypeScheme.Cropno,
                                              projectTypeScheme.Revealtypename) loop
      --DBMS_OUTPUT.put_line(c_N || '、項目名稱:' || projectRevealTip.projectCode);
      -- 1、確定期報開始日期
      -- 判斷是否存存在期間管理報告
      if projectRevealTip.periodDateStart is not null and
         projectRevealTip.periodDateEnd is not null then
        -- 存在上期期報,期報開始日:上期報結束日 + 1
        d_revealTreatyStartDate := trunc(projectRevealTip.periodDateEnd + 1,
                                         'dd');
        DBMS_OUTPUT.put_line('存在上期期報,項目名稱:' ||
                             projectRevealTip.projectCode || ',成立日期:' ||
                             to_char(projectRevealTip.setupDate,
                                     'yyyy-MM-dd') || ',上期期報結束日:' ||
                             to_char(projectRevealTip.periodDateEnd,
                                     'yyyy-MM-dd') || ',期報開始日期:' ||
                             to_char(d_revealTreatyStartDate, 'yyyy-MM-dd'));
      else
      
        -- 不存在上期期報,期報開始日:成立日
        d_revealTreatyStartDate := trunc(projectRevealTip.setupDate, 'dd');
        DBMS_OUTPUT.put_line('不存在上期期報,項目名稱:' ||
                             projectRevealTip.projectCode || ',成立日期:' ||
                             to_char(projectRevealTip.setupDate,
                                     'yyyy-MM-dd') || ',期報開始日期:' ||
                             to_char(d_revealTreatyStartDate, 'yyyy-MM-dd'));
      
      end if;
      -- 1.2、確定期報結束日期
      if reveal_end_date_arr.count > 0 then
        -- 期報開始日期的年份
        c_revealStartYear := to_char(d_revealTreatyStartDate, 'yyyy');
        loop
          for i in reveal_end_date_arr.first .. reveal_end_date_arr.last loop
            -- 期報結束日,節假日順延
            d_revealTreatyEndDate := fun_get_workdate(to_date(c_revealStartYear || '-' || reveal_end_date_arr(i).revealEndStr,
                                                              'yyyy-MM-dd'),
                                                      0);
            -- DBMS_OUTPUT.put_line('計算的期報結束日:' || to_char(d_revealTreatyEndDate, 'yyyy-MM-dd'));
            -- 期報開始日 < 期報結束日 <= 系統日期
            if d_revealTreatyEndDate >
               add_months(d_revealTreatyStartDate, 2) and
               d_revealTreatyEndDate <= trunc(sysdate, 'dd') then
              -- DBMS_OUTPUT.put_line('確認的期報結束日期:' || to_char(d_revealTreatyEndDate, 'yyyy-MM-dd'));
              -- 新增期報提示表
              -- 根據項目編號、期報開始結束日期,查詢期報披露提示表是否存在,不存在則新增
              select count(*)
                into v_reveal_tip_count
                from t_reveal_report_clear_tip t
               where 1 = 1
                 and t.delete_flag = '0'
                 and t.c_project_code = projectRevealTip.projectCode
                 and t.d_reveal_start_date = d_revealTreatyStartDate
                 and t.d_reveal_end_date = d_revealTreatyEndDate;
            
              DBMS_OUTPUT.put_line('計算的期報開始日:' ||
                                   to_char(d_revealTreatyStartDate,
                                           'yyyy-MM-dd') || ',計算的期報的結束日:' ||
                                   to_char(d_revealTreatyEndDate,
                                           'yyyy-MM-dd'));
              if v_reveal_tip_count = 0 then
                -- 如果不存在,則新增期報提示表
                insert into t_reveal_report_clear_tip
                  (c_reveal_report_clear_tip_id,
                   c_project_code,
                   d_reveal_date,
                   c_reveal_rate,
                   d_reveal_start_date,
                   d_reveal_end_date,
                   C_REVEAL_DUE_TIME,
                   C_REVEAL_DUE_END_TIME,
                   C_NOTICE_DUE_TIME,
                   C_ISAUTO_REPORT, --是否自動生成期報標識 1-是 0-否
                   delete_flag,
                   create_time,
                   create_user_id,
                   c_report_template_id)
                values
                  ('RCT' || to_char(SYSDATE, 'YYYYMMDDHH24MISS') ||
                   SEQ_ORIGINAL_DEFAULT.NEXTVAL,
                   projectRevealTip.projectCode,
                   d_revealTreatyEndDate + 1,
                   projectTypeScheme.Revealrate,
                   d_revealTreatyStartDate,
                   d_revealTreatyEndDate,
                   projectTypeScheme.Revealduetime,
                   projectTypeScheme.Revealdueendtime,
                   projectTypeScheme.Noticeduetime,
                   '2',
                   '0',
                   SYSDATE,
                   'admin',
                   projectTypeScheme.Reporttemplateid);
                v_reveal_tip_count := 0;
              end if;
            end if;
            -- 給下一期期報賦值 = 本期報結束日 + 1
            d_revealTreatyStartDate := d_revealTreatyEndDate + 1;
          end loop;
          -- 當計算出來的期報結束日大於 系統日期,則跳出
          if d_revealTreatyEndDate > trunc(sysdate, 'dd') then
            exit;
          end if;
          -- 拼接的年份 + 1
          c_revealStartYear := c_revealStartYear + 1;
        end loop;
      end if;
    end loop;
  end loop;

  --輸出放回狀態信息
  v_res       := 0;
  v_errorCode := SQLCODE;
  v_errorMsg  := 'P_REVEAL_REPORT_CLEAR_TIP' || ':' || TO_CHAR(SQLERRM);
  COMMIT;

  /* 期間管理報告清算提示 End */

  --異常處理
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    v_res       := -1;
    v_errorCode := SQLCODE;
    v_errorMsg  := 'P_REVEAL_REPORT_CLEAR_TIP' || ':' || TO_CHAR(SQLERRM);
    DBMS_OUTPUT.put_line('P_REVEAL_REPORT_CLEAR_TIP' || ':' || '異常錯誤爲:' ||
                         sqlerrm || '--' || sqlcode || '--' ||
                         dbms_utility.format_error_backtrace);
END P_REVEAL_REPORT_CLEAR_TIP;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章