sql >> Databasteknik >  >> RDS >> Oracle

Insamlingsmetod:FÖREGÅENDE &NÄSTA funktioner i Oracle Database

Som vi såg i Introduktionen till PL/SQL-insamlingsmetoder att det finns 7 insamlingsfunktioner i Oracle Database. Bland dessa sju funktioner har vi redan lärt oss de första fem metoderna. Före och Nästa är de två sista PL/SQL-insamlingsmetoderna/funktionerna som fortfarande är kvar att utforska.

Så i dagens PL/SQL-blogg kommer vi att utforska dessa två orörda insamlingsmetoder i detalj.

Vad är funktioner för föregående och nästa insamling?

Det är alltid bra att ha några funktioner under ärmen som kan hjälpa dig att navigera genom innehållet i din samling. Funktionen Före och Nästa kan vara dessa funktioner.

Båda dessa funktioner tar ett index över samlingen som indata och returnerar resultatet.

Till exempel tar PL/SQL-insamlingsmetoden PRIOR ett index som indata och returnerar värdet som lagrats i det föregående lägsta indexet. Medan insamlingsmetoden NEXT returnerar värdet från nästa högre index.

Är föregående och nästa insamling funktioner eller procedurer?

Både Före och Nästa är funktioner.

Kan vi använda båda dessa funktioner med alla tre typerna av samlingar?

Ja, både Föregående och Nästa insamlingsfunktioner kan användas med alla tre typer av samlingar.

När kommer PL/SQL Collection Methods Preor and Next returnera null?

Collection Method Preor returnerar null när det inte finns några lägre nedsänkta värden tillgängliga och Collection method Next returnerar null när det inte finns några högre nedsänkta värden tillgängliga att returnera.

Med enkla ord kan vi säga att båda dessa samlingsfunktioner returnerar Null om de används med det första respektive sista indexet för en samling .

Vad blir resultatet av insamlingsmetoden Next och Preor om vi använder dem med associativ array?

Om insamlingsmetoden PRIOR och NEXT används med associativa arrayer kommer de att returnera en utdata av VARCHAR2 eller LONG datatype.

Jag har hört att dessa metoder ger upphov till någon typ av undantag. Är det sant?

Ja det är sant. Om någon av dessa funktioner tillämpas på en oinitierad kapslad tabell eller en Varray, höjer de undantaget COLLECTION_IS_NULL.

Kan du visa oss hur man använder dessa funktioner i vår kod?

Visst varför inte! Jag kommer att visa dig tillämpningen av både föregående och nästa insamlingsfunktioner med hjälp av en mycket enkel kod.

Exempel på tidigare insamlingsmetod.

I den här metoden kommer vi att lära oss hur man använder insamlingsmetoden Prior med Nested Table.

SET SERVEROUTPUT ON;
DECLARE
    TYPE my_nested_table IS
        TABLE OF NUMBER;
    var_nt   my_nested_table := my_nested_table(9,18,27,36,45,54,63,72,81,90);
BEGIN
        dbms_output.put_line('Index prior to index 3 is '||var_nt.PRIOR(3)); 
        dbms_output.put_line('Value before 3rd Index is '||var_nt(var_nt.PRIOR(3))); 
END;
/

I ovanstående anonyma PL/SQL-block har vi två utdatasatser med "Prior Function Call". Den första utmatningen kommer att returnera indexnumret före indexnumret 3 som har något värde lagrat i sig. I vårt fall är indexet före indexnummer 3 2. Således kommer 2 att vara utdata från den första utdatasatsen.

I den andra utdatasatsen anropade vi Prior-funktionen och tillhandahöll den som en indata till samlingsobjektet.

var_nt(var_nt.PRIOR(3)) 

Oracle-motorn kommer att köra Collection-funktionen Prior först (låt oss kalla det del 1) och med hjälp av resultatet från del 1 kommer den sedan att exekvera samlingsobjektet (låt oss kalla det del 2) och producera det slutliga resultatet som blir 18 i vårt fall. Varsågod, kopiera koden och försök köra dig själv.

Vad händer om vi tar bort det föregående lägsta indexet från den kapslade tabellen?

Så nu är frågan, vad kommer att hända om du tar bort Previous Lowest Index som är 2 i vår kod. I så fall blir resultatet definitivt inte detsamma. Funktionen Prior returnerar det föregående lägsta indexet. Men det indexet måste innehålla något värde.

Prova själv. Här är koden.

DECLARE
    TYPE my_nested_table IS
        TABLE OF NUMBER;
    var_nt   my_nested_table := my_nested_table(9,18,27,36,45,54,63,72,81,90);
BEGIN
        var_nt.DELETE(2);
        dbms_output.put_line('Index prior to index 3 is '||var_nt.PRIOR(3)); 
        dbms_output.put_line('Value before 3rd Index is '||var_nt(var_nt.PRIOR(3))); 
END;
/

Exempel på insamlingsmetod Nästa.

Du kan använda PL/SQL Collection-metoden Nästa samma som du använde Prior-funktionen i ovanstående kod. Insamlingsmetod NEXT returnerar värdet från nästa högre index. Här är exemplet

DECLARE
    TYPE my_nested_table IS
        TABLE OF NUMBER;
    var_nt   my_nested_table := my_nested_table(9,18,27,36,45,54,63,72,81,90);
BEGIN
        dbms_output.put_line('Next Higher Index to index 3 is '||var_nt.NEXT(3)); 
        dbms_output.put_line('Value after 3rd Index is '||var_nt(var_nt.NEXT(3))); 
END;
/

Båda exemplen är nästan desamma förutom samlingsfunktionsanropet. I exekveringssektionen av detta PL/SQL-block har vi återigen två utdatasatser. Den första utmatningen kommer att returnera nästa icke-tomma indexnummer medan den andra returnerar data som lagrats i det indexet. Funktionen för båda dessa uttalanden kommer att vara densamma som vi diskuterade ovan. Fortsätt och kopiera koden och se resultatet.

Det var den detaljerade handledningen om PL/SQL-insamlingsmetoden Next and Preor. Hoppas du tyckte om att läsa och lärde dig något nytt. Se till att dela denna blogg på dina sociala medier. För att dela den här bloggen på din Facebook klicka här och för twitter klicka här.

Tack och ha en bra dag!


  1. Öka prestanda med Bulk Collect i Oracle

  2. Använda index i SQL Server-minnesoptimerade tabeller

  3. MySQL INSERT IF (anpassade if-satser)

  4. Hur man formaterar siffror i Oracle