sql >> Database teknologi >  >> RDS >> Oracle

Markørbaseret postdatatype med markør, der returnerer flere værdier i Oracle-databasen

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!


  1. Minimal logning med INSERT...SELECT i heaptabeller

  2. Opdateringer til JSON-feltet fortsætter ikke til DB

  3. Kan du bruge et alias i WHERE-sætningen i mysql?

  4. Ved hjælp af PL/SQL, hvordan får jeg en fils indhold ind i en klat?