PL /SQL Cursors

Oracle skaper en minneområde, kjent som kontekst område, for behandling av en SQL-setning som inneholder all informasjon som er nødvendig for behandling av setningen, for eksempel antall rader behandlet, etc.

En markør er en peker til denne sammenhengen området. PL /SQL styrer sammenheng området gjennom en markør. En markør holder radene (én eller flere) returnert av en SQL-setning. Settet med rader markøren innehar er referert til som aktiv sett
.

Du kan navngi en markør slik at det kunne bli referert til i et program for å hente og behandle radene som returneres av SQL-setningen, ett om gangen. Det finnes to typer av pekere:

Implisitt pekere

Explicit pekere

Implisitt Pekere
< p> Implisitt pekere blir automatisk opprettet av Oracle når en SQL-setning er utført, når det ikke er eksplisitt markør for uttalelsen. Programmerere kan ikke kontrollere den implisitte pekere og informasjonen i den.

Når en DML utsagn (INSERT, UPDATE og DELETE) er utstedt, en implisitt markøren er assosiert med denne uttalelsen. For INSERT operasjoner, holder markøren dataene som må settes inn. For UPDATE og DELETE operasjoner, identifiserer markøren radene som ville bli berørt.

I PL /SQL, kan du referere til den nyeste implisitte markøren som SQL markøren
, som alltid har attributtene som% FUNNET,% ISOPEN,% NOTFOUND, og% ROWCOUNT. SQL-markøren har flere attributter,% BULK_ROWCOUNT og% BULK_EXCEPTIONS, designet for bruk sammen med FORALL uttalelse. Tabellen nedenfor gir beskrivelsen av de mest brukte attributtene:
Egenskap
Beskrivelse
% FOUNDReturns TRUE hvis en INSERT, UPDATE eller DELETE-setningen påvirket én eller flere rader eller en SELECT INTO- returnert en eller flere rader. Ellers returnerer den USANN.% NOTFOUNDThe logisk motsatte av% FUNNET. Den returnerer TRUE hvis en INSERT, UPDATE eller DELETE-setningen berørt ingen rader, eller en SELECT INTO uttalelse ga ingen rader. Ellers returnerer den USANN.% ISOPENAlways Returnerer usann for implisitte pekere, fordi Oracle lukker SQL markøren automatisk etter gjennomføring av tilhørende SQL-setning.% ROWCOUNTReturns antallet rader berørt av en INSERT, UPDATE eller DELETE-setningen, eller returneres av en SELECT . INTO-

Alle SQL markøren attributt vil nås som sql% ATTRIBUTE_NAME
som vist nedenfor i eksempelet

Eksempel:.

Vi skal bruke de KUNDER . tabellen vi hadde skapt og brukt i de foregående kapitlene
Velg * fra kunder; + ---- + ---------- + ----- + -------- --- + ---------- + | ID | NAME | AGE | ADRESSE | LØNN | + ---- + ---------- + ----- + ----------- + ---------- + | 1 | Ramesh | 32 | Ahmedabad | 2000.00 || 2 | Khilan | 25 | Delhi | 1500.00 || 3 | Kaushik | 23 | Kota | 2000.00 || 4 | Chaitali | 25 | Mumbai | 6500.00 || 5 | Hardik | 27 | Bhopal | 8500.00 || 6 | Komal | 22 | MP | 4500.00 | + ---- + ---------- + ----- + ----------- + ---------- +

Følgende program vil oppdatere tabellen og øke lønnen til hver kunde med 500 og bruke SQL% ROWCOUNT attributt for å bestemme antall rader berørt:
ERKLÆRER TOTAL_ROWS nummer (2); BEGIN UPDATE kunder SET lønn = lønn + 500; IF sql% notfound SÅ dbms_output.put_line ('ingen kunder valgt'); ELSIF sql% funnet SÅ TOTAL_ROWS: = sql% ROWCOUNT; dbms_output.put_line (TOTAL_ROWS || "kunder utvalgte '); END IF; END; /

Når ovenfor koden kjøres på SQL teksten, gir det følgende resultat:
6 kunder selectedPL /SQL-prosedyren ble fullført

Hvis du sjekker postene i kundene tabellen, vil du finne det. radene har blitt oppdatert:
Velg * fra kunder; + ---- + ---------- + ----- + ----------- + - --------- + | ID | NAME | AGE | ADRESSE | LØNN | + ---- + ---------- + ----- + ----------- + ---------- + | 1 | Ramesh | 32 | Ahmedabad | 2500.00 || 2 | Khilan | 25 | Delhi | 2000.00 || 3 | Kaushik | 23 | Kota | 2500.00 || 4 | Chaitali | 25 | Mumbai | 7000.00 || 5 | Hardik | 27 | Bhopal | 9000.00 || 6 | Komal | 22 | MP | 5000.00 | + ---- + ---------- + ----- + ----------- + ---------- +
Explicit Markører

Explicit pekere er programmerer definert pekere for å få mer kontroll over sammenheng området
. En eksplisitt markøren skal defineres i erklæringen delen av PL /SQL Block. Den er laget på en SELECT Statement som returnerer mer enn én rad.

Syntaksen for å skape en eksplisitt markøren er:
CURSOR cursor_name ER select_statement;

Arbeide med en eksplisitt markøren innebærer fire trinn:

Erklærte markøren for initialisering i minnet

Åpne markøren for tildeling av minne

Henter markøren for å hente data

Lukke markøren for å frigjøre allokert minne

forkynner Markør

Erklærte markøren definerer markøren med et navn og tilhørende SELECT-setningen. For eksempel:
MARKØR- c_customers ER SELECT id, navn, adresse fra kunder;
Åpne Markør

Åpne markøren tildeler minne for markøren og gjør den klar for henting radene som returneres av SQL uttalelse i den. For eksempel vil vi åpne ovenfor definerte markøren som følger:
ÅPNE c_customers;
Henter Markør

Henter markøren innebærer tilgang til én rad om gangen. For eksempel vil vi hente rader fra oven åpnet markøren som følger:
HENT c_customers INTO c_id, c_name, c_addr;
Lukke Markør

Lukke markøren betyr frigjøre allokert minne. For eksempel vil vi stenge oven åpnet markøren som følger:
Lukk c_customers;
Eksempel:

Etter er en komplett eksempel for å illustrere begrepene eksplisitte pekere:
ERKLÆRER c_id kunder. id% type; c_name customers.name% type; c_addr customers.address% type; MARKØR- c_customers er SELECT id, navn, adresse fra kunder; BEGIN ÅPNE c_customers; LOOP HENT c_customers inn c_id, c_name, c_addr; EXIT NÅR c_customers% notfound; dbms_output.put_line (c_id || '' || c_name || '' || c_addr); END LOOP; LUKK c_customers; ende; /

Når ovenfor koden kjøres på SQL teksten, gir det følgende resultat:
en Ramesh Ahmedabad 2 Khilan Delhi 3 Kaushik Kota 4 Chaitali Mumbai 5 Hardik Bhopal 6 Komal MP PL /SQL prosedyre fullført.



Next Page: