动态卸载分区表数据

此存储过程实现动态卸载分区表数据。

SET SCHEMA TMISUSR ;


SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","TMISUSR";


CREATE PROCEDURE "TMISUSR"."PRC_BATCH_DETACH_DATA"
 (IN "PI_D_ACCT" DATE, 
  IN "PI_S_SCHEMA" VARCHAR(20), 
  OUT "PO_I_RETCODE" INTEGER, 
  OUT "PO_S_RETTEXT" VARCHAR(2048), 
  OUT "PO_S_STMT" VARCHAR(4096)
 ) 
  SPECIFIC "TMISUSR"."SQL100810165810100"
  DYNAMIC RESULT SETS 1
  LANGUAGE SQL
  NOT DETERMINISTIC
  CALLED ON NULL INPUT
  EXTERNAL ACTION
  OLD SAVEPOINT LEVEL
  MODIFIES SQL DATA
  INHERIT SPECIAL REGISTERS
  ------------------------------------------------------------------------
-- SQL 存储过程 
-- 功能 : 动态卸载分区表数据 
-- 调用时机:月末日切前
-- db2 "call  PROC_BATCH_DETACH_DATA('2006-08-01','tmisusr',?,?,?)"
------------------------------------------------------------------------
P1:BEGIN
DECLARE V_s_Stmt VARCHAR(8192) DEFAULT '';
DECLARE V_s_AllStmt VARCHAR(8192) DEFAULT '';
declare v_s_ErrMsg varchar(1024);--错误原因描述
declare SQLCODE INT;
declare SQLSTATE CHAR(5);

-- 声明异常处理
--declare continue handler for SQLSTATE '02000'
-- begin
-- end;
declare exit handler for SQLEXCEPTION
begin
GET DIAGNOSTICS EXCEPTION 1 v_s_ErrMsg = MESSAGE_TEXT;
   values(SQLCODE,'动态卸载分区表数据错误,错误状态:'||SQLSTATE||'说明:'||v_s_ErrMsg,v_s_Stmt) into po_i_RetCode,po_s_RetText,po_s_Stmt;
end;


IF DAY(pi_d_Acct + 1 days) <> 1 THEN
SIGNAL SQLSTATE '22007' SET MESSAGE_TEXT = '调用参数:清理日期必须为月末 !';
END IF;
   
    FOR v_Par AS SELECT TABNAME,DATAPARTITIONNAME 
    FROM TABLE
    (
    select TABNAME,DATAPARTITIONNAME 
from syscat.datapartitions a , td_multitbl_design b 
where 
   a.TABSCHEMA = UPPER(pi_s_Schema) 
--Before Pef:   
--AND POSITION(b.S_TBLNAME,UPPER(a.TABNAME),OCTETS) <> 0
--After Per:
AND a.TABNAME >= UPPER(b.S_TBLNAME) AND a.TABNAME < UPPER(b.S_TBLNAME)||'99'
AND 
(
( a.LOWVALUE = ''''||CHAR((pi_d_Acct + 1 days - b.I_SAVETERM years),ISO )||''''  AND b.S_SWITCHFREQ = '1' )
OR 
( a.LOWVALUE = CAST(((YEAR(pi_d_Acct + 1 days) - b.I_SAVETERM )*100 + MONTH(pi_d_Acct + 1 days)) AS CHAR(6)) AND b.S_SWITCHFREQ = '2' )
OR
( a.LOWVALUE = CAST((YEAR(pi_d_Acct + 1 days) - b.I_SAVETERM ) AS CHAR(4))   AND b.S_SWITCHFREQ = '3' )  
)
    ) AS TMP DO
    SET V_s_Stmt = 'ALTER TABLE '||v_Par.TABNAME||' DETACH PARTITION '||v_Par.DATAPARTITIONNAME||' INTO PAR_TMP ' ;
   SET V_s_AllStmt = V_s_AllStmt||V_s_Stmt||' ; ' ; 
PREPARE s1 FROM V_s_Stmt;
   execute s1;
   DROP TABLE PAR_TMP;   
    END FOR;
    IF V_s_AllStmt = '' THEN
    values(SQLCODE,'目前没有需要卸载分区表数据',V_s_AllStmt ) into po_i_RetCode,po_s_RetText,po_s_Stmt;    
    ELSE
   values(SQLCODE,'动态卸载分区表数据成功',V_s_AllStmt) into po_i_RetCode,po_s_RetText,po_s_Stmt;        
    END IF;
END P1;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值