sql >> Databasteknik >  >> RDS >> Oracle

Alternativ metod till globala temptabeller för Oracle Stored Procedure

T-SQL Temp-tabeller är i huvudsak minnesstrukturer. De ger fördelar i MSSQL som är mindre uppenbara i Oracle, på grund av skillnader i de två RDBMS-arkitekturerna. Så om du funderade på att migrera skulle du vara klokt att ta ett tillvägagångssätt som är mer anpassat till Oracle.

Men du har en annan situation, och uppenbarligen att hålla de två kodbaserna synkroniserade kommer att göra ditt liv enklare.

Det som ligger närmast temporära tabeller när du vill använda dem är PL/SQL-samlingar; specifikt kapslade tabeller.

Det finns ett par sätt att deklarera dessa. Den första är att använda en SQL-mall - en markör - och definiera en kapslad tabelltyp baserat på den. Den andra är att deklarera en posttyp och sedan definiera en kapslad tabell på den. I båda fallen, fyll in samlingsvariabeln med en bulkoperation.

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;
/

Att använda en markör ger fördelen av att automatiskt reflektera ändringar i den eller de underliggande tabellen. Även om RECORD ger fördelen av stabilitet inför förändringar i den eller de underliggande tabellen. Det beror bara på vad du vill :)

Det finns ett helt kapitel i PL/SQL-referensmanualen. Läs den för mer information .




  1. SQL - Ersätter dubblettvärde med tomt

  2. komplex SQL-fråga, många till många

  3. Hur får jag ID för en rad som har MAX- och MIN-värden i SQL

  4. Hur man tar bort alla dubbletter i PHP/Mysql