CREATE PROCEDURE p_fact_xxx
AS
DECLARE @step INTEGER --获取本次处理距离当前最大时间间隔
DECLARE @LogLimit INTEGER --获取本次处理最大时间间隔
DECLARE @BeginTime DATETIME --获取本次处理开始时间
DECLARE @EndTime DATETIME --获取本次处理结束时间
DECLARE @Num INTEGER --获取是否存在此次任务
DECLARE @TimeTemp VARCHAR(20) --时间临时中间变量
DECLARE @StatSecTime INTEGER --每次处理的步增情况,默认为1,即1小时
DECLARE @LastLogTime DATETIME --每次处理的当前时间点
DECLARE @Status VARCHAR(20) --本次处理的状态,EXCEPTION和FINISHED两种情况
DECLARE @CancelFlag INTEGER --取消情况,1和0
BEGIN
SELECT @StatSecTime = 1
--获取上次处理的最后时间,状态和取消情况
SELECT @LastLogTime = LastLogTime,@Status = Status,@CancelFlag = CancelFlag
FROM t_fact_RunStatus
WHERE UPPER(factProcName) = UPPER('p_fact_table')
--假如为取消该任务,则直接退出
IF @CancelFlag = 1 OR @CancelFlag IS NULL
RETURN
--判断是否存在此次任务
SELECT @Num = COUNT(factProcName) FROM t_fact_RunStatus
WHERE UPPER(factProcName) = UPPER('p_fact_table')
--存在更新任务状态,没有则新增一个任务
IF @Num = 1
UPDATE t_fact_RunStatus set Status = 'RUNNING',CurTime=GETDATE()
WHERE UPPER(factProcName) = UPPER('p_fact_table')
ELSE
BEGIN
IF @Num > 1
DELETE FROM t_fact_RunStatus
WHERE UPPER(factProcName) = UPPER('p_fact_table')
INSERT INTO t_fact_RunStatus(factProcName, factDesc, factType,Status, LogLimit, Step, CancelFlag,CurTime)
VALUES(UPPER('p_fact_table'), 'XXXXXX', 60,'RUNNING', 24, 120, 0,GETDATE())
END
--获取本次任务开始的开始时间和结束时间
BEGIN
--如果任务没有正常终结,则从事实表中获取
--否则获取通过配置表获取,不过此处存在一定风险,既没有考虑到事实上的时间盲点
IF @Status != 'FINISHED'
SELECT @BeginTime = DATEADD(hh,@StatSecTime,max(LogDate)) FROM t_fact_table
ELSE
SELECT @BeginTime = DATEADD(hh,@StatSecTime,@LastLogTime)
IF @BeginTime IS NULL
SELECT @BeginTime = MIN(LogDate) FROM t_org_table
IF @BeginTime IS NULL
BEGIN
UPDATE t_fact_RunStatus SET Status = 'EXCEPTION'
WHERE UPPER(factProcName) = UPPER('p_fact_table')
RETURN
END
--时间取整,此处为整点小时
SELECT @TimeTemp = CONVERT(VARCHAR, @BeginTime,112)
SELECT @TimeTemp = @TimeTemp + ' ' + DATENAME(hour, @BeginTime)
SELECT @TimeTemp = @TimeTemp + ':' + '00:00'
SELECT @BeginTime = CONVERT(DATETIME, @TimeTemp)
--获取距离当前时间最大间隔和当前处理的最大间隔
SELECT @Step = ISNULL(Step, 120),@LogLimit = ISNULL(LogLimit, 24)
FROM t_fact_RunStatus
WHERE UPPER(factProcName) = UPPER('p_fact_table')
SELECT @EndTime = DATEADD(minute, -@step, getdate())
--如果要处理的时间间隔大于指定间隔,则从原始记录表中获取开始时间和结束时间
--否则直接对结束时间进行截取
IF DATEDIFF(hour, @BeginTime, @EndTime) > @LogLimit
BEGIN
SELECT @BeginTime = MIN(LogDate) FROM t_org_table WHERE LogDate >= @BeginTime
SELECT @TimeTemp = CONVERT(VARCHAR, @BeginTime,112)
SELECT @TimeTemp = @TimeTemp + ' ' + DATENAME(hour, @BeginTime)
SELECT @TimeTemp = @TimeTemp + ':' + '00:00'
SELECT @BeginTime = CONVERT(DATETIME, @TimeTemp)
SELECT @EndTime = DATEADD(HOUR, @LogLimit, @BeginTime)
END
ELSE
BEGIN
SELECT @TimeTemp = CONVERT(VARCHAR, @EndTime,112)
SELECT @TimeTemp = @TimeTemp + ' ' + DATENAME(hour, @EndTime)
SELECT @TimeTemp = @TimeTemp + ':' + '00:00'
SELECT @EndTime = CONVERT(DATETIME, @TimeTemp)
END
END
--更新开始和结束时间
UPDATE t_fact_RunStatus
SET BeginTime = @BeginTime,
EndTime = @EndTime
WHERE UPPER(factProcName) = UPPER('p_fact_table')
--为了减少系统压力,循环进行数据处理
WHILE @BeginTime < @EndTime
BEGIN
BEGIN TRAN Tran_Fact
INSERT INTO t_fact_table
(
LogDate,
Dim1 ,
Dim2 ,
Measure1 ,
Measure2
)
SELECT
@BeginTime,
Dim1,
Dim2,
SUM(Value1),
SUM(Value2)
FROM t_org_table a
WHERE LogDate >= @BeginTime
AND LogDate < DATEADD(hour,@StatSecTime, @BeginTime)
GROUP BY Dim1,Dim2
IF @@ERROR <> 0
GOTO FAIL
--每次处理完,必须更新当前的时间标志
UPDATE t_fact_RunStatus
SET LastLogTime=@BeginTime,
CurTime = GETDATE(),
Status = 'FINISHED'
WHERE UPPER(factProcName) = UPPER('p_fact_table')
COMMIT TRAN Tran_Fact
SELECT @BeginTime = DATEADD(hour, @StatSecTime, @BeginTime)
END
RETURN
FAIL:
ROLLBACK TRAN Tran_Fact
UPDATE t_fact_RunStatus
SET Status = 'EXCEPTION',
LastLogTime=@BeginTime
WHERE UPPER(factProcName) = UPPER('p_fact_table')
RETURN 0
END
|
相关推荐
精品软件工具--适用于多孔材料吸附性质模拟软件——RASPA的脚本工具集合,可用于并行计算等温线、高通量模拟,zeo+
git仓库————迁移脚本
通过函数封装加减乘除运算,实现一个简易的计算器。 实现背景 1、print函数中,多行文字 ‘’’ ‘’’ 的使用 2、input输入内容为字符串,input()内文字可做提示词 3、为方便使用,我们经常将常用的...
打开PS文件后——文件——脚本——浏览——找到文件就可以了
Python3编写实用脚本程序——处理Excel数据原表...Python3编写实用脚本程序——处理Excel数据原表保存.zipPython3编写实用脚本程序——处理Excel数据原表保存.zipPython3编写实用脚本程序——处理Excel数据原表保存.zip
放入centos服务器中解压,可配置化进行mysql从某张表到历史表的数据迁移。该脚本可根据表中日期进行数据的定时迁移
3DS MAX高级编程——使用脚本制作动画。不错的教材
恺撒加密的python实现,CTF必备,小游戏很好,恺撒加解密(Caesar cipher)——python脚本实现
3ds_max_script_高级编程——使用脚本制作动画
第一次接触linux系统,之前写的数据导出不好使了。原因是程序放在root用户下,要runtime执行exp的话,root不认exp命令;找了好多资料,最后决定写个shell脚本;没接触过shell脚本,网上...只是最简单的数据表的导出备份
SIMATIC WINCC V7.5使用C脚本通过画面结合结构变量实现多个电机的控制功能
2、能够批量导出sql库中需要的一些小表数据。 4、自动解析oracle连接配置,支持不安装sqlplus备份oracle中某个用户的所有对象脚本,方便备份。 5.能够批量导出oracle用户下的重要的小表数据。 6.如果有用户下载此...
这个脚本实现了跨服务器增量同步mysql数据的功能,可以同步多个表。 在使用这个脚本的时候需要注意有修改的地方就是源表配置、目标表配置需要修改成自己的服务器和登录mysql数据库的用户名和密码。基础配置中需要...
使用脚本批量修改本地管理员密码,大大方便了网络管理员工作
JBPM采购申请系统——07_JBPM中的脚本语言.7z JBPM采购申请系统——07_JBPM中的脚本语言.7z JBPM采购申请系统——07_JBPM中的脚本语言.7z JBPM采购申请系统——07_JBPM中的脚本语言.7z JBPM采购申请系统——07_JBPM...
如何在STEP7 WINCC中编写脚本实现2个PLC之间的数据交换?
顺风数据库工具(生成sql脚本)顺风数据库工具(生成sql脚本)顺风数据库工具(生成sql脚本)顺风数据库工具(生成sql脚本)
Unity3D脚本:飞行模拟的实现代码1
The cons of Lua are as follows:Lua的不足:· The documentation has improved b
Flash中动作面板与动作脚本的应用——动作脚本中的术语.pdf 学习资料 复习资料 教学资源