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

Método alternativo a las tablas temporales globales para el procedimiento almacenado de Oracle

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 .