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.

  • 🧱 Definisjon: En posttype grupperer én eller flere kolonner i én ny datatype.
  • 🔑 søkeord: TYPE-nøkkelordet forteller kompilatoren at en ny datatype opprettes.
  • 🏛️ To nivåer: En post på databasenivå er et lagret objekt; en post på underprogramnivå er bare synlig i det underprogrammet.
  • 🔗 Felttilgang: Felt nås som record_variable.column_name ved hjelp av punktumoperatoren.
  • 📥 Kolonnenivå: Verdier kan tilordnes til ett felt om gangen.
  • 📦 Radnivå: En SELECT INTO kan fylle ut en hel post fra en tabellrad.
  • 🧩 Opptakstyper: Tabellbaserte %ROWTYPE, markørbaserte %ROWTYPE og programmererdefinerte poster.

Oracle Type PL/SQL-poster

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å:

Deklarasjon av posttype 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å:

Deklarasjon av posttype på underprogramnivå

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.

Eksempel på tilgang på kolonnenivå for posttype

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.

Eksempel på tilgang på radnivå for posttype

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.

Spørsmål og svar

En post grupperer forskjellige kolonner av muligens forskjellige typer i én radlignende struktur. En samling inneholder mange elementer av samme type indeksert av et indeksert indeks. De er ofte kombinert, en samling av poster.

%ROWTYPE deklarerer en post der feltene samsvarer med en tabell eller markør automatisk. Bruk den når posten skal speile den kilden, slik at en kolonneendring gjenspeiles uten å redigere deklarasjonen.

Ja, hvis begge postene er av samme type. SELECT INTO kan også fylle en hel post fra en tabellrad, forutsatt at rekkefølgen på SELECT-listen samsvarer med feltrekkefølgen i posten.

Ja. AI kan lese en tabelldefinisjon og produsere en samsvarende TYPE … IS RECORD-blokk, eller anbefale en %ROWTYPE der en live-lenke til tabellen er å foretrekke. Bekreft datatyper før bruk.

En post på databasenivå opprettes med CREATE TYPE og lagres som et objekt som er synlig i databasen. En post på underprogramnivå deklareres i en blokk og finnes bare i det underprogrammet.

Oppsummer dette innlegget med: