ON COMMIT DELETE ROWS
= данные в одной транзакции
ON COMMIT PRESERVE ROWS
= данные в одном сеансе базы данных (один пользователь с 2 сеансами = 2 сеанса = разное содержимое)
Если GTT определен сON COMMIT DELETE ROWS
, он будет пустым после любой явной фиксации или неявной фиксации (= неявная фиксация = после любой команды DLL, включая, например, таблицу усечения, изменение индекса, добавление раздела, изменение столбца, обмен раздела):
CREATE GLOBAL TEMPORARY TABLE GTT__TEST (A NUMBER) ON COMMIT DELETE ROWS;
INSERT INTO GTT__TEST VALUES (1);
SELECT * FROM GTT__TEST; -- 1 ROW;
COMMIT; -- commit = delete rows
SELECT * FROM GTT__TEST; -- 0 ROWS;
INSERT INTO GTT__TEST VALUES (1);
SELECT * FROM GTT__TEST; -- 1 ROW;
ALTER TABLE GTT__TEST MODIFY A NOT NULL; -- DLL = commit = delete rows
SELECT * FROM GTT__TEST; -- 0 ROWS
Если GTT определен с ON COMMIT PRESERVE ROWS
, он будет хранить данные до конца сеанса:
DROP TABLE GTT__TEST;
CREATE GLOBAL TEMPORARY TABLE GTT__TEST (A NUMBER) ON COMMIT PRESERVE ROWS;
INSERT INTO GTT__TEST VALUES (1);
SELECT * FROM GTT__TEST; -- 1 ROW
COMMIT;
SELECT * FROM GTT__TEST; -- 1 ROW