hive存储过程示例

--第一种:正常的存储
	CREATE OR REPLACE PROCEDURE CDP_PRO_TRUC_XXXX(v_date IN String)                             
	is																							
	--声明变量                                                                                  
	v_pro_name String                                                                           
	v_sql  String                                                                               
	v_step int                                                                                  
	error_meg String                                                                            
	begin                                                                                       
		---v_date  yyyy-mm-dd                                                                   
		---业务模块:XXXXXXX                                                                    
		---开发日期:2020-04-21                                                                 
		---开发人:XXXXX                                                                         
	--如果需要给变量赋初始值                                                                    
	v_step  := 0;                                                                               
	v_pro_name   := 'CDP_PRO_TRUC_XXXX';                                                        
	v_date := replace(v_date,'-','');                                                           
	--手动判断源表
	 IF (V_STEP = 0) THEN
	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'0')
	
	--0.1 取来源表和结果表的最大日期
	select to_char(date(max(txdate)),'yyyy-mm-dd') into person_base_date from jyt_t_personal_base_info; -- 2021-07-07
	select to_char(max(txdate),'yyyy-mm-dd') into base_info_date from ndata.CMT_EBC_BASE_INFO; -- 基本信息表 2021-07-08
	select to_char(max(txdate),'yyyy-mm-dd') into cbk_cls_date  from ndata.LGF_PK_CBK_CLS; -- 渠道信息表 2021-07-08
	
	SELECT to_char(date(max(txdate)),'yyyy-mm-dd') into change_maxdate FROM jyt_t_wy_sjyh_change ; --20210705 2021-07-05
	dbms_output.put_line('结果表最大日期:'||change_maxdate);
	
	--0.2 根据参数判断数据执行日期,如果参数无效根据结果表日期去计算;
	if (v_date is null or v_date = '') then
		-- 判断结果日期是否为空,为空则赋值铺底日期上个周期的数据
		if (change_maxdate is null or change_maxdate = '') then
		change_maxdate := '2021-07-06';
		end if ;
		-- 计算下一次执行日期
		--select to_char(add_months(to_date(change_maxdate, 'YYYY-MM-DD'),1),'YYYY-MM-DD') into next_exec_date  FROM DUAL;
		select DATE_ADD(change_maxdate, 1) into next_exec_date   FROM system.DUAL;
	else
		next_exec_date := v_date;
	end if;
	--0.3 比较执行日期和源表日期,不符合要求不执行
		if (next_exec_date > person_base_date or next_exec_date > base_info_date or next_exec_date > cbk_cls_date ) then
			dbms_output.put_line('不执行');
			-- 如果未满足条件,则删除文本表,防止数据重复插入
			v_sql := 'truncate table jyt_wy_sjyh_change_x'
			execute immediate v_sql; 
		V_STEP := V_STEP + 100;
		dbms_output.put_line('不正常执行,执行的步数:'||V_STEP);
		else
		dbms_output.put_line('执行');
		end if;
	-- 需要使用去掉“-’的日期
	next_exec_date_trim := replace(next_exec_date,'-','');
	dbms_output.put_line('执行日期为: '||next_exec_date);
	dbms_output.put_line('执行日期去掉‘-’为: '||next_exec_date_trim);
	dbms_output.put_line('jyt_t_personal_base_info最大日期为: '||person_base_date);
	dbms_output.put_line('基本信息表的最大日期: '||base_info_date);
	dbms_output.put_line('渠道信息表最大日期: '||cbk_cls_date);
	
	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'1')
	V_STEP := V_STEP + 1;
	END IF;
	
	if (v_step = 1)  then                                                                      
	---按步骤执行 脚本日志监控                                                                 
	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'0')                 
																								
	v_sql := 'truncate table CDP_XXXXXXXX';                                                    
	DBMS_OUTPUT.PUT_LINE(v_sql);                                                               
	execute immediate v_sql;                                                                   
	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'1')                 
	v_step :=v_step+1
	end IF
	
	exception
	when others then
	error_meg:=sqlerrm
	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),error_meg,'e')
	return
	end CDP_PRO_TRUC_XXXX;	
--存储调起
DECLARE 
yb_max_date STRING
result_max_date string
BEGIN 
	
	yb_max_date:= '2022-02-22';
	result_max_date := '2022-02-22'
	WHILE result_max_date < yb_max_date AND result_max_date <> ''
	LOOP 
	   result_max_date := date_add(result_max_date,1)
	  	dbms_output.put_line(result_max_date);
        --CDP_PRO_T_EMP_INFO_DAY(result_max_date);
	END LOOP
END 	


----第二种:数据中台,任务调度存储
--	CREATE OR REPLACE PROCEDURE  CDP_PRO_RGS_XXXX (v_date IN String)
--	is
--		v_pro_name String
--		v_sql  String 
--		v_step int
--		error_meg String 
--	begin
--		/**
--		*存储入参及格式: v_date  yyyy-mm-dd                
--		*业务模块:数据中台——贵金属存储
--		*开发日期:2020-06-17              
--		*开发人: 张晓波                     
--		*/
--		v_step  := 1
--		v_pro_name   := 'CDP_PRO_RGS_XXXX'
--		---脚本最开始 将执行状态置为 正在执行
--		UPDATE cdp_t_pro_status t SET t.is_running='0' ---0正在执行  1执行完毕
--		WHERE t.pro_name=v_pro_name;
--		--调度表    插入本存储最新一条的状态status
--		CDP_PRO_INSERT_JOB_BEG(v_pro_name,v_date);
--	
--	if (v_step = 1)  then
--	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'0')
--		v_sql := 'truncate table CDP_T_RGS_INFO';
--		DBMS_OUTPUT.PUT_LINE(v_sql);                                                               
--		execute immediate v_sql
--	
--	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'1')
--	v_step :=v_step+1
--	end IF	
--	if (v_step = 2)  then
--	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'0')
--		v_sql := 'truncate table CDP_T_RGS_INFO_MERGE'
--		execute immediate v_sql		
--		--插入数据,满足条件就更新,不满足就插入一条
--		MERGE INTO cpd_t_cust_label p1
--		USING CDP_T_RGS_INFO_MERGE p2
--		ON (p1.CUST_BASE_ZZHM = p2.cert_code)
--		when matched then
--			update
--				SET
--				p1.prod_is_gjs = '1'
--		WHEN NOT MATCHED THEN
--		INSERT (cust_base_zzhm,prod_is_gjs)
--		values(cert_code,'1');
--		--更新剩余不为空的值
--		UPDATE cpd_t_cust_label SET prod_is_gjs = '0' WHERE  prod_is_gjs IS NULL;	
--	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'1')
--	v_step :=v_step+1
--	end IF	
--	if (v_step = 3)  then
--	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'0')
--		--脚本结束
--		UPDATE cdp_t_pro_status t SET t.is_running='1' ---0正在执行  1执行完毕
--		WHERE t.pro_name=v_pro_name;
--		--更新结果表 日期以及设定下次需要执行日期exectime
--		CDP_PRO_UPD_JGTABEL(replace(v_pro_name,'_PRO_','_T_')); ---注意此处参数为表名
--	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'1')
--	v_step :=v_step+1
--	end IF	
--	if (v_step = 4)  then
--	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'0')
--		--调度表,更新是否可以执行状态(挂起存储)
--		CDP_PRO_INSERT_JOB_END(v_pro_name);  --注意此处参数为存储名
--	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),v_date,'1')
--	v_step :=v_step+1
--	end IF
--	exception
--	when others then
--	error_meg:=sqlerrm
--	CDP_PRO_LOG(v_pro_name,v_step,to_char(sysdate,'yyyyMMddhhmmss'),error_meg,'e')
--	return
--	END CDP_PRO_RGS_XXXX;	
--	--调用存储过程
--	--CALL CDP_PRO_RGS_XXXX("2020-06-07");

你可能感兴趣的:(hive,hive)