通过 db2 上的存储过程更改表空间
Alter tablespace through stored procedure on db2
我正在尝试编写存储过程以在 db2 中删除分区后回收磁盘 space。
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 followed by ALTER TABLESPACE TS_PART_TABLES REDUCE MAX 磁盘 space 被删除的分区回收。
我在存储过程中做错了什么?
在 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)
我正在尝试编写存储过程以在 db2 中删除分区后回收磁盘 space。
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 followed by ALTER TABLESPACE TS_PART_TABLES REDUCE MAX 磁盘 space 被删除的分区回收。
我在存储过程中做错了什么?
在 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)