sql >> Base de Datos >  >> RDS >> Oracle

Alternativas para tablas temporales en Oracle

¿Cuál es el problema comercial que está tratando de resolver? Es excepcionalmente raro que necesite usar tablas temporales en Oracle. ¿Por qué no simplemente

SELECT *
  FROM employees
 WHERE id = p_id_passed_in;

En otras bases de datos, a menudo crea tablas temporales porque los lectores bloquean a los escritores, por lo que desea crear una copia separada de los datos para evitar bloquear otras sesiones. En Oracle, sin embargo, los lectores nunca bloquean a los escritores, por lo que generalmente no es necesario guardar una copia separada de los datos.

En otras bases de datos, crea tablas temporales porque no desea realizar lecturas sucias. Oracle, sin embargo, no permite lecturas sucias. La consistencia de lectura de múltiples versiones significa que Oracle siempre le mostrará los datos tal como existían cuando se inició la consulta (o cuando se inició la transacción si ha establecido un nivel de aislamiento de transacción de serializable). Por lo tanto, no es necesario crear una tabla temporal para evitar lecturas sucias.

Si realmente quería usar tablas temporales en Oracle, no crearía la tabla dinámicamente. Crearía una tabla temporal global antes de crear el procedimiento almacenado. La estructura de la tabla sería visible para todas las sesiones, pero los datos solo serían visibles para la sesión que los insertó. Completaría la tabla temporal en el procedimiento y luego consultaría la tabla. Algo como

CREATE GLOBAL TEMPORARY TABLE temp_emp (
  empno number,
  ename varchar2(10),
  job   varchar2(9),
  mgr   number,
  sal   number(7,2)
)
ON COMMIT PRESERVE ROWS;

CREATE OR REPLACE PROCEDURE populate_temp_emp
AS
BEGIN
  INSERT INTO temp_emp( empno,
                        ename,
                        job,
                        mgr,
                        sal )
    SELECT empno, 
           ename,
           job,
           mgr,
           sal
      FROM emp;
END;
/

SQL> begin
  2    populate_temp_emp;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select *
  2    from temp_emp;

     EMPNO ENAME      JOB              MGR        SAL
---------- ---------- --------- ---------- ----------
      7623 PAV        Dev
      7369 smith      CLERK           7902        800
      7499 ALLEN      SALESMAN        7698       1600
      7521 WARD       SALESMAN        7698       1250
      7566 JONES      MANAGER         7839       2975
      7654 MARTIN     SALESMAN        7698       1250
      7698 BLAKE      MANAGER         7839       2850
      7782 CLARK      MANAGER         7839       2450
      7788 SCOTT      ANALYST         7566       3000
      7839 KING       PRESIDENT                  5000
      7844 TURNER     SALESMAN        7698       1500
      7876 ADAMS      CLERK           7788       1110
      7900 SM0        CLERK           7698        950
      7902 FORD       ANALYST         7566       3000
      7934 MILLER     CLERK           7782       1300
      1234 BAR

16 rows selected.

Sin embargo, como dije, sería muy inusual en Oracle realmente querer usar una tabla temporal.