sql >> Databasteknik >  >> RDS >> Oracle

Insamlingsmetod:DELETE-procedur i Oracle Database

Ta bort procedur i Oracle Database

Som diskuterats i Introduktionen till insamlingsmetoder har vi sju insamlingsfunktioner och 3 insamlingsprocedurer. Därför har vi totalt 10 insamlingsmetoder, bland vilka vi redan har diskuterat 7 insamlingsfunktioner hittills. Därför kommer vi idag i denna handledning att diskutera den första PL/SQL-insamlingsproceduren som är DELETE-proceduren i Oracle Database.

Vad är PL/SQL-insamlingsmetoden Ta bort?

Insamlingsmetod DELETE är en överbelastad procedur som tar bort element från samlingen.

Vad menar du med en överbelastad procedur?

Du hörde rätt. PL/SQL-insamlingsmetoden DELETE är en överbelastad procedur. Vilket innebär att du kan använda samma procedur på tre olika sätt . Dessa tre olika sätt är –

  • RADERA :Enkelt proceduranrop utan några parametrar. Så om PL/SQL Collection-proceduren DELETE används utan någon parameter så kommer den att ta bort alla element från samlingen .
  • RADERA (indexnummer ) :Proceduranrop med en enda parameter. Denna enstaka parameter är det giltiga indexnumret för samlingen. Insamlingsprocedur DELETE anropad genom att skicka ett giltigt indexnummer kommer att ta bort elementet i det specifika indexet .
  • RADERA (startindex, slutindex ) : Proceduranrop med två parametrar. Detta sätt att anropa en DELETE-procedur kallas Range delete . På detta sätt måste du ange två index. Och proceduren tar bort intervallet av element som faller mellan startindex och slutindex .

Om samlingen är en strängindexerad associativ array är startindex och slutindex strängar; annars är start- och slutindex heltal.

Kan vi använda DELETE-proceduren i Oracle Database med alla samlingar?

Ja, insamlingsmetoden DELETE kan användas för alla tre typer av samlingar. Dessa är – Kapslade tabeller, VARRAYs och associativa arrayer.

Vänta! Men om vi använder proceduren DELETE med VARRAYs blir det då inte en sparsam samling?

Eftersom VARRAY inte är en gles samling så kan vi inte ta bort enskilda rader från den. Dessutom är det enda proceduranrop som vi kan utföra med VARRAY det första. Vilket är samlingsmetoden DELETE utan några argument som tar bort alla element från samlingen. Det enda sättet att ta bort en enskild rad från en VARRAY är att trimma den från dess ände med ett annat proceduranrop TRIM.

Kan vi förvänta oss något undantag med insamlingsmetoden DELETE?

Ja, det finns ett undantag förknippat med PL/SQL-insamlingsmetoden DELETE. Om proceduren DELETE tillämpas på en oinitierad kapslad tabell och VARRAY, väcker det undantaget "Collection_is_Null".

Exempel på PL/SQL-insamlingsmetod DELETE.

Låt oss se några exempel på var och en av de ovan nämnda Procedur DELETE-anrop.

Exempel 1:Enkelt proceduranrop utan argument.

DECLARE
    TYPE my_nested_table IS
        TABLE OF NUMBER;
    var_nt my_nested_table := my_nested_table(2,4,6,8,10,12,14,16,18,20);
BEGIN

    --Range Delete
    var_nt.DELETE;
    FOR i IN 1..var_nt.LAST LOOP
        IF var_nt.EXISTS(i) THEN
            DBMS_OUTPUT.PUT_LINE('Value at Index ['||i||'] is '|| var_nt(i));
        END IF;
    END LOOP;
END;
/

Att anropa insamlingsproceduren DELETE utan några argument kommer att radera alla element i samlingen som den tillämpas på. På samma sätt har vi i exemplet ovan en kapslad tabell med namnet "my_nested_table" över vilken vi tillämpade proceduren DELETE. Sålunda, vid framgångsrik exekvering, kommer proceduranropet att radera alla 10 numeriska element som är lagrade i den.

Föreslagen läsning:Hur man skapar kapslade tabeller lokalt till PL/SQL-block.

Exempel 2:Proceduranrop med en enda parameter

DECLARE
    TYPE my_nested_table IS
        TABLE OF NUMBER;
    var_nt my_nested_table := my_nested_table(2,4,6,8,10,12,14,16,18,20);
BEGIN
    DBMS_OUTPUT.PUT_LINE('After Deleted');
    --Delete Specific Index
    var_nt.DELETE(5);
    IF var_nt.EXISTS(5) THEN
            DBMS_OUTPUT.PUT_LINE('Value at Index [5] is '|| var_nt(5));
    ELSE
        DBMS_OUTPUT.PUT_LINE('Data is Deleted');
    END IF;
END;
/

Denna enstaka parameter är det giltiga indexnumret för samlingen. Dessutom kommer insamlingsproceduren DELETE som anropas genom att skicka ett giltigt indexnummer att ta bort elementet i det specifika indexet. Så i exemplet ovan angav vi 5 som argument för PL/SQL-insamlingsmetoden DELETE. Sålunda, vid framgångsrik exekvering, kommer proceduranropet att ta bort elementet från samlingen som är lagrat i index 5.

Exempel 3:Proceduranrop med två parametrar.

DECLARE
    TYPE my_nested_table IS
        TABLE OF NUMBER;
    var_nt my_nested_table := my_nested_table(2,4,6,8,10,12,14,16,18,20);
BEGIN

    --Delete Range
    var_nt.DELETE(2,6);
    FOR i IN 1..var_nt.LAST LOOP
        IF var_nt.EXISTS(i) THEN
            DBMS_OUTPUT.PUT_LINE('Value at Index ['||i||'] is '|| var_nt(i));
        END IF;
    END LOOP;
END;
/

Detta sätt att anropa DELETE-proceduren kallas Range delete. Här måste du ange två index och proceduren tar bort intervallet av element som faller mellan startindex och slutindex. I exemplet ovan ställer vi in ​​startindexet som 2 och slutindexet som 6. Detta betyder att vid körning kommer procedureropet DELETE att ta bort alla element som faller inom detta intervall.

Gå vidare och kopiera ovanstående koder till din SQL-utvecklare och kör dem själv för att se vilka utdata som är.

Du kan också titta på videohandledningen om samma ämne för liveförklaring av alla ovanstående exempel.

Det är handledningen om PL/SQL-insamlingsmetoden DELETE i Oracle Database. Hoppas du tyckte om att läsa och lärde dig något nytt. Se till att dela denna blogg på dina sociala medier. Gå också med mig på min Facebook-sida för fler intressanta koncept för PL/SQL.

Tack och ha en bra dag!


  1. Inbäddade PostgreSQL för Java JUnit-tester

  2. Oracle Database Link - MySQL-ekvivalent?

  3. TNSPING OK men sqlplus ger ORA-12154?

  4. Postgres VÄLJ där WHERE är UUID eller sträng