PL / SQL-markør (Norsk)

Sammendrag: i denne opplæringen lærer du om PL / SQL-markøren og dens bruk.

En markør er en pekeren som peker på et resultat av et spørsmål. PL / SQL har to typer markører: implisitte markører og eksplisitte markører.

Implisitte markører

Når Oracle utfører en SQL-setning som SELECT INTO, INSERT, UPDATE, og DELETE, oppretter den automatisk en implisitt markør.

Oracle styrer internt hele utførelsessyklusen til implisitte markører og avslører bare markørens informasjon og statuser som SQL%ROWCOUNT, SQL%ISOPEN, SQL%FOUND og SQL%NOTFOUND.

Den implisitte markøren er ikke elegant når spørringen returnerer null eller flere rader som forårsaker henholdsvis NO_DATA_FOUND eller TOO_MANY_ROWS.

Eksplisitte markører

En eksplisitt markør er en SELECT -erklæring erklært eksplisitt i erklæringsdelen av den gjeldende blokken eller en pakke-spesifikasjon.

For en eksplisitt markør har du fortsatt rolle over kjøringssyklusen fra OPEN, FETCH, og CLOSE.

Oracle definerer en kjøringssyklus som kjører en SQL-setning og knytter en markør til den.

Følgende illustrasjon viser kjøringssyklusen til en eksplisitt markør:

La oss undersøke hvert trinn i detalj.

Erklær en markør

Før du bruker en eksplisitt markør, må du erklære den i erklæringsdelen av en blokk eller pakke som følger:

I denne syntaksen :

  • Angi først navnet på markøren etter CURSOR nøkkelordet.
  • For det andre, definer et spørsmål for å hente data etter IS nøkkelordet.

Åpne en markør

Før du begynner å hente rader fra markøren, må du åpne den. For å åpne en markør bruker du følgende syntaks:

I denne syntaksen er cursor_name navnet av markøren deklarert i erklæringsdelen.

Når du åpner en markør, analyserer Oracle spørringen, binder variabler og utfører den tilknyttede SQL-setningen.

Oracle bestemmer også en utførelsesplan , knytter vertsvariabler og markørparametere til plassholderne i SQL-setningen, bestemmer resultatsettet og setter markøren til første rad i resultatsettet.

Mer om parameterisert markør i neste opplæring.

Hent fra en markør

Uttrykket FETCH plasserer innholdet i den gjeldende raden i variabler. Syntaksen for FETCH utsagnet er som følger:

For å hente alle radene i et resultatsett, trenger du for å hente hver rad til den siste.

Lukke en markør

Når du har hentet alle radene, må du lukke markøren med CLOSE uttalelse:

Lukking av en markør instruerer Oracle om å frigjøre allokert minne til et passende tidspunkt.

Hvis du erklærer en markør i en anonym blokk, prosedyre eller funksjon, vil markøren automatisk lukkes når utførelsen av disse objektene avsluttes.

Du må imidlertid eksplisitt lukke pakkebaserte markører. Merk at hvis du lukker en markør som ikke har åpnet ennå, vil Oracle heve et INVALID_CURSOR unntak.

Eksplisitte markørattributter

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

der cursor_name er navnet på eksplisitt markør.

1)% ISOPEN

Dette attributtet er TRUE hvis markøren er åpen eller FALSE hvis det ikke er det.

2)% FUNNT

Dette attributtet har fire verdier:

  • NULL før første henting
  • TRUE hvis en post ble hentet vellykket
  • FALSE hvis ingen rad returneres
  • INVALID_CURSOR hvis markøren ikke åpnes

3)% NOTFOUND

Dette attributtet har fire verdier:

  • NULL før første henting
  • FALSE hvis en plate ble hentet suksess essensielt
  • TRUE hvis ingen rad returneres
  • INVALID_CURSOR hvis markøren ikke åpnes

3)% ROWCOUNT

%ROWCOUNT -attributtet returnerer antall rader hentet fra markøren. Hvis markøren ikke åpnes, returnerer dette attributtet INVALID_CURSOR.

PL / SQL-markøreksempel

Vi vil bruke orders og order_items tabellene eksempeldatabasen for demonstrasjonen.

Følgende uttalelse oppretter et syn som returnerer salgsinntektene fra kunder:

Verdiene til kredittkolonnen er 5% av den totale salgsinntekten.

Anta at du trenger å utvikle en anonym blokker det:

  1. Tilbakestill kredittgrenser for alle kunder til null.
  2. Hent kunder sortert etter salg i synkende rekkefølge og gir dem nye kredittgrenser fra et budsjett på 1 million.

Følgende anonyme blokk illustrerer logikken:

I erklæringsdelen erklærer vi tre variabler.

Den første er l_budget hvis opprinnelige verdi er 1,000,000.

Den andre variabelen er en eksplisitt markørvariabel med navnet c_sales hvis uttalelse henter data fra sales visning:

Den tredje variabelen er en markørbasert post med navnet c_sales.

I utførelsesdelen utfører vi følgende:

  • Tilbakestill kredittgrenser først av alle kunder til null ved å bruke en UPDATE uttalelse.
  • For det andre, åpne c_sales markøren.
  • For det tredje, hent hver rad fra markøren. I hver loop-iterasjon oppdaterer vi kredittgrensen og reduserte budsjettet. Sløyfen avsluttes når det ikke er noen rad å hente eller budsjettet er oppbrukt.
  • Til slutt lukker du markøren.

Følgende spørring henter data fra customers tabell for å bekrefte oppdateringen:

Resultat:

Som du ser tydelig av resultatet, er det bare de første få kundene som har kredittgrensene. Hvis du oppsummerer alle kredittgrenser, bør totalen være 1 million som vist nedenfor:

Nå , bør du forstå PL / SQL-markører inkludert implisitte og eksplisitte markører, og hvordan du kan bruke dem effektivt til å behandle data, rad for rad, fra en tabell.

  • Var denne opplæringen nyttig?
  • JaNei

Leave a Reply

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *