sql >> Database teknologi >  >> RDS >> Oracle

Indsamlingsmetoder:FØRSTE &SIDSTE funktioner i Oracle-databasen

Velkommen tilbage igen til serien om indsamlingsmetoder i Oracle-databasen. Indtil videre i denne serie har vi dækket samlingsfunktionstælling ( ) og samlingsfunktion eksisterer ( ). Håber du nød at læse. I dag i denne PL/SQL-tutorial lærer vi indsamlingsmetoderne først ( ) og sidst ( ).

Hvad er indsamlingsmetoder FØRST ( ) og SIDSTE ( )?

Vi bruger samlingsfunktionerne First &Last for at kende de første og sidste indeksværdier defineret i en samling.

Kan vi bruge disse indsamlingsmetoder med enhver form for indsamling?

Ja! Du kan bruge begge disse funktioner med alle tre typer samlinger, som er Associative Array, Nested table og VARRAYs.

Hvornår returnerer indsamlingsmetode FIRST ( ) og LAST ( ) null?

Begge funktioner returnerer null, når de anvendes på en tom samling, eller når de anvendes på en initialiseringssamling, der ikke har nogen elementer.

Kan du angive funktionsspecifikationen for begge disse funktioner?

Jo da! Hvorfor ikke. Specifikationen for indsamlingsfunktionen FIRST ( ) er:

FUNCTION FIRST RETURN PLS_INTEGER | VARCHAR2

Og funktionsspecifikationen for indsamlingsfunktionen LAST ( ) er:

FUNCTION LAST RETURN PLS_INTEGER | VARCHAR2

Oplysninger:
For strengindekseret associativ array returnerer disse metoder strenge; "laveste" og "højeste" bestemmes af rækkefølgen af ​​det tegnsæt, der bruges i den pågældende session.

Hvad hvis der kun er 1 element i min VARRAY?

I så fald er indsamlingsfunktionen FØRST ( ) altid 1, og indsamlingsmetode LAST ( ) er altid lig med COUNT.

Hvad hvis jeg anvendte disse funktioner på en ikke-initialiseret samling?

Jeg mener seriøst, hvorfor skulle du gøre det! Uanset hvad, hvis du anvendte indsamlingsfunktionen FIRST &LAST på en ikke-initialiseret samling, vil det give COLLECTION_IS_NULL undtagelse.

Eksempel:Hvordan bruger man indsamlingsfunktionen FØRST og SIDST med indsamling?

SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_tab IS TABLE OF NUMBER;
    col_var nt_tab := nt_tab(10, 20, 30, 40, 50);
BEGIN
    DBMS_OUTPUT.PUT_LINE ('First Index of the Nested table is ' || col_var.FIRST);
    DBMS_OUTPUT.PUT_LINE ('Last Index of the Nested table is ' || col_var.LAST);
END;
/

I ovenstående eksempel har vi oprettet en indlejret tabel med navnet NT_TAB og initialiseret den ved hjælp af samlingsvariablen col_var. Denne indlejrede tabel har 5 indekser, som vi har gemt værdierne i. Det laveste indeks i denne indlejrede tabel er 1, som har værdien 10, og det maksimale indeks er 5 med værdien 50. Således vil resultatet fra den første DBMS_OUTPUT være 1, og fra den anden DBMS_OUTPUT-sætning vil være 5.

Gå videre, kopier koden og tjek resultatet selv.

Hvad hvis vi sletter det første element i den indlejrede tabel? Hvad bliver resultatet af indsamlingsfunktionen FØRST?

Det er et meget godt spørgsmål! Hvis du sletter det første element i indsamlingsfunktionen, vil indsamlingsfunktionen FIRST returnere sænkningen, som er større end 1 og indeholder nogle data. Lad os se eksemplet:

SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_tab IS TABLE OF NUMBER;
    col_var nt_tab := nt_tab(10, 20, 30, 40, 50);
BEGIN
col_var.DELETE(1);
    DBMS_OUTPUT.PUT_LINE ('First Index after DELETE is ' || col_var.FIRST);
END;
/

I ovenstående eksempel slettede vi det første element i den indlejrede tabel nt_tab ved hjælp af indsamlingsmetoden DELETE. Efter at have slettet det første element, som er 10 på indeks 1, er den nye laveste subscript nu 2, som har nogle data gemt i sig. Ved udførelse vil resultatet således være 2.

Hvad hvis jeg sletter elementet fra midten af ​​samlingen?

Hvis du sletter dataene fra midten, vil indsamlingsfunktionen LAST returnere en værdi, der er større end den værdi, der returneres af COUNT-metoden.

Kan vi se de data, der er gemt i samlingens indekser ved hjælp af FIRST og LAST indsamlingsmetoder?

Da jeg forklarede det samme koncept i en klasse, rakte en elev hånden op og spurgte mig.

Sir, indtil videre ser vi, at disse funktioner returnerer samlingens indeksnummer. Hvad hvis vi ønsker at se dataene gemt i disse indeks. Er der en måde at se de data, der er gemt i indekset ved hjælp af disse indsamlingsmetoder FØRST &SIDST?

Svaret på dette spørgsmål er, ja! Selvfølgelig . Sammen med sænket nummer kan du bruge disse funktioner til at se de data, der er gemt i samlingens laveste og højeste indeks.

For eksempel

SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_tab IS TABLE OF NUMBER;
    col_var nt_tab := nt_tab(10, 20, 30, 40, 50);
BEGIN
    -- This output statement will return 10 which is the value stored at the first index
    DBMS_OUTPUT.PUT_LINE ('Value stored at First Index is ' || col_var(col_var.FIRST));
    -- This output statement will return 50 which is the value stored at the last index
    DBMS_OUTPUT.PUT_LINE ('Value stored at First Index is ' || col_var(col_var.LAST));
END;
/

For at se de data, der er gemt i det første og sidste indeks, skal du blot placere funktionskaldene for disse funktioner inden for parentesen af ​​samlingsvariablen, som er col_var ligesom vi gjorde i ovenstående eksempel.

Nu er spørgsmålet hvad nu hvis vi TRIMMER kollektionen? Hvad bliver outputtet af indsamlingsfunktionen LAST? Gå videre og tjek videoselvstudiet hvor jeg har forklaret, hvad der vil være output af indsamlingsmetode SIDST, når du trimmer samlingen ved hjælp af eksemplet.

Det handler om disse indsamlingsmetoder. Håber du fandt denne blog nyttig. Tak og god dag!


  1. Kan ikke oprette forbindelse til heroku postgresql-database fra lokal node-app med efterfølger

  2. Kan ikke indsætte eksplicit værdi for identitetskolonnen i tabellen "tabel", når IDENTITY_INSERT er indstillet til FRA

  3. SQL række returordre

  4. ORA-12505, TNS:listener kender i øjeblikket ikke til SID givet i forbindelsesbeskrivelsen