Cursoare în Oracle

Cursor - un pointer la porțiunea rezervată a memoriei în SGA, care este procesat de către SQL (SELECT) sau DML (UPDATE / INSERT / DELETE) oferta.

SGA (Global System Area), o mare parte din memorie rezervată de către sistemul de operare, care utilizează Oracle pentru a lucra. SGA (printre altele) sunt piscină comună (bazin de memorie partajată) și o piscină privată de memorie (piscină privată de memorie), care sunt executate PL / SQL program. Atunci când codul este compilat și încărcat în memorie pentru execuție, definiția cursorului este încărcat în piscină comună: textul cursor și codul analizat. Prin termenul „comun“ înseamnă că există doar un singur exemplar în memorie, și înseamnă că, dacă tu și cu mine suntem administrați aceeași cerere identică (în aceeași simbolic), folosim a explodat. Oracle știe că cursorul și mi - identic atunci când se compară versiunea text a cursorului. Și în acest caz, Oracle poate utiliza cursorul care se află deja în memorie.

Când fac mouse-ul meu, informațiile necesare pentru procesarea este stocată în memorie piscina privată. În acest caz, Oracle vă permite să reutilizați același cursor.

Există trei tipuri principale de cursoare:
  • implicit,
  • o clară și
  • Cursor cicluri pentru.

cursor implicită este controlată în mod automat, transparent pentru tine. În timpul execuției, cursorul este deschis, acesta selectat din datele și se închide, toate într-un cursoare shag.Neyavnye sunt utilizate numai în cazul în care este necesar să se întoarcă un singur rând din tabel. Atunci când cursorul implicit ar trebui să se întoarcă mai mult de un rând, o excepție (TOO_MANY_ROWS) este declanșată. Faptul este că puteți selecta (SELECT INTO) numai variabile scalare (având doar o singură valoare).

Când cursorul implicit nu returnează rânduri, o excepție (NO_DATA_FOUND) este declanșată.

Utilizați întotdeauna un cursor implicit, împreună cu propriul său manipulator de excepție.

excepții tipice care pot apărea atunci când se lucrează cu cursorul: În cazul în care înregistrarea de tip declarată variabilă, care câmpul este exact la fel cu datele solicitate în instrucțiunea SELECT, este posibil să se utilizeze o construcție SELECT INTO. cursoare implicite sunt optimizate pentru a selecta o singură linie, și, prin urmare, ei lucrează mai repede decât în ​​mod clar definite: deschiderea, proba și închiderea cursorului.

Pentru trimiterile la câmpul de înregistrare, termeni utilizați. Exemple: Puteți specifica, de asemenea, RECORD TYPE și de a face cursorul să-l întoarcă. După cum puteți vedea, primul este utilizat pentru cursorul ambalate pe care doriți să partajați. caietul de sarcini lot conține doar descrierea cursorului (numele și tipul de întoarcere), în timp ce (ascuns) corpul cursorului este conținută în instrucțiunea SELECT. Ambele componente cursor trebuie să se potrivească (meci). tip de înregistrare este utilizat pentru a furniza un tip de date convenabil pentru cursor. tip de înregistrare și a expresiei Cursor SELECT comparabile.

Prin setarea cursorului în corpul corpului pachetului, puteți păstra declarația cursorului mai ușor fără a fi nevoie să recompilați antetul pachetului, ceea ce poate afecta unitatea de software dependente.

Cursoare sunt (4) atribute:
  • line GĂSIT eliminat cu succes? (TRUE / FALSE)
  • Not Found Șirul nu este eliminat? (TRUE / FALSE)
  • ISOpen cursorul deschis? (TRUE / FALSE)
  • Numărul de rânduri recuperate ROWCOUNT

Primele trei valori ale boolean (boolean), iar a patra - numărul. GĂSIT, Not Found, și ROWCOUNT - folosit pentru a deschide cursoare. ISOpen poate fi folosit pentru a testa care cursoare sunt deschise și care sunt închise. Tu le utilizați cu o notație a atributului; de exemplu: cursoare parametrizate

cursoare expliciți pot folosi: Este o bună practică de a utiliza întotdeauna parametrii pe baza tipurilor tabel de date cu care se presupune să le folosească.

Numele parametrului trebuie să fie diferit de numele de coloană în cursorul locală; În caz contrar, fiecare linie va fi returnat! (X = x este întotdeauna TRUE). Fii consecvent în numele parametrilor de selecție; de exemplu, „folosiți întotdeauna un simbol atunci numele coloanei“, această regulă poate fi utilizată ca un standard, atunci când se ocupă cu cursoare explicite.

Numele parametrului este doar „umplere“ pentru variabila pe care le furnizați. Zona - strict cursorul locale în organism. Deoarece cursoare sunt obiecte pentru read-only, nu este nevoie pentru a defini parametrii pentru flux. Flow - întotdeauna (IN).

Cursor bucle

Ciclul fugară PENTRU - proiectarea iterativă care permite utilizarea OPEN, FETCH, cursorul de închidere din interiorul buclei. Acesta vă permite să efectuați operații pe fiecare rând selectat în ciclul. Acesta este, în general folosit atunci când aveți de gând pentru a procesa fiecare șir care returnează. Dacă aveți nevoie pentru a rupe ciclul prematur, utilizați cursoare explicite (cu mai mult control a acestora). Ieșirea cursorului (a se vedea mai sus :. Rec) poate fi utilizat numai într-un ciclu. Nu puteți utiliza înregistrare (înregistrare) în afara buclei, pentru că nu există în afara domeniului ciclului. Dacă aveți nevoie pentru a vedea valoarea tipului de înregistrare în afara buclei, atribuie o variabilă definită în afara buclei. Înregistrarea variabilă este declarată, implicit, cu aceleași tipuri de câmpuri ca linia cursorului, și poate fi numit ca nimic.

Nici unul dintre atributele cursorului, cu excepția ISOpen, nu sunt disponibile în afara buclei, deoarece cursorul nu este deschis. Dacă încercați să apel GĂSIT, Not Found, și în afara ROWCOUNT cursorul la cicluri (FOR), vei primi eroarea: ORA-01001: cursor invalid.

Ca și cursoare clare, cursorul pe cursorul utilizat pentru (FOR) cicluri pot utiliza, de asemenea opțiuni.

Cea mai simplă formă pentru ciclul cursorului (FOR) este o cerere care se introduce în descrierea ciclului: