Oracle PL/SQL Records Type med eksempler
⚡ Smart oppsummering
PL/SQL-posttype er en kompleks datatype som grupperer flere kolonner, hver med sitt eget navn og datatype, til én ny type. En post kan defineres på databasenivå som et lagret objekt eller i et underprogram, og feltene nås med punktumoperatoren.

Hva er en posttype?
En posttype er en kompleks datatype som lar programmereren opprette en ny datatype med ønsket kolonnestruktur. Hovedkarakteristikkene er:
- Den grupperer én eller flere kolonner for å danne en ny datatype.
- Hver av disse kolonnene har sitt eget navn og datatype.
- En posttype kan godta dataene som én enkelt post som består av mange kolonner, eller den kan godta verdien for én bestemt kolonne i en post.
- En posttype er rett og slett en ny datatype. Når den er opprettet, lagres den som en ny datatype og kan brukes til å deklarere en variabel i programmer.
- Den bruker nøkkelordet 'TYPE' for å instruere kompilatoren om at en ny datatype opprettes.
- Den kan opprettes hos databasenivå, lagret som et databaseobjekt og brukt på tvers av databasen, eller på delprogramnivå, kun synlig inne i underprogrammet.
- En posttype på databasenivå kan også deklareres for tabellkolonner, slik at en enkelt kolonne kan inneholde komplekse data.
- Dataene nås ved å referere til variabelnavnet, deretter en punktumoperator (.), og deretter kolonnenavnet, som ' . '.
Syntaks for å deklarere en posttype
Syntaks for erklæring på databasenivå:
CREATE TYPE <type_name_db> IS RECORD ( <column 1> <datatype>, );
I den første syntaksen instruerer nøkkelordet «CREATE TYPE» kompilatoren til å opprette posttypen med navnet «type_name_db» med de angitte kolonnene som et databaseobjekt. Dette gis som en individuell setning, ikke inni noen blokk.
Syntaks for deklarasjon på delprogramnivå:
DECLARE TYPE <type_name> IS RECORD ( <column1> <datatype>, ); BEGIN <execution_section>; END;
I denne syntaksen oppretter vi posttypen med navnet «type_name» bare inne i underprogrammet. I begge metodene er måten å definere kolonnen og datatypen på lik.
Eksempel 1: Posttype som et databaseobjekt
I dette programmet ser vi hvordan man oppretter en posttype som et databaseobjekt. Vi oppretter posttypen 'emp_det' med fire kolonner. Kolonnene og deres datatyper er:
- EMP_NO (NUMBER)
- EMP_NAME (VARCHAR2 (150))
- MANAGER (NUMBER)
- LØNN (ANTALL)
CREATE TYPE emp_det IS OBJECT ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); /
Utgang:
Type created
Code Forklaring
- Koden ovenfor oppretter typen emp_det som et databaseobjekt.
- Den har fire kolonner: ansattnummer, ansattnavn, leder og lønn, som definert.
- Nå er 'emp_det' lik alle andre data-type (som NUMBER eller VARCHAR2) og er synlig i hele databasen. Derfor kan den brukes hvor som helst i databasen for å deklarere en variabel av denne typen.
Eksempel 2: Tilgang på underprogramnivå, kolonnenivå
I dette eksemplet ser vi hvordan man oppretter en posttype på underprogramnivå og hvordan man fyller ut og henter verdier fra den etter kolonne. Vi oppretter posttypen 'emp_det' på underprogramnivå og bruker den til å fylle ut 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; /
Utgang:
Employee Detail Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000
Code Forklaring
- Code linje 2–8: Posttypen 'emp_det' deklareres med kolonnene emp_no, emp_name, manager og salary av datatypene NUMBER, VARCHAR2, NUMBER og NUMBER.
- Code linje 9: Variabelen guru99_emp_rec er deklarert som datatypen 'emp_det'. Dette variabel kan inneholde en verdi som inneholder alle fire feltene.
- Code linje 11: Fyller "emp_no"-feltet til "guru99_emp_rec" med verdien 1001.
- Code linje 12: Fyller ut feltet 'emp_name' med verdien XXX.
- Code linje 13: Fyller ut verdien 1000 i feltet «manager».
- Code linje 14: Fyller ut verdien 10000 i feltet «lønn».
- Code linje 15–19: Viser verdien til 'guru99_emp_rec' i utdataene.
Eksempel 3: Tilgang på delprogramnivå, radnivå
I dette eksemplet ser vi hvordan man oppretter en posttype på underprogramnivå og fyller den ut på radnivå. Vi oppretter posttypen 'emp_det' på underprogramnivå og bruker den til å fylle ut 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' deklareres med kolonnene emp_no, emp_name, manager og salary av datatypene NUMBER, VARCHAR2, NUMBER og NUMBER.
- Code linje 9: Variabelen guru99_emp_rec er deklarert som datatypen 'emp_det' og kan inneholde alle fire feltene.
- Code linje 11: Fyller ut tabellen ansatt med 1002 som ansattnr., YYY som ansattnavn, 15000 som lønn og 1000 som ledernummer.
- Code linje 12: Begår innsettingstransaksjonen.
- Code linje 13: Fyller ut variabelen 'guru99_emp_rec' på radnivå fra utvalgsspørringen for ansattnummer 1002.
- Code linje 15–19: Viser verdien til 'guru99_emp_rec' i utdataene.
Utgang:
Employee Detail Employee Number: 1002 Employee Name: YYY Employee Salary: 1000 Employee Manager Number: 15000
OBS: En posttype kan bare nås på kolonnenivå når verdien omdirigeres til en hvilken som helst utdatamodus. Legg merke til at i dette eksemplet samsvarer ikke SELECT-listerekkefølgen med postfeltrekkefølgen, og det er derfor lønns- og lederverdiene vises ombyttet i utdataene.
Typer PL/SQL-poster
Utover den programmererdefinerte posten vist ovenfor, Oracle tilbyr to forankrede posttyper som kopierer strukturen automatisk. Bruk av dem unngår å deklarere kolonner på nytt og holder posten i takt med tabellen eller markøren den er basert på.
| Record type | Erklært med | Strukturen kommer fra |
|---|---|---|
| Tabellbasert post | tabellnavn%ROWTYPE | Alle kolonnene i en tabell |
| Markørbasert post | markørnavn%ROWTYPE | Markørens valgliste |
| Programmerdefinert post | TYPE … ER POST | Kolonner du lister opp for hånd |
En %ROWTYPE-post er det sikreste valget når formen skal følge en tabell eller en markør, fordi en kolonneendring plukkes opp automatisk ved neste kompilering.




