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:
- 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