Arbeiten mit Records

PL/SQL unterstützt drei verschiedene Typen von Records: tabellenbasierte, cursorbasierte und selbstdefinierte Records. Alle diese Typen werden verschieden benutzt, haben aber die gleiche interne Struktur. Jeder Record besteht aus einem oder mehreren Feldern. Das Feld eines selbstdefinierten Records kann wiederum selbst ein Record sein.

  • Tabellenbasierte Records beruhen auf der Spaltenstruktur einer zugrundeliegenden Tabelle und jedes Feld des Records heißt genauso wie die Spalte der Tabelle
  • Cursorbasierte Records beruhen auf dem SELECT Statement eines Cursors. Erinnern Sie sich, dass das SELECT Statement eine “virtuelle” Tabelle erzeugt. Jedes Feld des Records beruht damit auf einer Spalte oder einem Ausdruck des SELECT Kommandos in der Cursordeklaration.
  • Selbstdefinierte Records werden vom Programmierer bereitgestellt, jedes Feld wird einzeln deklariert unter Angabe des Namens und Datentyps.

Vorteile von Records

Einfachheit ist der wohl wichtigste Grund. Es ist sehr viel einfacher, einen Records zu referenzieren als alle einzelnen Spalten einer Tabelle oder alle Spalten eines CURSORSELECT Statements.

Tabellenbasierte Records

Ein tabellenbasierter Record beruht in seinem Aufbau auf der Struktur einer Tabelle. Jedes Feld des Records entspricht einer Spalte der Tabelle, auf die wir uns bei der Deklaration des Records beziehen. Die Deklaration von tabellenbasierten Records erfolgt über das %ROWTYPE Attribut. Das Format der Deklaration ist also

record_name table_name%ROWTYPE; 

Erinnern Sie sich an die verankerte Deklaration mit Hilfe des TYPE beziehen wir uns auf den (skalaren) Datentypen einer Spalte. Über %ROWTYPE beziehen wir uns auf den Aufbau der gesamten Tabelle.

Cursorbasierte Records

Ein cursorbasierter Record beruht auf dem Aufbau des SELECT-Statements. Jedes Feld im Record korrespondiert mit einem Spaltennamen oder Ausdruck aus dem Cursor. Cursorbasierte Records machen es sehr einfach, eine Datenstruktur bereitzustellen, die die Spaltenwerte des Cursors aufnehmen kann. Wir beziehen uns bei der Deklaration wieder mit %ROWTYPE auf eine vorhandene Struktur. Diesmal nicht auf eine Tabelle, sondern auf einen Cursor.

cursor c1 is select * from emp;
record_name c1%ROWTYPE; 

Referenzieren von Records

Um das Feld eines Records anzusprechen, wird das Feld wie folgt referenziert:

--record_name.attribute_name
-- also z.B.
mitarbeiter.name := 'Hansi';

Der Attributname muß stets komplett ausgeschrieben werden. Soll der gesamte Record referenziert werden, reicht es, den Namen des Records anzugeben.

Selbstdefinierte Records

Es ist möglich, Recordstrukturen zu erzeugen, die weder etwas mit Tabellen noch mit Cursors zu tun haben. Ich beschreibe sie hier nur der Vollständigkeit halber, selber benutze ich sie so gut wie nie, denn meist erreicht man mit erstgenannten Records schneller das Ziel.

Die Syntax, um eigene Records zu deklarieren, ist folgende:

TYPE record_typ IS RECORD
  (field_name1 datatype1,
   field_name2 datatype2,
   ..
   ..
   field_nameN datatypeN); 
my_record_var record_typ;

Auch hier ist es möglich, den einzelnen Feldern einen Initialwert zuzuordnen.

Verschachtelte records

Weiterhin ist er möglich, Recordstrukturen zu bauen, die ihrerseits wieder auf Records basieren. An dieser Stelle sei lediglich erwähnt, dass es möglich ist, ohne weiter darauf einzugehen. Verschachtelte Records werden in Verbindung mit PL/SQL Tabellen wieder interessant.

Records zuweisen und vergleichen

Die Zuweisung von Recordvariablen an andere Recordvariablen gleichen Typs ist möglich, sie müssen aber den GLEICHEN Typ haben. Selbst wenn Sie zwei Typen deklarieren, die völlig identisch sind, wird ein Recordvergleich scheitern. Ein Recordvergleich scheitert in jedem Fall.

...
-- das funktioniert
 myrecord1 := myrecord2;
-- der Vergleich bringt TYPE MISMATCH
 if myrecord1 = myrecord2 then
...

Damit haben wir den ersten komplexen Datentyp kennengelernt. Nun existieren noch die PL/SQL Tabellen …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert