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
CURSORnøgleordet. - For det andet skal du definere en forespørgsel for at hente data efter
ISnø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:
-
NULLfør første hentning -
TRUEhvis en post blev hentet med succes -
FALSEhvis ingen række returneres -
INVALID_CURSORhvis markøren ikke åbnes
3)% NOTFOUND
Denne attribut har fire værdier:
-
NULLfør første hentning -
FALSEhvis en post blev hentet succ essensielt -
TRUEhvis ingen række returneres -
INVALID_CURSORhvis 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:
- Nulstil kreditgrænser for alle kunder til nul.
- 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