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.




