Иногда необходимо в нескольких сессиях использовать одну и ту же таблицу, но при этом хранить в ней различные данные для каждой сессии. Для таких целей существуют временные таблицы - global temporary tables. Например, временные таблицы нужны для складирования промежуточных рассчетов отчета, который разные пользователи одновременно запускают в разных сессиях с различными параметрами.
Создадим временную таблицу:
create global temporary table TMP_TABLE_D(ID NUMBER)
on commit delete rows;
Опция 'on commit delete rows' означает, что после commit-а в сессии все строки из таблицы автоматически удаляются.
Если бы стояла опция 'on commit preserve rows', то после commit-а в сессии строки таблицы сохранялись бы неизменными.
Выполним в двух различных сессиях один и тот же блок кода. Во временную таблицу вставляются сгенерированные случайные значения, а затем в dbms_output выдается среднее значение вставленных id:
declare
avg_id number;
begin
for i in 1 .. 1000 loop
insert into tmp_table_d (id) values (1000 * dbms_random.value());
end loop;
select avg(id) into avg_id from tmp_table_d;
dbms_output.put_line('avg_id = ' || to_char(avg_id, '999.99'));
end;
В каждой из сессий данные в tmp_table_d получатся различные и значения avg_id вряд ли совпадут. Можно посмотреть эти данные запросом:
select * from tmp_table_d;
После выполнение команды
commit;
все данные в tmp_table_d исчезают, как, впрочем, исчезают и при logoff-е сессии.