sql >> Database >  >> RDS >> Oracle

Cursorgebaseerd recordgegevenstype met cursor die meerdere waarden retourneert in Oracle Database

We hebben in de vorige tutorial al gezien hoe je een op een cursor gebaseerde recordtypevariabele kunt maken op basis van een eenvoudige cursor die een enkele rij gegevens retourneert. Nu rijst hier de vraag of we dezelfde gegevenstypevariabele met één record kunnen gebruiken met de cursor die meerdere rijen gegevens retourneert? Lees verder en leer hoe u meerdere waarden kunt verwerken die door een cursor worden geretourneerd met behulp van een op een enkele cursor gebaseerde recordgegevenstypevariabele om het antwoord te weten.

Omdat we te maken hebben met op cursor gebaseerde records, is een beetje kennis van cursor vereist. Omwille van de eenvoud en om dit concept gemakkelijk te begrijpen te maken, zal ik een eenvoudige expliciete cursor gebruiken voor de demonstratie.

Stap 1:Declareer een eenvoudige expliciete cursor

Een op Cursor gebaseerd recordgegevenstype vereist een reeds gemaakte cursor. Deze cursor wordt een onderliggende basis voor onze recordtypevariabele. Alle velden van de recordtypevariabele die met deze cursor is gemaakt, hebben dezelfde naam en hetzelfde gegevenstype als die van de kolommen die worden gebruikt in de SELECT-lijst van de cursor.

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

In tegenstelling tot de cursor uit de vorige zelfstudie die een enkele rij gegevens retourneert, retourneert deze cursor meerdere rijen. Al deze rijen zullen bestaan ​​uit de voornaam en het salaris van alle werknemers met een werknemers-ID groter dan 200.

Stap2:De op cursor gebaseerde recordgegevenstypevariabele declareren

Omdat we de cursor hebben gemaakt, zijn we nu helemaal klaar om onze recordvariabele met deze cursor te declareren.

var_emp    cur_RebellionRider%ROWTYPE;

Var_emp is de recordtypevariabele en aangezien het gebaseerd is op de cursor cur_RebellionRider, kunnen we het dus met trots een op cursor gebaseerde recordtypevariabele noemen. Nu moeten we zien of deze enkele recordvariabele alle gegevens kan bevatten die worden geretourneerd door de onderliggende cursor cur_RebellionRider.

Stap 3:Initialiseer de Cursor-Record-variabele

Zoals we in de PL/SQL-zelfstudie 34 hebben besproken, is initialisatie van een recordvariabele het proces waarbij er enkele waarden aan worden toegewezen. In het geval van Cursors doet de FETCH-INTO-instructie dit. Maar we moeten ervoor zorgen dat we de Cursor Life Cycle goed hebben gevolgd.

Als u niet weet wat deze Cursor-levenscyclus is en de stappen die nodig zijn om een ​​Cursor te maken, bekijk dan deze blog over "Inleiding tot Database Cursor".

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;

Het bovenstaande uitvoeringsgedeelte van het PL/SQL-blok dat we hier maken, is regel voor regel uitgelegd in de video-tutorial op mijn YouTube-kanaal. Kijk daar eens naar.

Dus dat is het. Dat is alles wat we moeten doen. Laten we nu al deze stukjes code die we in verschillende stappen hierboven hebben gezien, combineren in een enkel anoniem PL/SQL-blok.

Cursorgebaseerde recordgegevenstypevariabele in 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;

Wanneer u de bovenstaande code compileert en uitvoert, krijgt u alle gegevens die de FETCH-INTO-instructie heeft opgehaald van de cursor cur_RebellionRider en is opgeslagen in de op Cursor gebaseerde Record-variabele var_emp. Dit houdt in dat we inderdaad meerdere rijen gegevens kunnen verwerken met een enkele cursorgebaseerde record.

In mijn PL/SQL-videozelfstudie vroeg ik of we deze code kunnen vereenvoudigen of dat er een andere manier is om dezelfde taak uit te voeren. Het antwoord is ja, er zijn meerdere manieren om hetzelfde resultaat te bereiken en een daarvan is door "Cursor For-Loop" te gebruiken. Dit is een speciaal soort lus die de recordvariabele declareert en de onderliggende cursor impliciet op de achtergrond opent, ophaalt en sluit. U kunt hier meer Cursor For-Loop lezen.

Referentieboek voor SQL Expert 1z0-047 Affiliate link
OCA Oracle Database SQL Certified Expert examengids (examen 1Z0-047)

Hier is de code gedaan met behulp van Cursor For-Loop die gelijk is aan de bovenstaande code. Zoals je kunt zien is het veel minder complex met weinig Line-of-Codes (LOC's).

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; 

Beide codes zullen hetzelfde resultaat opleveren omdat beide dezelfde taak uitvoeren.

Ik hoop dat je genoten hebt van deze gedetailleerde PL/SQL-tutorial. Zorg ervoor dat je dit op je social media deelt en me tagt, want ik geef elke maand de merchandise van RebellionRider weg aan een willekeurig geselecteerde gebruiker. Volg mij ook op mijn sociale media [Twitter/Facebook/Instagram] voor regelmatige updates.

Bedankt en nog een fijne dag!


  1. MAX vs Top 1 - wat is beter?

  2. Aantal SQL(*) prestaties

  3. Hoe vind ik de gegevensmap voor een SQL Server-instantie?

  4. PostgreSQL v13-implementatie en schalen met ClusterControl 1.8.2