PL / SQL-cursor

Samenvatting: in deze tutorial leert u over PL / SQL-cursor en het gebruik ervan.

Een cursor is een pointer die naar een resultaat van een query verwijst. PL / SQL heeft twee soorten cursors: impliciete cursors en expliciete cursors.

Impliciete cursors

Telkens wanneer Oracle een SQL-instructie uitvoert zoals SELECT INTO, INSERT, UPDATE, en DELETE, wordt automatisch een impliciete cursor gemaakt.

Oracle beheert intern de hele uitvoeringscyclus van impliciete cursors en onthult alleen de informatie en statussen van de cursor, zoals SQL%ROWCOUNT, SQL%ISOPEN, SQL%FOUND, en SQL%NOTFOUND.

De impliciete cursor is niet elegant wanneer de zoekopdracht nul of meerdere rijen retourneert die respectievelijk een NO_DATA_FOUND of TOO_MANY_ROWS uitzondering veroorzaken.

Expliciete cursors

Een expliciete cursor is een SELECT statement expliciet gedeclareerd in de declaratiesectie van het huidige blok of een pakketspecificatie.

Voor een expliciete cursor moet je cont rol over de uitvoeringscyclus van OPEN, FETCH, en CLOSE.

Oracle definieert een uitvoeringscyclus die een SQL-instructie uitvoert en er een cursor aan koppelt.

De volgende illustratie toont de uitvoeringscyclus van een expliciete cursor:

Laten we elke stap in detail bekijken.

Declareer een cursor

Voordat u een expliciete cursor gebruikt, moet u deze als volgt declareren in de declaratiegedeelte van een blok of pakket:

In deze syntaxis :

  • Geef eerst de naam van de cursor op na het CURSOR trefwoord.
  • Ten tweede, definieer een zoekopdracht om gegevens op te halen na het IS sleutelwoord.

Een cursor openen

Voordat u rijen van de cursor gaat ophalen, moet u deze openen. Om een cursor te openen, gebruik je de volgende syntaxis:

In deze syntaxis is de cursor_name de naam van de cursor gedeclareerd in de declaratiegedeelte.

Wanneer u een cursor opent, parseert Oracle de query, bindt variabelen en voert de bijbehorende SQL-instructie uit.

Oracle stelt ook een uitvoeringsplan vast , associeert hostvariabelen en cursorparameters met de tijdelijke aanduidingen in de SQL-instructie, bepaalt de resultaatset en stelt de cursor in op de eerste rij in de resultatenset.

Meer over de geparametriseerde cursor in de volgende tutorial.

Ophalen van een cursor

De FETCH instructie plaatst de inhoud van de huidige rij in variabelen. De syntaxis van FETCH -instructie is als volgt:

Om alle rijen in een resultatenset op te halen, heb je om elke rij op te halen tot de laatste.

Een cursor sluiten

Nadat je alle rijen hebt opgehaald, moet je de cursor sluiten met de CLOSE statement:

Door een cursor te sluiten, wordt Oracle geïnstrueerd om toegewezen geheugen op een geschikt moment vrij te geven.

Als u een cursor in een anoniem blok, procedure of functie, wordt de cursor automatisch gesloten wanneer de uitvoering van deze objecten wordt beëindigd.

U moet echter expliciet pakketgebaseerde cursors sluiten. Merk op dat als u een cursor sluit die nog niet is geopend, Oracle een INVALID_CURSOR uitzondering opheft.

Expliciete cursorattributen

Een cursor heeft vier kenmerken waarnaar u kunt verwijzen in de volgende indeling:

waarbij cursor_name de naam is van de expliciete cursor.

1)% ISOPEN

Dit attribuut is TRUE als de cursor open is of FALSE als dit niet het geval is.

2)% GEVONDEN

Dit attribuut heeft vier waarden:

  • NULL voor de eerste keer ophalen
  • TRUE als een record met succes is opgehaald
  • FALSE als er geen rij is geretourneerd
  • INVALID_CURSOR als de cursor niet is geopend

3)% NOTFOUND

Dit kenmerk heeft vier waarden:

  • NULL vóór de eerste keer ophalen
  • FALSE als een record is opgehaald succ wezenlijk
  • TRUE als er geen rij wordt geretourneerd
  • INVALID_CURSOR als de cursor niet is geopend

3)% ROWCOUNT

Het %ROWCOUNT attribuut geeft het aantal rijen terug dat van de cursor gehaald is. Als de cursor niet is geopend, retourneert dit attribuut INVALID_CURSOR.

PL / SQL-cursorvoorbeeld

We gebruiken de orders en order_items tabellen uit de voorbeelddatabase voor de demonstratie.

De volgende verklaring creëert een weergave die de verkoopopbrengsten van klanten retourneert:

De waarden van de kredietkolom zijn 5% van de totale verkoopopbrengsten.

Stel dat u een anonieme blokkeer dat:

  1. Reset kredietlimieten van alle klanten naar nul.
  2. Haal klanten gesorteerd op verkopen in aflopende volgorde op en geef ze nieuwe kredietlimieten vanaf een budget van 1 miljoen.

Het volgende anonieme blok illustreert de logica:

In het declaratiegedeelte declareren we drie variabelen.

Het eerste is l_budget waarvan de initiële waarde 1,000,000 is.

De tweede variabele is een expliciete cursorvariabele genaamd c_sales waarvan -instructie haalt gegevens op uit de sales -weergave:

De derde variabele is een cursorgebaseerd record met de naam c_sales.

In de uitvoeringssectie doen we het volgende:

  • Ten eerste, reset kredietlimieten van alle klanten tot nul met een UPDATE instructie.
  • Ten tweede, open de c_sales cursor.
  • Ten derde: haal elke rij op van de cursor. Bij elke herhaling van de lus updaten we de kredietlimiet en verlaagden we het budget. De lus wordt beëindigd wanneer er geen rij is om op te halen of het budget is opgebruikt.
  • Sluit ten slotte de cursor.

De volgende query haalt gegevens op uit de customers tabel om de update te verifiëren:

Resultaat:

Zoals je duidelijk kunt zien aan het resultaat, hebben alleen de eerste paar klanten de kredietlimieten. Als u alle kredietlimieten bij elkaar optelt, zou het totaal 1 miljoen moeten zijn, zoals hieronder weergegeven:

Nu , zou u PL / SQL-cursors moeten begrijpen, inclusief impliciete en expliciete cursors, en hoe u ze effectief kunt gebruiken om gegevens rij voor rij uit een tabel te verwerken.

  • Was deze tutorial nuttig?
  • JaNee

Leave a Reply

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *