sql >> Databasteknik >  >> RDS >> Oracle

Markörbaserad postdatatyp med markör som returnerar flera värden i Oracle-databasen

Vi har redan sett i den tidigare handledningen hur man skapar markörbaserad posttypvariabel baserad på enkel markör som returnerar en enda rad med data. Nu uppstår frågan här är att kan vi använda samma datatypvariabel för en enda post med markören som returnerar flera rader med data? För att veta svaret, läs med och lär dig hur du hanterar flera värden som returneras av en markör med en enda markörbaserad postdatatypvariabel.

Eftersom vi har att göra med markörbaserade poster krävs därför lite kunskap om markören. För enkelhetens skull och för att göra detta koncept lätt att förstå kommer jag att använda en Simple Explicit-Cursor för demonstrationen.

Steg 1:Deklarera en enkel explicit markör

En markörbaserad postdatatyp kräver en redan skapad markör. Den här markören kommer att bli en underliggande bas för vår posttypvariabel. Alla fält för posttypvariabeln som skapas med den här markören kommer att ha samma namn och datatyp som kolumnerna som används i markörens SELECT-lista.

SET SERVEROUTPUT ON;
DECLARE
 CURSOR cur_RebellionRider IS
 SELECT first_name, salary FROM employees 
 WHERE employee_id > 200;

Till skillnad från markören från föregående handledning som returnerar en enda rad med data, kommer den här markören att returnera flera rader. Alla dessa rader kommer att bestå av förnamn och lön för alla anställda med anställnings-ID större än 200.

Steg 2:Deklarera den markörbaserade postdatatypvariabeln

När vi har skapat markören är vi nu redo att deklarera vår postvariabel med den här markören.

var_emp    cur_RebellionRider%ROWTYPE;

Var_emp är posttypsvariabeln och eftersom den är baserad på cursorn cur_RebellionRider så kan vi stolt kalla den en Cursor-Based record type variabel. Nu måste vi se om denna enda postvariabel är kapabel att hålla all data som returneras av den underliggande markören cur_RebellionRider.

Steg 3:Initiera Cursor-Record-variabeln

Som vi diskuterade i PL/SQL-handledningen 34 är initiering av en postvariabel processen att tilldela några värden till den. I fallet med markörer fungerar FETCH-INTO-satsen detta. Men vi måste se till att vi har följt markörens livscykel ordentligt.

Om du inte vet vad den här markörens livscykel är och vilka steg som är involverade i att skapa en markör, kolla in den här bloggen om "Introduktion till databasmarkören".

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;

Ovanstående exekveringsavsnitt av PL/SQL-blocket som vi skapar här har förklarats rad för rad i videohandledningen på min YouTube-kanal. Kolla in det.

Så det är det. Det är allt vi behöver. Låt oss nu kombinera alla dessa bitar av kod som vi såg i olika steg ovan till ett enda anonymt PL/SQL-block.

Markörbaserad postdatatypvariabel i Oracle Database

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 kompilerar och kör ovanstående kod får du all data som FETCH-INTO-satsen hämtade från cursorn cur_RebellionRider och lagras i den markörbaserade Record-variabeln var_emp. Detta innebär att vi verkligen kan hantera flera rader med data med en enda markörbaserad post.

I min PL/SQL-videohandledning frågade jag om kan vi förenkla den här koden eller finns det något annat sätt att göra samma uppgift. Svaret är ja, det finns flera sätt att uppnå samma resultat och ett av dem är att använda "Cursor For-Loop". Detta är en speciell typ av loop som deklarerar postvariabeln samt öppnar, hämtar och stänger den underliggande markören implicit i bakgrunden för dig. Du kan läsa mer Cursor For-Loop här.

Referensbok för SQL Expert 1z0-047 Affiliate-länk
OCA Oracle Database SQL Certified Expert Exam Guide (Exam 1Z0-047)

Här är koden gjord med Cursor For-Loop som motsvarar koden ovan. Som du kan se är det mycket mindre komplicerat med få Line-of-Codes (LOCs).

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; 

Båda koderna kommer att returnera samma resultat eftersom båda gör samma uppgift.

Hoppas du gillade den här detaljerade PL/SQL-handledningen. Se till att dela detta på din sociala sida och tagga mig då jag ger bort RebellionRiders varor varje månad till en slumpmässigt utvald användare. Följ mig också på mina sociala medier [Twitter/Facebook/Instagram] för regelbundna uppdateringar.

Tack och ha en bra dag!


  1. ORA-00932:inkonsekventa datatyper:förväntat - fick CLOB

  2. ExecuteNonQuery:Anslutningsegenskapen har inte initierats.

  3. Hur undkommer jag ett reserverat ord i Oracle?

  4. Hur kan jag uppdatera ett fält i min spinner med användarinmatning i EditText