Oracle PL/SQL-Datensatztyp mit Beispielen

⚡ Intelligente Zusammenfassung

Der PL/SQL-Datensatztyp ist ein komplexer Datentyp, der mehrere Spalten mit jeweils eigenem Namen und Datentyp zu einem neuen Typ zusammenfasst. Ein Datensatz kann auf Datenbankebene als gespeichertes Objekt oder innerhalb eines Unterprogramms definiert werden; auf seine Felder wird mit dem Punktoperator zugegriffen.

  • 🧱 Definition: Ein Datensatztyp fasst eine oder mehrere Spalten zu einem einzigen neuen Datentyp zusammen.
  • 🔑 Stichwort: Das Schlüsselwort TYPE teilt dem Compiler mit, dass ein neuer Datentyp erstellt wird.
  • ️ Zwei Ebenen: Ein Datensatz auf Datenbankebene ist ein gespeichertes Objekt; ein Datensatz auf Unterprogrammebene ist nur innerhalb dieses Unterprogramms sichtbar.
  • 🔗 Feldzugriff: Die Felder werden über record_variable.column_name mit Hilfe des Punktoperators aufgerufen.
  • 📥 Spaltenebene: Werte können jeweils nur einem Feld zugewiesen werden.
  • 📦 Zeilenebene: Mit SELECT INTO kann ein ganzer Datensatz aus einer Tabellenzeile abgerufen werden.
  • 🧩 Datensatzarten: Tabellenbasierte %ROWTYPE-Datensätze, cursorbasierte %ROWTYPE-Datensätze und vom Programmierer definierte Datensätze.

Oracle PL/SQL-Datensatztyp

Was ist ein Datensatztyp?

Ein Datensatztyp ist ein komplexer Datentyp, der es dem Programmierer ermöglicht, einen neuen Datentyp mit der gewünschten Spaltenstruktur zu erstellen. Seine Hauptmerkmale sind:

  • Es gruppiert eine oder mehrere Spalten zu einem neuen Datentyp.
  • Jede dieser Spalten hat ihren eigenen Namen und Datentyp.
  • Ein Datensatztyp kann die Daten als einen einzelnen Datensatz mit vielen Spalten akzeptieren oder den Wert für eine bestimmte Spalte eines Datensatzes.
  • Ein Datensatztyp ist einfach ein neuer Datentyp. Nach seiner Erstellung wird er als neuer Datentyp gespeichert und kann zur Deklaration einer Variablen in Programmen verwendet werden.
  • Es verwendet das Schlüsselwort 'TYP' um den Compiler anzuweisen, dass ein neuer Datentyp erstellt wird.
  • Es kann erstellt werden bei Datenbankebene, gespeichert als Datenbankobjekt und verwendet in der gesamten Datenbank oder an der Unterprogrammebene, nur innerhalb des Unterprogramms sichtbar.
  • Es kann auch ein Datensatztyp auf Datenbankebene für Tabellenspalten deklariert werden, sodass eine einzelne Spalte komplexe Daten enthalten kann.
  • Auf die Daten wird zugegriffen, indem man auf den Variablennamen, dann einen Punkt (.) und anschließend den Spaltennamen verweist, wie folgt: ' Die '.

Syntax zur Deklaration eines Datensatztyps

Syntax für die Deklaration auf Datenbankebene:

Deklaration des Datensatztyps auf Datenbankebene

CREATE TYPE <type_name_db> IS RECORD
(
<column 1> <datatype>,
);

In der ersten Syntax weist das Schlüsselwort „CREATE TYPE“ den Compiler an, den Datensatztyp „type_name_db“ mit den angegebenen Spalten als Datenbankobjekt zu erstellen. Dies wird als einzelne Anweisung und nicht innerhalb eines Blocks angegeben.

Syntax für die Deklaration auf Unterprogrammebene:

Deklaration des Datensatztyps auf Unterprogrammebene

DECLARE
TYPE <type_name> IS RECORD
(
<column1> <datatype>,
);
BEGIN
<execution_section>;
END;

Bei dieser Syntax wird der Datensatztyp mit dem Namen „type_name“ nur innerhalb des Unterprogramms erstellt. Die Definition von Spalte und Datentyp ist in beiden Methoden ähnlich.

Beispiel 1: Datensatztyp als Datenbankobjekt

In diesem Programm sehen wir, wie man einen Datensatztyp als Datenbankobjekt erstellt. Wir erstellen den Datensatztyp „emp_det“ mit vier Spalten. Die Spalten und ihre Datentypen sind:

  • EMP_NO (ANZAHL)
  • EMP_NAME (VARCHAR2 (150))
  • MANAGER (ANZAHL)
  • GEHALT (ANZAHL)
CREATE TYPE emp_det IS OBJECT
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
/

Ausgang:

Type created

Code Erläuterung

  • Der obige Code erzeugt den Typ emp_det als Datenbankobjekt.
  • Es hat 4 Spalten: Mitarbeiternummer, Mitarbeitername, Manager und Gehalt, wie definiert.
  • Nun ist 'emp_det' ähnlich wie jedes andere Datentyp (wie NUMBER oder VARCHAR2) und ist in der gesamten Datenbank sichtbar. Daher kann es überall in der Datenbank verwendet werden, um eine Variable dieses Typs zu deklarieren.

Beispiel 2: Zugriff auf Unterprogrammebene, Spaltenebene

In diesem Beispiel sehen wir, wie man einen Datensatztyp auf Unterprogrammebene erstellt und wie man ihn spaltenweise befüllt und Werte daraus abruft. Wir erstellen den Datensatztyp „emp_det“ auf Unterprogrammebene und verwenden ihn, um Daten zu befüllen und anzuzeigen.

Beispiel für den Zugriff auf Spaltenebene eines Datensatztyps

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;
/

Ausgang:

Employee Detail
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000

Code Erläuterung

  • Code Zeile 2-8: Der Datensatztyp 'emp_det' ist mit den Spalten emp_no, emp_name, manager und salary vom Datentyp NUMBER, VARCHAR2, NUMBER und NUMBER deklariert.
  • Code Zeile 9: Die Variable guru99_emp_rec ist als Datentyp 'emp_det' deklariert. Variable kann einen Wert enthalten, der alle vier Felder umfasst.
  • Code Zeile 11: Füllen des Felds „emp_no“ von „guru99_emp_rec“ mit dem Wert 1001.
  • Code Zeile 12: Das Feld 'emp_name' wird mit dem Wert XXX belegt.
  • Code Zeile 13: Das Feld „Manager“ wird mit dem Wert 1000 belegt.
  • Code Zeile 14: Das Feld „Gehalt“ wird mit dem Wert 10000 belegt.
  • Code Zeile 15-19: Der Wert von 'guru99_emp_rec' wird in der Ausgabe angezeigt.

Beispiel 3: Zugriff auf Zeilenebene (Unterprogrammebene)

In diesem Beispiel sehen wir, wie man einen Datensatztyp auf Unterprogrammebene erstellt und ihn auf Zeilenebene befüllt. Wir erstellen den Datensatztyp „emp_det“ auf Unterprogrammebene und verwenden ihn, um Daten zu befüllen und anzuzeigen.

Beispiel für den Zugriff auf Zeilenebene eines Datensatztyps

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 Erläuterung

  • Code Zeile 2-8: Der Datensatztyp 'emp_det' ist mit den Spalten emp_no, emp_name, manager und salary vom Datentyp NUMBER, VARCHAR2, NUMBER und NUMBER deklariert.
  • Code Zeile 9: Die Variable guru99_emp_rec ist als Datentyp 'emp_det' deklariert und kann alle vier Felder aufnehmen.
  • Code Zeile 11: Die Tabelle emp wird mit 1002 als emp_no, YYY als emp_name, 15000 als salary und 1000 als manager number befüllt.
  • Code Zeile 12: Festschreiben der Einfügetransaktion.
  • Code Zeile 13: Die Variable 'guru99_emp_rec' wird auf Zeilenebene mit den Daten der SELECT-Abfrage für Mitarbeiternummer 1002 befüllt.
  • Code Zeile 15-19: Der Wert von 'guru99_emp_rec' wird in der Ausgabe angezeigt.

Ausgang:

Employee Detail
Employee Number: 1002
Employee Name: YYY
Employee Salary: 1000
Employee Manager Number: 15000

Hinweis: Auf einen Datensatztyp kann nur auf Spaltenebene zugegriffen werden, wenn sein Wert in einen beliebigen Ausgabemodus umgeleitet wird. Beachten Sie, dass in diesem Beispiel die Reihenfolge der SELECT-Liste nicht mit der Reihenfolge der Datensatzfelder übereinstimmt. Daher erscheinen die Werte für Gehalt und Manager in der Ausgabe vertauscht.

Arten von PL/SQL-Datensätzen

Über die oben dargestellten, vom Programmierer definierten Aufzeichnungen hinaus, Oracle Es bietet zwei verankerte Datensatztypen, die ihre Struktur automatisch kopieren. Dadurch entfällt die erneute Deklaration von Spalten, und der Datensatz bleibt mit der Tabelle oder dem Cursor, auf dem er basiert, synchron.

Datensatzart Erklärt mit Struktur entsteht durch
Tabellenbasierter Datensatz Tabellenname%ROWTYPE Alle Spalten einer Tabelle
Cursorbasierter Datensatz cursor_name%ROWTYPE Auswahlliste des Cursors
Programmiererdefinierter Datensatz TYP … IST DATENSATZ Spalten, die Sie von Hand auflisten

Ein %ROWTYPE-Datensatz ist die sicherste Wahl, wenn die Struktur einer Tabelle oder einem anderen Format folgen soll. Cursorweil eine Spaltenänderung beim nächsten Kompilieren automatisch erkannt wird.

Häufig gestellte Fragen

Ein Datensatz fasst verschiedene Spalten, möglicherweise unterschiedlicher Datentypen, in einer zeilenartigen Struktur zusammen. Eine Sammlung enthält viele Elemente desselben Typs, die durch einen Index gekennzeichnet sind. Oft werden sie kombiniert, zu einer Sammlung von Datensätzen.

%ROWTYPE deklariert einen Datensatz, dessen Felder automatisch mit einer Tabelle oder einem Cursor übereinstimmen. Verwenden Sie ihn, wenn der Datensatz die Quelle widerspiegeln soll, sodass eine Spaltenänderung ohne Bearbeitung der Deklaration übernommen wird.

Ja, wenn beide Datensätze vom gleichen Typ sind. Mit SELECT INTO kann auch ein kompletter Datensatz aus einer Tabellenzeile befüllt werden, vorausgesetzt, die Reihenfolge der Auswahlliste entspricht der Feldreihenfolge des Datensatzes.

Ja. KI kann eine Tabellendefinition lesen und einen passenden TYPE … IS RECORD-Block erzeugen oder %ROWTYPE empfehlen, wobei ein direkter Link zur Tabelle vorzuziehen ist. Überprüfen Sie die Datentypen vor der Verwendung.

Ein Datensatz auf Datenbankebene wird mit CREATE TYPE erstellt und als Objekt gespeichert, das in der gesamten Datenbank sichtbar ist. Ein Datensatz auf Unterprogrammebene wird innerhalb eines Blocks deklariert und existiert nur innerhalb dieses Unterprogramms.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: