存储过程标准
CREATE OR REPLACE PROCEDURE IF.PROC_表名(IN F_DATE DATE) ------------------------------------------------------------------------------- -- (C) Copyright TLB and IBM <date> -- -- File name: XXXXXXXX.sql -- Procedure name: XXXXXXX -- Source Table: XXXXXX -- Target Table: XXXXXX -- Project: TLB EDW -- Note: -- Purpose: -- --============================================================================= -- Creation Date: YYYY.MM.DD -- Origin Author: XXXXX -- -- Version: %1.0% -- -- Modification History -- -------------------- -- Date ByPerson Description -- ---------- -------------- ----------------------------------------------- -- 2013-12-25 XXXXX XXXXXX ------------------------------------------------------------------------------- LANGUAGE SQL BEGIN /*声明异常处理变量*/ DECLARE V_PROC_SCHEMA VARCHAR(100); --存储过程所在的schema DECLARE V_PROC_NM VARCHAR(100); --存储过程名称 DECLARE V_PROC_ACT_DT DATE; --存储过程会计日期 DECLARE V_PROC_STEPNUM INT DEFAULT 1; --过程内部位置标记 DECLARE V_PROC_STEPDESC VARCHAR(100) DEFAULT ''; --过程内部位置描述 DECLARE V_PROC_START_TS TIMESTAMP; --过程开始执行时间 DECLARE V_PROC_END_TS TIMESTAMP; --过程结束时间 DECLARE V_STEP_START_TS TIMESTAMP; --步骤开始执行时间 DECLARE V_STEP_END_TS TIMESTAMP; --步骤结束时间 DECLARE SQLCODE,V_PROC_SQLCODE INT DEFAULT 0; --SQLCODE DECLARE V_PROC_RCOUNT INT; --DML语句作用记录数 /*声明存储过程使用变量*/ DECLARE V_IF_DT VARCHAR(8); --接口业务日期 DECLARE XXX SMALLINT; DECLARE XXX SMALLINT; /*定义针对SQL异常情况的句柄(EXIT、WARNING方式)*/ DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET V_PROC_SQLCODE = SQLCODE; ROLLBACK; INSERT INTO DWMM.PROC_RUN_LOG ( PROC_SCHEMA, PROC_NM, PROC_ACT_DT, PROC_STEPNUM, PROC_STEPDESC, PROC_STRT_TS, PROC_END_TS, PROC_SQLCODE) Values( V_PROC_SCHEMA, -- PROC_SCHEMA V_PROC_NM, -- PROC_NM V_PROC_ACT_DT, -- PROC_ACT_DT V_PROC_STEPNUM, -- PROC_STEPNUM V_PROC_STEPDESC, -- PROC_STEPDESC V_STEP_START_TS, -- PROC_STRT_TS CURRENT TIMESTAMP, -- PROC_END_TS V_PROC_SQLCODE) -- PROC_SQLCODE ; COMMIT; RESIGNAL; END; DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN SET V_PROC_SQLCODE = SQLCODE; INSERT INTO DWMM.PROC_RUN_LOG ( PROC_SCHEMA, PROC_NM, PROC_ACT_DT, PROC_STEPNUM, PROC_STEPDESC, PROC_STRT_TS, PROC_END_TS, PROC_SQLCODE) Values( V_PROC_SCHEMA, -- PROC_SCHEMA V_PROC_NM, -- PROC_NM V_PROC_ACT_DT, -- PROC_ACT_DT V_PROC_STEPNUM, -- PROC_STEPNUM V_PROC_STEPDESC, -- PROC_STEPDESC V_STEP_START_TS, -- PROC_STRT_TS CURRENT TIMESTAMP, -- PROC_END_TS V_PROC_SQLCODE) -- PROC_SQLCODE ; COMMIT; END; /*变量赋值*/ SET V_PROC_SCHEMA = '根据具体SCHEMA赋值'; SET V_PROC_NM = '存储过程名'; SET V_PROC_ACT_DT = F_DATE; SET V_IF_DT = TO_CHAR(V_PROC_ACT_DT,'YYYYMMDD'); --==============================数据加工开始========================================== SET V_PROC_STEPNUM = 0; SET V_PROC_STEPDESC = 'PROCEDURE START.'; SET V_PROC_START_TS = CURRENT TIMESTAMP; SET V_PROC_END_TS = CURRENT TIMESTAMP; INSERT INTO DWMM.PROC_RUN_LOG (PROC_SCHEMA,PROC_NM,PROC_ACT_DT,PROC_STEPNUM,PROC_STEPDESC,PROC_STRT_TS,PROC_END_TS,PROC_SQLCODE,PROC_RCOUNT) VALUES(V_PROC_SCHEMA,V_PROC_NM,V_PROC_ACT_DT,V_PROC_STEPNUM,V_PROC_STEPDESC,V_PROC_START_TS,V_PROC_END_TS,0,0); COMMIT; /*数据恢复与备份*/ SET V_STEP_START_TS = CURRENT TIMESTAMP; SET V_PROC_STEPNUM = 10; SET V_PROC_STEPDESC = '数据恢复与备份'; --此处放置处理脚本 COMMIT; GET DIAGNOSTICS V_PROC_RCOUNT = ROW_COUNT; SET V_STEP_END_TS = CURRENT TIMESTAMP; INSERT INTO DWMM.PROC_RUN_LOG (PROC_SCHEMA,PROC_NM,PROC_ACT_DT,PROC_STEPNUM,PROC_STEPDESC,PROC_STRT_TS,PROC_END_TS,PROC_SQLCODE,PROC_RCOUNT) VALUES(V_PROC_SCHEMA,V_PROC_NM,V_PROC_ACT_DT,V_PROC_STEPNUM,V_PROC_STEPDESC,V_STEP_START_TS,V_STEP_END_TS,V_PROC_SQLCODE,V_PROC_RCOUNT); COMMIT; /*临时表声明及赋值*/ SET V_STEP_START_TS = CURRENT TIMESTAMP; SET V_PROC_STEPNUM = 20; SET V_PROC_STEPDESC = '临时表声明及赋值'; DECLARE GLOBAL TEMPORARY TABLE xxxx ( ) ON COMMIT PRESERVE ROWS NOT LOGGED WITH REPLACE IN TS_USER_TMP ---TS_DM(数据量不大的时候可以放在此,否则放在TS_SGL_USR_TMP) PARTITIONING KEY(key); CREATE INDEX SESSION.XXX_ID ON SESSION.XXX(key); --此处对临时表进行赋值--- GET DIAGNOSTICS V_PROC_RCOUNT = ROW_COUNT; SET V_STEP_END_TS = CURRENT TIMESTAMP; INSERT INTO DWMM.PROC_RUN_LOG (PROC_SCHEMA,PROC_NM,PROC_ACT_DT,PROC_STEPNUM,PROC_STEPDESC,PROC_STRT_TS,PROC_END_TS,PROC_SQLCODE,PROC_RCOUNT) VALUES(V_PROC_SCHEMA,V_PROC_NM,V_PROC_ACT_DT,V_PROC_STEPNUM,V_PROC_STEPDESC,V_STEP_START_TS,V_STEP_END_TS,V_PROC_SQLCODE,V_PROC_RCOUNT); COMMIT; /*数据加工-XXX*/ SET V_STEP_START_TS = CURRENT TIMESTAMP; SET V_PROC_STEPNUM = 30; SET V_PROC_STEPDESC = '数据加工-XXX'; --加工逻辑处理 GET DIAGNOSTICS V_PROC_RCOUNT = ROW_COUNT; SET V_STEP_END_TS = CURRENT TIMESTAMP; INSERT INTO DWMM.PROC_RUN_LOG (PROC_SCHEMA,PROC_NM,PROC_ACT_DT,PROC_STEPNUM,PROC_STEPDESC,PROC_STRT_TS,PROC_END_TS,PROC_SQLCODE,PROC_RCOUNT) VALUES(V_PROC_SCHEMA,V_PROC_NM,V_PROC_ACT_DT,V_PROC_STEPNUM,V_PROC_STEPDESC,V_STEP_START_TS,V_STEP_END_TS,V_PROC_SQLCODE,V_PROC_RCOUNT); COMMIT; --==============================数据加工结束========================================== SET V_PROC_STEPNUM = 999; SET V_PROC_STEPDESC = 'PROCEDURE END.'; SET V_PROC_END_TS = CURRENT TIMESTAMP; INSERT INTO DWMM.PROC_RUN_LOG (PROC_SCHEMA,PROC_NM,PROC_ACT_DT,PROC_STEPNUM,PROC_STEPDESC,PROC_STRT_TS,PROC_END_TS,PROC_SQLCODE,PROC_RCOUNT) VALUES(V_PROC_SCHEMA,V_PROC_NM,V_PROC_ACT_DT,V_PROC_STEPNUM,V_PROC_STEPDESC,V_PROC_START_TS,V_PROC_END_TS,0,0); COMMIT; END@