Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Método alternativo para tabelas temporárias globais para Oracle Stored Procedure


As tabelas T-SQL Temp são essencialmente estruturas de memória. Eles fornecem benefícios no MSSQL que são menos óbvios no Oracle, devido às diferenças nas duas arquiteturas RDBMS. Portanto, se você deseja migrar, seria aconselhável adotar uma abordagem mais adequada ao Oracle.

No entanto, você tem uma situação diferente e, obviamente, manter as duas bases de código sincronizadas facilitará sua vida.

A coisa mais próxima de tabelas temporárias como você deseja usá-las são coleções PL/SQL; especificamente, tabelas aninhadas.

Existem algumas maneiras de declará-los. A primeira é usar um modelo SQL - um cursor - e definir um tipo de tabela aninhada com base nele. A segunda é declarar um tipo de registro e então definir uma tabela aninhada nele. Em ambos os casos, preencha a variável de coleção com uma operação em massa.
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;
/

O uso de um cursor oferece a vantagem de refletir automaticamente as alterações na(s) tabela(s) subjacente(s). Embora o RECORD forneça a vantagem de estabilidade em face de mudanças na(s) tabela(s) subjacente(s). Só depende do que você quer :)

Há um capítulo inteiro no manual de referência PL/SQL. Leia para saber mais .