benutzerdefinierte CAST-Funktionen

Die üblichen Vergleichs- und Rechenoperatoren wie =, <, >, <>, LIKE, BETWEEN, +, *, /, =, etc. lassen sich nur auf Basisdatentypen? anwenden, nicht aber auf benutzerdefinierte-Datentypen. Daher ist es notwendig, für benutzerdefinierte Datentypen explizit benutzerdefinierte Typumwandlungsfunktionen zu programmieren. Die benutzerdefinierten CASTs sind Teil eines umfassenderen CAST-Konzepts bei den objektrelationalen Datenbanksystemen.

Zu beachten ist, dass wenigstens einer der Quell- bzw. Zieltypen ein benuzterdefinierter Datentyp sein muss, also entweder ein DISTINCT-Datentyp oder ein strukturierter Datentyp oder auch ein Referenztyp.

SQL-/Oracle??????????????-Syntax der benutzerdefinierten CAST-Funktion:

    <CREATE CAST Anweisung> ::=
CREATE CAST (Quelltypname AS Zieltypname)
WITH FUNCTION Funktionsname(Quelltypname) [AS ASSIGNMENT]

Das die CAST-Funktion selbst keinen Namen bekommt, sondern sich nur über die beteiligten Quell- und Zieltypnamen identifiziert, sorgt dafür, dass je Tranfsormation immer nur eine Funktion hinterlegt werden kann. Bevor ein solcher benutzerdefinierter CAST deklariert werden kann, muss eine Funktion Funktionsname mittels einer CREATE FUNCTION-Anweisung erzeugt worden sein. Die Option AS ASSIGNMENT macht einen benutzerdefinierten CAST zu einem impliziten, der automatisch ausgeführt wird, wenn eine Typwandlung erforderlich wird.

Gelöscht wird eine benutzerdefnierte CAST-Funktion mittels DROP CAST-Anweisung.

Beispiel:

   CREATE TYPE NettoPreisTyp  AS DECIMAL(8,2)  FINAL;                  -- hier zwei DISTINCT-Typen
   CREATE TYPE BruttoPreisTyp AS DECIMAL(9,2)  FINAL; 

   CREATE  FUNCTION BruttoBerechnung (Netto  IN  NettoPreisTyp)        -- Typumwandlung und Preisberechnung von Netto zu Brutto
   RETURNS BruttoPreisTyp  
   RETURN  BruttoPreisTyp( 1.19 * CAST(Netto AS DECIMAL) );            

   CREATE  FUNCTION NettoBerechnung (Brutto  IN  BruttoPreisTyp)       -- Typumwandlung und Preisberechnung von Brutto zu Netto
   RETURNS NettoPreisTyp  
   RETURN  NettoPreisTyp( CAST(Brutto AS DECIMAL) / 1.19 );            

   CREATE CAST (NettoPreisTyp AS BruttoPreisTyp)\\                     -- Deklaration der beiden Funktionen als 
        WITH FUNCTION BruttoBerechnung(NettoPreisTyp);                 -- nur expliziter CAST
   CREATE CAST (NettoPreisTyp AS BruttoPreisTyp)
WITH FUNCTION BruttoBerechnung(NettoPreisTyp) AS ASSIGNMENT; -- impliziter CAST DECLARE NettoPreis NettoPreisTyp; DECLARE BruttoPreis BruttoPreisTyp; SET Nettopreis = NettoPreisTyp(123,66); SET Bruttopreis = BruttoBerechnung(Nettopreis); SET Bruttopreis = BruttoPreisTyp(123,66); SET Nettopreis = NettoBerechnung(Bruttopreis); -- explizite Verwendung des impliziten CAST SET Nettopreis = Bruttopreis; -- implizite Verwnedung des CAST NettoBerechnung


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, B