【问题标题】:Alter tablespace through stored procedure on db2通过 db2 上的存储过程更改表空间
【发布时间】:2019-01-29 12:31:30
【问题描述】:

我正在尝试编写一个存储过程,用于在 db2 中删除分区后回收磁盘空间。

CREATE OR REPLACE PROCEDURE RECLAIM_PARTITION_SPACE(OUT RESPONSE_MESS 
VARCHAR(200))
LANGUAGE SQL
BEGIN   
DECLARE REDUCE_STOP VARCHAR(200);
DECLARE LOWER_HIGH_WATER_MARK VARCHAR(200);
DECLARE REDUCE_MAX VARCHAR(200);
DECLARE V_MSG VARCHAR(80);
DECLARE V_OUTSTATUS INTEGER DEFAULT 0;
DECLARE V_SECONDS INTEGER DEFAULT 300;

SET REDUCE_STOP = 'ALTER TABLESPACE TS_PART_TABLES REDUCE STOP';
SET LOWER_HIGH_WATER_MARK = 'ALTER TABLESPACE TS_PART_TABLES LOWER HIGH WATER MARK';
SET REDUCE_MAX = 'ALTER TABLESPACE TS_PART_TABLES REDUCE MAX';

BEGIN
    EXECUTE IMMEDIATE REDUCE_STOP;
    EXECUTE IMMEDIATE LOWER_HIGH_WATER_MARK;
END;

CALL DBMS_ALERT.WAITONE('wait for reduce max' , V_MSG , V_OUTSTATUS , V_SECONDS);

BEGIN
    EXECUTE IMMEDIATE REDUCE_STOP;
    EXECUTE IMMEDIATE REDUCE_MAX;
END;
COMMIT WORK;        
END@

GRANT EXECUTE ON PROCEDURE RECLAIM_PARTITION_SPACE(VARCHAR(200)) TO 
USER DB2INST1@

但是当我运行这个存储过程时,不会发生回收,但是当我手动运行查询 ALTER TABLESPACE TS_PART_TABLES LOWER HIGH WATER MARK 后跟 ALTER TABLESPACE TS_PART_TABLES REDUCE MAX 时,会为已删除的分区回收磁盘空间。

我在存储过程中做错了什么?

【问题讨论】:

  • 你有没有尝试在EXECUTE IMMEDIATE LOWER_HIGH_WATER_MARK之后提交?使用CALL DBMS_ALERT.WAITONE 的目的是什么?您是否检查该表空间上的范围移动过程是否已完成并随后从另一个会话发送信号?
  • 你知道你可以只使用REDUCE MAX - 没有必要先LOWER HIGH WATERMARK
  • @MarkBarinstein 谢谢。在 EXECUTE IMMEDIATE 工作后添加提交。使用 DDL 语句执行隐式提交,而不是 DML 语句。

标签: stored-procedures db2 partitioning


【解决方案1】:

在 EXECUTE IMMEDIATE LOWER_HIGH_WATER_MARK 和 EXECUTE IMMEDIATE REDUCE_MAX 之后添加 Commit 解决了这个问题。 这是因为在使用 EXECUTE IMMEDIATE 时,会使用 DDL 语句而不是 DML 语句执行隐式提交。 (来源:https://searchoracle.techtarget.com/answer/Telling-EXECUTE-IMMEDIATE-to-commit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多