PL-SQL: Typen

Aus Wikibooks


PL/SQL kennt die folgenden vordefinierten Typen. Das sind Typen, deren Struktur vom Programmierer nicht mehr verändert werden kann.

Skalare Typen [Bearbeiten]

Skalare Typen haben keine weiteren, internen Strukturen, die vom Programmierer verändert werden können.

  skalareType = numerischeType | characterType | boolscheType | pointerType | datetimeType;

Numerische Typen[Bearbeiten]

Numerische Typen definieren ganzzahlige, reelle und numerische Aufzählungstypen unterschiedlicher Genauigkeit und Wertebereiche.

 numerischeType           = binaryType | numberType;
   binaryType             = "PLS_INTEGER" | "BINARY_INTEGER" | binaryIntegerSubtype;
     binaryIntegerSubtype = "NATURAL" | "NATURALN" | "POSITIVE" | "POSITIVEN" | "SIGNTYPE";
   numberType             = ("NUMBER" [laengenBeschreibung]) | numberSubType;
     laengenBeschreibung  = gesamtlaenge[("," nachkommaanteil)]  
       gesamtlaenge       = 1..38;
       nachkommaanteil    = -84..127;
     numberSubType        = "DEC" | "DECIMAL" | "NUMERIC" | "DOUBLE PRECISION" | "FLOAT" | "REAL" | "INTEGER" | "INT" | "SMALLINT";

Binäre, ganzzahlige Typen[Bearbeiten]

Die binären Typen stellen ganzzahlige Zahlen, wie der Name schon sagt, intern in binärer Form dar. Sie sind in der Berechnung besonders schnell und werden hauptsächlich als Index verwendet, wobei der Typ PLS_INTEGER am schnellsten ist. Die Subtypen dieser Typklasse unterscheiden sich nur im Wertebereich,

Wertebereiche

Typ                minimaler Wert      maximaler Wert
BINARY_INTEGER     -2.147.483.648      2.147.483.647
PLS_INTEGER        -2.147.483.648      2.147.483.647
NATURAL                         1      2.147.483.647
POSITIVE                        1      2.147.483.647
NATURALN                        0      2.147.483.647
POSITIVEN                       0      2.147.483.647
SIGNTYPE                       -1                  1

Der Type SIGNTYPE hat nur die drei Werte -1, 0 und 1.

Reelle Typen[Bearbeiten]

Für reelle Typen gibt verschiedene Darstellungsmöglichkeiten, die sich grundlegend in Floatingpoint und Fixedpoint unterscheiden. Der Wertebereich geht von 10**-130 bis 10**125. Der Typ NUMBER gestattet die größte Gestaltungsmöglichkeit durch die optionale Längendefinition. Floatingpoint wird durch NUMBER ohne Längenbeschreibung definiert und Fixedpoint wird mit einer Längenbeschreibung definiert. Es gelten folgende Regeln bei der Festlegeung der Längenbeschreibung.

  • nur Gesamtlänge bzw. Nachkommaanteil ist 0

Die Längendefinition ist identisch mit 0 als Nachkommaanteil und es wird nur der ganzzahlige Anteil der reellen Zahl verwendet.

  • Nachkommaanteil < 0

Auch diese Variante ist möglich, obwohl sie im ersten Moment widersprüchlich ist. Mit einem negativen Wert im Nachkommaanteil werden Vorkommaanteil 0 gesetzt. -1 setzt die Einerstelle auf 0; es können also nur die Zahlen 10, 20, 30 usw. verarbeitet werden. -2 setzt die Einer- und Hunderterstelle auf 0, es können also nur die Zahlen 100, 200, 300 usw. verarbeitet werden. Damit sollte die Verwendung von negativen Werten als Nachkommaanteilen verständlich sein.

  • Nachkommaanteil > 0

Mit einem Nachkommaanteil > 0 wird die Genauigkeit der reellen Zahl festgelegt. 1 als Nachkomaanteil verarbeitet nur Zehntelwerte, 2 Zehntel- und Hunderstelwert.

Bei der Längenfestlegung ist zu beachten, dass die Gesamtlänge größer als der Nachkommaanteil sein muss. Die Subtypen DEC, DECIMAL und NUMERIC definieren eine 38-stellige, reelle Zahl; DOUBLE PRECISION und FLOAT definieren eine 128 Bit und REAL eine 63 Bit lange, reelle Zahl.

Ganzzahlige Typen[Bearbeiten]

Die Typen INTEGER, INT und SMALLINT stellen eine 38 Zeichen lange, ganze Zahl dar.

Character-Typen[Bearbeiten]

Character-Typen definieren alphanumerische Werte, auf die in ihrer Gesamtheit, aber auch auf ihre einzelnen Elemente, zugegriffen werden kann.

 characterType         = ("CHAR" [laengenFestlegung [struktur]]) | characterSubtype | longType | rawType | rowidType | varcharType | nationalCharType;
   characterSubtype    = "CHARACTER";
   lonType             = "LONG" | "LONG RAW";
   rawType             = "RAW" laengenFestlegung;
   stuktur             = ["CHAR" | "BYTE";
   rowidType           = "ROWID" | "UROWID";
   varcharType         = ("VARCHAR2" | "VARCHAR" | "STRING") [laengenFestlegung [struktur]]);
   nationalCharType    = ("NCHAR" | "NVARCHAR2") [laengenFestlegung];
     laengenFestlegung = "(" 1..32767 ")";

CHAR-Typen[Bearbeiten]

CHAR ist ein Typ zur Speicherung, mit festgelegter Länge, von Zeichen. Die maximal mögliche Länge beträgt 32767. Mit der Festlegung der Struktur wird definiert, auf was sich die Längenangabe bezieht - auf ein Byte oder ein Zeichen. Das ist besonders wichtig, wenn mit UTF8-Codezeichen gearbeitet wird. Eine Länge von 32767 und die Struktur BYTE ermöglicht bei der Speicherung von 2-Byte-UTF8-Codezeichen nur 16383 Zeichen zu speichern. Die Standardannahme für die Länge ist 1 und als Struktur wird die Festlegung des Parameters NLS_LENGTH_SEMANTICS der benutzenden Datenbankinstanz verwendet. Der Typ CHARACTER ist identisch mit dem Typ CHAR und ist nur aus Kompatibilitätsgründen eingeführt wurden.

LONG-Typen[Bearbeiten]

Dieser Typ hat eine konstante Länge von 32760 Bytes und dient zur Speicherung von Zeichen (LONG, LONG RAW) oder binären Daten (LONG RAW). Ab der Version Oracle 9i gibt es ((PL_SQL: LOB-Typen|LOB-Tyen)) zur Speicherung von binären Daten und Zeichen bis 2GB. , die die LONG Die Chractertypen haben unterschiedliche Bedeutung und sind teilweise auf Abwärtskompatibilität zurück zu führen.

RAW-Typen[Bearbeiten]

Der Typ RAW ist identisch mit den Typ LONG RAW, der einzige Unterschied ist die maximale Lange von 32767 Bytes.

ROWID-Typen[Bearbeiten]

Ein ROWID ist die eindeutige Adresse innerhalb eines Datensatzes in einer Tabelle. Jede Tabelle hat das ROWID als Pseudospalte. Es wird in physische und logische ROWIDs unterschieden, wobei der Typ ROWID nur physische ROWIDs und der Typ UROWID (universell ROWID) physische und logische ROWIDs darstellen kann. Physische ROWIDs haben folgenden Aufbau

 rowid              = dataobjektNumber fileNumber blockNumber rowNumber;
   dataobjektNumber = zeichen;
   fileNumber       = zeichen;
   blockNumber      = zeichen;
   rowNumber        = zeichen;

Das Element haben folgende Längen in Byte.

 dataobjectNumber 6
 fileNumber       3
 blockNumber      6
 rownumber        3

VARCHAR2-Typen[Bearbeiten]

Dieser Typ ist fast identisch mit dem CHAR-Typ. Die Länge und die Struktur (Byte oder Char) kann festgelegt werden. Der wesentliche Unterschied besteht darin, dass VARCHAR2 speicher- und performanceorientiert arbeitet und nur die tatsächlich benötigte Anzahl von Speicherplätzen belegt. CHAR hingegen belegt den Speicher immer mit der vereinbarten Länge. Die Subtypen STRING und VARCHAR sind identisch zu VARCHAR2 und existieren aus Kompatibilitätsgründen.

Nationale CHAR-Typen[Bearbeiten]

Um erweiterte Zeichensätze, die mehr als 256 Zeichen beinhalten, zu ermöglichen. Dieses ist vorallem bei asiatischen Sprachen notwendig. Die Datenbank arbeitet mit zwei Zeichensätzen, den Datenbankzeichensatz, mit dem alle Informationen über die Strukturen und der PL/SQL-Programmcode und dem Nationalen Zeichensatz mit dem alle Informationen in den Tabellen gespeichert werden. Der Nationale Zeichensatz wird im UNI-Code dargestellt, der 1, 2 oder 3 Byte pro Zeichen lang ist. Zeichensätze, die für jedes Zeichen immer 2 Byte benötigen, werden als AL16UTF16 bezeichnet. Zeichensätze, die für jedes Zeichen 1, 2 oder 3 Byte benötigt, werden als UTF8 bezeichnet. Die Längenangaben in der Typdefinition ist in Byte, das heißt, bei Speicherung in UTF-8 ist die Anzahl der maximal möglichen Zeichen 32787/3 und bei AL16UTF16 32767/2. Der Unterschied zwischen den beiden NCHAR und NVARCHAR2 besteht darin, dass NCHAR immer den Speicherplatz laut Längenbeschreibung belegt, unabhängig davon, wieviel Speicher tatsächlich benötigt wird. NVARCHAR2 belegt nur soviel Platz, wie tatsächlich benötigt wird.

Boolsche Typen[Bearbeiten]

Dieser Typ ist sehr einfach beschrieben.

 boolscheType := "BOOLEAN";

Pointertypen[Bearbeiten]

Datums- und Zeittypen[Bearbeiten]

Mit diesen Typen werden Datums- und Zeitangaben definiert. Die einzelnen Komponenten des Datums und der Zeit unterliegen folgenden Beschränkungen bzw. Wertebereichen.

 jahr          = -4712..-1 | 1..9999;
 monat         = 1..12; 
 tag           = 1..31;
 stunde        = 0..23;
 minute        = 0..59;
 sekunde       = 0..59 ["," sekundenTeile];
 sekundenTeile = zahl;

Zur Darstellung von Zeitzonen sind folgende Wertebereiche möglich.

 zeitzoneStunde = -12..14;
 zeitzoneMinute = 0..59;

Die Region der Zeitzonen ist dem Parameter V$TIMEZONE_NAMES der aktuellen DB-Instanz zu entnehmen. Folgende Datums- und Zeittypen sind definiert.

 datetimeType    = "DATE" |
                   "TIMESTAMP" [precision] |
                   "TIMESTAMP" [precision] "WITH TIME ZONE" | 
                   "TIMESTAMP" [precision] "WITH LOCAL TIME ZONE" |
                   "INTERVAL YEAR" [precisionYear] "TO MONTH" |
                   "INTERVAL DAY" precisionDay] "TO SECOND" [precisionSecond];
 precision       = zahl;
 precisionYear   = 0..4;
 precisionDay    = 0..9;
 precisionSecond = zahl;

Typ DATE[Bearbeiten]

Dieser Typ definiert ausschließlich das Datum. Oracle kann das Datum im Bereich vom 1.1.4712 v.Chr. bis 31.12.9999 darstellen. Es besteht die Möglichkeit das Datum als Zahl der Tage seit dem Startdatum darzustellen.

Typ TIMESTAMP[Bearbeiten]

Timestamp stellt Datum und Uhrzeit in einer rellen Zahl dar, wobei der ganzzahlige Anteil das Datum und der Nachkommaanteil die Zeit seit Mitternacht ist. der Parameter precision gibt die Genauigkeit der Sekundenanteile an, wobei 1 Zehntelsekunden, 2 Hunderstelsekunden usw, sind. Der Zusatz WITH TIME ZONE speichert das Datum in der lokalen Zeitzone mit einem Displacment in Stunden und Minuten der lokalen Zeitzone zu UTC oder den Namen der Zeitzone. Mit dem Zusatz WITH LOCAL TIME ZONE erfolgt bei Speicherung eine Umrechnung von der lokalen Zeitzone in die Zeitzone der Datenbank und dem Displacment der umgerechneten Zeit zu UTC.

Typ INTERVAL[Bearbeiten]

Mit dem INTERVAL-Typ werden Zeitdifferenzen definiert. Der Parameter precisionYear definiert bei INTERVAL YEAR die Anzahl der Ziffern bei der Jahresangabe Der Standard ist 2, möglich ist 0. Die Differenz wird als Zeichenkette definiert, wobei Jahr und Monat getrennt, als auch zusammen festgelegt werden können. Beispiel für zeitdiff als Variable vom Typ INTERVAL YEAR (3) TO MONATH:

 zeitdiff = INTERVAL '10-2' YEAR TO MONTH; -- Zeitdifferenz von 10 Jahren und 2 Moanten
 zeitdiff = INTERVAL '10' YEAR; Zuweisung der Jahre in der Zeitdifferenz
 zeitdiff = INTERVAL '3' MONTH; -- Zuweisung der Monate in der Zeitdifferenz
 zeitdiff = '10-2'; -- implizite Zeitdifferenzzuweisung

Der Parameter precisionDay legt die Anzahl der Ziffern bei der Tagesangabe fest, Standard ist 2 und der Parameter precisionSecond legt die Anzahl der Ziffern bei der Sekundenangabe fest, Standard ist 6. Die Zuweisung erfolgt analog wie im Beispiel bei INTERVAL YEAR TO MONTH.

LOB-Typen [Bearbeiten]

Die Abkürzung LOB steht für Large Object. Mit LOB-Typen werden, aus der Sicht von PL/SQL, unstrukturierte, binäre Daten mit einer Größe von maximal 4 Gigabyte definiert. Es kann sich dabei um

  • Texte,
  • Files,
  • Bilder,
  • Videos u.a.m.

handeln. Es handelt sich um Objekte, die, wie in der objektorientierten Programmierung, für ihre Bearbeitung Methoden haben. Die Definition eines LOB-Types stellt einen Pointer zur Verfügung, der auf den referenzierten Speicherplatz zeigt. Eine Pointerverarbeitung, wie zum Beispiel in C, ist nicht möglich; es gibt keine Möglichkeit, die Adresse an sich unter PL/SQL auszulesen und damit in Form einer Pointerarithmetik zu arbeiten. Aus der Sicht des Programmierers erfolgt der Zugriff statisch auf einen reservierten Speicherbereich. Zur Bearbeitung von LOB-Typen steht das Package DBMS_LOB zur Verfügung.

 lobType         = fileLobType |
                   binaryLobType |
                   charLobType |
                   numLobType  |
                   xmlLobType;
   fileLobType   = "BFILE";
   binaryLobType = "BLOB";
   charLobType   = "CLOB" | "NCLOB";
   xmlLobType    = "XMLType";

BFILE[Bearbeiten]

Mit dem LOB-Typ BFILE wird der Zugriff auf ein File aus dem Filesystem ermöglicht. Es muss gewährleistet sein, das der User, der aus der Sicht des Betriebssystem Oracle gestartet hat, auf das File lesende Zugriffsrechte hat. Es ist nur ein lesender Zugriff auf das File über den BFILE-Type möglich. Des weitren ist zu berücksichtigen, dass der BFILE-Type nicht der Transaktionssteuerung der Datenbank unterliegt. Es ist nicht möglich unbegrenzt viele Files duch die Definition von Variablen mit dem Typ BFILE in einer Session zu bearbeiten. Die maximale Anzahl wird durch den Datenbankparameter SESSION_MAX_OPEN_FILES festgelegt. Dabei muss beachtet werden, dass es noch andere Möglichkeiten gibt, Files durch die Datenbank (Package UTL_FILE) zu bearbeiten.

BLOB[Bearbeiten]

Mit dem LOB-Typ BLOB werden binäre Daten mit einer Größe von maximal 4 GB definiert. Dieser Typ unterliegt der Transaktionssteuerung.

CLOB und NCLOB[Bearbeiten]

Mit dem LOB-Typ CLOB und NCLOB werden Characterdaten mit einer Größe von maximal 4 GB definiert. Diese beiden Typen unterliegen der Transaktionssteuerung. CLOB ist auf den Typ Characters vom Typ VARCHAR und NCLOB auf Characters vom Typ NVARCHAR zurückzuführen.

XMLType[Bearbeiten]

Im Gegensatz zu den bisher betrachteten LOB-Typen handelt es sich beim LOB-Type XMLType um ein Objekt. Dieser Typ besteht aus einem Datenbereich, der das XML-Dokument enthält, sowie aus einer Vielzahl von Methoden, mit der das XML-Dokument bearbeitet werden kann. Ausführlich wird im Abschnitt XML auf die Erstellung und Verarbeitung von XML-Dokumenten eingegangen.

Typkonvertierung [Bearbeiten]

PL/SQL gestattet eine implizite Typkonvertierung über Zuweisungen. Die explizite Typkonvertierung wird über Funktionen realisiert, bei denen teilweise Formatierungsvorschriften vorgegeben werden können.

Implizite Typkonvertierung[Bearbeiten]

Implizit können folgende Typen konvertiert werden

von/nach Character Number Datetypen Rowid
Character eingeschränkt eingeschränkt immer
Number immer nein immer
Date immer immer nein
Rowid immer immer nein

Einschränkung

Die Umwandlung von

  • Character in Number ist nur möglich, wenn es sich bei dem String um eine Zahl handelt,
  • Character in Datetypen ist nur möglich, wenn der String einem Datum gemäß dem im Parameter NLS_DATE_FORMAT und NLS_DATE_LANGUAGE festgelegten Format entspricht.

Explizite Typkonvertierung[Bearbeiten]

Die explizite Typkonvertierung ist extrem komplex und hat eine Vielzahl von Parametern, die hier im Einzelnen erläutert werden sollen.

Konvertierung in numerische Datentypen[Bearbeiten]

Die Konvertierung von Characterwerten in numerische Werte ermöglicht eine implizite Formatierung oder eine individuelle Formatsteuerung des Ausgangswertes für die Umwandlung.

 konvertierungsfunktion           = numberkonvertierungsfunktion "(" numberparameterliste ")";
   numberkonvertierungsfunktion   = "TO_NUMBER";
   numberparameterliste           = (name | zahl) ["," formatparameter ["," nlsnumberparameterliste]];
     formatparameter              = formatangabe;
       formatangabe               = ziffernformatierung | 
                                    vorzeichenformatierung | 
                                    trennzeichenformatierung | 
                                    waehrungsformatierung |
                                    zahlenformatierung   
         ziffernformatierung      = "0" | "9" | "FM";
         vorzeichenformatierung   = "PR" | "MI" | "S";
         trennzeichenformatierung = "D" | "G" | "." | ",";
         waehrungsformatierung    = "$" | "C" | "L" | "U";
         zahlenformatierung       = "EEEE" | "RN" | "rn" | "TM9" | "TME" | "V" | "X";
     nlsnumberparameterliste      = "'" nlsnumberparameter [..] "'";
       nlsnumberparameter         = "NLS_NUMERIC_CHARACTERS = " "" dezimaltrenner tausendertrenner "" |
                                    "NLS_CURRENCY = " "" text "" |
                                    "NLS_ISO_CURRENCY = " isocurrencycode;
         dezimaltrenner           = "." | ",";
         tausendertrenner         = "." | ",";
         text                     = zeichenkette;
         isocurrencycode          = zeichenkette;

Formatierungen

Formatierungszeichen Bedeutung Beispiel
0 Zeichen ist eine Vornull '0123','0999' --> 123
9 Zeichen ist eine Ziffer '123','999' --> 123
FM Entfernen alle Blanks und Vornullen ' 123 ','FM999' --> 123
PR positives Vorzeichen '+123','PR999' --> 123
MI negatives Vorzeichen '123-','999MI' --> -123
S Vorzeichen '+123','S999' --> 123
D oder , Dezimaltrenner '123.1','999D9' --> 123,1
G oder . Tausendertrenner '1.234','9G999' --> 1234
$ Währungszeichen '123$','999$' --> 123
C internationales Währungszeichen '123$','999C' --> 123
L lokales Währungszeichen '123€','999L' --> 123
U Währungssymbol im DB-Parameter NLS_DUAL_CURRENCY '123€','123U' --> 123
EEEE wissenschaftliche Notation '1.23E+02','9.99EEEE' --> 123
TM9 oder TME minimale Textdarstellung '123','TM9' --> 123
RN oder rn römische Zahlendarstellung (groß/klein) 'XII','RM' --> 12
V Zehnerpotenzdarstellung '1.23x45','9.99V99' --> 123
X hexadezimale Darstellung 'FF','XX' --> 128

Die Formatierung muss die Zeichenfolge der umzuwandelnden Zeichenkette exakt beschreiben. Es erklärt sich von selbst, dass es nicht mögliche Kombinationen gibt, die hier aber nicht weiter erläutert werden sollen. Ebenso soll an dieser Stelle darauf hingewiesenw erden, dass alle Vorzeichenformatierungen nur am Anfang oder Ende der Formatbeschreibung stehen dürfen.

Der 'text' ist eine Zeichenkette, die als Währungsbezeichnung ausgegeben wird und der 'isocurrencycode' das Währungskürzel. Die Parameter überschreiben während der Ausführung der Funktion die Werte der Parameter der DB.

Konvertierung in Datetypen[Bearbeiten]

Die Konvertierung von Characterwerten in Datetypen ermöglicht eine implizite Formatierung oder eine individuelle Formatsteuerung des Ausgangswertes für die Umwandlung.

 konvertierungsfunktion           = (datekonvfunktion "(" dateparameterliste ")")|(dateintervallkonvfunktion "(" dateintervallparameterliste ")");
   datekonvfunktion               = "TO_DATE" | "TO_TIMESTAMP" | "TO_TIMESTAMP_TZ";
   dateintervallfunktion          = "TO_DSINTERVAL" | "TO_TMINTERVAL" ;
   dateparameterliste             = (name | date) ["," dateparameter ["," nlsnumberparameterliste]];
     dataparameter                = dateangabe;
       formatangabe               = freietextformatierung | 
                                    dateformatierung | 
                                    timeformatierung
         freietextformatierung    = "-"|","|"."|";"|":"|freiertext;
           freiertext             = """|zeichen[..]|"""; 
         dateformatierung         = [jahresformatierung] [monatsformatierung] [wochenformatierung] [tagesformatierung];
           jahresformatierung     = "AD" | "A.D."| "AM" | "A.M." | "BC" | "B.C." | "BC" | "CC" | "BCC" | "Q" | 
                                    "YYYY" | "YYY" | "YY" | "Y" | "SYYYY" | "YEAR" | "SYEAR" | "Y,YYY";
           monatsformatierung     = "MM" | "MON" | "MONTH" | "RM";
           wochenformatierung     = "W" | "WW" | "IW";
           tagesformatierung      = "DD" | "DDD" | "D" | "DAY" | "DY";

Formatierungen

Formatierungszeichen Bedeutung Beispiel
AD oder A.D.
AM oder A.M.
BC oder B.C.
CC oder BCC Jahrhundert zweistellig 1999,'CC' --> 20
Q Quartal 10.05.2012,'Q' --> 2
YYYY oder YEAR Jahr vierstellig 1999,'YYYY' --> 1999
YYY Jahr dreistellig 1999,'YYY' --> 999
YY Jahr zweistellig 1999,'YY' --> 99
Y Jahr einstellig 1999,'Y' --> 9
SYYYY oder SYEAR Jahr mit Vorzeichen 1999,'SYYYY' --> 1999
Y,YYY Jahr mit Tausendertrenner 1999,'Y,YYY' --> 1,999
MM Monat zweistellig 10,'MM' --> 10
MON Monat dreibuchstabig 1,'MON' --> JAN
MONTH Monat mit 9 Characters (rechts Blanks) 1,'MONTH' --> Januar
RM Monat in römischen Zahlen 10,'RM' --> X
W Woche im Monat
WW Woche im Jahr
IW Industriewoche im Jahr
D Tag in der Woche
DD Tag im Monat
DDD Tag im Jahr
DAY Wochentag mit 9 Characters (rechts Blanks)
DY Tag dreibuchstabig

Die Typen aus der Datenbank [Bearbeiten]

Es ist in PL/SQL möglich, Typen auf

  • Tabellen und Views,
    • in der Gesamtheit der Tabellen- oder Viewstruktur oder
    • eines einzelnen Spaltenelementes (ordinale Typdefinition in Bezug auf den Typ der Spalte),
  • Typdefinitionen in Packages und
  • Typdefinitionen in der DB

zurückzuführen. Der Vorteil dieser Art der Typzuweisung ist, dass die Programmstruktur sofort invalid wird, wenn das Datenbankobjekt geändert wird. Dadurch werden potentielle Fehlerquellen, die durch Strukturänderungen der Tabellen oder Views entstehen, vermieden.

 dbobjektType          = tableType | packageType | dbType;
   tableType           = rowtypeType | spaltenType;
     rowtypeType       = [ownername](tabellenname | viewname)[dblinkname] "%rowtype";
       ownername       = name ".";
       dblinkname      = "@" name;
       tabellenname    = name;
       viewname        = name;
     spaltenType       = [ownername](tabellenname | viewname)[dblinkname] "." spaltename "%type";
       spaltename      = name;
   packageType         = [ownername]packagename[dblinkname] "." typDeklaration;
     packagename       = name;
       ownername       = name ".";
       dblinkname      = "@" name;
     typDeklaration    = recordType | subType | dbType | plsqltableType;
   dbType              = name;

Den eigenen Wunschrecord festlegen [Bearbeiten]

Neben Strukturdefinitionen, die auf Tabellen oder Views zurückgeführt werden, kann ein freier Record als Typ definiert werden. Diese Art der Typdefinition kann beliebige viele, auch weitere Recorddefinitionen enthalten. Zugriff auf die Recordelemente erfolgt über qualifizierte Namen.

 recordType            = "type" recordtypename "is record" recordelementliste;
   recordtypename      = name;
   recordelementliste  = "(" recordelement [,..] ")";
      recordelement    =  elementname typedefinition;
        elementname    = name;
        typedefinition = numerischeType | characterType | boolscheType | datetimeType | lobType | tableType | recordType

Die Subtypen [Bearbeiten]

Die Tabellensammlung im Speicher [Bearbeiten]

Es gibt mehrere Möglichkeiten, Tabellenstrukturen im Speicher zu definieren. Diese Strukturen entsprechen Arrays in Programmiersprachen wie C oder Pascal.

Index By[Bearbeiten]

Die erste Variante ist eine Tabellenstruktur, die folgende Struktur hat.

 plsqltableType = "type" typename "is table of" {dbobjektType | recordType | plsqltableType} "index by binary_integer";
   typename     = name;

V(ariable) Array[Bearbeiten]

Nested Table[Bearbeiten]