En Oracle, rara vez necesita una tabla temporal en primer lugar. Por lo general, necesita tablas temporales en otras bases de datos porque esas bases de datos no implementan la consistencia de lectura de múltiples versiones y existe la posibilidad de que alguien que lea los datos de la tabla se bloquee mientras se ejecuta su procedimiento o que su procedimiento haga una lectura sucia si no lo hace. No guardar los datos en una estructura separada. No necesita tablas temporales globales en Oracle por ninguna de estas razones porque los lectores no bloquean a los escritores y las lecturas sucias no son posibles.
Si solo necesita un lugar temporal para almacenar datos mientras realiza cálculos PL/SQL, las colecciones PL/SQL se usan más comúnmente que las tablas temporales en Oracle. De esta manera, no está enviando datos de un lado a otro del motor PL/SQL al motor SQL y de regreso al motor 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;
Puede crear una tabla temporal global (fuera del procedimiento) y usar la tabla temporal global dentro de su procedimiento tal como usaría cualquier otra tabla. Así que puedes seguir usando tablas temporales si así lo deseas. Pero puedo contar con los dedos de una mano la cantidad de veces que realmente necesité una tabla temporal en Oracle.