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.




