Sammanfattning: i denna handledning lär du dig om PL / SQL-markören och dess användning.
En markör är en pekare som pekar på ett resultat av en fråga. PL / SQL har två typer av markörer: implicita markörer och explicita markörer.
Implicita markörer
När Oracle kör ett SQL-uttalande som SELECT INTO
, INSERT
, UPDATE
och DELETE
skapar det automatiskt en implicit markör.
Oracle hanterar internt hela körcykeln för implicita markörer och avslöjar endast markörens information och status som SQL%ROWCOUNT
, SQL%ISOPEN
, SQL%FOUND
och SQL%NOTFOUND
.
Den implicita markören är inte elegant när frågan returnerar noll eller flera rader som orsakar NO_DATA_FOUND
eller TOO_MANY_ROWS
undantag respektive.
Explicita markörer
En uttrycklig markör är ett SELECT
-uttalande som deklareras uttryckligen i deklarationssektionen i det aktuella blocket eller i en paketspecifikation.
För en uttrycklig markör har du fortsatt roll över dess körningscykel från OPEN
, FETCH
och CLOSE
.
Oracle definierar en körningscykel som kör en SQL-sats och associerar en markör med den.
Följande bild visar körningscykeln för en uttrycklig markör:
Låt oss granska varje steg i detalj.
Förklara en markör
Innan du använder en uttrycklig markör måste du deklarera det i deklarationsavsnittet i ett block eller paket enligt följande:
I denna syntax :
- Ange först markörens namn efter
CURSOR
nyckelordet. - För det andra definiera en fråga för att hämta data efter nyckelordet
IS
.
Öppna en markör
Innan du börjar hämta rader från markören måste du öppna den. För att öppna en markör använder du följande syntax:
I denna syntax är cursor_name
namnet av markören som deklareras i deklarationsavsnittet.
När du öppnar en markör, analyserar Oracle frågan, binder variabler och kör den associerade SQL-satsen.
Oracle bestämmer också en exekveringsplan , associerar värdvariabler och markörparametrar med platshållarna i SQL-satsen, bestämmer resultatuppsättningen och sätter markören till första raden i resultatuppsättningen.
Mer om parametrerad markör i nästa handledning.
Hämta från en markör
Uttrycket FETCH
placerar innehållet i den aktuella raden i variabler. Syntaxen för FETCH
uttalande är som följer:
För att hämta alla rader i en resultatuppsättning behöver du för att hämta varje rad till den sista.
Stänga en markör
När du har hämtat alla rader måste du stänga markören med CLOSE
uttalande:
Att stänga en markör instruerar Oracle att frigöra tilldelat minne vid en lämplig tidpunkt.
Om du förklarar en markör i en anonymt block, procedur eller funktion stängs markören automatiskt när körningen av dessa objekt slutar.
Du måste dock uttryckligen stänga paketbaserade markörer. Observera att om du stänger en markör som inte har öppnats ännu, kommer Oracle att höja ett INVALID_CURSOR
undantag.
Explicit markörattribut
En markör har fyra attribut som du kan referera till i följande format:
där cursor_name
är namnet på tydlig markör.
1)% ISOPEN
Detta attribut är TRUE
om markören är öppen eller FALSE
om det inte är det.
2)% HITTAD
Detta attribut har fyra värden:
-
NULL
före första hämtningen -
TRUE
om en post lyckades hämtas -
FALSE
om ingen rad returneras -
INVALID_CURSOR
om markören inte öppnas
3)% NOTFOUND
Detta attribut har fyra värden:
-
NULL
före första hämtningen -
FALSE
om en post hämtades succ väsentligen -
TRUE
om ingen rad returneras -
INVALID_CURSOR
om markören inte öppnas
3)% ROWCOUNT
%ROWCOUNT
-attributet returnerar antalet rader som hämtats från markören. Om markören inte öppnas returnerar detta attribut INVALID_CURSOR
.
PL / SQL-markörexempel
Vi använder tabellerna orders
och order_items
exempeldatabasen för demonstrationen.
Följande uttalande skapar en vy som returnerar försäljningsintäkterna från kunder:
Kreditkolumnens värden är 5% av de totala försäljningsintäkterna.
Antag att du behöver utveckla en anonym blockera det:
- Återställ kreditgränser för alla kunder till noll.
- Hämta kunder sorterade efter försäljning i fallande ordning och ger dem nya kreditgränser från en budget på 1 miljon.
Följande anonyma block illustrerar logiken:
I deklarationsavsnittet deklarerar vi tre variabler.
Den första är l_budget
vars ursprungliga värde är 1,000,000
.
Den andra variabeln är en uttrycklig markörvariabel med namnet c_sales
vars uttalande hämtar data från sales
-vy:
Den tredje variabeln är markörbaserad post med namnet c_sales
.
I exekveringsavsnittet utför vi följande:
- Återställ först kreditgränser av alla kunder till noll med ett
UPDATE
uttalande. - För det andra, öppna
c_sales
markören. - För det tredje, hämta varje rad från markören. I varje loop iteration uppdaterar vi kreditgränsen och minskade budgeten. Slingan avslutas när det inte finns någon rad att hämta eller budgeten är slut.
- Stäng slutligen markören.
Följande fråga hämtar data från customers
tabell för att verifiera uppdateringen:
Resultat:
Som du ser tydligt av resultatet är det bara de första kunderna som har kreditgränserna. Om du summerar alla kreditgränser bör summan vara 1 miljon enligt följande:
Nu , bör du förstå PL / SQL-markörer inklusive implicita och explicita markörer, och hur man använder dem effektivt för att bearbeta data, rad för rad, från en tabell.
- Hjälpte den här handledningen?
- Ja Nej