Las tablas temporales de T-SQL son esencialmente estructuras de memoria. Brindan beneficios en MSSQL que son menos obvios en Oracle, debido a las diferencias en las dos arquitecturas RDBMS. Por lo tanto, si desea migrar, le recomendamos que adopte un enfoque más adecuado para Oracle.
Sin embargo, tiene una situación diferente y, obviamente, mantener las dos bases de código sincronizadas le facilitará la vida.
Lo más parecido a las tablas temporales, ya que desea usarlas, son las colecciones PL/SQL; específicamente, tablas anidadas.
Hay un par de formas de declararlos. La primera es usar una plantilla de SQL, un cursor, y definir un tipo de tabla anidada en función de ella. El segundo es declarar un tipo de registro y luego definir una tabla anidada en eso. En cualquier caso, complete la variable de colección con una operación masiva.
declare
-- approach #1 - use a cursor
cursor c1 is
select *
from t23;
type nt1 is table of c1%rowtype;
recs1 nt1;
-- approach #1a - use a cursor with an explicit projection
cursor c1a is
select id, col_d, col_2
from t23;
type nt1a is table of c1a%rowtype;
recs1 nt1a;
-- approach #2 - use a PL/SQL record
type r2 is record (
my_id number
, some_date date
, a_string varchar2(30)
);
type nt2 is table of r2;
recs2 nt2;
begin
select *
bulk collect into recs1
from t23;
select id, col_d, col_2
bulk collect into recs2
from t23;
end;
/
El uso de un cursor ofrece la ventaja de reflejar automáticamente los cambios en las tablas subyacentes. Aunque el REGISTRO proporciona la ventaja de la estabilidad frente a los cambios en la(s) tabla(s) subyacente(s). Solo depende de lo que quieras :)
Hay un capítulo completo en el manual de referencia de PL/SQL. Léalo para obtener más información .