sql >> Base de Datos >  >> RDS >> Mysql

Alternativa para una tabla temporal de MySQL en Oracle

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.