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: