源代码:ZGLanguage 解析SQL数据血缘 之 显示复杂SQL脚本结构图
# 通过 ZGLanguage + Python 将一个复杂存储过程脚本转换成 Echarts 展示:

# 存储过程脚本如下所示:
CREATE OR REPLACE PROCEDURE PROC_F_CWWS_LOAN
(
P_AS_OF_DATE IN DATE,
RET_FLG OUT VARCHAR2,
RET_MSG OUT VARCHAR2
) IS
/******************************************************************************
功能描述:xxxx业务数据ETL处理
源 表:
目 标 表:MA_F_LOAN
备 注:
******************************************************************************/
-- 声明变量并初始化
V_COUNT NUMBER := 0;
V_PROC_NAME VARCHAR2(200) := 'PROC_F_CWWS_LOAN';
V_PROC_DESC VARCHAR2(100) := 'xxxx业务数据ETL处理';
V_P_FREQ VARCHAR2(4) := '';
BEGIN
----------------------------------------------------------------
----------------------------------------------------------------
----------------------------------------------------------------
----------------------------------------------------------------
--写入初始日志
INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 1');
COMMIT;
ETL.PROC_ETL_LOG(P_AS_OF_DATE,
V_PROC_NAME,
V_PROC_DESC,
0,
0,
NULL,
NULL);
--设置会话日期格式
EXECUTE IMMEDIATE ' ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY-MM-DD''';
--查询参数表中,该程序对应的频率值
SELECT P_FREQ
INTO V_P_FREQ
FROM ETL_PROC_STATUS_DEF
WHERE PROC_NAME = V_PROC_NAME;
--判断是调度频率
IF P_AS_OF_DATE = FUNC_GET_FREQ_DAYS(P_AS_OF_DATE, V_P_FREQ) THEN
--调用分区维护程序
ETL.ETL_ADD_PARTITION('MA_F_LOAN', P_AS_OF_DATE, 'ETL');
--删除取上下次支付日临时表
DELETE TMP_XD_LAST_PAYDATE;
COMMIT;
DELETE TMP_XD_NEXT_PAYDATE;
COMMIT;
INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 2');
COMMIT;
--从还款计划表中取每笔账户最近一次小于等于数据日期还款日,作为上次还款日
INSERT INTO ETL.TMP_XD_LAST_PAYDATE
(OBJECTNO, LAST_PAYDATE)
SELECT OBJECTNO, LAST_PAYDATE
FROM (SELECT T.OBJECTNO,
MAX(TO_DATE(PAYDATE, 'YYYY-MM-DD')) LAST_PAYDATE
FROM NYBDP.O_CWWS_ACCT_PAYMENT_SCHEDULE T
WHERE T.AS_OF_DATE = P_AS_OF_DATE
AND T.SEQID <> '999'
AND TO_DATE(T.PAYDATE, 'YYYY-MM-DD') < P_AS_OF_DATE
GROUP BY T.OBJECTNO);
INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 3');
COMMIT;
--从还款计划表中取每笔账户最近一次大于数据日期还款日,作为下次还款日
INSERT INTO ETL.TMP_XD_NEXT_PAYDATE
(OBJECTNO, NEXT_PAYDATE)
SELECT OBJECTNO, NEXT_PAYDATE
FROM (SELECT T.OBJECTNO,
MIN(TO_DATE(PAYDATE, 'YYYY-MM-DD')) NEXT_PAYDATE
FROM NYBDP.O_CWWS_ACCT_PAYMENT_SCHEDULE T
WHERE T.AS_OF_DATE = P_AS_OF_DATE
AND T.SEQID <> '999'
AND TO_DATE(T.PAYDATE, 'YYYY-MM-DD') >= P_AS_OF_DATE
GROUP BY T.OBJECTNO);
INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 4');
COMMIT;
--xxxx业务数据ETL处理
INSERT INTO MA_F_LOAN
(ACCOUNT_NUMBER,
ACCOUNT_STAT,
RESERVE_FLG,
ACCOUNT_ID,
AS_OF_DATE,
PRODUCT_ID,
GL_ACCOUNT_ID,
INT_GL_ACCOUNT_ID,
ISO_CURRENCY_CD,
ORG_UNIT_ID,
CUR_BOOK_BAL,
OVERDUE_BAL,
SUM_BOOK_BAL_M,
SUM_BOOK_BAL_Y,
AVG_BOOK_BAL_M,
AVG_BOOK_BAL_Y,
CUR_BOOK_BAL_C,
AVG_BOOK_BAL_M_C,
AVG_BOOK_BAL_Y_C,
SUM_OVERDUE_BAL_M,
SUM_OVERDUE_BAL_Y,
AVG_OVERDUE_BAL_M,
AVG_OVERDUE_BAL_Y,
CUR_OVERDUE_BAL_C,
AVG_OVERDUE_BAL_M_C,
AVG_OVERDUE_BAL_Y_C,
ORG_BOOK_BAL,
MATURITY_DATE,
ORG_TERM,
ORG_TERM_MULT,
ORIGINATION_DATE,
ACCRUAL_BASIS_CD,
CUR_NET_RATE,
MARGIN,
FLOAD_R,
FLOAD_M,
BENCHMARK_RATE,
AMRT_TYPE_CD,
CUR_PAYMENT_INT,
CUR_PAYMENT,
LAST_PAYMENT_DATE,
NEXT_PAYMENT_DATE,
PMT_FREQ,
PMT_FREQ_MULT,
REMAIN_NO_PMTS_C,
ADJUSTABLE_TYPE_CD,