CREATE TYPE-Anweisung (SQL)

Die CREATE TYPE-Anweisung gehört zum SQL-Standard und definiert einen strukturierten Datentyp. Dieser kann als Datentyp für Attribute relationaler wie auch objektrelationaler Tabellen, für Variablen der prozeduralen Erweitetung von SQL oder auch für Java-Objekte verwendet werden. Zudem sind strukturierte Datentypen für die Definition der Struktur einer typisierten Tabelle unerlässlich. Mit dem Befehl können u.a.auch noch die SQL-Kollektionsdatentypen ARRAY und MULTISET definiert werden.

  • Die Attributdefinitionsliste besteht aus einer Komma getrennten Liste von Attributnamen und Datentypen, wobei es sich dabei um einen einfachen Datentyp oder einen strukturierten Datentyp beliebiger Komplexität handeln kann. Constraints sind hier nicht definierbar, erst bei der CREATE-Anweisung für typisierte Tabellen.
  • Wird keine Instanziierbarkeit bei srutkturierten Datentypen gewünscht, so ist die Option NOT INSTANTIABLE zu spezifizieren. Ausgeschlossen ist die unsinnige Konstellation von NOT INSTANTIABLE und FINAL.
  • Typhierarchien sind definierbar, indem von einem Wurzeltyp resp. Supertyp ein oder mehrere Subtypen abgeleitet werden können, wenn die Option NOT FINAL beim Supertypen gewählt ist.
  • Wird ein strukturierter Datentyp zur Definition einer typisierten Tabelle verwendet (vgl. CREATE-TABLE-Typisiert), so muss ein Objektidentifikator OID spezifiziert werden. Dieser ist nicht inhärent in der Struktur, sondern muss assoziiert werden. Es sind drei Optionen möglich: systemgeneriert (REF IS SYSTEM GENERATED), abgeleitet (REF FROM (<Attributliste>)) sowie benutzerdefiniert (REF USING (<Basisdatentypname>)).
  • Methoden zur Programmierung von Objektverhalten können auch deklariert werden.

SQL-Syntax der CREATE TYPE-Anweisung für den Wurzeltyp:

    <CREATE TYPE Anweisung> ::=
CREATE TYPE Typname AS ( <Attributdefinitionsliste> )
[ [NOT] INSTANTIABLE ]
[NOT] FINAL
[ REF { IS SYSTEM GENERATED | FROM (<Attributliste>) | USING (<Basisdatentypname>)}]
[<Methodendeklarationsliste>]

SQL-Syntax der CREATE TYPE-Anweisung für Subtypen/Typhierarchien:

    <CREATE TYPE UNDER Anweisung> ::=
CREATE TYPE <Subtypname> UNDER <Supertypname> AS ( <Attributdefinitionsliste> )
[ [NOT] INSTANTIABLE ]
[NOT] FINAL
[<Methodendeklarationsliste>] \\ -- siehe Methoden in SQL

Beispiele:

-- Euro als DISTINCT-Typ definiert CREATE TYPE euroTyp AS DECIMAL(20,2) FINAL;
  -- instanziierbarer Typ für Atrikel-Daten, der kein Wurzeltyp einer Hierarchie sein kann
-- mit einer abgeleiteten OID
  CREATE TYPE artikel_typ AS (artikel_nr        NUMERIC(20), 
                              bezeichnung       VARCHAR(100),  
                              preis_netto       euro_Typ) 
                              REF FROM (artikel_nr)
                              INSTANTIABLE  FINAL;


  -- instanziierbare Typen für Personen, die an einer FH bekannt sein müssen
  -- mit einer systemgenerierten OID und als Wurzeltyp einer Typhierarchie

  CREATE TYPE name_typ AS (nachname    VARCHAR(50),
                           vorname     VARCHAR(50),
                           titel       VARCHAR(25)) 
                           NOT FINAL;

  CREATE TYPE adress_typ AS (land    VARCHAR(3),
                             plz     VARCHAR(5),
                             ort     VARCHAR(50),
                             str     VARCHAR(50)) 
                             NOT FINAL;

  -- mit NOT FINAL kann personen_typ als Supertyp fungieren
  -- die beiden obigen Typen werden als Datentypen für Spalten verwendet
  CREATE TYPE personen_typ AS (name        name_typ,
                               adresse     adress_typ,
                               geb_datum   DATE,
                               email       VARCHAR(50) ARRAY[5]) 
                               NOT FINAL
                               REF IS SYSTEM GENERATED;

  -- Ein Subtyp für die Studierenden mit neuen Attributen und einer Methode
  CREATE TYPE studierende_typ UNDER personen_typ AS (matrikel_nr           VARCHAR(10),
                                                     ersteinschreibung_am  DATE,
                                                     exmatrikuliert_am     DATE)
                                                     NOT FINAL
                                                     INSTANCE METHOD einschreiben(date) RETURNS SELF AS RESULT;

  -- Ein zweiter Subtyp für die Lehrenden, für den keine weiteren Suptypen definiert werden können
  CREATE TYPE lehrende_typ UNDER personen_typ AS (lehrgebiet            VARCHAR(100),
                                                  besoldungsgruppe      VARCHAR(5),
                                                  eingestellt_am        DATE,
                                                  emeritiert_am         DATE)
                                                  FINAL;

  -- Ein erster Suptyp für die Studierenden und damit eine zweite Ebene unter dem Personen_typ
  CREATE TYPE wiss_hilfskreafte_typ UNDER studierende_typ AS (erstanstellung_am  DATE,
                                                              ausgeschieden_am   DATE)
                                                              NOT FINAL;


Siehe auch: CREATE-TABLE, CREATE-TABLE-Typisiert, CREATE-TYPE-Oracle?

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

Kategorie: Objektrelationale DB, C