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

PL/SQL Stærk Ref Cursor Med Brugerdefineret Record Datatype

Stærk referencemarkør med brugerdefineret postdatatype

I den forrige tutorial lærte vi, hvordan man opretter en PL/SQL stærk ref-markør ved hjælp af tabelbaseret registreringsdatatypevariabel. Der demonstrerede jeg brugen af ​​en stærk ref-markør til at håndtere dataene fra alle kolonnerne i medarbejdertabellen. Dette giver derfor anledning til bekymring. Hvad hvis vi vil have data fra en bestemt kolonne i tabellen? Det er præcis, hvad vi vil tage fat på i dagens selvstudie.

Men før du går videre i denne tutorial, foreslår jeg, at du gør dig bekendt med kendskabet til PL/SQL Ref Cursorer. Specielt Strong Ref Cursor og User Defined Record Datatype. Desuden giver jeg for nemheds skyld alle de nødvendige links her:

  • Sådan opretter du en stærk referencemarkør ved hjælp af tabelbaseret registrering
  • Hvad er brugerdefinerede registreringsdatatyper?

Den forrige tutorial viste med succes, hvordan en PL/SQL Strong ref-markør hentede og håndterede data fra alle kolonnerne i en række. Men hvad hvis vi vil have data fra en bestemt kolonne i en række? Lad os sige, at vi bare vil se e-mailen eller lønnen for en medarbejder. Derfor ønsker vi ikke at bruge de dyre ressourcer på at hente al den unødvendige information. Så kan vi bruge den samme ref-markør til det? Lad os finde ud af det.

Kan vi bruge Strong Ref Cursor, som vi oprettede i den forrige tutorial, til at hente data fra en specifik kolonne?

Svaret på det spørgsmål er Nej, det kan vi ikke .

Fordi den stærke referencemarkør blev oprettet ved hjælp af tabelbaseret postdatatype. For at illustrere, når vi opretter en tabelbaseret registreringsdatatype, opretter Oracle-motoren en sammensat datastruktur. Denne struktur er fyldt med felter, der svarer til hver kolonne i den angivne tabel.

Desuden bliver alle disse felter automatisk tildelt det samme navn og samme datatype som i kolonnerne i basistabellen. Men når det kommer til at initialisere en post ved hjælp af en specifik kolonne, skal vi udføre alt dette arbejde manuelt.

For at forstå det mere klart henvises til PL/SQL tutorial 34. Der har jeg diskuteret, hvordan man initialiserer datatype og dens funktion i detaljer.

Så hvad er løsningen på dette problem?

Vi kan nemt løse dette problem. Vi kan oprette en PL/SQL stærk ref markør med brugerdefineret Record Datatype variabel.

Eksempel:PL/SQL Strong Ref Cursor med brugerdefineret registreringsdatatypevariabel.

For eksempel vil vi skabe en stærk ref-markør med SELECT-sætningen. Hvilket kun returnerer lønnen for den medarbejder, hvis medarbejder-id er 100.

SET SERVEROUTPUT ON;
DECLARE
	--Create User-Defined Record Datatype
    TYPE my_rec IS RECORD (
        emp_sal employees.salary%TYPE
        );
	--Declare Strong Ref Cursor
    TYPE RefCur IS REF CURSOR RETURN my_rec;
    cur_var REFCUR;
	--Another anchored datatype variable for holding data
    at_var  employees.salary%TYPE;
BEGIN
   OPEN cur_var FOR SELECT salary FROM employees WHERE employee_id = 100;
    FETCH cur_var INTO at_var;
    CLOSE cur_var;
    DBMS_OUTPUT.PUT_LINE ('Salary of the employee is '||at_var);
END;
/

Så lad os bryde denne kode og se, hvad der sker her.

Erklæringsafsnit

DECLARE
    TYPE my_rec IS RECORD (
        emp_sal employees.salary%TYPE
        );
    TYPE RefCur IS REF CURSOR RETURN my_rec;
    cur_var REFCUR;
    at_var  employees.salary%TYPE;

Her er vores erklæringsafsnit. I de første tre linjer i denne sektion oprettede vi vores brugerdefinerede record datatype med navnet my_rec. Desuden har denne brugerdefinerede postdatatype kun ét felt, som er emp_sal. Emp_sal er et forankret datatypefelt, som er designet over lønkolonnen i medarbejdertabellen. Fordi emp_sal er af forankret datatype, vil den automatisk blive tildelt datatypen og databredden af ​​basiskolonnen, som i dette tilfælde er løn.

Lige efter det erklærede vi vores PL/SQL Strong Ref Cursor med navnet "RefCur". Returtypen for denne stærke ref-markør er “my_rec” . Efterfulgt af markørerklæring oprettede vi en markørvariabel med navnet cur_var. Derudover bruges denne variabel til at henvise til den stærke ref-markør foran i koden.

Ud over markørvariablen har vi også en anden variabel deklareret i dette afsnit. Denne variabel er "at_var", dette er igen en forankret datatypevariabel. Den bruges til at gemme de data, der returneres af markøren.

Lad os nu komme til udførelsessektionen.

Udførelsessektion

BEGIN
    OPEN cur_var FOR SELECT salary FROM employees WHERE employee_id = 100;
    FETCH cur_var INTO at_var;
    CLOSE cur_var;
    DBMS_OUTPUT.PUT_LINE('Salary of the employee is '||at_var);
END;
/

Denne udførelsessektion har fire eksekverbare linjer med koder. Lad os se, hvad det er.

Linje 1:Åbn for erklæring

Denne sætning åbner dynamisk den nævnte markør. Derefter vedhæfter den SELECT-sætningen, der er angivet lige efter FOR nøgleordet.

I vores tilfælde åbner denne sætning den stærke ref-markør ved hjælp af cursorvariablen "cur_var" - en SELECT-sætning. Hvilket kun returnerer data fra "lønsøjlen" i medarbejdertabellen.

Linje 2:Hent-erklæring

Denne erklæring vil hente data fra ref-markøren og gemme dem i variablen "at_var". Lige så vigtigt er det at sikre, at datatypen for de hentede data og den for den variabel, som dataene gemmes i, skal matche. Ellers vil der være en fejl.

Linje 3:Luk erklæring

Den tredje linje er et tæt udsagn. Det er en god praksis at lukke en markør, som du er færdig med.

Linje 4:Outputerklæring

Endelig er den sidste sætning i udførelsessektionen DBMS_OUTPUT-sætningen. Og det viser medarbejderens løn tilbage til brugeren.

Disse fire linjer fuldender udførelsessektionen af ​​denne PL/SQL-blok. Ydermere bør en vellykket eksekvering af denne kode vise dig lønnen med den formaterede streng.

Er en af ​​dem, der lærer bedre ved at se video? Så er her videotutorialen om Strong ref cursor med brugerdefineret record datatype.

Det er det for denne tutorial. Sørg for at dele denne blog på dine sociale medier og hjælpe andre med at lære. Du kan abonnere på YouTube-kanalen for flere interessante tutorials. Tak og god dag!


  1. lokale samlingstyper er ikke tilladt i SQL-sætninger

  2. EF4 - Den valgte lagrede procedure returnerer ingen kolonner

  3. Brug MySQL rumlige udvidelser til at vælge punkter inde i cirklen

  4. Hvordan kan du navngive datasættets tabeller, du returnerer i en lagret proc?