CREATE OR REPLACE PACKAGE BODY PKG_TOOLS_CONF_JCJ
AS
PROCEDURE PROC_GET_COMBINE_SQLS(V_IN_NAME IN VARCHAR2,
INSERT_COLNAME OUT CLOB,
SELECT_COLNAME OUT CLOB)
IS
V_INSERT_COLNAME CLOB:='';
V_SELECT_COLNAME CLOB:='';
--IN_COLNAME CLOB;
--SE_COLNAME CLOB;
BEGIN
FOR I IN(SELECT A.INSERT_COLNAME,A.SELECT_COLNAME FROM GCG_CUST_ACCT_CREDIT_JCJCONF A
WHERE A.TAB_NAME=V_IN_NAME)
LOOP
V_INSERT_COLNAME:=V_INSERT_COLNAME||I.INSERT_COLNAME||',';
V_SELECT_COLNAME:=V_SELECT_COLNAME||I.SELECT_COLNAME||',';
END LOOP;
INSERT_COLNAME:=RTRIM(V_INSERT_COLNAME,',');
SELECT_COLNAME:=RTRIM(V_SELECT_COLNAME,',');
--PKG_TOOLS_CONF_JCJ.PROC_DISP_LONG_STRING(INSERT_COLNAME||CHR(10)||SELECT_COLNAME);
RETURN;
END;
PROCEDURE PROC_DISP_LONG_STRING(V_SQL CLOB)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
IF LENGTH(V_SQL)>80 THEN
DBMS_OUTPUT.PUT_LINE(SUBSTR(V_SQL,1,80));
PROC_DISP_LONG_STRING(SUBSTR(V_SQL,81));
ELSE
DBMS_OUTPUT.PUT_LINE(SUBSTR(V_SQL,1,80));
END IF;
END;
PROCEDURE PROC_EXEC_JOB(IN_SP_NAME VARCHAR2,IN_PARAM PROC_PARAM_TYPE)
IS
V_PROGRAMNAME VARCHAR2(30);
V_JOBNAME VARCHAR2(100);
V_JOB_PROCNAME VARCHAR2(100);
V_SEQ_JOBID VARCHAR2(5);
BEGIN
V_SEQ_JOBID := LPAD(SEQ_SP_JOBID.NEXTVAL,3,'0');
V_PROGRAMNAME := 'PRO_'||SUBSTR(IN_SP_NAME, 5, 22)||'_'||V_SEQ_JOBID;
V_JOBNAME := 'JOB_' || SUBSTR(IN_SP_NAME, 5, 22)||'_'||V_SEQ_JOBID;
V_JOB_PROCNAME := IN_SP_NAME;
--1.创建JOB对应的PROGRAM和参数
DBMS_SCHEDULER.CREATE_PROGRAM(PROGRAM_NAME => V_PROGRAMNAME,
PROGRAM_TYPE => 'STORED_PROCEDURE',
PROGRAM_ACTION => V_JOB_PROCNAME,
NUMBER_OF_ARGUMENTS => 1,
ENABLED => FALSE);
DBMS_SCHEDULER.DEFINE_ANYDATA_ARGUMENT(PROGRAM_NAME => V_PROGRAMNAME,
ARGUMENT_POSITION => 1,
ARGUMENT_NAME => 'IN_WF_PARAM',
ARGUMENT_TYPE => 'SYS.ANYDATA',
DEFAULT_VALUE => SYS.ANYDATA.CONVERTOBJECT(IN_PARAM));
--2.创建JOB one-time-run
DBMS_SCHEDULER.CREATE_JOB(JOB_NAME => V_JOBNAME,
PROGRAM_NAME => V_PROGRAMNAME,
JOB_CLASS =>'DEFAULT_JOB_CLASS',
ENABLED => FALSE,
AUTO_DROP => TRUE);
--3.ENABLE PROGRAM AND JOB
DBMS_SCHEDULER.ENABLE(V_PROGRAMNAME);
DBMS_SCHEDULER.ENABLE(V_JOBNAME);
END;
PROCEDURE PROC_CREATE_JOB(V_SP_NAME VARCHAR2,PARAM IN OUT PROC_WF_PARAM_TYPE)
IS
V_JOB_NAME VARCHAR2(64);
V_SQL VARCHAR2(4000);
IN_PARAM PROC_PARAM_TYPE;
BEGIN
V_JOB_NAME :=SUBSTR(V_SP_NAME,0,10)||TO_CHAR(SYSDATE,'HH24MISS');
IN_PARAM := PROC_PARAM_TYPE(NULL,'',PARAM.IN_BUSI_DT,PARAM.IN_IMPORT_DT,'');
V_SQL:='BEGIN
DBMS_SCHEDULER.CREATE_JOB
(
job_name =>'''||V_JOB_NAME||''',
job_type =>''PLSQL_BLOCK'',
job_action =>''BEGIN '||V_SP_NAME||'(:A); END;'',
job_class =>''DEFAULT_JOB_CLASS'',
enabled =>TRUE,
auto_drop =>TRUE,
comments =>''''
); END;';
--DBMS_OUTPUT.PUT_LINE(PARAM.IN_BUSI_DT||PARAM.IN_IMPORT_DT);
EXECUTE IMMEDIATE 'DBMS_OUTPUT.PUT_LINE(:B)' USING IN OUT IN_PARAM;
EXECUTE IMMEDIATE V_SQL USING IN OUT IN_PARAM;
END;
PROCEDURE PROC_DISP_LONG_STRING_PLUS(V_IN_NAME IN VARCHAR2,
SELECT_COLNAME OUT CLOB,
INSERT_COLNAME OUT CLOB)
IS
V_INSERT_COLNAME CLOB;
V_SELECT_COLNAME CLOB;
V_COUNT NUMBER;
BEGIN
FOR I IN(SELECT A.COLUMN_NAME FROM USER_TAB_COLUMNS A
WHERE A.TABLE_NAME=V_IN_NAME)
LOOP
V_INSERT_COLNAME:=V_INSERT_COLNAME||I.COLUMN_NAME||',';
--ODS_COLNAME
SELECT COUNT(1) INTO V_COUNT
FROM DML_ODS_IN_SCONF
WHERE TABNAME = UPPER(V_IN_NAME);
IF V_COUNT = 0
THEN
V_SELECT_COLNAME:=V_SELECT_COLNAME||I.COLUMN_NAME||',';
ELSE
V_SELECT_COLNAME:=V_SELECT_COLNAME||'REGEXP_REPLACE('||I.COLUMN_NAME||',''(^null$|^-$)'',''''),';
END IF;
END LOOP;
INSERT_COLNAME:=RTRIM(V_INSERT_COLNAME,',');
SELECT_COLNAME:=RTRIM(V_SELECT_COLNAME,',');
RETURN;
END;
PROCEDURE PROC_ODS_IN_LOADDATA_PLUS(V_ODS_TABNAME VARCHAR2, /*原始表*/
V_IN_TABNAME VARCHAR2, /*IN层表*/
IN_DATE DATE, /*跑批日期*/
VIN_DBLINK VARCHAR2, /*DBLINK默认NULL*/
V_USER VARCHAR2)
IS
DEFAULT_COLNAME CLOB; --IN表前6个字段
ODS_COLNAME CLOB; --原始表字段
V_SQL CLOB;
IN_ODS_COLNAME CLOB; --插入IN表字段
RECORD_LOG LOG_EVENT%ROWTYPE; --日志
V_DATECOL VARCHAR2(32); --获取配置表日期字段
V_DATACOUNT NUMBER; --记录隐式游标属性
V_DBLINK VARCHAR2(64):=VIN_DBLINK; --DBLINK
IN_TABNAME VARCHAR2(32):=UPPER(V_IN_TABNAME);--IN层表
V_DATATYPE VARCHAR2(32); --根据数据字典判断数据类型
ODS_IN_DATE VARCHAR2(256):=TO_CHAR(IN_DATE,'YYYY-MM-DD');--配合日期字段为varchar2的ods表
V_LINK_ODS_TABNAME VARCHAR2(64):=V_USER||UPPER(V_ODS_TABNAME)||V_DBLINK;
BEGIN
--初始化日志
PKG_LOG_EVENT.INITEVENT(RECORD_LOG,V_ODS_TABNAME,IN_TABNAME,IN_DATE);
--删除重跑
EXECUTE IMMEDIATE 'TRUNCATE TABLE '||IN_TABNAME;
--拼接ODS字段
PKG_TOOLS_CONF_JCJ.PROC_DISP_LONG_STRING_PLUS(V_ODS_TABNAME,ODS_COLNAME,IN_ODS_COLNAME);
--获取配置表日期字段
SELECT DATE_COLUMN INTO V_DATECOL FROM WF_NODE_CONF
WHERE ODS_TABNAME=V_ODS_TABNAME
AND NODE_TABNAME=IN_TABNAME
AND WF_CODE='005'
AND LAYER='IN';
IF V_DATECOL IS NOT NULL --不为空加入到谓词
THEN
--计算IN表前6个字段
SELECT 'PKG_COMM_UTIL.FUNC_GET_DATA_ID(),:A,'
||'PKG_COMM_UTIL.FUNC_BRANCH_CDE_TRANSFER('||NVL(A.BRANCH_COLUMN,'''''')||')'||','
||NVL(A.BRANCH_COLUMN,'''0000''')||','''||SRC_SYS_NO||''','||'SYSDATE' AS SELECT_COLUMN
INTO DEFAULT_COLNAME
FROM WF_NODE_CONF A
WHERE A.ODS_TABNAME =V_ODS_TABNAME
AND A.NODE_TABNAME=IN_TABNAME
AND A.LAYER='IN'
AND A.WF_CODE='005';
V_SQL:='INSERT /*+APPEND PARALLEL(4)*/ INTO '||IN_TABNAME||' NOLOGGING (DATA_ID,BUSI_DT,BRANCH_CD,
BRANCH_CD_ORG,SRC_SYS_NO,INPUT_DT,'||IN_ODS_COLNAME||') SELECT '
||DEFAULT_COLNAME||','||ODS_COLNAME||' FROM '||V_LINK_ODS_TABNAME||' WHERE '||
V_DATECOL||'=:B';
SELECT DATA_TYPE INTO V_DATATYPE FROM USER_TAB_COLUMNS
WHERE TABLE_NAME=V_ODS_TABNAME
AND COLUMN_NAME=V_DATECOL;
IF V_DATATYPE='DATE'--判断日期字段是date类型还是varchar2采用绑定变量传入参数
THEN
EXECUTE IMMEDIATE V_SQL USING IN_DATE,IN_DATE;
V_DATACOUNT:=SQL%ROWCOUNT;
--插入数据量记录日志
PKG_LOG_EVENT.APPEND_RECORDS(RECORD_LOG,'INSERT:'||V_DATACOUNT);
PKG_LOG_EVENT.APPEND_COUNT(RECORD_LOG,V_DATACOUNT);
COMMIT;
ELSE
EXECUTE IMMEDIATE V_SQL USING IN_DATE,ODS_IN_DATE;
V_DATACOUNT:=SQL%ROWCOUNT;
--插入数据量记录日志
PKG_LOG_EVENT.APPEND_RECORDS(RECORD_LOG,'INSERT:'||V_DATACOUNT);
PKG_LOG_EVENT.APPEND_COUNT(RECORD_LOG,V_DATACOUNT);
COMMIT;
END IF;
ELSE --配置表日期字段为空,则全量导入数据
--计算IN表前6个字段
SELECT 'PKG_COMM_UTIL.FUNC_GET_DATA_ID(),:A,'
||'PKG_COMM_UTIL.FUNC_BRANCH_CDE_TRANSFER('||NVL(A.BRANCH_COLUMN,'''''')||')'||','
||NVL(A.BRANCH_COLUMN,'''0000''')||','''||SRC_SYS_NO||''','||'SYSDATE' AS SELECT_COLUMN
INTO DEFAULT_COLNAME
FROM WF_NODE_CONF A
WHERE A.ODS_TABNAME=V_ODS_TABNAME
AND A.NODE_TABNAME=IN_TABNAME
AND A.LAYER='IN'
AND A.WF_CODE='005';
V_SQL:='INSERT /*+APPEND PARALLEL(4)*/ INTO '||IN_TABNAME||' NOLOGGING
(DATA_ID,BUSI_DT,BRANCH_CD,
BRANCH_CD_ORG,SRC_SYS_NO,INPUT_DT,'||IN_ODS_COLNAME||') SELECT '
||DEFAULT_COLNAME||','||ODS_COLNAME||' FROM '||V_LINK_ODS_TABNAME;
EXECUTE IMMEDIATE V_SQL USING IN_DATE;
V_DATACOUNT:=SQL%ROWCOUNT;
--插入数据量记录日志
PKG_LOG_EVENT.APPEND_RECORDS(RECORD_LOG,'INSERT:'||V_DATACOUNT);
PKG_LOG_EVENT.APPEND_COUNT(RECORD_LOG,V_DATACOUNT);
COMMIT;
END IF;
--PROC_DISP_LONG_STRING(V_SQL);
RECORD_LOG.END_TIME:=SYSDATE;
PKG_LOG_EVENT.START_EVENT(RECORD_LOG);
EXCEPTION
WHEN OTHERS THEN
RECORD_LOG.REMARK:=SQLERRM;
PKG_LOG_EVENT.START_EVENT(RECORD_LOG);
END;
PROCEDURE PROC_SWAP_TO_PARTITION_BATCH(VIN_TABNAME VARCHAR2)
IS
V_TABNAME VARCHAR2(32):=UPPER(VIN_TABNAME);
V_BAK_TABNAME VARCHAR2(32);
V_TABLENGTH NUMBER;
V_NEW_TABNAME VARCHAR2(32);
V_CONSTRAIN_NAME VARCHAR2(1024);
V_INDEX_NAME VARCHAR2(1024);
V_BAKINDEX VARCHAR2(32);
V_TABCOMMENT VARCHAR2(512);
V_COLCOMMENT VARCHAR2(512);
V_COLCOUNT NUMBER;
V_EVENT_DESC VARCHAR2(64):='HEAPTAB_TO_PARTITIONTAB';
V_DATE DATE:=TRUNC(SYSDATE);
RECORD_LOG LOG_EVENT%ROWTYPE;
V_COLNAME CLOB;
V_CREATE_SQL CLOB;
V_SQL CLOB;
V_INDEX_SQL CLOB;
V_EXEC_INDEX_SQL CLOB;
V_INSERT_COLUMN CLOB;
V_SELECT_COLUMN CLOB;
V_PARTCOL CLOB:='PARTITION BY RANGE ("BUSI_DT") INTERVAL (NUMTOYMINTERVAL(1,''MONTH''))
STORE IN ("MDR")
(PARTITION "PM_201804" VALUES LESS THAN (TO_DATE(''2018-05-01'',''YYYY-MM-DD'')))';
BEGIN
--初始化日志
PKG_LOG_EVENT.INITEVENT(RECORD_LOG,V_TABNAME,V_EVENT_DESC,V_DATE);
--获取原装创建表语句
SELECT SUBSTR(SUBSTR(DBMS_METADATA.GET_DDL('TABLE',V_TABNAME),
INSTR(DBMS_METADATA.GET_DDL('TABLE',V_TABNAME),'(',1,1)),
1,
INSTR(SUBSTR(DBMS_METADATA.GET_DDL('TABLE',V_TABNAME),INSTR(DBMS_METADATA.GET_DDL('TABLE',V_TABNAME),'(',1,1)),' ) ',1,1)+1)
INTO V_COLNAME
FROM DUAL;
--拼接新表名
SELECT LENGTH(V_TABNAME) INTO V_TABLENGTH FROM DUAL;
IF V_TABLENGTH<28 THEN
V_NEW_TABNAME:=V_TABNAME||'_P';
ELSE
V_NEW_TABNAME:=SUBSTR(V_TABNAME,1,28)||'_P';
END IF;
--创建表语句
V_CREATE_SQL:='CREATE TABLE '||V_NEW_TABNAME||V_COLNAME||V_PARTCOL;
/*INSERT INTO DATA_CONTROL_JCJTEST_LOG(SQL_TEXT,EXEC_DATE)
VALUES(V_CREATE_SQL,SYSDATE);
COMMIT;*/
--执行创建表语句
--EXECUTE IMMEDIATE V_CREATE_SQL;
--EXECUTE IMMEDIATE 'ALTER TABLE '||V_NEW_TABNAME||' NOLOGGING';
--记录日志
PKG_LOG_EVENT.APPEND_RECORDS(RECORD_lOG,'CREATE:'||V_NEW_TABNAME);
--获取源表字段
PKG_TOOLS_CONF_JCJ.PROC_DISP_LONG_STRING_PLUS(V_TABNAME,V_INSERT_COLUMN,V_SELECT_COLUMN);
--同步数据到新表
V_SQL:='INSERT /*+APPEND NOLOGGING PARALELL(4)*/ INTO '||V_NEW_TABNAME||'('||V_INSERT_COLUMN||')
SELECT '||V_SELECT_COLUMN||' FROM '||V_TABNAME;
--EXECUTE IMMEDIATE V_SQL;
--记录插入数据
PKG_LOG_EVENT.APPEND_COUNT(RECORD_LOG,SQL%ROWCOUNT);
COMMIT;
--复制约束和索引
FOR I IN
(SELECT A.INDEX_NAME,B.CONSTRAINT_NAME FROM USER_INDEXES A,USER_CONSTRAINTS B
WHERE A.INDEX_NAME=B.CONSTRAINT_NAME(+)
AND A.TABLE_NAME=V_TABNAME) LOOP
IF I.CONSTRAINT_NAME IS NOT NULL
THEN
SELECT REPLACE(SUBSTR(DBMS_METADATA.GET_DDL('CONSTRAINT',I.CONSTRAINT_NAME),
1,
INSTR(DBMS_METADATA.GET_DDL('CONSTRAINT',I.CONSTRAINT_NAME),'USING INDEX ',1,1)+10),
V_TABNAME,
V_NEW_TABNAME)
INTO V_CONSTRAIN_NAME
FROM DUAL;
SELECT REPLACE(I.INDEX_NAME,'IDX','BAK') INTO V_BAKINDEX FROM DUAL;
--EXECUTE IMMEDIATE 'ALTER INDEX '||I.INDEX_NAME||' RENAME TO '||V_BAKINDEX;
--EXECUTE IMMEDIATE V_CONSTRAIN_NAME||' LOCAL';
ELSE
SELECT REPLACE(SUBSTR(DBMS_METADATA.GET_DDL('INDEX',I.INDEX_NAME),
1,
INSTR(DBMS_METADATA.GET_DDL('INDEX',I.INDEX_NAME),') ',1,1)+1),
V_TABNAME,
V_NEW_TABNAME)
INTO V_INDEX_NAME
FROM DUAL;
SELECT REPLACE(I.INDEX_NAME,'IDX','BAK') INTO V_BAKINDEX FROM DUAL;
V_INDEX_SQL:='ALTER INDEX '||I.INDEX_NAME||' RENAME TO '||V_BAKINDEX;
--EXECUTE IMMEDIATE V_INDEX_SQL;
V_EXEC_INDEX_SQL:=V_INDEX_NAME||' LOCAL';
--EXECUTE IMMEDIATE V_EXEC_INDEX_SQL;
END IF;
END LOOP;
--记录创建索引
PKG_LOG_EVENT.APPEND_RECORDS(RECORD_lOG,',CREATED INDEX');
--同步表注释
SELECT 'COMMENT ON TABLE '||V_NEW_TABNAME||' IS '''||COMMENTS||''''
INTO V_TABCOMMENT
FROM USER_TAB_COMMENTS WHERE TABLE_NAME=V_TABNAME;
--EXECUTE IMMEDIATE V_TABCOMMENT;
--同步字段注释
SELECT COUNT(*) INTO V_COLCOUNT FROM USER_COL_COMMENTS
WHERE TABLE_NAME=V_TABNAME AND COMMENTS IS NOT NULL;
IF V_COLCOUNT>0
THEN
FOR J IN (SELECT COLUMN_NAME,COMMENTS FROM USER_COL_COMMENTS
WHERE TABLE_NAME=V_TABNAME AND COMMENTS IS NOT NULL) LOOP
V_COLCOMMENT:='COMMENT ON COLUMN '||V_NEW_TABNAME||'.'||J.COLUMN_NAME||' IS '''
||J.COMMENTS||'''';
--EXECUTE IMMEDIATE V_COLCOMMENT;
END LOOP;
END IF;
--备份源表修改“ODS/DML为“BAK_”,新表RENAME为源表;
SELECT REGEXP_REPLACE(V_TABNAME,'(^ODS|^DML)','BAK') INTO V_BAK_TABNAME FROM DUAL;
--EXECUTE IMMEDIATE 'RENAME '||V_TABNAME ||' TO '||V_BAK_TABNAME;
--EXECUTE IMMEDIATE 'RENAME '||V_NEW_TABNAME||' TO '||V_TABNAME;
--记录日志
PKG_LOG_EVENT.APPEND_RECORDS(RECORD_lOG,',BAK:'||V_BAK_TABNAME);
RECORD_lOG.END_TIME:=SYSDATE;
PKG_LOG_EVENT.START_EVENT(RECORD_LOG);
INSERT INTO DATA_CONTROL_JCJTEST_LOG(SQL_TEXT,EXEC_DATE)
VALUES(V_CREATE_SQL||CHR(10)||V_SQL||CHR(10)||V_CONSTRAIN_NAME||CHR(10)
||V_INDEX_SQL||CHR(10)||V_EXEC_INDEX_SQL,SYSDATE);
COMMIT;
EXCEPTION WHEN OTHERS THEN
RECORD_LOG.REMARK:=SQLERRM;
PKG_LOG_EVENT.START_EVENT(RECORD_LOG);
END;
FUNCTION FUNC_LONG_TO_CHAR(VIN_TABNAME VARCHAR2,VIN_DATE DATE) RETURN VARCHAR2
IS
V_TABNAME VARCHAR2(32):=UPPER(VIN_TABNAME);
V_PARTITION_HIGH_VALUE VARCHAR2(4000);
V_STR_DATE DATE:=TRUNC(VIN_DATE,'dd');
V_OUTPUT_PARTITION_NAME VARCHAR2(64);
BEGIN
FOR I IN(
SELECT PARTITION_NAME,HIGH_VALUE
FROM USER_TAB_PARTITIONS
WHERE TABLE_NAME=V_TABNAME) LOOP
SELECT I.PARTITION_NAME,REGEXP_SUBSTR(I.HIGH_VALUE,'\d{4}-\d{2}-\d{2}',1,1) -- \d{2}:\d{2}:\d{2}
INTO V_OUTPUT_PARTITION_NAME,V_PARTITION_HIGH_VALUE
FROM DUAL;
/*RETURN V_PARTITION_HIGH_VALUE;*/
IF V_STR_DATE<TO_DATE(V_PARTITION_HIGH_VALUE,'YYYY-MM-DD')
AND V_STR_DATE>=TRUNC(TRUNC(TO_DATE(V_PARTITION_HIGH_VALUE,'YYYY-MM-DD'),'MM')-1,'MM')
THEN RETURN V_OUTPUT_PARTITION_NAME;
ELSE V_OUTPUT_PARTITION_NAME:='NON-EXISTENT';
END IF;
END LOOP;
RETURN V_OUTPUT_PARTITION_NAME;
END;
FUNCTION FUNC_LONG_TO_CHAR_PLUS(VIN_TABNAME VARCHAR2,V_PARTNAME VARCHAR2) RETURN VARCHAR2
IS
V_PARTITION_HIGH_VALUE VARCHAR2(512);
V_OUTPUT_HIGH_VALUE VARCHAR2(512);
BEGIN
SELECT HIGH_VALUE INTO V_PARTITION_HIGH_VALUE
FROM USER_TAB_PARTITIONS
WHERE TABLE_NAME=UPPER(VIN_TABNAME)
AND PARTITION_NAME=UPPER(V_PARTNAME);
SELECT V_PARTITION_HIGH_VALUE
INTO V_OUTPUT_HIGH_VALUE
FROM DUAL;
RETURN V_OUTPUT_HIGH_VALUE;
END;
/**********************************************************************************
自动处理异常信息中的varchar2长度不足
===================================================================================
V1.0 2018-11-23 JIANGCHANGJIAN INITIAL
***********************************************************************************/
PROCEDURE PROC_AUTO_MODIFY_VARCHAR2(VIN_SQLERRM VARCHAR2)
IS
V_SQLERRM VARCHAR2(512):=VIN_SQLERRM;
V_SQLERRM_TYPE VARCHAR2(256);
V_TABLE_INFO VARCHAR2(256);
V_TABNAME VARCHAR2(256);
V_COLNAME VARCHAR2(256);
V_DATA_TYPE VARCHAR2(256);
V_ACTUAL_LENGTH INTEGER:='';
V_SQL VARCHAR2(1024);
BEGIN
SELECT REGEXP_SUBSTR(V_SQLERRM,'ORA-12899',1,1,'m') INTO V_SQLERRM_TYPE FROM DUAL;
IF V_SQLERRM_TYPE='ORA-12899'
THEN
--截取表相关信息
SELECT REGEXP_SUBSTR(V_SQLERRM,'\"UUPSDB2\"\.\"\w{1,30}\"\.\"\w{1,30}\"',1,1,'m')
INTO V_TABLE_INFO
FROM DUAL;
--截取表名/字段名
SELECT REPLACE(REPLACE(REGEXP_SUBSTR(V_TABLE_INFO,'\.\"\w{1,30}\"\.',1,1,'m'),'."',''),'".',''),
REPLACE(REGEXP_SUBSTR(V_TABLE_INFO,'\"\w{1,30}\"$',1,1),'"','')
INTO V_TABNAME,V_COLNAME
FROM DUAL;
--截取字段插入数据的实际长度
SELECT REGEXP_SUBSTR(REGEXP_SUBSTR(V_SQLERRM,'\(actual\:.*\,',1,1,'m')
,'[0-9]{1,5}',1,1,'m')
INTO V_ACTUAL_LENGTH
FROM DUAL;
IF V_ACTUAL_LENGTH<=200
--修改为实际长度的5倍
THEN V_ACTUAL_LENGTH:=V_ACTUAL_LENGTH*5;
ELSIF 200<V_ACTUAL_LENGTH AND V_ACTUAL_LENGTH<=1000
--修改为实际长度的2倍
THEN V_ACTUAL_LENGTH:=V_ACTUAL_LENGTH*2;
ELSIF 1000<V_ACTUAL_LENGTH AND V_ACTUAL_LENGTH<=3500
--修为实际长度的增加500
THEN V_ACTUAL_LENGTH:=V_ACTUAL_LENGTH+500;
END IF;
SELECT DATA_TYPE INTO V_DATA_TYPE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME=V_TABNAME AND COLUMN_NAME=V_COLNAME;
--拼接DDL语句
V_SQL:='ALTER TABLE '||V_TABNAME||' MODIFY('||V_COLNAME||' '||V_DATA_TYPE||'('||V_ACTUAL_LENGTH||'))';
EXECUTE IMMEDIATE V_SQL;
END IF;
END;
PROCEDURE PROC_EXEC_SP(VIN_DATE DATE,SP_NAME VARCHAR2)
IS
IN_IMPORT_DATE DATE;
IN_BUSI_DATE DATE:=VIN_DATE;
V_PARAM PROC_PARAM_TYPE;
V_EVENT_DESC VARCHAR2(256):=UPPER(SP_NAME);
V_EVENT_NAME VARCHAR2(32);
RECORD_LOG LOG_EVENT%ROWTYPE;
BEGIN
SELECT NODE_TABNAME INTO V_EVENT_NAME FROM WF_NODE_CONF
WHERE WF_CODE='005'
AND SP_NAME=V_EVENT_DESC;
PKG_LOG_EVENT.INITEVENT(RECORD_LOG,V_EVENT_NAME,V_EVENT_DESC,IN_BUSI_DATE);
V_PARAM:=PROC_PARAM_TYPE(0,'',IN_BUSI_DATE,IN_IMPORT_DATE,'');
EXECUTE IMMEDIATE 'BEGIN '||V_EVENT_DESC||'(:A); END;'
USING IN OUT V_PARAM;
RECORD_LOG.REMARK:=V_PARAM.OUT_RET_MSG;
RECORD_LOG.END_TIME:=SYSDATE;
PKG_LOG_EVENT.START_EVENT(RECORD_LOG);
EXCEPTION
WHEN OTHERS THEN
RECORD_LOG.REMARK:=SQLERRM;
PKG_LOG_EVENT.START_EVENT(RECORD_LOG);
END;
PROCEDURE PROC_REF_CURSOR_EXEC
IS
TYPE REF_CUR IS REF CURSOR;
L_CURSOR REF_CUR;
REF_CURSOR EXEC_PROC_QUEUE%ROWTYPE;
BEGIN
OPEN L_CURSOR FOR SELECT NODE_TABNAME,STATUS,REMARK FROM EXEC_PROC_QUEUE WHERE STATUS='READY';
FETCH L_CURSOR INTO REF_CURSOR;
WHILE L_CURSOR%FOUND
LOOP
INSERT INTO EXEC_PROC_QUEUE_BAK(NODE_TABNAME,STATUS,REMARK)
VALUES(REF_CURSOR.NODE_TABNAME,REF_CURSOR.STATUS,REF_CURSOR.REMARK);
COMMIT;
UPDATE EXEC_PROC_QUEUE T SET T.STATUS='OK'
WHERE T.STATUS='READY'
AND T.NODE_TABNAME=REF_CURSOR.NODE_TABNAME;
COMMIT;
FETCH L_CURSOR INTO REF_CURSOR;
END LOOP;
CLOSE L_CURSOR;
EXCEPTION
WHEN OTHERS THEN
CLOSE L_CURSOR;
END;
FUNCTION FUNC_GET_JGXXGXB_INFO(V_XZQHDM VARCHAR2,IN_BUSI_DT DATE)RETURN TYPE_JGXXGXB_CCCL
IS
V_JGXXGXB_RECORD TYPE_JGXXGXB_CCCL;
BEGIN
V_JGXXGXB_RECORD:=TYPE_JGXXGXB_CCCL('','','');
SELECT DISTINCT SUPER_MANAGEMENT_ORG_NAM,SUPER_MANAGEMENT_ORG_CODE,SCOPE_BUSINESS
INTO V_JGXXGXB_RECORD.SUPER_MANAGEMENT_ORG_NAM,
V_JGXXGXB_RECORD.SUPER_MANAGEMENT_ORG_CODE,
V_JGXXGXB_RECORD.SCOPE_BUSINESS
FROM ODS_IF_MU_JGXXGXB_CCCL
WHERE XZQHDM=V_XZQHDM
AND BUSI_DT=IN_BUSI_DT;
RETURN V_JGXXGXB_RECORD;
END;
/*FUNCTION FUNC_GET_IDX_COLUMNS(VIN_TABNAME VARCHAR2) RETURN TYPE_GET_IDX_COLUMNS_ARR PIPELINED
IS
V_TABNAME VARCHAR2(32):=UPPER(VIN_TABNAME);
V_TYPE_TAB TYPE_GET_IDX_COLUMNS;
BEGIN
FOR I IN
(SELECT INDEX_NAME,TABLE_NAME,
LISTAGG(COLUMN_NAME,',')WITHIN GROUP(ORDER BY COLUMN_POSITION) AS V_COLUMNS
FROM USER_IND_COLUMNS
WHERE TABLE_NAME=(V_TABNAME)
GROUP BY INDEX_NAME,TABLE_NAME) LOOP
V_TYPE_TAB.ARR_INDEX_NAME:=I.INDEX_NAME;
V_TYPE_TAB.ARR_TABLE_NAME:=I.TABLE_NAME;
V_TYPE_TAB.ARR_V_COLUMNS :=I.V_COLUMNS;
PIPE ROW (V_TYPE_TAB);
END LOOP;
END;*/
PROCEDURE FUNC_GET_IDX_COLUMNS_PLUS(VIN_TABNAME VARCHAR2) /*RETURN TYPE_ROWS PIPELINED*/
IS
V_TABNAME VARCHAR2(32):=UPPER(VIN_TABNAME);
V_TYPE_TABLE TYPE_COLUMNS;
V_TYPE_INDEX TYPE_COLUMNS;
V_TYPE_COLUMNS TYPE_COLUMNS;
V_TYPE_ROWS TYPE_ROWS:=TYPE_ROWS(V_TYPE_TABLE);
BEGIN
SELECT INDEX_NAME,TABLE_NAME,
LISTAGG(COLUMN_NAME,',')WITHIN GROUP(ORDER BY COLUMN_POSITION) AS V_COLUMNS
BULK COLLECT INTO V_TYPE_INDEX,V_TYPE_TABLE,V_TYPE_COLUMNS
FROM USER_IND_COLUMNS
WHERE TABLE_NAME=(V_TABNAME)
GROUP BY INDEX_NAME,TABLE_NAME;
/*V_TYPE_TABLE :=TYPE_COLUMNS('111','333');
V_TYPE_INDEX :=TYPE_COLUMNS('222','444');
V_TYPE_COLUMNS:=TYPE_COLUMNS('555','666');*/
V_TYPE_ROWS.EXTEND;
V_TYPE_ROWS(1):=V_TYPE_TABLE;
V_TYPE_ROWS.EXTEND;
V_TYPE_ROWS(2):=V_TYPE_INDEX;
V_TYPE_ROWS.EXTEND;
V_TYPE_ROWS(3):=V_TYPE_COLUMNS;
FOR J IN 1 .. 3 LOOP
INSERT INTO ARRAY_IND_ROWS
VALUES(V_TYPE_ROWS(J)(1),V_TYPE_ROWS(J)(2),V_TYPE_ROWS(J)(3),V_TYPE_ROWS(J)(4),
V_TYPE_ROWS(J)(5));
COMMIT;
/*FOR I IN 1 .. 5 LOOP
DBMS_OUTPUT.PUT_LINE(V_TYPE_ROWS(J)(I));
END LOOP;*/
END LOOP;
--RETURN V_TYPE_ROWS;
END;
PROCEDURE PROC_DATA_ACQUISITION(VIN_TABNAME VARCHAR2)
IS
V_BRANCH_CD VARCHAR2(20);
V_BRANCH_CD_ORG VARCHAR2(20);
V_SRC_SYS_NO VARCHAR2(64);
V_TABNAME VARCHAR2(32):=UPPER(VIN_TABNAME);
V_DATE DATE:=DATE'2018-06-30';
BEGIN
EXECUTE IMMEDIATE 'SELECT BRANCH_CD,BRANCH_CD_ORG,SRC_SYS_NO FROM '||V_TABNAME||
' WHERE ROWNUM=1
AND BUSI_DT=:A
AND BRANCH_CD IS NOT NULL'
INTO V_BRANCH_CD,V_BRANCH_CD_ORG,V_SRC_SYS_NO USING V_DATE;
EXECUTE IMMEDIATE 'INSERT INTO IF_TABLE_BRANCH_CD
(NODE_CODE,BRANCH_CD,BRANCH_CD_ORG,SRC_SYS_NO)
VALUES('''||V_TABNAME||''','''||V_BRANCH_CD||''',
'''||V_BRANCH_CD_ORG||''','''||V_SRC_SYS_NO||''')';
COMMIT;
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE 'INSERT INTO IF_TABLE_BRANCH_CD
(NODE_CODE,BRANCH_CD,BRANCH_CD_ORG)
VALUES('''||V_TABNAME||''','''||SQLERRM||''','''||SYSDATE||''')';
COMMIT;
END;
PROCEDURE PROC_UNI_OUTPUT_SQLERRM(PARAM IN OUT PROC_PARAM_TYPE,V_SQLERRM VARCHAR2)
IS
BEGIN
PARAM.OUT_RET :=1;
PARAM.OUT_RET_MSG :=V_SQLERRM;
END;
PROCEDURE PROC_COLUMN_ORDER_CHANGE(VIN_TABNAME VARCHAR2)
IS
V_TABLE_DDL CLOB;
V_COLUMN_NAME_ALL CLOB;
V_TABNAME VARCHAR2(32):=UPPER(VIN_TABNAME);
--MIN_COL_ORDER NUMBER;
--V_COMMENTS VARCHAR2(1000);
V_COL_COUNT NUMBER;
BEGIN
DELETE COLUMN_ORDER_CHANGE T WHERE T.TABLE_NAME=V_TABNAME;
COMMIT;
SELECT DBMS_METADATA.GET_DDL('TABLE',''||V_TABNAME||'')
INTO V_TABLE_DDL
FROM DUAL;
SELECT COUNT(*) INTO V_COL_COUNT
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME=V_TABNAME;
V_COLUMN_NAME_ALL:=RTRIM(LTRIM(REGEXP_SUBSTR(V_TABLE_DDL,
'\(.{0,10}?\".{0,30}?\,.*\".{0,25}'||CHR(10)||'\s{0,20}?\)',
1,
1,
'n'),
'('),
')');
INSERT INTO COLUMN_ORDER_CHANGE(TABLE_NAME,COLUMN_NAME,DATA_TYPE,COL_ORDER)
SELECT
''||V_TABNAME||'' AS TABLE_NAME,
TO_CHAR(REGEXP_SUBSTR(V_COLUMN_NAME_ALL,
'[^"]+',1,ROWNUM*2)
) AS COLUMN_NAME,
REGEXP_REPLACE(TO_CHAR(REGEXP_SUBSTR(V_COLUMN_NAME_ALL,
'[^"]+',1,ROWNUM*2+1)
),
'(, '||CHR(10)||' | CONSTRAINT )',
'') AS DATA_TYPE,
ROWNUM*100 AS COL_ORDER
FROM DUAL
CONNECT BY LEVEL<= V_COL_COUNT;
COMMIT;
--DBMS_OUTPUT.PUT_LINE(REGEXP_COUNT(V_COLUMN_NAME_ALL,'"')/2||','||V_COL_COUNT);
/* SELECT MIN(COL_ORDER) INTO MIN_COL_ORDER FROM COLUMN_ORDER_CHANGE
WHERE COLUMN_NAME IN ('LLB_CODE',
'LLB_CODE_SHORT',
'NAT',
'COUNTRY',
'CUSTOMER_TYPE');
DELETE COLUMN_ORDER_CHANGE
WHERE COLUMN_NAME IN ('LLB_CODE',
'LLB_CODE_SHORT',
'NAT',
'COUNTRY',
'CUSTOMER_TYPE');
COMMIT;
INSERT \*+APPEND*\ INTO COLUMN_ORDER_CHANGE NOLOGGING
(COL_ORDER,
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE)
VALUES(''||MIN_COL_ORDER||'',
''||V_TABNAME||'',
''||MIN_COL_ORDER||'',
''||MIN_COL_ORDER||'');
COMMIT;
SELECT 'COMMENT ON COLUMN '||TABLE_NAME||'.'||COLUMN_NAME||' IS '''||COMMENTS||''''
INTO V_COMMENTS
FROM USER_COL_COMMENTS
WHERE TABLE_NAME=V_TABNAME;
EXECUTE IMMEDIATE V_COMMENTS;*/
END;
FUNCTION FUNC_GET_LD_INT_RATE(IN_LD_TYPE VARCHAR2,
IN_CURRENCY VARCHAR2,
IN_PERIOD VARCHAR2,
IN_BUSI_DT DATE) RETURN NUMBER
IS
V_INT_RATE NUMBER;
BEGIN
SELECT INT_RATE INTO V_INT_RATE FROM
(SELECT T.*,ROW_NUMBER()OVER(PARTITION BY LD_TYPE,CURRENCY,PERIOD,BUSI_DT
ORDER BY EFFECTIVE_DT DESC) AS RN
FROM ODS_IF_MU_INTEREST_RATE T
WHERE LD_TYPE =UPPER(IN_LD_TYPE)
AND CURRENCY=UPPER(IN_CURRENCY)
AND PERIOD =UPPER(IN_PERIOD)
AND EFFECTIVE_DT<=IN_BUSI_DT)
WHERE RN=1;
RETURN V_INT_RATE;
END;
FUNCTION FUNC_GET_CITI_DEPO_RATE(IN_CURRENCY VARCHAR2,
IN_PERIOD VARCHAR2,
IN_BUSI_DT DATE) RETURN NUMBER
IS
V_INT_RATE NUMBER;
BEGIN
SELECT INT_RATE INTO V_INT_RATE FROM
(SELECT INT_RATE.*,ROW_NUMBER()OVER(PARTITION BY LD_TYPE,CURRENCY,PERIOD,BUSI_DT
ORDER BY EFFECTIVE_DT DESC) AS RN
FROM ODS_IF_MU_INTEREST_RATE INT_RATE
WHERE INT_RATE.CITI_BENCHMARK='C'
AND INT_RATE.LD_TYPE='D'
AND INT_RATE.CURRENCY=UPPER(IN_CURRENCY)
AND INT_RATE.PERIOD =UPPER(IN_PERIOD)
AND INT_RATE.EFFECTIVE_DT<=IN_BUSI_DT)
WHERE RN=1;
RETURN V_INT_RATE;
END;
FUNCTION FUNC_GET_CITI_LOAN_RATE(IN_CURRENCY VARCHAR2,
IN_PERIOD VARCHAR2,
IN_BUSI_DT DATE) RETURN NUMBER
IS
V_INT_RATE NUMBER;
BEGIN
SELECT INT_RATE INTO V_INT_RATE FROM
(SELECT INT_RATE.*,ROW_NUMBER()OVER(PARTITION BY LD_TYPE,CURRENCY,PERIOD,BUSI_DT
ORDER BY EFFECTIVE_DT DESC) AS RN
FROM ODS_IF_MU_INTEREST_RATE INT_RATE
WHERE INT_RATE.CITI_BENCHMARK='C'
AND INT_RATE.LD_TYPE='L'
AND INT_RATE.CURRENCY=UPPER(IN_CURRENCY)
AND INT_RATE.PERIOD =UPPER(IN_PERIOD)
AND INT_RATE.EFFECTIVE_DT<=IN_BUSI_DT)
WHERE RN=1;
RETURN V_INT_RATE;
END;
FUNCTION FUNC_GET_BM_DEPO_RATE(IN_CURRENCY VARCHAR2,
IN_PERIOD VARCHAR2,
IN_BUSI_DT DATE) RETURN NUMBER
IS
V_INT_RATE NUMBER;
BEGIN
SELECT INT_RATE INTO V_INT_RATE FROM
(SELECT INT_RATE.*,ROW_NUMBER()OVER(PARTITION BY LD_TYPE,CURRENCY,PERIOD,BUSI_DT
ORDER BY EFFECTIVE_DT DESC) AS RN
FROM ODS_IF_MU_INTEREST_RATE INT_RATE
WHERE INT_RATE.CITI_BENCHMARK='B'
AND INT_RATE.LD_TYPE='D'
AND INT_RATE.CURRENCY=UPPER(IN_CURRENCY)
AND INT_RATE.PERIOD =UPPER(IN_PERIOD)
AND INT_RATE.EFFECTIVE_DT<=IN_BUSI_DT)
WHERE RN=1;
RETURN V_INT_RATE;
END;
FUNCTION FUNC_GET_BM_LOAN_RATE(IN_CURRENCY VARCHAR2,
IN_PERIOD VARCHAR2,
IN_BUSI_DT DATE) RETURN NUMBER
IS
V_INT_RATE NUMBER;
BEGIN
SELECT INT_RATE INTO V_INT_RATE FROM
(SELECT INT_RATE.*,ROW_NUMBER()OVER(PARTITION BY LD_TYPE,CURRENCY,PERIOD,BUSI_DT
ORDER BY EFFECTIVE_DT DESC) AS RN
FROM ODS_IF_MU_INTEREST_RATE INT_RATE
WHERE INT_RATE.CITI_BENCHMARK='B'
AND INT_RATE.LD_TYPE='M'
AND INT_RATE.CURRENCY=UPPER(IN_CURRENCY)
AND INT_RATE.PERIOD =UPPER(IN_PERIOD)
AND INT_RATE.EFFECTIVE_DT<=IN_BUSI_DT)
WHERE RN=1;
RETURN V_INT_RATE;
END;
PROCEDURE PROC_BRANCH_CD_COLLECT
IS
V_COUNT NUMBER;
V_BRANCH VARCHAR2(64);
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE BRANCH_CD_COLLECT';
FOR I IN (SELECT NODE_CODE FROM WF_NODE_CONF WHERE WF_CODE='005' AND LAYER='IN' AND SRC_SYS_NO NOT IN('DWH','MU'))
LOOP
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||I.NODE_CODE||'
WHERE BRANCH_CD_ORG=''C41'' ' INTO V_COUNT;
IF V_COUNT>0
THEN
EXECUTE IMMEDIATE 'SELECT BRANCH_CD_ORG FROM '||I.NODE_CODE||'
WHERE BRANCH_CD_ORG=''C41'' AND ROWNUM<=1' INTO V_BRANCH;
INSERT INTO BRANCH_CD_COLLECT(TABLE_NAME,BRANCH_CD)
VALUES(''||I.NODE_CODE||'',''||V_BRANCH||'');
COMMIT;
END IF;
END LOOP;
END;
PROCEDURE PROC_GET_TABLE_FROM_PKG(VIN_PKGNAME VARCHAR2)
IS
TYPE V_NESTED_TAB IS TABLE OF USER_DEPENDENCIES.REFERENCED_NAME%TYPE
INDEX BY PLS_INTEGER;
V_BULK_COLLECT V_NESTED_TAB;
V_PKGNAME VARCHAR2(32):=UPPER(VIN_PKGNAME);
V_PKG_BODY CLOB;
V_PROC_BODY CLOB;
V_INSERT_BODY VARCHAR2(512);
V_NODE_TABNAME VARCHAR2(256);
V_PRENODE_TABNAME VARCHAR2(256);
V_SQLERRM VARCHAR2(256);
BEGIN
SELECT DBMS_METADATA.GET_DDL('PACKAGE_BODY',V_PKGNAME)
INTO V_PKG_BODY
FROM DUAL;
SELECT REFERENCED_NAME BULK COLLECT INTO V_BULK_COLLECT
FROM USER_DEPENDENCIES
WHERE NAME=VIN_PKGNAME
AND REFERENCED_OWNER='UUPSDB2'
AND REFERENCED_TYPE='TABLE'
AND REGEXP_LIKE(REFERENCED_NAME,'(^ODS\_IN|^ODS\_IF|DML\_SD)');
EXECUTE IMMEDIATE 'TRUNCATE TABLE GET_TABLE_FROM_PKG';
EXECUTE IMMEDIATE 'TRUNCATE TABLE DATA_CONTROL_JCJTEST_LOG';
FOR I IN
(SELECT DISTINCT OBJECT_NAME,PACKAGE_NAME
FROM USER_ARGUMENTS
WHERE PACKAGE_NAME=V_PKGNAME)
LOOP
SELECT REGEXP_SUBSTR(V_PKG_BODY,
'PROCEDURE\s{1,10}'||I.OBJECT_NAME||'\W.*?SQLERRM.{0,20}?'
||CHR(10)||'{1,20}?.{1,100}?END',1,1,'n')
INTO V_PROC_BODY
FROM DUAL;
INSERT INTO DATA_CONTROL_JCJTEST_LOG(SQL_TEXT,EXEC_DATE,SP_NAME)
VALUES(V_PROC_BODY,SYSDATE,I.OBJECT_NAME);
COMMIT;
FOR Q IN V_BULK_COLLECT.FIRST .. V_BULK_COLLECT.LAST LOOP
SELECT REGEXP_SUBSTR(V_PROC_BODY,
'INSERT.{1,40}INTO\s{1,10}'||V_BULK_COLLECT(Q)||'\W?',1,1,'n')
INTO V_INSERT_BODY
FROM DUAL;
SELECT REGEXP_SUBSTR(V_INSERT_BODY,V_BULK_COLLECT(Q),1,1,'n')
INTO V_NODE_TABNAME
FROM DUAL;
SELECT REGEXP_REPLACE(REGEXP_SUBSTR(V_PROC_BODY,
'\W'||V_BULK_COLLECT(Q)||'\W',
1,
1,
'n'),
'\W',
'')
INTO V_PRENODE_TABNAME
FROM DUAL;
IF V_PRENODE_TABNAME IS NOT NULL AND V_NODE_TABNAME IS NOT NULL
THEN
INSERT INTO GET_TABLE_FROM_PKG(NODE_TABNAME,PRENODE_TABNAME,SP_NAME,PKG_NAME,PROC_NAME)
VALUES(V_NODE_TABNAME,V_NODE_TABNAME,I.PACKAGE_NAME||'.'
||I.OBJECT_NAME,I.PACKAGE_NAME,I.OBJECT_NAME);
COMMIT;
ELSIF V_PRENODE_TABNAME IS NOT NULL AND V_NODE_TABNAME IS NULL
THEN
INSERT INTO GET_TABLE_FROM_PKG(PRENODE_TABNAME,SP_NAME,PKG_NAME,PROC_NAME)
VALUES(V_PRENODE_TABNAME,I.PACKAGE_NAME||'.'
||I.OBJECT_NAME,I.PACKAGE_NAME,I.OBJECT_NAME);
COMMIT;
END IF;
END LOOP;
END LOOP;
FOR J IN
(SELECT NODE_TABNAME,PROC_NAME
FROM GET_TABLE_FROM_PKG
WHERE NODE_TABNAME IS NOT NULL)
LOOP
UPDATE GET_TABLE_FROM_PKG T
SET T.NODE_TABNAME=J.NODE_TABNAME
WHERE T.PROC_NAME=J.PROC_NAME;
COMMIT;
END LOOP;
DELETE GET_TABLE_FROM_PKG T WHERE T.NODE_TABNAME=T.PRENODE_TABNAME;
COMMIT;
DELETE GET_TABLE_FROM_PKG_HIS WHERE PKG_NAME=V_PKGNAME;
COMMIT;
INSERT INTO GET_TABLE_FROM_PKG_HIS
(SEQ,
IN_TIME,
NODE_TABNAME,
PRENODE_TABNAME,
SP_NAME,
PKG_NAME,
PROC_NAME)
SELECT
SEQ_LOG_EVENT.NEXTVAL AS SEQ,
SYSDATE AS IN_TIME,
NODE_TABNAME,
PRENODE_TABNAME,
SP_NAME,
PKG_NAME,
PROC_NAME
FROM GET_TABLE_FROM_PKG;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
V_SQLERRM:=SQLERRM;
INSERT INTO GET_TABLE_FROM_PKG_HIS(SEQ,IN_TIME,SP_NAME)
VALUES(1,SYSDATE,''||V_SQLERRM||'');
COMMIT;
END;
PROCEDURE PROC_CREATE_IN_TAB(IN_PARAM IN OUT TYPE_CREATE_IN_TAB)
IS
VIN_ODS_TABNAME VARCHAR2(32);
VIN_IN_TABNAME VARCHAR2(32);
V_INDEX_NAME VARCHAR2(32);
V_IN_IDX_DDL VARCHAR2(256);
V_ADD_COL VARCHAR2(256);
V_TABCOUNT NUMBER;
V_IDXCOUNT NUMBER;
V_ODS_TAB_DDL CLOB;
V_ODS_COLUMNS CLOB;
V_IN_DDL CLOB;
BEGIN
VIN_ODS_TABNAME :=UPPER(IN_PARAM.V_ODS_TABNAME);
VIN_IN_TABNAME :=UPPER(IN_PARAM.V_IN_TABNAME);
SELECT COUNT(*) INTO V_TABCOUNT FROM USER_TABLES
WHERE TABLE_NAME=VIN_IN_TABNAME;
IF V_TABCOUNT=0
THEN
V_ADD_COL:='DATA_ID NUMBER,
BUSI_DT DATE,
BRANCH_CD VARCHAR2(10),
BRANCH_CD_ORG VARCHAR2(10),
SRC_SYS_NO VARCHAR2(128),
INPUT_DT DATE,';
SELECT DBMS_METADATA.GET_DDL('TABLE',''||VIN_ODS_TABNAME||'')
INTO V_ODS_TAB_DDL
FROM DUAL;
V_ODS_COLUMNS:=RTRIM(LTRIM(REGEXP_SUBSTR(V_ODS_TAB_DDL,
'\(.{0,10}?\".{0,30}?\,.*\".{0,25}'||CHR(10)||'\s{0,20}?\)',
1,
1,
'n'),
'('),
')');
V_IN_DDL:='CREATE TABLE '||VIN_IN_TABNAME||'('||V_ADD_COL||V_ODS_COLUMNS||')
TABLESPACE "MDR" NOLOGGING';
EXECUTE IMMEDIATE V_IN_DDL;
--PROC_DISP_LONG_STRING(V_IN_DDL);
END IF;
V_INDEX_NAME:='IDX_'||RTRIM(SUBSTR(VIN_IN_TABNAME,1,23),'_')||'_99';
SELECT COUNT(*) INTO V_IDXCOUNT FROM USER_IND_COLUMNS
WHERE TABLE_NAME=VIN_IN_TABNAME
AND COLUMN_NAME='BUSI_DT';
IF V_IDXCOUNT=0
THEN
V_IN_IDX_DDL:='CREATE INDEX '||V_INDEX_NAME||' ON '||VIN_IN_TABNAME||'(BUSI_DT)';
EXECUTE IMMEDIATE V_IN_IDX_DDL;
END IF;
DELETE WF_NODE_CONF
WHERE NODE_TABNAME=VIN_IN_TABNAME
AND WF_CODE='005';
COMMIT;
INSERT INTO WF_NODE_CONF
(WF_CODE,NODE_CODE,NODE_NAME,TYPE,LAYER,PRIORITY,NODE_TABNAME,ODS_TABNAME,
SP_NAME,FREQ,BRANCH_COLUMN,DATE_COLUMN,SRC_SYS_NO,ODS_VERIFY_STATUS,
REMARK,UPDATE_BRANCH,BUSINESS_CLASS)
SELECT WF_CODE AS WF_CODE,
''||VIN_IN_TABNAME||'' AS NODE_CODE,
''||VIN_IN_TABNAME||'' AS NODE_NAME,
TYPE AS TYPE,
LAYER AS LAYER,
PRIORITY AS PRIORITY,
''||VIN_IN_TABNAME||'' AS NODE_TABNAME,
''||VIN_ODS_TABNAME||'' AS ODS_TABNAME,
'' AS SP_NAME,
FREQ AS FREQ,
''||IN_PARAM.V_BRANCH_COLUMN||'' AS BRANCH_COLUMN,
''||IN_PARAM.V_DATA_COLUMN||'' AS DATE_COLUMN,
''||IN_PARAM.V_SRC_SYS_NO||'' AS SRC_SYS_NO,
ODS_VERIFY_STATUS AS ODS_VERIFY_STATUS,
REMARK AS REMARK,
UPDATE_BRANCH AS UPDATE_BRANCH,
BUSINESS_CLASS AS BUSINESS_CLASS
FROM WF_NODE_CONF
WHERE WF_CODE='005'
AND LAYER='IN'
AND ROWNUM=1;
COMMIT;
DELETE WF_NODE_RELATIONMGR
WHERE NODE_CODE=VIN_IN_TABNAME
AND WF_CODE='005';
COMMIT;
INSERT INTO WF_NODE_RELATIONMGR(WF_CODE,NODE_CODE,PRENODE_CODE,IS_NECESSARY)
VALUES('005',''||VIN_IN_TABNAME||'',''||VIN_ODS_TABNAME||'','Y');
COMMIT;
--PKG_TOOLS_CONF_JCJ.PROC_DISP_LONG_STRING(V_IN_DDL);
EXCEPTION
WHEN OTHERS THEN
IN_PARAM.OUT_ERRM_MSG:=SQLERRM;
DBMS_OUTPUT.PUT_LINE(IN_PARAM.OUT_ERRM_MSG);
END;
PROCEDURE PROC_CONF_IF_TAB(IN_PARAM IN OUT TYPE_CREATE_IN_TAB)
IS
VIN_ODS_TABNAME VARCHAR2(32);
VIN_IN_TABNAME VARCHAR2(32);
VIN_IF_TABNAME VARCHAR2(32);
BEGIN
VIN_ODS_TABNAME :=UPPER(IN_PARAM.V_ODS_TABNAME);
VIN_IN_TABNAME :=UPPER(IN_PARAM.V_IN_TABNAME);
VIN_IF_TABNAME :=UPPER(IN_PARAM.V_IF_TABNAME);
DELETE WF_NODE_CONF WHERE WF_CODE='005' AND NODE_CODE=VIN_IF_TABNAME;
COMMIT;
INSERT INTO WF_NODE_CONF
(WF_CODE,NODE_CODE,NODE_NAME,TYPE,LAYER,PRIORITY,NODE_TABNAME,ODS_TABNAME,
SP_NAME,FREQ,BRANCH_COLUMN,DATE_COLUMN,SRC_SYS_NO,ODS_VERIFY_STATUS,
REMARK,UPDATE_BRANCH,BUSINESS_CLASS)
SELECT WF_CODE AS WF_CODE,
''||VIN_IF_TABNAME||'' AS NODE_CODE,
''||VIN_IF_TABNAME||'' AS NODE_NAME,
TYPE AS TYPE,
LAYER AS LAYER,
PRIORITY AS PRIORITY,
''||VIN_IF_TABNAME||'' AS NODE_TABNAME,
''||VIN_ODS_TABNAME||'' AS ODS_TABNAME,
''||IN_PARAM.V_SPNAME||'' AS SP_NAME,
FREQ AS FREQ,
'' AS BRANCH_COLUMN,
'' AS DATE_COLUMN,
'' AS SRC_SYS_NO,
ODS_VERIFY_STATUS AS ODS_VERIFY_STATUS,
REMARK AS REMARK,
'' AS UPDATE_BRANCH,
'' AS BUSINESS_CLASS
FROM WF_NODE_CONF
WHERE WF_CODE='005'
AND LAYER='IF'
AND ROWNUM=1;
COMMIT;
DELETE WF_NODE_RELATIONMGR WHERE WF_CODE='005' AND NODE_CODE=VIN_IF_TABNAME;
COMMIT;
INSERT INTO WF_NODE_RELATIONMGR(WF_CODE,NODE_CODE,PRENODE_CODE,IS_NECESSARY)
VALUES('005',''||VIN_IF_TABNAME||'',''||VIN_IN_TABNAME||'','Y');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
IN_PARAM.OUT_ERRM_MSG:=SQLERRM;
END;
PROCEDURE PROC_CREATE_PROC_SQLTEXT(IN_PARAM IN OUT TYPE_CREATE_IN_TAB)
IS
V_PRE_PROC_SQLTEXT CLOB;
VIN_IN_TABNAME VARCHAR2(32);
VIN_IF_TABNAME VARCHAR2(32);
VIN_PROC_NAME VARCHAR2(32);
VIN_COMMENTS VARCHAR2(256);
VIN_ALTER_DATE VARCHAR2(64);
VIN_INSERT_COLS CLOB;
VIN_SELECT_COLS CLOB;
BEGIN
VIN_IN_TABNAME :=UPPER(IN_PARAM.V_IN_TABNAME);
VIN_IF_TABNAME :=UPPER(IN_PARAM.V_IF_TABNAME);
VIN_PROC_NAME :=REPLACE(VIN_IF_TABNAME,'ODS','PROC');
VIN_COMMENTS :=UPPER(IN_PARAM.V_COMMENTS);
VIN_ALTER_DATE :=TO_CHAR(TRUNC(SYSDATE,'DD'),'YYYY-MM-DD');
PKG_TOOLS_CONF_JCJ.PROC_COLUMN_ORDER_CHANGE(IN_PARAM.V_IN_TABNAME);
PKG_TOOLS_CONF_JCJ.PROC_COLUMN_ORDER_CHANGE(IN_PARAM.V_IF_TABNAME);
SELECT LISTAGG(COLUMN_NAME,','||CHR(10)||' ')WITHIN GROUP(ORDER BY COL_ORDER) AS INSERT_COLUMN,
LISTAGG(SELECT_COLS,','||CHR(10)||' ')WITHIN GROUP(ORDER BY COL_ORDER) AS SELECT_COLUMN
INTO VIN_INSERT_COLS,
VIN_SELECT_COLS
FROM (SELECT LEFT_COL.COL_ORDER,LEFT_COL.TABLE_NAME,LEFT_COL.COLUMN_NAME,
CASE WHEN REGEXP_SUBSTR(LEFT_COL.DATA_TYPE,'\w{1,30}',1,1,'n')<>REGEXP_SUBSTR(RIGHT_COL.DATA_TYPE,'\w{1,30}',1,1,'n')
AND REGEXP_SUBSTR(RIGHT_COL.DATA_TYPE,'\w{1,30}',1,1,'n')='DATE'
THEN 'PKG_COMM_UTIL.FUNC_TO_DATE(T.'||LEFT_COL.COLUMN_NAME||',''YYYY-MM-DD'')'
WHEN REGEXP_SUBSTR(LEFT_COL.DATA_TYPE,'\w{1,30}',1,1,'n')<>REGEXP_SUBSTR(RIGHT_COL.DATA_TYPE,'\w{1,30}',1,1,'n')
AND REGEXP_SUBSTR(RIGHT_COL.DATA_TYPE,'\w{1,30}',1,1,'n')='NUMBER'
THEN 'PKG_COMM_UTIL.FUNC_TO_NUMBER(T.'||LEFT_COL.COLUMN_NAME||')'
WHEN REGEXP_SUBSTR(LEFT_COL.DATA_TYPE,'\w{1,30}',1,1,'n')='INPUT_DT'
THEN 'SYSDATE'
ELSE 'T.'||LEFT_COL.COLUMN_NAME
END SELECT_COLS
FROM COLUMN_ORDER_CHANGE LEFT_COL,COLUMN_ORDER_CHANGE RIGHT_COL
WHERE LEFT_COL.COL_ORDER =RIGHT_COL.COL_ORDER
AND LEFT_COL.TABLE_NAME =VIN_IN_TABNAME
AND RIGHT_COL.TABLE_NAME=VIN_IF_TABNAME
ORDER BY COL_ORDER);
V_PRE_PROC_SQLTEXT:=' /**************************************************************************************
程序名 : '||VIN_PROC_NAME||'
用途 : '||VIN_COMMENTS||'
数据源 : '||VIN_IN_TABNAME||'
目标表 : '||VIN_IF_TABNAME||'
修改历史:
版本 更改日期 更改人 更改说明
===================================================================================
V1.0 '||VIN_ALTER_DATE||' JIANGCHANGJIAN INIT
************************************************************************************/
PROCEDURE '||VIN_PROC_NAME||'(PARAM IN OUT PROC_PARAM_TYPE)
IS
BEGIN
DELETE '||VIN_IF_TABNAME||'
WHERE BUSI_DT=PARAM.IN_BUSI_DT;
COMMIT;
INSERT INTO '||VIN_IF_TABNAME||'
('||VIN_INSERT_COLS||')
SELECT
'||VIN_SELECT_COLS||'
FROM '||VIN_IN_TABNAME||' T
WHERE T.BUSI_DT = PARAM.IN_BUSI_DT;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
PKG_COMM_UTIL.PROC_UNI_OUTPUT_SQLERRM(PARAM,SQLERRM);
END;';
DELETE PRE_PROC_SQLTEXT WHERE SP_NAME=VIN_PROC_NAME;
COMMIT;
INSERT INTO PRE_PROC_SQLTEXT(SQLTEXT,SP_NAME,IF_TABNAME,DATETIME)
VALUES(V_PRE_PROC_SQLTEXT,VIN_PROC_NAME,VIN_IF_TABNAME,SYSDATE);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
IN_PARAM.OUT_ERRM_MSG:=SQLERRM;
END;
PROCEDURE PROC_EXEC_IF_SP(IN_PARAM IN OUT TYPE_CREATE_IN_TAB)
IS
SP_PARAM PROC_PARAM_TYPE;
V_SPNAME VARCHAR2(128);
BEGIN
SELECT SP_NAME INTO V_SPNAME FROM WF_NODE_CONF
WHERE WF_CODE='005'
AND NODE_CODE=UPPER(IN_PARAM.V_IF_TABNAME);
SP_PARAM:=IN_PARAM.V_PARAM;
EXECUTE IMMEDIATE 'BEGIN '||V_SPNAME||'(:A); END;' USING IN OUT SP_PARAM;
END;
PROCEDURE PROC_BATCH_CREATE_HISTAB
IS
V_NEW_TABNAME VARCHAR2(32);
V_DATA_COUNT NUMBER;
V_DDATE_COUNT NUMBER;
V_TAB_COUNT NUMBER;
V_IND_COUNT NUMBER;
V_OUT_TAB VARCHAR2(256);
BEGIN
FOR I IN(SELECT NODE_TABNAME FROM WF_NODE_CONF
WHERE WF_CODE='005'
AND LAYER='IN')
LOOP
SELECT COUNT(*) INTO V_TAB_COUNT
FROM USER_TABLES
WHERE TABLE_NAME=REPLACE(I.NODE_TABNAME,'ODS','HIS');
SELECT COUNT(*) INTO V_IND_COUNT
FROM USER_INDEXES
WHERE INDEX_NAME='HIS_'||SUBSTR(I.NODE_TABNAME,0,25);
IF V_TAB_COUNT=0
THEN
V_NEW_TABNAME:=REPLACE(I.NODE_TABNAME,'ODS','HIS');
EXECUTE IMMEDIATE 'CREATE TABLE '||V_NEW_TABNAME
||' AS SELECT * FROM '||I.NODE_TABNAME||' WHERE 1=2';
SELECT COUNT(*) INTO V_DATA_COUNT FROM USER_TAB_COLUMNS
WHERE TABLE_NAME=V_NEW_TABNAME
AND COLUMN_NAME='DATA_DATE';
SELECT COUNT(*) INTO V_DDATE_COUNT FROM USER_TAB_COLUMNS
WHERE TABLE_NAME=V_NEW_TABNAME
AND COLUMN_NAME='DATA_DATE';
IF V_DATA_COUNT=1 AND V_IND_COUNT=0
THEN
EXECUTE IMMEDIATE 'CREATE INDEX HIS_'||SUBSTR(I.NODE_TABNAME,0,25)||' ON '||V_NEW_TABNAME||'(DATA_DATE)';
ELSIF V_DATA_COUNT=0 AND V_DDATE_COUNT=1 AND V_IND_COUNT=0
THEN
EXECUTE IMMEDIATE 'CREATE INDEX HIS_'||SUBSTR(I.NODE_TABNAME,0,25)||' ON '||V_NEW_TABNAME||'(DDATE)';
END IF;
V_OUT_TAB:=V_OUT_TAB||';'||I.NODE_TABNAME;
END IF;
END LOOP;
--DBMS_OUTPUT.PUT_LINE(V_OUT_TAB);
END;
PROCEDURE PROC_EAST_PKG_TAB_AUTO_CREATE(V_LDM_TAB VARCHAR2,V_SD_TABNAME VARCHAR2)
IS
V_COL_DDL CLOB;
V_COMM_DDL CLOB;
V_TAB_DDL CLOB;
V_EAST_PROC CLOB;
VIN_INSERT_COLS CLOB;
VIN_SELECT_COLS CLOB;
V_PRE_COLS VARCHAR2(256);
V_IDX_DDL VARCHAR2(512);
V_EAST_TAB VARCHAR2(32);
V_EAST_TAB_COUNT NUMBER;
V_99_IDX_COUNT NUMBER;
VIN_LDM_TAB VARCHAR2(32);
VIN_SD_TABNAME VARCHAR2(32);
VIN_PROC_NAME VARCHAR2(32);
VIN_ALTER_DATE VARCHAR2(64);
BEGIN
VIN_ALTER_DATE :=TO_CHAR(SYSDATE,'YYYY-MM-DD');
VIN_LDM_TAB :=UPPER(V_LDM_TAB);
VIN_SD_TABNAME :=UPPER(V_SD_TABNAME);
V_EAST_TAB :='DM_EAST_'||RTRIM(SUBSTR(VIN_LDM_TAB,1,22),'_');
FOR I IN (SELECT COL_SEQ,IN_COL,IN_COL_DATA_TY,COMMENTS,
CASE WHEN REGEXP_LIKE(SE_COL,'(^PKG|SYSDATE|''|NULL)')
THEN NULL ELSE 'T.' END||SE_COL AS SE_COL
FROM DEF_EA_IN_SE_CONF
WHERE COL_SEQ NOT IN(0.8,0.9)
UNION ALL
SELECT COL_SEQ,IN_COL,IN_COL_DATA_TY,COMMENTS,
CASE WHEN REGEXP_LIKE(SE_COL,'(^PKG|SYSDATE|''|NULL)')
THEN NULL ELSE 'T.' END||SE_COL AS SE_COL
FROM EA_IN_SE_CONF
WHERE LDM_TAB=VIN_LDM_TAB
ORDER BY COL_SEQ)
LOOP
V_COL_DDL :=V_COL_DDL||I.IN_COL||' '||I.IN_COL_DATA_TY||',';
V_COMM_DDL :=V_COMM_DDL||'COMMENT ON COLUMN '||V_EAST_TAB||'.'
||I.IN_COL||' IS '''||I.COMMENTS||''''||';';
VIN_INSERT_COLS:=VIN_INSERT_COLS||I.IN_COL||','||CHR(10)||' ';
V_PRE_COLS :=I.SE_COL||' AS '||I.IN_COL||',';
IF LENGTH(V_PRE_COLS)<50
THEN
VIN_SELECT_COLS:=VIN_SELECT_COLS||RPAD(V_PRE_COLS,50,' ')||'--'
||I.COMMENTS||CHR(10)||' ';
ELSE
VIN_SELECT_COLS:=VIN_SELECT_COLS||V_PRE_COLS||'--'
||I.COMMENTS||CHR(10)||' ';
END IF;
END LOOP;
V_COL_DDL :=RTRIM(V_COL_DDL,',');
V_COMM_DDL :=RTRIM(V_COMM_DDL,',');
VIN_INSERT_COLS :=RTRIM(VIN_INSERT_COLS,','||CHR(10)||' ');
VIN_SELECT_COLS :=RTRIM(TRIM(RTRIM(VIN_SELECT_COLS,'--'||CHR(10)||' ')),',');
SELECT COUNT(*) INTO V_EAST_TAB_COUNT FROM USER_OBJECTS
WHERE OBJECT_NAME='IDX_'||SUBSTR(V_EAST_TAB,1,23)||'_99'
AND OBJECT_TYPE='INDEX';
IF V_EAST_TAB_COUNT=0
THEN
V_TAB_DDL:='CREATE TABLE '||V_EAST_TAB||'('||V_COL_DDL||')TABLESPACE MDR';
EXECUTE IMMEDIATE V_TAB_DDL;
END IF;
FOR I IN(
SELECT REGEXP_SUBSTR(TO_CHAR(V_COMM_DDL),'[^;]+',1,ROWNUM) AS COMMENTS
FROM DUAL
CONNECT BY ROWNUM<=REGEXP_COUNT(V_COMM_DDL,';'))
LOOP
EXECUTE IMMEDIATE I.COMMENTS;
END LOOP;
--记录
INSERT INTO DATA_CONTROL_JCJTEST_LOG(SQL_TEXT,EXEC_DATE)
VALUES(V_COL_DDL,SYSDATE);
COMMIT;
SELECT COUNT(*) INTO V_99_IDX_COUNT FROM USER_OBJECTS
WHERE OBJECT_NAME='IDX_'||SUBSTR(V_EAST_TAB,1,23)||'_99'
AND OBJECT_TYPE='INDEX';
IF V_99_IDX_COUNT=0
THEN
V_IDX_DDL:='CREATE INDEX IDX_'||SUBSTR(V_EAST_TAB,1,23)||'_99 ON '||V_EAST_TAB||'(BUSI_DT)';
EXECUTE IMMEDIATE V_IDX_DDL;
END IF;
VIN_PROC_NAME:='PROC_EAST_'||RTRIM(SUBSTR(VIN_LDM_TAB,1,21),'_');
V_EAST_PROC:=' /**************************************************************************************
程序名 : '||VIN_PROC_NAME||'
用途 :
数据源 : '||VIN_SD_TABNAME||'
目标表 : '||V_EAST_TAB||'
修改历史:
版本 更改日期 更改人 更改说明
===================================================================================
V1.0 '||VIN_ALTER_DATE||' JIANGCHANGJIAN INIT
************************************************************************************/
PROCEDURE '||VIN_PROC_NAME||'(PARAM IN OUT PROC_PARAM_TYPE)
IS
BEGIN
DELETE '||V_EAST_TAB||'
WHERE BUSI_DT=PARAM.IN_BUSI_DT;
COMMIT;
INSERT INTO '||V_EAST_TAB||'
('||VIN_INSERT_COLS||')
SELECT
'||VIN_SELECT_COLS||'
FROM '||VIN_SD_TABNAME||' T
WHERE T.BUSI_DT = PARAM.IN_BUSI_DT;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
PKG_COMM_UTIL.PROC_UNI_OUTPUT_SQLERRM(PARAM,SQLERRM);
END;';
--插入脚本
DELETE PRE_PROC_SQLTEXT WHERE SP_NAME=VIN_PROC_NAME;
COMMIT;
INSERT INTO PRE_PROC_SQLTEXT(SQLTEXT,SP_NAME,IF_TABNAME,DATETIME)
VALUES(V_EAST_PROC,VIN_PROC_NAME,V_EAST_TAB,SYSDATE);
COMMIT;
END;
FUNCTION FUNC_GET_FTZ_FLG(IN_BRANCH VARCHAR2) RETURN VARCHAR2
IS
OUT_FTZ_FLG VARCHAR2(1);
BEGIN
SELECT CASE WHEN IN_BRANCH='C33' THEN 'Y' ELSE 'N' END FTZ_FLG
INTO OUT_FTZ_FLG
FROM DUAL;
RETURN OUT_FTZ_FLG;
END;
PROCEDURE PROC_GET_MAPPING_DQL(IN_LDM_TAB VARCHAR2,IN_EAST_TAB VARCHAR2,IN_BUSI_DT DATE)
IS
V_IN_LDM_TAB VARCHAR2(32):=UPPER(IN_LDM_TAB);
V_IN_EAST_TAB VARCHAR2(32):=UPPER(IN_EAST_TAB);
V_PK_COL_JOIN VARCHAR2(1024);
V_IN_EAST_DATE VARCHAR2(64):=TO_CHAR(IN_BUSI_DT,'YYYY-MM-DD');
V_IN_LDM_DATE VARCHAR2(64):=TO_CHAR(IN_BUSI_DT,'YYYYMMDD');
V_NULL_TYPE VARCHAR2(64);
V_MAP_COLS CLOB;
--V_SELECT_COLS CLOB;
V_PREDICATE CLOB;
V_MAP_DQL CLOB;
V_LDM_OVER CLOB;
V_EAST_OVER CLOB;
BEGIN
/*SELECT A.COLUMN_NAME,A.DATA_TYPE FROM USER_TAB_COLUMNS A,USER_TAB_COLUMNS B
WHERE A.COLUMN_NAME=B.COLUMN_NAME
AND A.TABLE_NAME=V_IN_LDM_TAB
AND B.TABLE_NAME=V_IN_EAST_TAB*/--这是共同字段,按理应该包含所有字段
FOR I IN(SELECT A.COLUMN_NAME,DATA_TYPE FROM USER_TAB_COLUMNS A
WHERE A.TABLE_NAME=V_IN_LDM_TAB)
LOOP
SELECT DECODE(I.DATA_TYPE,'DATE','DATE''9999-12-31''',0)
INTO V_NULL_TYPE
FROM DUAL;
V_MAP_COLS :=V_MAP_COLS||'CASE WHEN NVL(DM_EAST.'||I.COLUMN_NAME||','
||V_NULL_TYPE||')=NVL(LDM.'||I.COLUMN_NAME||','
||V_NULL_TYPE||') THEN ''Y'' ELSE DM_EAST.'
||I.COLUMN_NAME||'||'';''||LDM.'
||I.COLUMN_NAME||' END '||I.COLUMN_NAME||','||CHR(10)||' ';
--V_SELECT_COLS:=V_SELECT_COLS||I.COLUMN_NAME||','||CHR(10);
V_PREDICATE :=V_PREDICATE||I.COLUMN_NAME||'<>''Y'' OR '||CHR(10)||' ';
END LOOP;
V_MAP_COLS :=RTRIM(V_MAP_COLS,','||CHR(10)||' ');
--V_SELECT_COLS :=RTRIM(V_SELECT_COLS,',')||CHR(10);
V_PREDICATE :=RTRIM(V_PREDICATE,' OR '||CHR(10)||' ');
SELECT LISTAGG('DM_EAST.'||REGEXP_SUBSTR(V_COLUMNS,'[^,]+',1,ROWNUM)||
' = LDM.' ||REGEXP_SUBSTR(V_COLUMNS,'[^,]+',1,ROWNUM),
CHR(10)||' AND ')
WITHIN GROUP(ORDER BY V_COLUMNS) AS PK_COL_LIST
INTO V_PK_COL_JOIN
FROM
(
SELECT CONS.CONSTRAINT_NAME,CONS.TABLE_NAME,REPLACE(IND_VIEW.V_COLUMNS,'DATA_DATE,','') AS V_COLUMNS
FROM USER_CONSTRAINTS CONS,VIEW_USER_IND_COLUMNS IND_VIEW
WHERE CONS.CONSTRAINT_NAME=IND_VIEW.INDEX_NAME
AND CONS.TABLE_NAME=IND_VIEW.TABLE_NAME
AND CONS.TABLE_NAME=V_IN_LDM_TAB
AND CONS.CONSTRAINT_TYPE='P'
)
CONNECT BY LEVEL<=REGEXP_COUNT(V_COLUMNS,',')+1;
V_MAP_DQL:='SELECT *
FROM
(
SELECT '||V_MAP_COLS||'
FROM '||V_IN_EAST_TAB||' DM_EAST,'||V_IN_LDM_TAB||' LDM
WHERE '||V_PK_COL_JOIN||'
AND LDM.DATA_DATE='||V_IN_LDM_DATE||'
AND DM_EAST.BUSI_DT=DATE'''||V_IN_EAST_DATE||'''
)
WHERE ('||V_PREDICATE||')';
V_LDM_OVER:='SELECT *
FROM '||V_IN_LDM_TAB||' LDM
WHERE NOT EXISTS
(SELECT 1 FROM '||V_IN_EAST_TAB||' DM_EAST
WHERE '||V_PK_COL_JOIN||'
AND DM_EAST.BUSI_DT=DATE'''||V_IN_EAST_DATE||''')
AND LDM.DATA_DATE='||V_IN_LDM_DATE||';';
V_EAST_OVER:='SELECT *
FROM '||V_IN_EAST_TAB||' DM_EAST
WHERE NOT EXISTS
(SELECT 1 FROM '||V_IN_LDM_TAB||' LDM
WHERE '||V_PK_COL_JOIN||'
AND LDM.DATA_DATE='||V_IN_LDM_DATE||')
AND DM_EAST.BUSI_DT=DATE'''||V_IN_EAST_DATE||'''';
DELETE CITI_GET_MAPPING_DQL WHERE EAST_TABNAME=V_IN_EAST_TAB;
COMMIT;
INSERT INTO CITI_GET_MAPPING_DQL(MAPPING_DQL,LDM_MORE_DQL,EAST_MORE_DQL,EAST_TABNAME,LDM_TABNAME,INPUT_DT)
VALUES (V_MAP_DQL,V_LDM_OVER,V_EAST_OVER,V_IN_EAST_TAB,V_IN_LDM_TAB,SYSDATE);
COMMIT;
END;
/*FUNCTION FUNC_ROW_TURN_COLUMN(V_TABNAME VARCHAR2) RETURN TYPE_ROWS
IS
V_ONE_ARR TYPE_COLUMNS;
V_DIM_ARR TYPE_ROWS:=TYPE_ROWS(V_ONE_ARR);
BEGIN
V_ONE_ARR:=TYPE_COLUMNS('111','222');
V_DIM_ARR.EXTEND;
V_DIM_ARR(1):=V_ONE_ARR;
V_ONE_ARR:=TYPE_COLUMNS('333','444');
V_DIM_ARR(2):=V_ONE_ARR;
RETURN V_DIM_ARR;
END;*/
/*FUNCTION GET_TERM_YEARS RETURN DATE_TABLE PIPELINED
IS
L_RESULT DATE_RECORD;
BEGIN
FOR REC IN (SELECT 'QWER' AS YEAR FROM DUAL
UNION ALL
SELECT 'ASDF' AS YEAR FROM DUAL
UNION ALL
SELECT 'ZXCV' AS YEAR FROM DUAL)
LOOP
L_RESULT.NAME := REC.YEAR || '年';
L_RESULT.VALUE := REC.YEAR;
PIPE ROW (L_RESULT); --依次返回行
END LOOP;
END;*/
/*PROCEDURE PROC_REDEFINITION_PLUS(ORG_TABNAME VARCHAR2,NEW_TABNAME VARCHAR2)
IS
num_errors PLS_INTEGER;
V_USERNAME VARCHAR2(32):='UUPSDB2';
V_ORG_TABNAME VARCHAR2(32):=UPPER(ORG_TABNAME);
V_NEW_TABNAME VARCHAR2(32):=UPPER(NEW_TABNAME);
V_OPTIONS_FLAG VARCHAR2(256):='dbms_redefinition.cons_use_pk';
BEGIN
SYS.DBMS_REDEFINITION.can_redef_table
(
uname =>V_USERNAME,
tname =>V_ORG_TABNAME,
options_flag =>V_OPTIONS_FLAG,
part_name =>''
);
DBMS_REDEFINITION.START_REDEF_TABLE
(
uname =>V_USERNAME,
orig_table =>V_ORG_TABNAME,
int_table =>V_NEW_TABNAME,
col_mapping =>'',
options_flag =>V_OPTIONS_FLAG
--orderby_cols =>'',
--part_name =>''
);
DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT
(
uname =>V_USERNAME,
orig_table =>V_ORG_TABNAME,
int_table =>V_NEW_TABNAME,
dep_type =>'',
dep_owner =>V_USERNAME,
dep_orig_name =>'',
dep_int_name =>''
);
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS
(
uname =>V_USERNAME,
orig_table =>V_ORG_TABNAME,
int_table =>V_NEW_TABNAME,
copy_indexes =>0,
copy_triggers => TRUE,
copy_constraints => TRUE,
copy_privileges => TRUE,
ignore_errors => FALSE,
num_errors =>num_errors
--copy_statistics => FALSE,
--copy_mvlog => FALSE
);
DBMS_REDEFINITION.SYNC_INTERIM_TABLE
(
uname =>V_USERNAME,
orig_table =>V_ORG_TABNAME,
int_table =>V_NEW_TABNAME
--part_name =>''
);
DBMS_REDEFINITION.FINISH_REDEF_TABLE
(
uname =>V_USERNAME,
orig_table =>V_ORG_TABNAME,
int_table =>V_NEW_TABNAME
--part_name =>''
);
EXCEPTION
WHEN OTHERS THEN
DBMS_REDEFINITION.ABORT_REDEF_TABLE(
uname =>V_USERNAME,
orig_table =>V_ORG_TABNAME,
int_table =>V_NEW_TABNAME
--part_name =>''
);
END; */
END;