Cursor PL / SQL (Română)

Rezumat: în acest tutorial veți afla despre cursorul PL / SQL și utilizarea acestuia.

Un cursor este un indicator care indică un rezultat al unei interogări. PL / SQL are două tipuri de cursoare: cursoare implicite și cursoare explicite.

Cursoare implicite

Ori de câte ori Oracle execută o instrucțiune SQL precum SELECT INTO, INSERT, UPDATE și DELETE, creează automat un cursor implicit.

Oracle gestionează intern întregul ciclu de execuție al cursoarelor implicite și dezvăluie doar informațiile și stările cursorului, cum ar fi SQL%ROWCOUNT, SQL%ISOPEN, SQL%FOUND și SQL%NOTFOUND.

Cursorul implicit nu este elegant atunci când interogarea returnează zero sau mai multe rânduri care cauzează NO_DATA_FOUND sau, respectiv, TOO_MANY_ROWS excepție.

Cursoare explicite

Un cursor explicit este o declarație SELECT declarată explicit în secțiunea de declarație a blocului curent sau o specificație a pachetului.

Pentru un cursor explicit, aveți cont rol peste ciclul său de execuție din OPEN, FETCH și CLOSE.

Oracle definește un ciclu de execuție care execută o instrucțiune SQL și asociază un cursor cu aceasta.

Următoarea ilustrație arată ciclul de execuție al unui cursor explicit:

Să examinăm fiecare pas în detaliu.

Declarați un cursor

Înainte de a utiliza un cursor explicit, trebuie să-l declarați în secțiunea de declarație a unui bloc sau pachet după cum urmează:

În această sintaxă :

  • Mai întâi, specificați numele cursorului după cuvântul cheie CURSOR.
  • În al doilea rând, definiți o interogare pentru a prelua date după cuvântul cheie IS.

Deschideți un cursor

Înainte de a începe să preluați rânduri de pe cursor, trebuie să îl deschideți. Pentru a deschide un cursor, utilizați următoarea sintaxă:

În această sintaxă, cursor_name este numele a cursorului declarat în secțiunea de declarație.

Când deschideți un cursor, Oracle analizează interogarea, leagă variabilele și execută instrucțiunea SQL asociată.

Oracle determină și un plan de execuție , asociază variabilele gazdei și parametrii cursorului cu substituenții din instrucțiunea SQL, determină setul de rezultate și setează cursorul pe primul rând din setul de rezultate.

Mai multe despre cursorul parametrizat în următorul tutorial.

Preluare dintr-un cursor

Instrucțiunea FETCH plasează conținutul rândului curent în variabile. Sintaxa declarației FETCH este următoarea:

Pentru a prelua toate rândurile dintr-un set de rezultate, aveți nevoie pentru a prelua fiecare rând până la ultimul.

Închiderea unui cursor

După preluarea tuturor rândurilor, trebuie să închideți cursorul cu CLOSE statement:

Închiderea unui cursor instruiește Oracle să elibereze memoria alocată la un moment adecvat.

Dacă declarați un cursor într-un bloc, procedură sau funcție anonimă, cursorul va fi închis automat când se termină executarea acestor obiecte.

Cu toate acestea, trebuie să închideți în mod explicit cursurile bazate pe pachete. Rețineți că, dacă închideți un cursor care nu s-a deschis încă, Oracle va ridica o excepție INVALID_CURSOR.

Atribute explicite ale cursorului

Un cursor are patru atribute la care puteți face referire în următorul format:

unde cursor_name este numele cursor explicit.

1)% ISOPEN

Acest atribut este TRUE dacă cursorul este deschis sau FALSE dacă nu este.

2)% FOUND

Acest atribut are patru valori:

  • NULL înainte de prima preluare
  • TRUE dacă o înregistrare a fost preluată cu succes
  • FALSE dacă nu a revenit niciun rând
  • INVALID_CURSOR dacă cursorul nu este deschis

3)% NOTFOUND

Acest atribut are patru valori:

  • NULL înainte de prima preluare
  • FALSE dacă o înregistrare a fost preluată succ esențial
  • TRUE dacă nu a revenit niciun rând
  • INVALID_CURSOR dacă cursorul nu este deschis

3)% ROWCOUNT

Atributul %ROWCOUNT returnează numărul de rânduri preluate de la cursor. Dacă cursorul nu este deschis, acest atribut returnează INVALID_CURSOR.

Exemplu cursor PL / SQL

Vom folosi tabelele orders și order_items baza de date eșantion pentru demonstrație.

Următoarea declarație creează o vizualizare care returnează veniturile din vânzări de către clienți:

Valorile coloanei de credit sunt 5% din totalul veniturilor din vânzări.

Să presupunem că trebuie să dezvoltați un anonim blocați acest lucru:

  1. Resetați la zero limitele de credit ale tuturor clienților.
  2. Aduceți clienții sortați după vânzări în ordine descrescătoare și le acordați noi limite de credit dintr-un buget de 1 milion.

Următorul bloc anonim ilustrează logica:

În secțiunea declarație, declarăm trei variabile.

Prima este l_budget a cărui valoare inițială este 1,000,000.

A doua variabilă este o variabilă explicită a cursorului numită c_sales al cărui preia date din vizualizarea sales:

A treia variabilă este o înregistrare bazată pe cursor numită c_sales.

În secțiunea de execuție, efectuăm următoarele:

  • Mai întâi, resetați limitele de credit dintre toți clienții la zero utilizând o instrucțiune UPDATE.
  • În al doilea rând, deschideți cursorul c_sales.
  • În al treilea rând, preluați fiecare rând de la cursor. În fiecare iterație de buclă, actualizăm limita de credit și am redus bugetul. Bucla se termină atunci când nu există niciun rând de preluat sau bugetul este epuizat.
  • În cele din urmă, închideți cursorul.

Următoarea interogare preia date din customers tabel pentru a verifica actualizarea:

Rezultat:

După cum puteți vedea clar din rezultat, doar primii clienți au limitele de credit. Dacă rezumați toate limitele de credit, suma totală ar trebui să fie de 1 milion, după cum se arată în continuare:

Acum , ar trebui să înțelegeți cursorii PL / SQL, inclusiv cursorile implicite și explicite, și cum să le utilizați eficient pentru a procesa date, rând cu rând, dintr-un tabel.

  • A fost de ajutor acest tutorial?
  • Da Nu

Leave a Reply

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *