Vi har allerede set i den forrige tutorial, hvordan man opretter markørbaseret registreringstypevariabel baseret på Simple Cursor, som returnerer en enkelt række data. Nu opstår spørgsmålet her er, at kan vi bruge den samme enkelt record datatype variabel med markøren, som returnerer flere rækker af data? For at kende svaret skal du læse med og lære, hvordan du håndterer flere værdier, der returneres af en markør ved hjælp af en enkelt markørbaseret registreringsdatatypevariabel.
Da vi har at gøre med markørbaserede optegnelser, kræves der derfor en lille smule kendskab til markøren. For enkelhedens skyld og for at gøre dette koncept let at forstå, vil jeg bruge en Simple Explicit-Cursor til demonstrationen.
Trin 1:Erklær en simpel eksplicit markør
En markørbaseret postdatatype kræver en allerede oprettet markør. Denne markør bliver en underliggende base for vores registreringstypevariabel. Alle felterne i registreringstypevariablen, som er oprettet ved hjælp af denne markør, vil have samme navn og datatype som for de kolonner, der bruges i markørens SELECT-liste.
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200;
I modsætning til markøren fra den forrige øvelse, som returnerer en enkelt række data, returnerer denne markør flere rækker. Alle disse rækker vil bestå af fornavn og løn for alle medarbejdere med medarbejder-id større end 200.
Trin 2:Erklærer den markørbaserede registreringsdatatypevariabel
Da vi har oprettet markøren, er vi nu klar til at erklære vores registreringsvariabel ved hjælp af denne markør.
var_emp cur_RebellionRider%ROWTYPE;
Var_emp er registreringstypevariablen, og da den er baseret på cursoren cur_RebellionRider, kan vi stolt kalde det en Cursor-baseret posttypevariabel. Nu skal vi se, om denne enkelte registreringsvariabel er i stand til at indeholde alle de data, der returneres af den underliggende cursor cur_RebellionRider.
Trin 3:Initialiser Cursor-Record-variablen
Som vi diskuterede i PL/SQL-tutorial 34, er initialisering af en registreringsvariabel processen med at tildele nogle værdier til den. I tilfælde af markører fungerer FETCH-INTO-sætningen dette. Men vi skal sikre os, at vi har fulgt markørens livscyklus korrekt.
Hvis du ikke ved, hvad denne markørlivscyklus er og de trin, der er involveret i at oprette en markør, så tjek denne blog om "Introduktion til databasemarkør".
BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary ); END LOOP;--Simple Loop End CLOSE cur_RebellionRider; END;
Ovenstående udførelsessektion af PL/SQL-blok, som vi opretter her, er blevet forklaret linje for linje i videovejledningen på min YouTube-kanal. Tjek det ud.
Så det er det. Det er alt, vi skal. Lad os nu kombinere alle disse bidder af kode, som vi så i forskellige trin ovenfor, til en enkelt anonym PL/SQL-blok.
Cursor-baseret registreringsdatatypevariabel i Oracle-databasen
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200; var_emp cur_RebellionRider%ROWTYPE; BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary); END LOOP; CLOSE cur_RebellionRider; END;
Når du kompilerer og kører ovenstående kode, vil du få alle de data, som FETCH-INTO-sætningen hentede fra cursoren cur_RebellionRider og gemt i den Cursor-baserede Record-variabel var_emp. Dette indebærer, at vi faktisk kan håndtere flere rækker af data ved hjælp af en enkelt markørbaseret post.
I min PL/SQL video tutorial spurgte jeg, om vi kan forenkle denne kode, eller er der nogen anden måde at udføre den samme opgave på. Svaret er ja, der er flere måder at opnå det samme resultat på, og en af dem er ved at bruge "Cursor For-Loop". Dette er en speciel slags loop, som erklærer registreringsvariablen samt åbner, henter og lukker den underliggende markør implicit i baggrunden for dig. Du kan læse mere Cursor For-Loop her.
Referencebog til SQL Expert 1z0-047 Affiliate-link
OCA Oracle Database SQL Certified Expert Exam Guide (Eksamen 1Z0-047)
Her er koden udført ved hjælp af Cursor For-Loop, som svarer til ovenstående kode. Som du kan se, er det meget mindre komplekst med få Line-of-Codes (LOC'er).
SET SERVEROUTPUT ON; BEGIN FOR var_emp IN (SELECT first_name, salary FROM employees WHERE employee_id >200) LOOP DBMS_OUTPUT.PUT_LINE(var_emp.first_name||' '||var_emp.salary); END LOOP; END;
Begge koder vil returnere det samme resultat, da begge udfører den samme opgave.
Håber du nød denne detaljerede PL/SQL-tutorial. Sørg for at dele dette på din sociale side, og tag mig, da jeg giver væk RebellionRiders merchandise hver måned til en tilfældigt udvalgt bruger. Følg mig også på mine sociale medier [Twitter/Facebook/Instagram] for regelmæssige opdateringer.
Tak og god dag!