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.

  • ๐Ÿงฑ Definition: En posttype grupperer en eller flere kolonner i รฉn ny datatype.
  • ๐Ÿ”‘ Sรธgeord: TYPE-nรธgleordet fortรฆller compileren, at en ny datatype oprettes.
  • ๐Ÿ›๏ธ To niveauer: En post pรฅ databaseniveau er et lagret objekt; en post pรฅ underprogramniveau er kun synlig i det pรฅgรฆldende underprogram.
  • ๐Ÿ”— Adgang til felt: Felter nรฅs som record_variable.column_name ved hjรฆlp af punktumoperatoren.
  • ๐Ÿ“ฅ Kolonneniveau: Vรฆrdier kan tildeles รฉt felt ad gangen.
  • ๐Ÿ“ฆ Rรฆkkeniveau: En SELECT INTO kan udfylde en hel post fra en tabelrรฆkke.
  • ๐Ÿงฉ Optagelsestyper: Tabelbaserede %ROWTYPE, markรธrbaserede %ROWTYPE og programmรธrdefinerede poster.

Oracle PL/SQL Records Type

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:

Deklaration af posttype 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:

Deklaration af posttype 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.

Eksempel pรฅ adgang pรฅ kolonneniveau 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;
/

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.

Eksempel pรฅ adgang pรฅ rรฆkkeniveau 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' 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.

Ofte Stillede Spรธrgsmรฅl

En post grupperer forskellige kolonner af muligvis forskellige typer i รฉn rรฆkkelignende struktur. En samling indeholder mange elementer af samme type indekseret af et indeks. De er ofte kombineret, en samling af poster.

%ROWTYPE deklarerer en post, hvis felter automatisk matcher en tabel eller markรธr. Brug den, nรฅr posten skal afspejle den kilde, sรฅ en kolonneรฆndring afspejles uden at deklarationen skal redigeres.

Ja, hvis begge poster er af samme type. SELECT INTO kan ogsรฅ udfylde en hel post fra en tabelrรฆkke, forudsat at rรฆkkefรธlgen pรฅ SELECT-listen matcher postens feltrรฆkkefรธlge.

Ja. AI kan lรฆse en tabeldefinition og producere en matchende TYPE โ€ฆ IS RECORD-blok eller anbefale en %ROWTYPE, hvor et live-link til tabellen er at foretrรฆkke. Bekrรฆft datatyper fรธr brug.

En post pรฅ databaseniveau oprettes med CREATE TYPE og gemmes som et objekt, der er synligt i hele databasen. En post pรฅ underprogramniveau deklareres inde i en blok og findes kun inden for det pรฅgรฆldende underprogram.

Opsummer dette indlรฆg med: