DISTINCT Datentyp

Sie zählen neben den strukturierten Datentypen zu den benutzerdefinierten Datentypen. Sie sind im Grunde Kopien eines beliebigen Basis-? oder benuzterdefinierten Datentyps. Sinn und Zweck dieser DISTINCT-Datentypen ist es, semantisch sinnlose Verlgeiche, Berechnungen und Zuweisungen auszuschließen. Zu diesem Zweck, sind nur Vergleiche von Instanzen gleicher DISTINCT-Datentypen möglich, womit sie dem Prinzip der strengen Typisierung genügen. Weder ist der Vergleich einer Instanz eines DISTINCT-Datentyps mit einer Instanz seines Quelldatentyps zugelassen, noch Vergleiche von Instanzen verschiedener DISTINCT-Typen. Hingegen werden zwei Instanzen gleichen DISTINCT-Typs verglichen, indem DBS-intern der Vergleich auf dem zugrunde liegenden Quelldatentyp augeführt wird.

Bei der Erstellung eines DISTINCT-Datentyps wird automatisch ein Konstuktor generiert. Durch Aufruf als distinct-Typname(Quelltypwert) wird eine Instanz des DISTINCT-Typs erzeugt. Ferner werden bei der Erstellung zwei CAST-Funktionen erzeugt, die die Instanz eines DISTINCT-Typs in eine Instanz eines Quelltyps transformieren und umgekehrt. Der Aufruf erfolgt als CAST(Werteausdruck AS Zieltypname).

Eine Bildung von Subtypen für DISTICT-Typen ist nicht möglich, was durch die Klausel FINAL deutlich wird, die zwar optional ist, aber auch die Default-Einstellung.

Die DISTICT-Datentypen sind nur im SQL-Standard bekannt, nicht bei Oracle.

SQL-Syntax für DISTINCT-Datentypen:

    <CREATE DISTINCT-Datentyp Anweisung> ::=
CREATE TYPE distinct-Typname AS Quelltypname [ FINAL ];

Beispiele:

   CREATE TYPE euroTyp          AS DECIMAL(20,2) FINAL; 
   CREATE TYPE Montasgehalt_Typ AS DECIMAL(7,2)  FINAL;
   CREATE TYPE Jahresgehalt_Typ AS DECIMAL(10,2) FINAL;
   CREATE TYPE TelefonTyp       AS VARCHAR(15)   FINAL;
   CREATE TYPE PLZTyp           AS VARCHAR(5)    FINAL;

   -- Variablendeklaration
   DECLARE TelefonPrivat   TelefonTyp;
   DECLARE TelefonArbeit   TelefonTyp;
   DECLARE TelefonHandy    VARCHAR(15);

   SET TelefonPrivat = TelefonTyp('02261819689833');     -- initialisieren mit 022618196989833
   SET TelefonArbeit = TelefonTyp('02261734979834');     -- initialisieren mit 02261734979834
   IF  TelefonArbeit =  TelefonPrivat THEN ...;          -- ausführbarer Vergleich dank passender/gleicher Typen der Operanden
   IF  TelefonArbeit =  TelefonHandy  THEN ...;          -- ein Typkonflikt bei den Operanden tritt auf

Quellen:

  • ANSI/ISO/IEC 9075-1:2003. Part 1 "SQL/Framework", ISO International Organization for Standardization / ANSI American National Standards Institute, September 2003
  • ANSI/ISO/IEC 9075-2:2003. Part 2 "SQL/Foundation", ISO International Organization for Standardization / ANSI American National Standards Institute, Dezember 2003
  • Türker, Can/Saake, Gunter: "Objektrelationale Datenbanken", dpunkt-verlag, Heidelberg, 2006, ISBN 3-89864-190-2

Kategorien: Objektrelationale DB, D