Linux中定時執行DB2的存儲過程


一、需求說明

  將DB2中的實時數據按天和小時匯總到匯總表中。

 

二、過程及步驟

  第一步:編寫DB2存儲過程。

  1. 在Dbvisualizer中新建SQL editor。

  2. 代碼:

 1 --/
 2 CREATE PROCEDURE "NCPOLLDATA"."AGGREGATE_ENTITY_DAILY"
 3 ()
 4 LANGUAGE SQL
 5 SPECIFIC SQL160427123206300
 6 BEGIN
 7   --declare varibles
 8   DECLARE V_PREFIX_TIME VARCHAR(7);
 9   DECLARE V_START_TIME VARCHAR(16);
10   DECLARE V_END_TIME VARCHAR(16);
11   DECLARE V_AGGREGATE_TIMESTAMP BIGINT DEFAULT 0;
12   DECLARE V_YEAR_VALUE INTEGER DEFAULT 0;
13   DECLARE V_MONTH_VALUE INTEGER DEFAULT 0;
14   DECLARE V_AGGREGATE_TIME TIMESTAMP;
15   --set varibles value
16   SET V_PREFIX_TIME = ('1' || REPLACE(SUBSTR(CHAR(current_timestamp - 1 DAYS), 3, 9), '-', ''));
17   SET V_START_TIME = V_PREFIX_TIME || '000000000';
18   SET V_END_TIME = V_PREFIX_TIME || '235959999';
19   SET V_YEAR_VALUE = YEAR(current_timestamp - 1 DAYS);
20   SET V_MONTH_VALUE = MONTH(current_timestamp - 1 DAYS);
21   SET V_AGGREGATE_TIME = current_timestamp - 1 DAYS;
22   SET V_AGGREGATE_TIMESTAMP = TIMESTAMPDIFF(2, CHAR(current_timestamp - TIMESTAMP('1970-01-01-00.00.00')));
23   --action
24   FOR TEMP_CUR AS 
25     SELECT t1.MONITOREDOBJECTID AS "POLICY_ID", t2.MAINNODEENTITYID AS "ENTITY_ID", 
26     MIN(VALUE) AS "MIN_VALUE", MAX(VALUE) AS "MAX_VALUE",  AVG(BIGINT(VALUE)) AS "AVG_VALUE", 
27     COUNT(VALUE) AS "DATA_COUNT", SUM(BIGINT(VALUE)) AS "DATA_SUM" 
28     FROM POLLDATA t1 LEFT JOIN MONITOREDINSTANCE t2 ON t1.MONITOREDINSTID = t2.MONITOREDINSTID 
29     WHERE t1.TDWTIME BETWEEN V_START_TIME AND V_END_TIME 
30     GROUP BY t1.MONITOREDOBJECTID, t2.MAINNODEENTITYID 
31     ORDER BY t1.MONITOREDOBJECTID, t2.MAINNODEENTITYID
32   DO 
33   --insert statement
34     INSERT INTO POLLDATA_ENTITY_DAILY 
35     VALUES (TEMP_CUR.POLICY_ID, TEMP_CUR.ENTITY_ID, V_AGGREGATE_TIMESTAMP, 
36       V_YEAR_VALUE, V_MONTH_VALUE, V_AGGREGATE_TIME, 
37       TEMP_CUR.MIN_VALUE, TEMP_CUR.MAX_VALUE, TEMP_CUR.AVG_VALUE, TEMP_CUR.DATA_COUNT, TEMP_CUR.DATA_SUM); 
38   END FOR;
39 END
40 /

  注意:在Dbvisualizer中編寫DB2存儲過程,第一行的 --/  和最后一行的 / 是必不可少的否則報錯。

  3. 執行存儲過程: 點擊Dbvisualizer的存儲過程編輯框的執行按鈕即可,也可以在命令行中執行call procedure_name。

 

  第二步:編寫可在Linux系統執行的腳本命令。

#!/bin/sh

DB2_HOME=/opt/IBM/tivoli/netcool/platform/linux2x86/db2

PATH=$DB2_HOME/bin:$PATH

export $DB2_HOME

export $PATH

startTime=`date +%Y%m%d%H%M%S`

echo $startTime

echo "開始執行腳本"

db2 connect to REPORTER user username using password

echo "連接上數據庫,開始執行腳本"

db2 "call NCPOLLDATA.AGGREGATE_ENTITY_DAILY()"

endTime=`date +%Y%m%d%H%M%S`

echo $endTime

echo "腳本執行完畢!關閉數據庫連接"

db2 terminate

 

  以上命令參考資料:http://blog.csdn.net/sweetbowie/article/details/19614289

 

  第三步:設置crond服務隨Linux系統自啟動

  root@localhost ~]# /etc/init.d/crond restart

  如果讓crond在開機時運行,應該改變其運行級別

  [root@localhost ~]# chkconfig --levels 35 crond on

 

  【相關資料鏈接】

  1. http://blog.csdn.net/sweetbowie/article/details/19614289

  2. http://www.linuxidc.com/Linux/2012-02/54391.htm

  3. http://blog.csdn.net/liu_xing_hui/article/details/6565804/

  4. http://blog.csdn.net/lulei9876/article/details/9170151

  5. http://blog.csdn.net/jiujie395/article/details/8692655

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM