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