Sterke referentiecursor met door de gebruiker gedefinieerd recordgegevenstype
In de vorige tutorial hebben we geleerd hoe we een PL/SQL sterke ref-cursor kunnen maken met behulp van een tabelgebaseerde record datatypevariabele. Daar demonstreerde ik het gebruik van een sterke ref-cursor om de gegevens uit alle kolommen van de werknemerstabel te verwerken. Dit geeft dan ook aanleiding tot bezorgdheid. Wat als we de gegevens uit een bepaalde kolom van de tabel willen hebben? Dat is precies waar we het in de tutorial van vandaag over zullen hebben.
Voordat u verder gaat met deze tutorial, raad ik u echter aan om kennis te maken met de kennis van PL/SQL-referentiecursors. Vooral de Strong Ref Cursor en User Defined Record Datatype. Verder geef ik voor uw gemak alle benodigde links hier:
- Hoe maak je een sterke ref-cursor met behulp van tabelgebaseerde records
- Wat zijn door de gebruiker gedefinieerde gegevenstypen voor records?
De vorige tutorial liet met succes zien hoe een PL/SQL Strong ref-cursor gegevens uit alle kolommen van een rij ophaalde en verwerkte. Maar wat als we de gegevens van een specifieke kolom van een rij willen? Laten we zeggen dat we alleen de e-mail of het salaris van een werknemer willen zien. Daarom willen we geen dure middelen besteden aan het ophalen van alle onnodige informatie. Dus, kunnen we daarvoor dezelfde ref-cursor gebruiken? Laten we het uitzoeken.
Kunnen we de Strong Ref Cursor gebruiken die we in de vorige tutorial hebben gemaakt om gegevens uit een specifieke kolom op te halen?
Het antwoord op die vraag is Nee, dat kunnen we niet .
Omdat die Strong Ref Cursor is gemaakt met behulp van Table Based Record Datatype. Ter illustratie:wanneer we een op tabellen gebaseerd recordgegevenstype maken, maakt de Oracle-engine een samengestelde gegevensstructuur. Deze structuur is vol met velden die overeenkomen met elke kolom van de opgegeven tabel.
Bovendien krijgen al deze velden automatisch dezelfde naam en hetzelfde datatype als de kolommen van de basistabel. Maar als het gaat om het initialiseren van een record met een specifieke kolom, moeten we al dit werk handmatig doen.
Raadpleeg PL/SQL-tutorial 34 om het beter te begrijpen. Daar heb ik in detail besproken hoe het recordgegevenstype en de werking ervan kunnen worden geïnitialiseerd.
Dus, wat is de oplossing voor dit probleem?
Dit probleem kunnen wij eenvoudig oplossen. We kunnen een PL/SQL-sterke ref-cursor maken met een door de gebruiker gedefinieerde recordgegevenstypevariabele.
Voorbeeld:PL/SQL Strong-referentiecursor met door de gebruiker gedefinieerde recordgegevenstypevariabele.
We willen bijvoorbeeld een sterke ref-cursor maken met de SELECT-instructie. Die retourneert alleen het salaris van de werknemer wiens werknemers-ID 100 is.
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; /
Dus laten we deze code breken en kijken wat hier gebeurt.
Declaratiesectie
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;
Hier is onze declaratiesectie. In de eerste drie regels van deze sectie hebben we ons door de gebruiker gedefinieerde recordgegevenstype gemaakt met de naam my_rec. Bovendien heeft dit door de gebruiker gedefinieerde recordgegevenstype slechts één veld, namelijk emp_sal. Emp_sal is een verankerd gegevenstypeveld dat is ontworpen over de salariskolom van de werknemerstabel. Omdat emp_sal van het verankerde gegevenstype is, krijgt het automatisch het gegevenstype en de gegevensbreedte van de basiskolom toegewezen, in dit geval salaris.
Direct daarna verklaarden we onze PL/SQL Strong Ref Cursor met de naam “RefCur”. Het retourtype van deze sterke ref-cursor is “my_rec” . Gevolgd door cursordeclaratie hebben we een cursorvariabele gemaakt met de naam cur_var. Bovendien wordt deze variabele gebruikt om te verwijzen naar de sterke ref-cursor verderop in de code.
Naast de cursorvariabele hebben we ook een andere variabele gedeclareerd in deze sectie. Deze variabele is "at_var", dit is weer een verankerde datatypevariabele. Het wordt gebruikt voor het opslaan van de gegevens die door de cursor worden geretourneerd.
Laten we nu naar de uitvoeringssectie gaan.
Uitvoeringssectie
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; /
Deze uitvoeringssectie heeft vier uitvoerbare regels met codes. Laten we eens kijken wat dat zijn.
Lijn 1:Open For statement
Deze instructie dynamisch Opent de genoemde cursor. Daarna voegt het de SELECT-instructie toe die is gespecificeerd direct na het FOR-sleutelwoord.
In ons geval opent deze instructie de sterke ref-cursor met behulp van de cursorvariabele "cur_var" - een SELECT-instructie. Wat de gegevens alleen retourneert uit de "salariskolom" van de werknemerstabel.
Regel 2:Ophaalopdracht
Deze instructie haalt de gegevens op van de ref-cursor en slaat deze op in de variabele "at_var". Even belangrijk is om ervoor te zorgen dat het gegevenstype van de opgehaalde gegevens en dat van de variabele waarin de gegevens worden opgeslagen, moeten overeenkomen. Anders is er een fout.
Regel 3:Verklaring sluiten
De derde regel is een close statement. Het sluiten van een cursor waarmee u klaar bent, is een goede gewoonte.
Regel 4:Uitvoerinstructie
Ten slotte is de laatste instructie van de uitvoeringssectie de DBMS_OUTPUT-instructie. En het toont het salaris van de werknemer terug aan de gebruiker.
Deze vier regels maken de uitvoeringssectie van dit PL/SQL-blok compleet. Verder zou de succesvolle uitvoering van deze code u het salaris moeten tonen met de opgemaakte string.
Ben jij een van degenen die beter leert door video te bekijken? Dan is hier de video-tutorial over Strong ref cursor met door de gebruiker gedefinieerd record datatype.
Dat is het voor deze tutorial. Zorg ervoor dat u deze blog deelt op uw sociale media en anderen helpt te leren. Je kunt je abonneren op het YouTube-kanaal voor meer interessante tutorials. Bedankt en een fijne dag verder!