LANGCHI_数仓作业

1、系统准备
 -- 在 sysdba 下操作
 --创建用户并赋予相关权限
create user STG  identified by "123456"  ;
create user ODS  identified by "123456"  ;
create user DWD  identified by "123456"  ;
create user DWA  identified by "123456"  ;
create user DM   identified by "123456"  ;
create user DIM   identified by "123456"  ;
-- 给予权限,创建数据库、存储过程、用户之间的连接、建表的权限
grant resource,connect ,dba to STG     ;
grant resource,connect ,dba to ODS     ;
grant resource,connect ,dba to DWD     ;
grant resource,connect ,dba to DWA     ;
grant resource,connect ,dba to DM      ;
grant resource,connect ,dba to DIM      ;
-- 删除用户测试____ 不用管
drop user DWD cascade; 
drop user DM cascade; 
drop user DWA cascade; 
drop user DIM cascade; 
-- 查看当前的表空间基本情况——————表空间的默认路径
select tablespace_name ,file_name,bytes/1024/1024 as MB from dba_data_files;
-- 创建表空间
-- 默认100M。不够的话自动增加100M
create tablespace TBS_DWD logging datafile '/oracle/app/oradata/ecom/DWD.dbf' size 100m autoextend on next 100mmaxsize unlimited extent management local;
create tablespace TBS_DWA logging datafile '/oracle/app/oradata/ecom/DWA.dbf' size 100m autoextend on next 100m maxsize unlimited extent management local;
create tablespace TBS_DM logging datafile '/oracle/app/oradata/ecom/DM.dbf' size 100m autoextend on next 100m maxsize unlimited extent management local;
create tablespace TBS_ODS logging datafile '/oracle/app/oradata/ecom/ODS.dbf' size 100m autoextend on next 100m maxsize unlimited extent management local;
create tablespace TBS_STG logging datafile '/oracle/app/oradata/ecom/STG.dbf' size 100m autoextend on next 100m maxsize unlimited extent management local;
create tablespace TBS_DIM logging datafile '/oracle/app/oradata/ecom/DIM.dbf' size 100m autoextend on next 100m maxsize unlimited extent management local;

select * from all_users; 查看所有用户
drop tablespace TBS_DWD including contents cascade constraints;
drop tablespace TBS_DWA including contents cascade constraints;
drop tablespace TBS_DM including contents cascade constraints;
drop tablespace TBS_ODS including contents cascade constraints;
drop tablespace TBS_STG including contents cascade constraints;
drop tablespace TBS_DIM including contents cascade constraints;
=============================================================================
2、进入STG用户,新建用户基础信息表
create table STG.STG_D_USE_BASE_INFO
(					
date_id      VARCHAR2(8),
area_id      VARCHAR2(10),
user_id      VARCHAR2(20),
device_number VARCHAR2(11),
service_type VARCHAR2(8),
innet_date  VARCHAR2(8),
innet_months NUMBER
)
TABLESPACE TBS_STG
PARTITION BY RANGE(date_id)
SUBPARTITION BY LIST(area_id)
(
 PARTITION PART_20190401 VALUES LESS THAN ('20190402')
 TABLESPACE TBS_STG
 (
  subpartition PART_20190401_SUBPART_01 values ('01') tablespace TBS_STG,
  subpartition PART_20190401_SUBPART_02 values ('02') tablespace TBS_STG,
  subpartition PART_20190401_SUBPART_03 values ('03') tablespace TBS_STG,
  subpartition PART_20190401_SUBPART_04 values ('04') tablespace TBS_STG,	
  subpartition PART_20190401_SUBPART_05 values ('05') tablespace TBS_STG,	
  subpartition PART_20190401_SUBPART_06 values ('06') tablespace TBS_STG,
  subpartition PART_20190401_SUBPART_07 values ('07') tablespace TBS_STG,
  subpartition PART_20190401_SUBPART_08 values ('08') tablespace TBS_STG,
  subpartition PART_20190401_SUBPART_09 values ('09') tablespace TBS_STG,
  subpartition PART_20190401_SUBPART_10 values ('10') tablespace TBS_STG,
  subpartition PART_20190401_SUBPART_11 values ('11') tablespace TBS_STG
 )
);
-- 创建索引
CREATE INDEX STG.IDX_SDUBI_DATE_ID ON STG.STG_D_USE_BASE_INFO (DATE_ID) TABLESPACE TBS_STG;
CREATE INDEX STG.IDX_SDUBI_AREA_ID ON STG.STG_D_USE_BASE_INFO (AREA_ID) TABLESPACE TBS_STG;
CREATE INDEX STG.IDX_SDUBI_USER_ID ON STG.STG_D_USE_BASE_INFO (USER_ID) TABLESPACE TBS_STG;
CREATE INDEX STG.IDX_SDUBI_DN ON STG.STG_D_USE_BASE_INFO (DEVICE_NUMBER) TABLESPACE TBS_STG;	
CREATE INDEX STG.IDX_SDUBI_ST ON STG.STG_D_USE_BASE_INFO (SERVICE_TYPE) TABLESPACE TBS_STG;
-- 在表上面,列上面的索引

COMMENT ON TABLE  STG.STG_D_USE_BASE_INFO IS '用户基础信息';
COMMENT ON COLUMN STG.STG_D_USE_BASE_INFO.date_id is '日期ID';
COMMENT ON COLUMN STG.STG_D_USE_BASE_INFO.area_id is '地市ID';
COMMENT ON COLUMN STG.STG_D_USE_BASE_INFO.user_id is '用户ID';
COMMENT ON COLUMN STG.STG_D_USE_BASE_INFO.device_number is '手机号码';
COMMENT ON COLUMN STG.STG_D_USE_BASE_INFO.service_type is '业务类型';
COMMENT ON COLUMN STG.STG_D_USE_BASE_INFO.innet_date is '入网日期';
COMMENT ON COLUMN STG.STG_D_USE_BASE_INFO.innet_months is '在网时长';				
-- 更改表上属性的数据类型来适应数据
alter table STG_D_USE_BASE_INFO  modify user_id VARCHAR2(50);
-- 重新修改表分区
ALTER TABLE STG_D_USE_BASE_INFO ADD PARTITION  PART_20190402 VALUES LESS THAN ('20190403')
 TABLESPACE TBS_STG					
 (
  subpartition PART_20190402_SUBPART_01 values ('01') tablespace TBS_STG,
  subpartition PART_20190402_SUBPART_02 values ('02') tablespace TBS_STG,
  subpartition PART_20190402_SUBPART_03 values ('03') tablespace TBS_STG,
  subpartition PART_20190402_SUBPART_04 values ('04') tablespace TBS_STG,
  subpartition PART_20190402_SUBPART_05 values ('05') tablespace TBS_STG,
  subpartition PART_20190402_SUBPART_06 values ('06') tablespace TBS_STG,
  subpartition PART_20190402_SUBPART_07 values ('07') tablespace TBS_STG,
  subpartition PART_20190402_SUBPART_08 values ('08') tablespace TBS_STG,
  subpartition PART_20190402_SUBPART_09 values ('09') tablespace TBS_STG,
  subpartition PART_20190402_SUBPART_10 values ('10') tablespace TBS_STG,
  subpartition PART_20190402_SUBPART_11 values ('11') tablespace TBS_STG
 );
 ALTER TABLE STG_D_USE_BASE_INFO ADD PARTITION  PART_20200301 VALUES LESS THAN ('20200302')
 TABLESPACE TBS_STG					
 (
  subpartition PART_20200301_SUBPART_01 values ('01') tablespace TBS_STG,
  subpartition PART_20200301_SUBPART_02 values ('02') tablespace TBS_STG,
  subpartition PART_20200301_SUBPART_03 values ('03') tablespace TBS_STG,
  subpartition PART_20200301_SUBPART_04 values ('04') tablespace TBS_STG,
  subpartition PART_20200301_SUBPART_05 values ('05') tablespace TBS_STG,
  subpartition PART_20200301_SUBPART_06 values ('06') tablespace TBS_STG,
  subpartition PART_20200301_SUBPART_07 values ('07') tablespace TBS_STG,
  subpartition PART_20200301_SUBPART_08 values ('08') tablespace TBS_STG,
  subpartition PART_20200301_SUBPART_09 values ('09') tablespace TBS_STG,
  subpartition PART_20200301_SUBPART_10 values ('10') tablespace TBS_STG,
  subpartition PART_20200301_SUBPART_11 values ('11') tablespace TBS_STG
 );
 ALTER TABLE STG_D_USE_BASE_INFO ADD PARTITION  PART_20200302 VALUES LESS THAN ('20200303')
 TABLESPACE TBS_STG					
 (
  subpartition PART_20200302_SUBPART_01 values ('01') tablespace TBS_STG,
  subpartition PART_20200302_SUBPART_02 values ('02') tablespace TBS_STG,
  subpartition PART_20200302_SUBPART_03 values ('03') tablespace TBS_STG,
  subpartition PART_20200302_SUBPART_04 values ('04') tablespace TBS_STG,
  subpartition PART_20200302_SUBPART_05 values ('05') tablespace TBS_STG,
  subpartition PART_20200302_SUBPART_06 values ('06') tablespace TBS_STG,
  subpartition PART_20200302_SUBPART_07 values ('07') tablespace TBS_STG,
  subpartition PART_20200302_SUBPART_08 values ('08') tablespace TBS_STG,
  subpartition PART_20200302_SUBPART_09 values ('09') tablespace TBS_STG,
  subpartition PART_20200302_SUBPART_10 values ('10') tablespace TBS_STG,
  subpartition PART_20200302_SUBPART_11 values ('11') tablespace TBS_STG
 );
 ALTER TABLE STG_D_USE_BASE_INFO ADD PARTITION  PART_20200401 VALUES LESS THAN ('20200402')
 TABLESPACE TBS_STG					
 (
  subpartition PART_20200401_SUBPART_01 values ('01') tablespace TBS_STG,
  subpartition PART_20200401_SUBPART_02 values ('02') tablespace TBS_STG,
  subpartition PART_20200401_SUBPART_03 values ('03') tablespace TBS_STG,
  subpartition PART_20200401_SUBPART_04 values ('04') tablespace TBS_STG,
  subpartition PART_20200401_SUBPART_05 values ('05') tablespace TBS_STG,
  subpartition PART_20200401_SUBPART_06 values ('06') tablespace TBS_STG,
  subpartition PART_20200401_SUBPART_07 values ('07') tablespace TBS_STG,
  subpartition PART_20200401_SUBPART_08 values ('08') tablespace TBS_STG,
  subpartition PART_20200401_SUBPART_09 values ('09') tablespace TBS_STG,
  subpartition PART_20200401_SUBPART_10 values ('10') tablespace TBS_STG,
  subpartition PART_20200401_SUBPART_11 values ('11') tablespace TBS_STG
 );
 ALTER TABLE STG_D_USE_BASE_INFO ADD PARTITION  PART_20200402 VALUES LESS THAN ('20200403')
 TABLESPACE TBS_STG					
 (
  subpartition PART_20200402_SUBPART_01 values ('01') tablespace TBS_STG,
  subpartition PART_20200402_SUBPART_02 values ('02') tablespace TBS_STG,
  subpartition PART_20200402_SUBPART_03 values ('03') tablespace TBS_STG,
  subpartition PART_20200402_SUBPART_04 values ('04') tablespace TBS_STG,
  subpartition PART_20200402_SUBPART_05 values ('05') tablespace TBS_STG,
  subpartition PART_20200402_SUBPART_06 values ('06') tablespace TBS_STG,
  subpartition PART_20200402_SUBPART_07 values ('07') tablespace TBS_STG,
  subpartition PART_20200402_SUBPART_08 values ('08') tablespace TBS_STG,
  subpartition PART_20200402_SUBPART_09 values ('09') tablespace TBS_STG,
  subpartition PART_20200402_SUBPART_10 values ('10') tablespace TBS_STG,
  subpartition PART_20200402_SUBPART_11 values ('11') tablespace TBS_STG
 );
 -- 删除之前的错误分区
ALTER TABLE STG_D_USE_BASE_INFO DROP PARTITION PART_20190402;
-- 进入dim用户
2.地市码表
create table DIM.DIM_AREA_ID            
(          
area_id varchar2(10) ,          
area_desc varchar2(100)          
)          
tablespace TBS_DIM;          
COMMENT ON TABLE DIM.DIM_AREA_ID IS '地市码表';          
COMMENT ON COLUMN DIM.DIM_AREA_ID.area_id is '地市ID';          
COMMENT ON COLUMN DIM.DIM_AREA_ID.area_desc is '地市描述';          
CREATE INDEX DIM.IDX_DAI_AREA_ID ON DIM.DIM_AREA_ID (AREA_ID) TABLESPACE TBS_DIM;
3.业务类型码表					
create TABLE  DIM.DIM_SERVICE_TYPE					
(					
service_type varchar2(10),					
service_type_desc  varchar2(100)					
)					
tablespace TBS_DIM;					
COMMENT ON TABLE DIM.DIM_SERVICE_TYPE IS '业务类型码表'; 					
COMMENT ON COLUMN DIM.DIM_SERVICE_TYPE.service_type is '业务类型';					
COMMENT ON COLUMN DIM.DIM_SERVICE_TYPE.service_type_desc is '业务类型描述';					
CREATE INDEX DIM.IDX_DST_SERVICE_TYPE ON DIM.DIM_SERVICE_TYPE (service_type) TABLESPACE TBS_DIM;	

select * from DIM.DIM_SERVICE_TYPE;
-- 插入数据
          
insert into DIM.DIM_SERVICE_TYPE values('10AAAAAA','宽带');
insert all
into DIM.DIM_SERVICE_TYPE values('50AAAAAA','固定电话')
into DIM.DIM_SERVICE_TYPE values('40AAAAAA','4G业务')
into DIM.DIM_SERVICE_TYPE values('30AAAAAA','3G业务')
into DIM.DIM_SERVICE_TYPE values('20AAAAAA','2G业务')
select 1 from dual;


-- Linux终端连接检测 ods 是否连接
-- dim用户
2.地市码表          
create table DIM.DIM_AREA_ID            
(          
area_id varchar2(10) ,          
area_desc varchar2(100)          
)          
tablespace TBS_DIM;          
COMMENT ON TABLE DIM.DIM_AREA_ID IS '地市码表';          
COMMENT ON COLUMN DIM.DIM_AREA_ID.area_id is '地市ID';          
COMMENT ON COLUMN DIM.DIM_AREA_ID.area_desc is '地市描述';          
CREATE INDEX DIM.IDX_DAI_AREA_ID ON DIM.DIM_AREA_ID (AREA_ID) TABLESPACE TBS_DIM;

select * from DIM.DIM_AREA_ID for update;    
3.业务类型码表          
create TABLE  DIM.DIM_SERVICE_TYPE          
(          
service_type varchar2(10),          
service_type_desc  varchar2(100)          
)          
tablespace TBS_DIM;          
COMMENT ON TABLE DIM.DIM_SERVICE_TYPE IS '业务类型码表';           
COMMENT ON COLUMN DIM.DIM_SERVICE_TYPE.service_type is '业务类型';          
COMMENT ON COLUMN DIM.DIM_SERVICE_TYPE.service_type_desc is '业务类型描述';          
CREATE INDEX DIM.IDX_DST_SERVICE_TYPE ON DIM.DIM_SERVICE_TYPE (service_type) TABLESPACE TBS_DIM;  

select * from DIM.DIM_SERVICE_TYPE;
-- 插入数据
insert into DIM.DIM_SERVICE_TYPE values('10AAAAAA','宽带');
insert all
into DIM.DIM_SERVICE_TYPE values('50AAAAAA','固定电话')
into DIM.DIM_SERVICE_TYPE values('40AAAAAA','4G业务')
into DIM.DIM_SERVICE_TYPE values('30AAAAAA','3G业务')
into DIM.DIM_SERVICE_TYPE values('20AAAAAA','2G业务')
select 1 from dual;
commit
-- ods 用户
日志: 为了定义错误

--SEGMENT CREATION DEFERRED Oracle_11g 特性

-- 创建日志表以及索引
CREATE TABLE "ODS"."ODS_EXECUTE_LOG" 					
   (ACCT_MONTH VARCHAR2(16), 				
	PKG_NAME VARCHAR2(30), 				
	PROCNAME VARCHAR2(100), 				
	PROV_ID VARCHAR2(10), 				
	STARTDATE DATE, 				
	ENDDATE DATE, 				
	RESULT VARCHAR2(4000), 				
	DURATION NUMBER, 				
	NOTE VARCHAR2(4000), 				
	ROW_COUNT NUMBER, 				
	TABLE_NAME VARCHAR2(60)				
   )  					
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING					
  STORAGE( INITIAL 163840 NEXT 32768 MINEXTENTS 1 MAXEXTENTS 2147483645)					
  TABLESPACE "TBS_ODS" ;					
 	-- 创建索引: 数据量过大时,创建B树索引查询加快
  CREATE INDEX "ODS"."IDX_ODS_EXECUTE_LOG" ON "ODS"."ODS_EXECUTE_LOG" ("ACCT_MONTH", "PROCNAME", "PROV_ID") 					
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS NOCOMPRESS LOGGING					
  STORAGE( INITIAL 163840 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645)					
  TABLESPACE "TBS_ODS" ;
  
  -- 创建历史日志表
  CREATE TABLE "ODS"."ODS_EXECUTE_LOG_HIS" 		                        --HIS:历史日志表			
   (	ACCT_MONTH VARCHAR2(16), 				
	PKG_NAME VARCHAR2(30), 				
	PROCNAME VARCHAR2(100), 				
	PROV_ID VARCHAR2(10), 				
	STARTDATE DATE, 				
	ENDDATE DATE, 				
	RESULT VARCHAR2(4000), 				
	DURATION NUMBER, 				
	NOTE VARCHAR2(4000), 				
	ROW_COUNT NUMBER, 				
	TABLE_NAME VARCHAR2(196), 				
	INSERT_DATE DATE				
   )                                                           -- SEGMENT CREATION DEFERRED 					
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING					
  STORAGE( INITIAL 163840 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645)					
  TABLESPACE "TBS_ODS" ;
  
  CREATE TABLE "ODS"."SQLPARSER_LOG_GENERAL" 					
   (LOG_SN NUMBER, 				
	ACCT_MONTH VARCHAR2(10), 				
	OWNER VARCHAR2(20), 				
	PROG_NAME VARCHAR2(1000), 				
	PROV_ID VARCHAR2(10), 				
	PROG_VERSION VARCHAR2(100), 				
	MODIFY_DATE DATE, 				
	INPUT_PARA VARCHAR2(200), 				
	BEGIN_TIME DATE, 				
	END_TIME DATE, 				
	RESULT VARCHAR2(4000), 				
	DURATION NUMBER, 				
	NOTE VARCHAR2(4000), 				
	TABLE_NAME VARCHAR2(60)				
   )                                                                               --SEGMENT CREATION DEFERRED 					
  PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING					
  STORAGE( INITIAL 163840 NEXT 32768 MINEXTENTS 1 MAXEXTENTS 2147483645)					
  TABLESPACE "TBS_ODS" ;
  
  
    CREATE TABLE "ODS"."SQLPARSER_LOG_GENERAL" 					
   (LOG_SN NUMBER, 				
	ACCT_MONTH VARCHAR2(10), 				
	OWNER VARCHAR2(20), 				
	PROG_NAME VARCHAR2(1000), 				
	PROV_ID VARCHAR2(10), 				
	PROG_VERSION VARCHAR2(100), 				
	MODIFY_DATE DATE, 				
	INPUT_PARA VARCHAR2(200), 				
	BEGIN_TIME DATE, 				
	END_TIME DATE, 				
	RESULT VARCHAR2(4000), 				
	DURATION NUMBER, 				
	NOTE VARCHAR2(4000), 				
	TABLE_NAME VARCHAR2(60)				
   )                                                                               --SEGMENT CREATION DEFERRED 					
  PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING					
  STORAGE( INITIAL 163840 NEXT 32768 MINEXTENTS 1 MAXEXTENTS 2147483645)					
  TABLESPACE "TBS_ODS" ;
  
  -- 序列号:类似mysql 随机数生成,生成整数
  create sequence ODS.SEQ_ODS_SQLPARSER					
minvalue 1					
maxvalue 999999999999999999999999999					
start with 1					
increment by 1					
cache 20;
 

-- 日志---> 存储过程

-- 创建存储过程

CREATE OR REPLACE PROCEDURE P_INSERT_LOG(					
   ACCT_MONTH#  VARCHAR2,					
   PKG_NAME#   VARCHAR2,							-- 定义字段			
   PROCNAME#    VARCHAR2,					
   PROV_ID#      VARCHAR2,					
   STARTDATE#   DATE,					
   TAB_NAME      VARCHAR2 DEFAULT NULL					
   ) IS					
  /*-------------------------------------------------------------------------------------------					
     过 程 名 : 生成存储过程日志信息					
     生成时间 :20071126					
     编 写 人 :KANGTAO					
     生成周期 :					
     执行时间 : ( 分钟)					
     使用参数 :					
     修改记录 :					
  -----------------------------------------------------------------------------------------------*/					
   V_TAB_NAME VARCHAR2(60);					
BEGIN					
  --日志部分, 把重复执行的过程的日志记录到日志历史表中					
  INSERT INTO ODS_EXECUTE_LOG_HIS					
      SELECT A.*, SYSDATE FROM ODS_EXECUTE_LOG A					
      WHERE ACCT_MONTH = ACCT_MONTH# --AND PKG_NAME=UPPER(PKG_NAME#)					
          AND PROCNAME = UPPER(PROCNAME#)  AND PROV_ID=PROV_ID# ;					
  DELETE ODS_EXECUTE_LOG					
   WHERE ACCT_MONTH = ACCT_MONTH# AND PKG_NAME=UPPER(PKG_NAME#)					
     AND PROCNAME = UPPER(PROCNAME#)  AND PROV_ID=PROV_ID#  ;					
  V_TAB_NAME := UPPER(NVL(TAB_NAME, SUBSTR(PROCNAME#,3)));					
  INSERT INTO ODS_EXECUTE_LOG					
    (ACCT_MONTH, PKG_NAME, PROCNAME, PROV_ID,  STARTDATE ,NOTE, TABLE_NAME)					
  VALUES					
    (ACCT_MONTH#, UPPER(PKG_NAME#), UPPER(PROCNAME#), PROV_ID#, STARTDATE# ,'开始', V_TAB_NAME);					
  COMMIT;					
END P_INSERT_LOG;		
commit
select * from user_procedures;

CREATE OR REPLACE PROCEDURE P_INSERT_SQLPARSER_LOG_GENERAL(					
   LOG_SN#      NUMBER, --运行日志序号					
   ACCT_MONTH#  VARCHAR2, --执行帐期					
   PROV_ID#     VARCHAR2, --执行省分代码					
   OWNER#       VARCHAR2, --脚本所在的用户					
   PROCNAME#    VARCHAR2, --脚本名称					
   V_PARA_STR#  VARCHAR2, --脚本程序输入参数  ,例如 V_MONTH=201103;V_PROV=010					
   STARTDATE#   Date , --脚本开始执行时间					
   table_name#  varchar2  --目标表					
					
   ) IS									
  /*-------------------------------------------------------------------------------------------					
     过 程 名 : 运行日志总体表					
     生成时间 :20110425					
     编 写 人 :JCM					
     生成周期 :					
     执行时间 :					
     使用参数 :					
     修改记录 :					
  -----------------------------------------------------------------------------------------------*/									
   V_MODIFY_DATE DATE; --脚本程序最近修改时间					
					
					
BEGIN									
 delete from SQLPARSER_LOG_GENERAL					
 where log_sn=LOG_SN#;					
 commit;					
								
 --获取脚本最近一次修改时间					
 SELECT max(LAST_DDL_TIME)					
     INTO V_MODIFY_DATE					
   FROM SYS.ALL_OBJECTS T					
  WHERE UPPER(OBJECT_NAME)=UPPER(PROCNAME#)					
    AND OWNER=upper(OWNER#); --					
							
        insert/*+append*/ into SQLPARSER_LOG_GENERAL nologging					
           (  LOG_SN  ,--  运行日志序号					
              ACCT_MONTH  ,--  脚本运行的帐期					
              OWNER  ,--  脚本所在的用户					
              PROG_NAME  ,--  脚本程序名					
              PROV_ID  ,--  脚本运行的省分代码					
              PROG_VERSION  ,--  脚本程序版本号					
              MODIFY_DATE  ,--  脚本程序最近修改时间					
              INPUT_PARA  ,--  脚本程序输入参数					
              BEGIN_TIME  ,--  脚本程序启动时间					
              END_TIME,  --  程序脚本结束时间					
              result ,					
              DURATION,  --脚本执行时长(秒)					
              note,					
              table_name					
          )					
					
        VALUES( LOG_SN# ,--运行日志序号					
                ACCT_MONTH#   ,--  脚本运行的帐期					
                upper(OWNER#)  ,--  脚本所在的用户					
                PROCNAME#   ,--  脚本程序名					
                PROV_ID#  ,--  脚本运行的省分代码					
                '1.0'  ,--  脚本程序版本号, 默认版本为 1.0					
                V_MODIFY_DATE  ,--  脚本程序最近修改时间					
                V_PARA_STR#  ,--  脚本程序输入参数					
                STARTDATE#  ,--  脚本程序启动时间					
                NULL  ,--  程序脚本结束时间					
                NULL, --运行结果					
                NULL, --脚本执行时长(秒)					
                NULL,					
                table_name# --目标表					
              );					
					
        COMMIT;					
					
					
					
END ;	

CREATE OR REPLACE PROCEDURE ODS.P_UPDATE_LOG(ACCT_MONTH#    VARCHAR2,					
                                         PKGNAME#       VARCHAR2,					
                                         PROCNAME#      VARCHAR2,					
                                         PROV_ID#       VARCHAR2,					
                                         NOTE#          VARCHAR2,					
                                         RESULT#        VARCHAR2,					
                                         ENDDATE#       DATE,					
                                         ROWLINE#       Number)					
IS					
  /*-------------------------------------------------------------------------------------------					
     过 程 名 : 生成更新日志信息					
     生成时间 :20100724					
     编 写 人 :TAOK					
     生成周期 :					
     执行时间 : (分钟)					
     使用参数 :日期					
  -----------------------------------------------------------------------------------------------*/					
BEGIN					
  UPDATE ODS_EXECUTE_LOG					
     SET ENDDATE  = ENDDATE#,					
         RESULT   = RESULT#,					
         DURATION = (ENDDATE# - STARTDATE) * 24 * 3600,					
         NOTE     = NOTE#,					
         ROW_COUNT = ROWLINE#					
   WHERE ACCT_MONTH = ACCT_MONTH#					
     AND PROCNAME = PROCNAME#					
     AND PROV_ID = PROV_ID# ;					
  COMMIT;					
					
END;

CREATE OR REPLACE PROCEDURE ODS.P_UPDATE_SQLPARSER_LOG_GENERAL(					
   LOG_SN#      NUMBER, --运行日志序号					
   result#      varchar2, --运行结果 SUCCESS /FAIL					
   note#        varchar2 --备注					
					
   ) IS					
					
  /*-------------------------------------------------------------------------------------------					
     过 程 名 : 运行日志总体表					
     生成时间 :20110425					
     编 写 人 :JCM					
     生成周期 :					
     执行时间 :					
     使用参数 :					
     修改记录 :					
  -----------------------------------------------------------------------------------------------*/					
					
					
					
BEGIN					
					
  UPDATE SQLPARSER_LOG_GENERAL  T					
  SET t.END_TIME=sysdate, --程序脚本结束时间					
      t.DURATION=(sysdate - t.BEGIN_TIME) * 24 * 3600, --脚本执行时长(秒)					
      t.result =result#, --					
      t.note=note#					
  where t.log_sn=LOG_SN# ;					
					
        COMMIT;					
END;					


-- 日志表,三个表,四个存储过程


-- stg 的数据加工到 ods

CREATE OR REPLACE PROCEDURE P_ODS_D_USE_BASE_INFO(
       V_DATE   IN  VARCHAR2,
       V_AREA   IN  VARCHAR2,
       V_RETCODE OUT VARCHAR2,
       V_RETINFO OUT VARCHAR2) AS

  /*@
  ****************************************************************
  *???? --%@NAME:   P_DWD_D_USE_BASE_INFO
  *???????? --%@COMMENT:????????????????????????
  *???????? --%@PERIOD:??
  *???? --%@PARAM:V_DATE ????,????YYYYMM
  *???? --%@PARAM:V_RETCODE  ????????????????????????
  *???? --%@PARAM:V_RETINFO  ????????????????????????
  *?????? --%@CREATOR:  liston
  *???????? --%@CREATED_TIME:2021-11-19
  *???? --%@REMARK:
  *???????? --%@MODIFY:
  *?????? --%@FROM:
  *?????? --%@TO:
  *???????? --%@MODIFY:
  ******************************************************************
  @*/

        V_PKG          VARCHAR2(30);
        V_TAB          VARCHAR2(300);
        V_PROCNAME     VARCHAR2(300);
        V_ROWLINE      NUMBER;
        V_COUNT        NUMBER;
       -- V_SQL          CLOB;
        V_LOG_SN       NUMBER;
        V_DATE_A1      VARCHAR2(8);
BEGIN
        V_PKG        := 'ODS_D_USE_BASE_INFO';                    -- ????????
        V_TAB        := 'ODS_D_USE_BASE_INFO';       -- ????
        V_PROCNAME   := 'P_ODS_D_USE_BASE_INFO';     -- ????????
        V_DATE_A1 :=TO_CHAR(TO_DATE(V_DATE,'YYYYMMDD')+1,'YYYYMMDD');
        SELECT SEQ_ODS_SQLPARSER.NEXTVAL
        INTO V_LOG_SN                                   --????????????
        FROM DUAL;

        
		--更新历史日志
        P_INSERT_SQLPARSER_LOG_GENERAL(
             V_LOG_SN,
             V_DATE,
             V_AREA,
             'ODS',
             V_PROCNAME,
             'V_DATE='|| V_DATE ||';V_PROV='|| V_AREA,
             SYSDATE,
             V_TAB);
-- 插入当前日志
        P_INSERT_LOG(
             V_DATE,
             V_PKG,
             V_PROCNAME,
             V_AREA,
             SYSDATE,
             V_TAB);
        -- ????????1  ????????????????
        EXECUTE IMMEDIATE '
        SELECT   count(1)
        FROM     ALL_TAB_SUBPARTITIONS									--建表时加了11个子分区
        WHERE    table_name = ''ODS_D_USE_BASE_INFO''					-- 范围分区里面加了list子分区
        AND      table_owner = ''ODS''
        AND      partition_name = ''PART_'||V_DATE||'''' INTO V_COUNT;

        IF V_COUNT != 11 THEN
        EXECUTE IMMEDIATE 'ALTER TABLE ODS.ODS_D_USE_BASE_INFO ADD PARTITION  PART_'||V_DATE||' VALUES LESS THAN ('''||V_DATE_A1||''')
                 TABLESPACE TBS_ODS
                 (
                  subpartition PART_'||V_DATE||'_SUBPART_01 values (''01'') tablespace TBS_ODS,
                  subpartition PART_'||V_DATE||'_SUBPART_02 values (''02'') tablespace TBS_ODS,
                  subpartition PART_'||V_DATE||'_SUBPART_03 values (''03'') tablespace TBS_ODS,
                  subpartition PART_'||V_DATE||'_SUBPART_04 values (''04'') tablespace TBS_ODS,
                  subpartition PART_'||V_DATE||'_SUBPART_05 values (''05'') tablespace TBS_ODS,
                  subpartition PART_'||V_DATE||'_SUBPART_06 values (''06'') tablespace TBS_ODS,
                  subpartition PART_'||V_DATE||'_SUBPART_07 values (''07'') tablespace TBS_ODS,
                  subpartition PART_'||V_DATE||'_SUBPART_08 values (''08'') tablespace TBS_ODS,
                  subpartition PART_'||V_DATE||'_SUBPART_09 values (''09'') tablespace TBS_ODS,
                  subpartition PART_'||V_DATE||'_SUBPART_10 values (''10'') tablespace TBS_ODS,
                  subpartition PART_'||V_DATE||'_SUBPART_11 values (''11'') tablespace TBS_ODS
 )
  ';
       -- EXECUTE IMMEDIATE V_SQL;
        END IF;

        -- 原始分区是否存在
        EXECUTE IMMEDIATE  '
        SELECT  COUNT(1)  CNT
        FROM    STG.STG_D_USE_BASE_INFO
        WHERE   DATE_ID ='''|| V_DATE ||'''						--转义
        AND     area_id ='''|| V_AREA ||'''
        AND      rownum < 2
        '
        into
        V_COUNT;

IF V_COUNT = 1
					--清空分区不怕数据重复,存储过程多次测试,执行首先清空分区
THEN
        EXECUTE IMMEDIATE 'ALTER TABLE ODS.ODS_D_USE_BASE_INFO TRUNCATE SUBPARTITION PART_'|| V_DATE ||'_SUBPART_'|| V_AREA ;
       -- EXECUTE IMMEDIATE V_SQL;
        EXECUTE IMMEDIATE 'INSERT INTO  ODS.ODS_D_USE_BASE_INFO NOLOGGING
                  SELECT DATE_ID,
                         AREA_ID,
                         USER_ID,
                         DEVICE_NUMBER,
                         SERVICE_TYPE,
                         INNET_DATE,
                         ROUND(MONTHS_BETWEEN(TO_DATE(DATE_ID,''YYYY-MM-DD''),TO_DATE(INNET_DATE,''YYYY-MM-DD'')),2) INNET_MONTHS
                  FROM   STG.STG_D_USE_BASE_INFO
                   WHERE  USER_ID IS NOT NULL
                  AND  TO_NUMBER(INNET_DATE)<=TO_NUMBER(DATE_ID)
                  AND  DATE_ID='''|| V_DATE ||'''
                  AND  AREA_ID='''|| V_AREA ||'''';

      --EXECUTE IMMEDIATE V_SQL;

         V_ROWLINE := SQL%ROWCOUNT;				--ROWCOUNT:数据行数
         COMMIT;
         V_RETCODE := 'SUCCESS';
         V_RETINFO := '????';

ELSE
         V_RETCODE := 'WAIT';
         V_RETINFO := '????????';
END IF;

         -- ????????????
         P_UPDATE_LOG(
                V_DATE,
                V_PKG,
                V_PROCNAME,
                V_AREA,
                V_RETINFO,
                V_RETCODE,
                SYSDATE,
                V_ROWLINE);

         P_UPDATE_SQLPARSER_LOG_GENERAL(
                V_LOG_SN,
                V_RETCODE,
                V_RETINFO);

EXCEPTION WHEN OTHERS THEN
         V_RETCODE := 'FAIL';
         V_RETINFO := SQLERRM;

         P_UPDATE_LOG(
                V_DATE,
                V_PKG,
                V_PROCNAME,
                V_AREA,
                V_RETINFO,
                V_RETCODE,
                SYSDATE,
                V_ROWLINE);

         P_UPDATE_SQLPARSER_LOG_GENERAL(
                V_LOG_SN,
                V_RETCODE,
                V_RETINFO);
END;
-- ods
grant all privileges to ods;、
--stg
-- 创建表
-- ods 用户下,新建表及对应存储过程,(清洗数据,沉淀有用的数据)

create table ODS.ODS_D_USE_BASE_INFO
(					
date_id      VARCHAR2(8),
area_id      VARCHAR2(10),
user_id      VARCHAR2(50),
device_number VARCHAR2(11),
service_type VARCHAR2(8),
innet_date  VARCHAR2(8),
innet_months NUMBER
)
TABLESPACE TBS_ODS
PARTITION BY RANGE(date_id)
SUBPARTITION BY LIST(area_id)
(
 PARTITION PART_20190401 VALUES LESS THAN ('20190402')
 TABLESPACE TBS_ODS
 (
  subpartition PART_20190401_SUBPART_01 values ('01') tablespace TBS_ODS,
  subpartition PART_20190401_SUBPART_02 values ('02') tablespace TBS_ODS,
  subpartition PART_20190401_SUBPART_03 values ('03') tablespace TBS_ODS,
  subpartition PART_20190401_SUBPART_04 values ('04') tablespace TBS_ODS,	
  subpartition PART_20190401_SUBPART_05 values ('05') tablespace TBS_ODS,	
  subpartition PART_20190401_SUBPART_06 values ('06') tablespace TBS_ODS,
  subpartition PART_20190401_SUBPART_07 values ('07') tablespace TBS_ODS,
  subpartition PART_20190401_SUBPART_08 values ('08') tablespace TBS_ODS,
  subpartition PART_20190401_SUBPART_09 values ('09') tablespace TBS_ODS,
  subpartition PART_20190401_SUBPART_10 values ('10') tablespace TBS_ODS,
  subpartition PART_20190401_SUBPART_11 values ('11') tablespace TBS_ODS
 )
);
-- 创建索引
CREATE INDEX ODS.IDX_SDUBI_DATE_ID ON ODS.ODS_D_USE_BASE_INFO (DATE_ID) TABLESPACE TBS_ODS;
CREATE INDEX ODS.IDX_SDUBI_AREA_ID ON ODS.ODS_D_USE_BASE_INFO (AREA_ID) TABLESPACE TBS_ODS;
CREATE INDEX ODS.IDX_SDUBI_USER_ID ON ODS.ODS_D_USE_BASE_INFO (USER_ID) TABLESPACE TBS_ODS;
CREATE INDEX ODS.IDX_SDUBI_DN ON ODS.ODS_D_USE_BASE_INFO (DEVICE_NUMBER) TABLESPACE TBS_ODS;	
CREATE INDEX ODS.IDX_SDUBI_ST ON ODS.ODS_D_USE_BASE_INFO (SERVICE_TYPE) TABLESPACE TBS_ODS;
-- 在表上面,列上面的索引

COMMENT ON TABLE  ODS.ODS_D_USE_BASE_INFO IS '用户基础信息';
COMMENT ON COLUMN ODS.ODS_D_USE_BASE_INFO.date_id is '日期ID';
COMMENT ON COLUMN ODS.ODS_D_USE_BASE_INFO.area_id is '地市ID';
COMMENT ON COLUMN ODS.ODS_D_USE_BASE_INFO.user_id is '用户ID';
COMMENT ON COLUMN ODS.ODS_D_USE_BASE_INFO.device_number is '手机号码';
COMMENT ON COLUMN ODS.ODS_D_USE_BASE_INFO.service_type is '业务类型';
COMMENT ON COLUMN ODS.ODS_D_USE_BASE_INFO.innet_date is '入网日期';
COMMENT ON COLUMN ODS.ODS_D_USE_BASE_INFO.innet_months is '在网时长';

commit;

select date_id,count(*) from stg.stg_d_use_base_info group by date_id;
select date_id,count(*) from ods.ods_d_use_base_info group by date_id;
select * from ods.ods_execute_log;
select * from ods.ods_execute_log_his;
-- 存储过程完了之后关闭任务 
-- 创建函数
create or replace function F_LOAD_MONTH_INFO(
          v_date varchar2
          )
          RETURN varchar2
as
          -- v_date varchar2(50) := '20190401';
          -- v_area varchar2(10) := '07' ;
          v_retcode varchar2(100);
          v_retinfo varchar2(100);
          v_area varchar2(2);
          i number;
     begin
       for t in 1..11 loop
         v_area:= to_char(t);
         i := length(v_area);
         if i = 1 then
           v_area := '0'||v_area;
           end if;
           p_ods_d_use_base_info(v_date,v_area,v_retcode,v_retinfo);
           end loop;
           return v_retcode||v_retinfo;
           --p_ods_d_use_base_info(v_date,v_retcode,v_retinfo);
           end;
 -- 调用函数
 
declare
    v_date varchar2(50);
    v_area varchar2(10):= '07';
    v_retcode varchar2(100);
    -- v retinfo varchar2(100);
    -- v area varchar2(2);
    --i number ;

BEGIN
v_retcode:= F_LOAD_MONTH_INFO('20190401');
v_retcode:= F_LOAD_MONTH_INFO('20190402');
v_retcode:= F_LOAD_MONTH_INFO('20200301');
v_retcode:= F_LOAD_MONTH_INFO('20200302');
v_retcode:= F_LOAD_MONTH_INFO('20200401');
v_retcode:= F_LOAD_MONTH_INFO('20200402');
dbms_output.put_line(v_retcode);
END;
--
declare
v_area varchar2(2);
i number;
begin
       for t in 1..11 loop 
         v_area:= to_char(t);
         i := length(v_area);
         if i = 1 then
         v_area := '0'||v_area;
         end if;
         dbms_output.put_line(v_area);
         end loop;
         commit;
end;
--存储过程调用存储过程
declare
         v_date varchar2(8);
         v_area varchar2(2);
         v_retcode varchar2(100);
         v_retinfo varchar2(100);
         i number;
begin
          for t in 1..11 loop
          v_area:= to_char(t);
          i := length(v_area);
          if i = 1 then
          v_area :='0'||v_area;
          end if;
          ODS.P_ODS_D_USE_BASE_INFO('20190401',v_area,v_retcode,v_retinfo);
          ODS.P_ODS_D_USE_BASE_INFO('20190402',v_area,v_retcode,v_retinfo);
          ODS.P_ODS_D_USE_BASE_INFO('20200301',v_area,v_retcode,v_retinfo);
          ODS.P_ODS_D_USE_BASE_INFO('20200302',v_area,v_retcode,v_retinfo);
          ODS.P_ODS_D_USE_BASE_INFO('20200401',v_area,v_retcode,v_retinfo);
          ODS.P_ODS_D_USE_BASE_INFO('20200402',v_area,v_retcode,v_retinfo);
          end loop;
          dbms_output.put_line(v_retinfo);
end;














=

 

 

 

 

 

 

 

 

 

 

 

 

 

创建函数

调用函数

存储过程调用存储过程

挂任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值