PL / SQL-markør

Oversigt: I denne vejledning lærer du om PL / SQL-markøren og dens anvendelse.

En markør er en markør, der peger på et resultat af en forespørgsel. PL / SQL har to typer markører: implicitte markører og eksplicitte markører.

Implicitte markører

Når Oracle udfører en SQL-sætning såsom SELECT INTO, INSERT, UPDATE og DELETE, opretter den automatisk en implicit markør.

Oracle styrer internt hele eksekveringscyklussen af implicitte markører og afslører kun markørens oplysninger og status som SQL%ROWCOUNT, SQL%ISOPEN, SQL%FOUND og SQL%NOTFOUND.

Den implicitte markør er ikke elegant, når forespørgslen returnerer nul eller flere rækker som forårsager henholdsvis NO_DATA_FOUND eller TOO_MANY_ROWS.

Eksplicitte markører

En eksplicit markør er en SELECT -erklæring, der er erklæret eksplicit i erklæringsafsnittet i den aktuelle blok eller en pakkespecifikation.

For en eksplicit markør har du rol over dens eksekveringscyklus fra OPEN, FETCH og CLOSE.

Oracle definerer en eksekveringscyklus, der udfører en SQL-sætning og knytter en markør til den.

Følgende illustration viser eksekveringscyklussen for en eksplicit markør:

Lad os undersøge hvert trin i detaljer.

Erklær en markør

Før du bruger en eksplicit markør, skal du erklære det i erklæringsafsnittet for en blok eller pakke som følger:

I denne syntaks :

  • Angiv først markørens navn efter CURSOR nøgleordet.
  • For det andet skal du definere en forespørgsel for at hente data efter IS nøgleordet.

Åbn en markør

Før du begynder at hente rækker fra markøren, skal du åbne den. For at åbne en markør bruger du følgende syntaks:

I denne syntaks er cursor_name navnet af markøren deklareret i erklæringsafsnittet.

Når du åbner en markør, analyserer Oracle forespørgslen, binder variabler og udfører den tilknyttede SQL-sætning.

Oracle bestemmer også en eksekveringsplan , knytter værtsvariabler og markørparametre til pladsholderne i SQL-sætningen, bestemmer resultatsættet og indstiller markøren til den første række i resultatsættet.

Mere om parametreret markør i næste tutorial.

Hent fra en markør

FETCH sætningen placerer indholdet af den aktuelle række i variabler. Syntaksen for FETCH udsagn er som følger:

For at hente alle rækker i et resultatsæt skal du have for at hente hver række til den sidste.

Lukning af en markør

Når alle rækker er hentet, skal du lukke markøren med CLOSE udsagn:

Lukning af en markør beder Oracle om at frigive allokeret hukommelse på et passende tidspunkt.

Hvis du erklærer en markør i en anonym blokering, procedure eller funktion, markøren lukkes automatisk, når udførelsen af disse objekter slutter.

Du skal dog eksplicit lukke pakkebaserede markører. Bemærk, at hvis du lukker en markør, der endnu ikke er åbnet, hæver Oracle en INVALID_CURSOR undtagelse.

Eksplicitte markørattributter

En markør har fire attributter, som du kan henvise til i følgende format:

hvor cursor_name er navnet på eksplicit markør.

1)% ISOPEN

Denne attribut er TRUE hvis markøren er åben eller FALSE hvis det ikke er det.

2)% FUNDET

Denne attribut har fire værdier:

  • NULL før første hentning
  • TRUE hvis en post blev hentet med succes
  • FALSE hvis ingen række returneres
  • INVALID_CURSOR hvis markøren ikke åbnes

3)% NOTFOUND

Denne attribut har fire værdier:

  • NULL før første hentning
  • FALSE hvis en post blev hentet succ essensielt
  • TRUE hvis ingen række returneres
  • INVALID_CURSOR hvis markøren ikke åbnes

3)% ROWCOUNT

Attributten %ROWCOUNT returnerer antallet af rækker, der er hentet fra markøren. Hvis markøren ikke åbnes, returnerer denne attribut INVALID_CURSOR.

PL / SQL-markøreksempel

Vi bruger orders og order_items tabeller fra eksempeldatabasen til demonstrationen.

Følgende udsagn skaber en visning, der returnerer kundens salgsindtægter:

Værdierne i kreditkolonnen er 5% af den samlede salgsindtægt.

Antag at du har brug for at udvikle en anonym bloker det:

  1. Nulstil kreditgrænser for alle kunder til nul.
  2. Hent kunder sorteret efter salg i faldende rækkefølge og giver dem nye kreditgrænser fra et budget på 1 million.

Følgende anonyme blok illustrerer logikken:

I erklæringsafsnittet erklærer vi tre variabler.

Den første er l_budget hvis startværdi er 1,000,000.

Den anden variabel er en eksplicit markørvariabel med navnet c_sales hvis udsagn henter data fra sales visning:

Den tredje variabel er en markørbaseret post med navnet c_sales.

I eksekveringsafsnittet udfører vi følgende:

  • Først skal du nulstille kreditgrænser af alle kunder til nul ved hjælp af en UPDATE -erklæring.
  • For det andet skal du åbne c_sales -markøren.
  • For det tredje skal du hente hver række fra markøren. I hver loop-iteration opdaterer vi kreditgrænsen og reducerede budgettet. Sløjfen afsluttes, når der ikke er nogen række at hente, eller budgettet er opbrugt.
  • Endelig skal du lukke markøren.

Den følgende forespørgsel henter data fra customers tabel for at kontrollere opdateringen:

Resultat:

Som du kan se tydeligt af resultatet, er det kun de første par kunder, der har kreditgrænser. Hvis du opsummerer alle kreditgrænser, skal det samlede beløb være 1 million som vist nedenfor:

Nu , skal du forstå PL / SQL-markører inklusive implicitte og eksplicitte markører, og hvordan man bruger dem effektivt til at behandle data, række for række, fra en tabel.

  • Var denne tutorial nyttig?
  • JaNej

Leave a Reply

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *