Oracle PL / SQL-cursor: impliciet, expliciet, cursor FOR-lus (voorbeeld)

Inhoudsopgave:

Anonim

Wat is CURSOR in PL / SQL?

Een cursor is een verwijzing naar dit contextgebied. Oracle creëert een contextgebied voor het verwerken van een SQL-instructie die alle informatie over de instructie bevat.

Met PL / SQL kan de programmeur het contextgebied via de cursor besturen. Een cursor bevat de rijen die door de SQL-instructie worden geretourneerd. De set rijen die de cursor bevat, wordt actieve set genoemd. Deze cursors kunnen ook een naam krijgen, zodat ze kunnen worden verwezen vanaf een andere plaats in de code.

In deze tutorial leer je-

  • Impliciete cursor
  • Expliciete cursor
  • Cursor attributen
  • FOR Loop Cursor-instructie

De cursor is van twee soorten.

  • Impliciete cursor
  • Expliciete cursor

Impliciete cursor

Elke keer dat er DML-bewerkingen plaatsvinden in de database, wordt een impliciete cursor gemaakt die de betrokken rijen in die specifieke bewerking bevat. Deze cursors kunnen geen naam krijgen en daarom kunnen ze niet worden bestuurd of doorverwezen vanaf een andere plaats in de code. We kunnen alleen naar de meest recente cursor verwijzen via de cursorattributen.

Expliciete cursor

Programmeurs mogen een benoemde contextzone maken om hun DML-bewerkingen uit te voeren om er meer controle over te krijgen. De expliciete cursor moet worden gedefinieerd in de declaratiegedeelte van het PL / SQL-blok en wordt gemaakt voor de 'SELECT'-instructie die in de code moet worden gebruikt.

Hieronder staan ​​de stappen die betrokken zijn bij het werken met expliciete cursors.

  • De cursor aangeven

    Het declareren van de cursor betekent simpelweg dat je een genoemd contextgebied maakt voor de 'SELECT'-instructie die is gedefinieerd in het declaratiegedeelte. De naam van dit contextgebied is hetzelfde als de cursornaam.

  • Cursor openen

    Door de cursor te openen, wordt de PL / SQL geïnstrueerd om het geheugen voor deze cursor toe te wijzen. Het maakt de cursor klaar om de records op te halen.

  • Gegevens ophalen uit de cursor

    In dit proces wordt de 'SELECT'-instructie uitgevoerd en worden de opgehaalde rijen opgeslagen in het toegewezen geheugen. Deze worden nu als actieve sets genoemd. Het ophalen van gegevens van de cursor is een activiteit op recordniveau, wat betekent dat we de gegevens record voor record kunnen openen.

    Elke fetch-instructie haalt één actieve set op en bevat de informatie van dat specifieke record. Deze instructie is hetzelfde als de 'SELECT'-instructie die het record ophaalt en toewijst aan de variabele in de' INTO'-clausule, maar het genereert geen uitzonderingen.

  • De cursor sluiten

    Zodra al het record is opgehaald, moeten we de cursor sluiten zodat het geheugen dat aan dit contextgebied is toegewezen, wordt vrijgegeven.

Syntaxis:

DECLARECURSOR  IS ;BEGINFOR I IN LOOP… END LOOP;END;
  • In de bovenstaande syntaxis bevat het declaratiegedeelte de declaratie van de cursor.
  • De cursor wordt gemaakt voor de 'SELECT'-instructie die in de cursor-declaratie wordt gegeven.
  • In het uitvoeringsgedeelte wordt de gedeclareerde cursor ingesteld in de FOR-lus en de lusvariabele 'I' zal zich in dit geval als cursorvariabele gedragen.

Voorbeeld 1 : In dit voorbeeld zullen we alle werknemersnamen uit de emp-tabel projecteren met behulp van een cursor-FOR-lus.

DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/

Uitvoer

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY

Code Verklaring:

  • Coderegel 2 : Declaratie van de cursor guru99_det voor statement 'SELECT emp_name FROM emp'.
  • Coderegel 4 : Constructie van de 'FOR'-lus voor de cursor met de lusvariabele lv_emp_name.
  • Coderegel 5: de naam van de werknemer afdrukken in elke iteratie van de lus.
  • Coderegel 8: verlaat de lus

Opmerking: In Cursor-FOR-lus kunnen cursorattributen niet worden gebruikt omdat het openen, ophalen en sluiten van de cursor impliciet wordt gedaan door de FOR-lus.