В Oracle вам очень редко нужна временная таблица. Обычно вам нужны временные таблицы в других базах данных, потому что в этих базах не реализована согласованность чтения нескольких версий, и существует вероятность того, что кто-то, считывающий данные из таблицы, будет заблокирован во время выполнения вашей процедуры или что ваша процедура будет выполнять грязное чтение, если она не сохранить данные в отдельную структуру. Вам не нужны глобальные временные таблицы в Oracle по любой из этих причин, потому что читатели не блокируют пишущие и грязное чтение невозможно.
Если вам просто нужно временное место для хранения данных при выполнении вычислений PL / SQL, коллекции PL / SQL используются чаще, чем временные таблицы в Oracle. Таким образом, вы не перемещаете данные назад и вперед из механизма PL / SQL в механизм SQL и обратно в механизм PL / SQL.
CREATE PROCEDURE do_some_processing
AS
TYPE emp_collection_typ IS TABLE OF emp%rowtype;
l_emps emp_collection_type;
CURSOR emp_cur
IS SELECT *
FROM emp;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur
BULK COLLECT INTO l_emps
LIMIT 100;
EXIT WHEN l_emps.count = 0;
FOR i IN 1 .. l_emps.count
LOOP
<<do some complicated processing>>
END LOOP;
END LOOP;
END;
Вы можете создать глобальную временную таблицу (вне процедуры) и использовать глобальную временную таблицу внутри своей процедуры так же, как и любую другую таблицу. Так что вы можете продолжать использовать временные таблицы, если хотите. Но я могу рассчитывать, с одной стороны, сколько раз мне действительно нужна временная таблица в Oracle.