Изменить табличное пространство через хранимую процедуру на db2 - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь написать сохраненный процесс для восстановления дискового пространства после удаления раздела в 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, дисковое пространство освобождается для удаленных разделов.

Что я делаю неправильно в хранимой процедуре?

1 Ответ

0 голосов
/ 30 января 2019

Добавление commit после EXECUTE IMMEDIATE LOWER_HIGH_WATER_MARK и EXECUTE IMMEDIATE REDUCE_MAX решило проблему.Это связано с тем, что при использовании EXECUTE IMMEDIATE существует неявная фиксация, выполняемая с помощью операторов DDL, а не операторов DML.(Источник: https://searchoracle.techtarget.com/answer/Telling-EXECUTE-IMMEDIATE-to-commit)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...