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:
- Resetați la zero limitele de credit ale tuturor clienților.
- 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