PL / SQL-markör (Svenska)

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:

  1. Återställ kreditgränser för alla kunder till noll.
  2. 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

Leave a Reply

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *