网站首页 > 文章精选 正文
CREATE TABLE "ETL_LOG_INFO"
(
"V_JOB_NAME" VARCHAR2(100),
"V_POINT" NUMBER(10,0),
"V_START_TM" TIMESTAMP(0),
"V_END_TM" TIMESTAMP(0),
"V_STEPDESC" VARCHAR2(200),
"V_RUN_RESULT" VARCHAR2(1500),
"V_DATA_DT" TIMESTAMP(0),
"V_MSG" CLOB,
"V_RCOUNT" NUMBER(11,0)) ;
--创建一个分区的存储过程
CREATE OR REPLACE PROCEDURE "SP_PARTITION"("IN_TABLE_NAME" IN VARCHAR2(50),"IN_DATA_DT" IN VARCHAR2(50),"OUT_SUCCEED" OUT VARCHAR2(50),"V_MSG" OUT VARCHAR2(50))
AUTHID DEFINER
IS
v_job_name VARCHAR2(60) DEFAULT 'SP_PARTITION_CREATE_PARENT';
v_point NUMBER := 0; -- 记录点
v_date DATE; -- 数据日期
v_start_tm TIMESTAMP DEFAULT CURRENT_TIMESTAMP; -- 开始执行时间
v_end_tm TIMESTAMP; -- 结束执行时间
v_sql VARCHAR2(200); -- 步骤描述
v_run_result VARCHAR2(20); -- 执行结果
v_rcount NUMBER; -- DML语句作用记录数
dm_error_code VARCHAR2(500) DEFAULT '00000'; -- 显示定义数据库变量SQLCODE
dm_error_msg VARCHAR2(500); -- 显示定义数据库变量SQLSTATE
v_pa_name VARCHAR2(30);
v_count NUMBER;
exe_sql VARCHAR2(1000);
v_subpart_name VARCHAR2(1000);
v_pre_seven_name VARCHAR2(100);
v_date_pre_seven date;
BEGIN
-- 开始处理数据
v_date := SYSDATE; -- 未定义in_data_dt参数,用当前日期
v_date_pre_seven:=TO_DATE(IN_DATA_DT)-7;
out_succeed := '0';
v_run_result := '执行成功';
-- 开始记录日志
v_point := v_point + 1;
v_sql := '存储过程开始';
INSERT INTO ETL_LOG_INFO(V_JOB_NAME,
V_POINT,
V_START_TM,
V_END_TM,
V_STEPDESC,
V_RUN_RESULT,
V_DATA_DT,
V_MSG,
V_RCOUNT)
VALUES(v_job_name,
v_point,
v_start_tm,
CURRENT_TIMESTAMP,
v_sql,
v_run_result,
v_date,
v_msg,
v_rcount);
COMMIT;
v_pa_name := 'P' || IN_DATA_DT;
v_pre_seven_name := 'P' || TO_CHAR(TO_DATE(IN_DATA_DT)-7,'yyyymmdd');
-- 修正分区存在性检查(严格匹配用户表)
SELECT COUNT(1)
INTO
v_count
FROM user_tab_partitions
WHERE table_name = UPPER(in_table_name)
AND partition_name = v_pa_name;
IF v_count != 0 THEN
exe_sql := 'ALTER TABLE ' || in_table_name ||' DROP PARTITION ' || v_pa_name ;
EXECUTE IMMEDIATE exe_sql;
END IF;
-- 创建主分区(列表分区示例)
exe_sql := 'ALTER TABLE ' || in_table_name || ' ADD PARTITION ' || v_pa_name || ' VALUES (''' || IN_DATA_DT || ''')';
-- 字符串值需加单引号
EXECUTE IMMEDIATE exe_sql;
SELECT COUNT(1)
INTO
v_count
FROM user_tab_partitions
WHERE table_name = UPPER(in_table_name)
AND partition_name = v_pre_seven_name;
--删除七天前的数据,并留存月末两天和月初一天
if v_count != 0 then
if(v_date_pre_seven>=LAST_DAY(ADD_MONTHS(v_date_pre_seven,-1)) -INTERVAL '2' DAY and v_date_pre_seven < LAST_DAY(ADD_MONTHS(v_date_pre_seven,-1)) +INTERVAL '2' DAY) then
null;
ELSE
exe_sql := 'ALTER TABLE ' || in_table_name ||' DROP PARTITION ' || v_pre_seven_name ;
EXECUTE IMMEDIATE exe_sql;
end if;
end if ;
/***************************写入日志***************************/
v_start_tm := CURRENT_TIMESTAMP;
v_point := v_point + 1 ;
v_sql := '存储过程结束' ;
INSERT INTO ETL_LOG_INFO(V_JOB_NAME,
V_POINT,
V_START_TM,
V_END_TM,
V_STEPDESC,
V_RUN_RESULT,
V_DATA_DT,
V_MSG,
V_RCOUNT)
VALUES(v_job_name,
v_point,
v_start_tm,
CURRENT_TIMESTAMP,
v_sql,
v_run_result,
v_date,
v_msg,
v_rcount);
COMMIT;
-- 异常处理
--1.定义针对SQL异常情况的句柄(EXIT方式).
--2.将出现SQL异常时在存储过程中的位置(V_POINT),位置描述(v_sql),错误代码SQLCODE(V_MSG)记入表ETL_LOG_INFO中作调试用.
--3.调用RESIGNAL重新引发异常,跳出存储过程执行体,对引发SQL异常之前存储过程体中所完成的操作进行回滚.
EXCEPTION
WHEN OTHERS THEN
dm_error_code := SQLCODE;
dm_error_msg := SQLERRM;
out_succeed := '1';
v_run_result := '执行失败';
v_msg := 'EXECUTE PROCEDURE FAILED! REASON: ' || 'dm_error_code: ' || dm_error_code || ', dm_error_msg: ' || dm_error_msg || '.';
ROLLBACK;
INSERT INTO ETL_LOG_INFO (V_JOB_NAME,
V_POINT,
V_START_TM,
V_END_TM,
V_STEPDESC,
V_RUN_RESULT,
V_DATA_DT,
V_MSG,
V_RCOUNT)
VALUES (v_job_name,
v_point,
v_start_tm,
SYSTIMESTAMP,
v_sql,
v_run_result,
v_date,
v_msg,
v_point);
COMMIT;
RAISE;
END SP_PARTITION;
猜你喜欢
- 2025-07-02 python如何操作SQL Server数据库?
- 2025-07-02 MySQL常用命令汇总(mysql常用命令大全)
- 2025-07-02 Ctrl+Enter,1秒批量合并数据并导入数据库的办法,你学会了吗?
- 2025-07-02 面试官:select语句和update语句分别是怎么执行的?
- 2025-07-02 MySQL的XtraBackup进行备份和恢复
- 2025-07-02 了解 SQL 语言特点、分类及规则(sql语言包括哪三种类型)
- 2025-07-02 数据库融入DevOps基因后,运维再也不用做背锅侠了
- 2025-07-02 Git Rebase(git rebase命令)
- 2025-07-02 Sequelize 在 Node.js 中的详细用法与使用笔记
- 2025-07-02 新课标高中教材1030个短语大汇总(新课标高中必备篇目60篇)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)