Oracle PL/SQL Records Type med eksempler
⚡ Smart opsummering
PL/SQL Record Type er en kompleks datatype, der grupperer flere kolonner, hver med sit eget navn og datatype, i én ny type. En record kan defineres på databaseniveau som et lagret objekt eller i et underprogram, og dens felter nås med punktumoperatoren.

Hvad er en posttype?
En posttype er en kompleks datatype, der giver programmøren mulighed for at oprette en ny datatype med den ønskede kolonnestruktur. Dens vigtigste egenskaber er:
- Den grupperer en eller flere kolonner for at danne en ny datatype.
- Hver af disse kolonner har sit eget navn og datatype.
- En posttype kan acceptere dataene som en enkelt post bestående af mange kolonner, eller den kan acceptere værdien for én bestemt kolonne i en post.
- En posttype er simpelthen en ny datatype. Når den er oprettet, gemmes den som en ny datatype og kan bruges til at deklarere en variabel i programmer.
- Den bruger nøgleordet 'TYPE' for at instruere compileren om, at en ny datatype oprettes.
- Den kan oprettes hos databaseniveau, gemt som et databaseobjekt og brugt på tværs af databasen eller på underprogramniveau, kun synlig i underprogrammet.
- En posttype på databaseniveau kan også deklareres for tabelkolonner, så en enkelt kolonne kan indeholde komplekse data.
- Dataene tilgås ved at referere til variabelnavnet, derefter en punktumoperator (.) og derefter kolonnenavnet, som ' . '.
Syntaks til at deklarere en posttype
Syntaks for erklæring på databaseniveau:
CREATE TYPE <type_name_db> IS RECORD ( <column 1> <datatype>, );
I den første syntaks instruerer nøgleordet 'CREATE TYPE' compileren til at oprette posttypen med navnet "type_name_db" med de angivne kolonner som et databaseobjekt. Dette angives som en individuel sætning, ikke inde i nogen blok.
Syntaks for deklaration på underprogramniveau:
DECLARE TYPE <type_name> IS RECORD ( <column1> <datatype>, ); BEGIN <execution_section>; END;
I denne syntaks opretter vi posttypen med navnet "type_name" kun inde i underprogrammet. I begge metoder er måden at definere kolonnen og datatypen på den samme.
Eksempel 1: Posttype som et databaseobjekt
I dette program ser vi, hvordan man opretter en posttype som et databaseobjekt. Vi opretter posttypen 'emp_det' med fire kolonner. Kolonnerne og deres datatyper er:
- EMP_NO (NUMBER)
- EMP_NAME (VARCHAR2 (150))
- MANAGER (NUMBER)
- LØN (ANTAL)
CREATE TYPE emp_det IS OBJECT ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); /
Output:
Type created
Code Forklaring
- Ovenstående kode opretter typen emp_det som et databaseobjekt.
- Den har 4 kolonner: medarbejdernummer, medarbejdernavn, leder og løn, som defineret.
- Nu ligner 'emp_det' alle andre datatype (som NUMBER eller VARCHAR2) og er synlig i hele databasen. Derfor kan den bruges hvor som helst i databasen til at deklarere en variabel af denne type.
Eksempel 2: Adgang på underprogramniveau, kolonneniveau
I dette eksempel ser vi, hvordan man opretter en posttype på underprogramniveau, og hvordan man udfylder og henter værdier fra den efter kolonne. Vi opretter posttypen 'emp_det' på underprogramniveau og bruger den til at udfylde og vise data.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); guru99_emp_rec emp_det; BEGIN guru99_emp_rec.emp_no:= 1001; guru99_emp_rec.emp_name:= 'XXX'; guru99_emp_rec.manager:= 1000; guru99_emp_rec.salary:= 10000; dbms_output.put_line('Employee Detail'); dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no); dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name); dbms_output.put_line ('Employee Salary: ' ||guru99_emp_rec.salary); dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager); END; /
Output:
Employee Detail Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000
Code Forklaring
- Code linje 2-8: Posttypen 'emp_det' erklæres med kolonnerne emp_no, emp_name, manager og salary af datatypene NUMBER, VARCHAR2, NUMBER og NUMBER.
- Code linje 9: Variablen guru99_emp_rec er deklareret som datatypen 'emp_det'. Dette variabel kan indeholde en værdi, der indeholder alle fire felter.
- Code linje 11: Udfylder "emp_no"-feltet for "guru99_emp_rec" med værdien 1001.
- Code linje 12: Udfylder feltet 'emp_name' med værdien XXX.
- Code linje 13: Udfylder feltet 'manager' med værdien 1000.
- Code linje 14: Udfylder feltet 'løn' med værdien 10000.
- Code linje 15-19: Viser værdien af 'guru99_emp_rec' i outputtet.
Eksempel 3: Adgang på underprogramniveau, rækkeniveau
I dette eksempel ser vi, hvordan man opretter en posttype på underprogramniveau og udfylder den på rækkeniveau. Vi opretter posttypen 'emp_det' på underprogramniveau og bruger den til at udfylde og vise data.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); guru99_emp_rec emp_det; BEGIN INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000); COMMIT; SELECT emp_no, emp_name, salary, manager INTO guru99_emp_rec FROM emp WHERE emp_no=1002; dbms_output.put_line ('Employee Detail'); dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no); dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name); dbms_output.put_line ('Employee Salary: '||guru99_emp_rec.salary); dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager); END; /
Code Forklaring
- Code linje 2-8: Posttypen 'emp_det' erklæres med kolonnerne emp_no, emp_name, manager og salary af datatypene NUMBER, VARCHAR2, NUMBER og NUMBER.
- Code linje 9: Variablen guru99_emp_rec er deklareret som datatypen 'emp_det' og kan indeholde alle fire felter.
- Code linje 11: Udfylder tabellen medarbejder med 1002 som medarbejdernr., YYY som medarbejdernavn, 15000 som løn og 1000 som ledernummer.
- Code linje 12: Forpligtelse af indsættelsestransaktionen.
- Code linje 13: Udfylder variablen 'guru99_emp_rec' på rækkeniveau fra select-forespørgslen for medarbejdernummer 1002.
- Code linje 15-19: Viser værdien af 'guru99_emp_rec' i outputtet.
Output:
Employee Detail Employee Number: 1002 Employee Name: YYY Employee Salary: 1000 Employee Manager Number: 15000
Bemærk: En posttype kan kun tilgås på kolonneniveau, når dens værdi omdirigeres til en hvilken som helst outputtilstand. Bemærk, at SELECT-listeordenen i dette eksempel ikke matcher postfelternes rækkefølge, hvilket er grunden til, at løn- og lederværdierne vises ombyttet i outputtet.
Typer af PL/SQL-poster
Ud over den programmørdefinerede post vist ovenfor, Oracle tilbyder to forankrede posttyper, der kopierer deres struktur automatisk. Brug af dem undgår gendeklarering af kolonner og holder posten i trit med den tabel eller markør, den er baseret på.
| Optagetype | Erklæret med | Strukturen kommer fra |
|---|---|---|
| Tabelbaseret post | tabelnavn%ROWTYPE | Alle kolonner i en tabel |
| Markørbaseret post | cursor_navn%ROWTYPE | Markørens valgliste |
| Programmørdefineret post | TYPE … ER REGISTRERING | Kolonner, du angiver manuelt |
En %ROWTYPE-post er det sikreste valg, når formen skal følge en tabel eller en markøren, fordi en kolonneændring registreres automatisk ved den næste kompilering.




