sql >> Databasteknik >  >> RDS >> Database

PL/SQL Stark referensmarkör med användardefinierad postdatatyp

Stark referensmarkör med användardefinierad postdatatyp

I den tidigare handledningen lärde vi oss hur man skapar en PL/SQL stark ref-markör med hjälp av tabellbaserad postdatatypvariabel. Där demonstrerade jag användningen av stark ref-markör för att hantera data från alla kolumner med anställdas tabell. Följaktligen väcker detta en oro. Vad händer om vi vill ha data från någon specifik kolumn i tabellen? Det är precis vad vi kommer att ta upp i dagens handledning.

Men innan du går vidare i denna handledning föreslår jag att du bekantar dig med kunskapen om PL/SQL Ref Cursorer. Speciellt Strong Ref Cursor och User Defined Record Datatype. Dessutom, för din bekvämlighet tillhandahåller jag alla nödvändiga länkar här:

  • Hur man skapar en stark referensmarkör med tabellbaserad post
  • Vad är användardefinierade postdatatyper?

Den tidigare handledningen visade framgångsrikt hur en PL/SQL Strong ref-markör hämtade och hanterade data från alla kolumner i en rad. Men vad händer om vi vill ha data från en specifik kolumn i en rad? Låt oss säga att vi bara vill se e-postmeddelandet eller lönen för en anställd. Följaktligen vill vi inte lägga de dyra resurserna på att hämta all onödig information. Så kan vi använda samma ref-markör för det? Låt oss ta reda på det.

Kan vi använda Strong Ref Cursor som vi skapade i föregående handledning för att hämta data från en specifik kolumn?

Svaret på den frågan är Nej, det kan vi inte .

Eftersom den starka referensmarkören skapades med tabellbaserad postdatatyp. För att illustrera, när vi skapar en tabellbaserad postdatatyp, skapar Oracle-motorn en sammansatt datastruktur. Denna struktur är fylld med fält som motsvarar varje kolumn i den angivna tabellen.

Dessutom tilldelas alla dessa fält automatiskt samma namn och samma datatyp som i kolumnerna i bastabellen. Men när det kommer till att initiera en post med en specifik kolumn måste vi göra allt detta arbete manuellt.

För att förstå det tydligare, se PL/SQL handledning 34. Där har jag diskuterat hur man initierar postdatatyp och dess funktion i detalj.

Så, vad är lösningen på det här problemet?

Vi kan enkelt lösa detta problem. Vi kan skapa en PL/SQL stark ref-markör med användardefinierad postdatatypvariabel.

Exempel:PL/SQL Strong Ref Cursor med användardefinierad postdatatypvariabel.

Till exempel vill vi skapa en stark ref-markör med SELECT-satsen. Vilket endast returnerar lönen för den anställde vars anställningsnummer är 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å låt oss bryta den här koden och se vad som händer här.

Deklarationsavsnittet

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;

Här är vårt deklarationsavsnitt. På de första tre raderna i detta avsnitt skapade vi vår användardefinierade postdatatyp med namnet my_rec. Dessutom har denna användardefinierade postdatatyp endast ett fält som är emp_sal. Emp_sal är ett förankrat datatypfält som är utformat över lönekolumnen i tabellen för anställda. Eftersom emp_sal är av förankrad datatyp kommer den automatiskt att tilldelas datatypen och databredden för baskolumnen som i detta fall är lön.

Strax efter det förklarade vi vår PL/SQL Strong Ref Cursor med namnet "RefCur". Returtypen för denna starka ref-markör är "my_rec" . Följt av markördeklaration skapade vi en markörvariabel med namnet cur_var. Dessutom används denna variabel för att referera till den starka ref-markören framför koden.

Förutom markörvariabel har vi också en annan variabel som deklareras i detta avsnitt. Denna variabel är "at_var" detta är återigen en förankrad datatypvariabel. Den används för att lagra data som returneras av markören.

Låt oss nu komma till exekveringssektionen.

Utförandesektion

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;
/

Denna exekveringssektion har fyra körbara rader med koder. Låt oss se vad det är.

Rad 1:Öppna för uttalande

Detta uttalande Öppnar den nämnda markören dynamiskt. Därefter bifogar den SELECT-satsen som anges precis efter nyckelordet FOR.

I vårt fall öppnar denna sats den starka ref-markören med hjälp av markörvariabeln "cur_var" - en SELECT-sats. Vilket returnerar data endast från "lönekolumnen" i tabellen för anställda.

Rad 2:Hämta uttalande

Denna sats hämtar data från ref-markören och lagrar den i variabeln "at_var". Lika viktigt är att se till att datatypen för den data som hämtas och den för variabeln som data lagras i måste matcha. Annars blir det ett fel.

Rad 3:Stäng uttalande

Den tredje raden är ett nära uttalande. Att stänga en markör som du är klar med är en bra praxis.

Rad 4:Utdatasats

Slutligen är den sista satsen i exekveringssektionen DBMS_OUTPUT-satsen. Och det visar lönen för den anställde tillbaka till användaren.

Dessa fyra rader kompletterar exekveringsdelen av detta PL/SQL-block. Dessutom bör den framgångsrika exekveringen av denna kod visa dig lönen med den formaterade strängen.

Är en av dem som lär sig bättre genom att titta på video? Här är sedan videohandledningen om Stark ref-markör med användardefinierad postdatatyp.

Det var allt för den här handledningen. Se till att dela den här bloggen på dina sociala medier och hjälp andra att lära sig. Du kan prenumerera på YouTube-kanalen för fler intressanta handledningar. Tack och ha en bra dag!


  1. Hur får man skript av SQL Server-data?

  2. Det gick inte att hitta konverteringsfunktionen från okänd till text

  3. Hur SQLite Length() fungerar

  4. 2 sätt att returnera rader som innehåller icke-alfanumeriska tecken i PostgreSQL