恆字系列渠道系列項目根據披露配置生產期報提示
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;