23ai: Enumeration Domains
Eines der vielen interessanten neuen Features der Datenbank 23ai sind die Domains, in einem vorigen Blogeintrag haben wir das bereits vorgestellt. Heute stellen wir eine besondere Art der Domains vor, die Enumeration Domains. Wie der Name schon impliziert, handelt es sich dabei um Aufzählungen. Man kann sich das vorstellen wie eine Lookup-Tabelle, in der zu bestimmten lesbaren Werten eine entsprechende ID zugeordnet wird. Nehmen wir als Beispiel Kreditkartendaten. Es gibt VISA, AMEX und Mastercard sowie Credit- und Debitkarten. Für diese beiden Eigenschaften erstellen wir jeweils eine Domain.
MARCO @ DB23AI:PDB1:>create domain dom_cc_type as
2 enum (
3 CREDIT = 10,
4 DEBIT = 20
5* );
Domain DOM_CC_TYPE created.
MARCO @ DB23AI:PDB1:>create domain dom_cc_issuer as
2 enum (
3 VISA = 1,
4 MASTER = 2,
5 AMEX = 3
6* );
Domain DOM_CC_ISSUER created.
Der Vollständigkeit halber erstellen wir eine weitere normale Domain für die sonstigen Eigenschaften der Kreditkarte.
MARCO @ DB23AI:PDB1:>create domain dom_credit_card as (
2 cc_number as varchar2(20 char),
3 cc_code as number(3),
4 valid_till as date
5 )
6 constraint dom_cc_check check (
7 regexp_like(cc_number, '([0-9]{4} ){3}[0-9]{4}')
8 )
9 display '**** **** **** ' || substr(cc_number, -4)
10 annotations (Description 'Credit Card Specification')
11* ;
Domain DOM_CREDIT_CARD created.
Mit Hilfe dieser Domains können wir nun eine Tabelle erstellen, die die Kreditkartendaten aufnimmt.
MARCO @ DB23AI:PDB1:>create table payment_methods (
2 cc_number varchar2(20 char),
3 cc_code number(3),
4 valid_till date,
5 cc_type number(4),
6 cc_issuer number(4),
7 domain dom_credit_card(cc_number, cc_code, valid_till),
8 domain dom_cc_type(cc_type),
9 domain dom_cc_issuer(cc_issuer)
10* );
Table PAYMENT_METHODS created.
Um nun Daten in die Tabelle einzufügen, müssen wir entsprechende Werte für CC_TYPE und CC_ISSUER übergeben. Diese Werte werden nach der Form <Domainname>.<Wert> gebildet.
MARCO @ DB23AI:PDB1:>insert into payment_methods(
2 cc_number, cc_type, cc_issuer
3 ) values (
4 '1111 2222 3333 1234', dom_cc_type.debit, dom_cc_issuer.visa
5* );
1 row inserted.
Letztendlich werden die IDs und nicht die lesbaren Werte in der Tabelle gespeichert. Werden die Werte aus der Tabelle nun abgefragt, erhält man dementsprechend die IDs. Hier kommt wieder die Funktion DOMAIN_DISPLAY ins Spiel, denn diese liefert zur gespeicherten ID den passenden Wert für die Darstellung.
MARCO @ DB23AI:PDB1:>select cc_number, cc_type, cc_issuer,
2 domain_display(cc_number,cc_code,valid_till) cc_disp_num,
3 domain_display(cc_type) cc_disp_type,
4 domain_display(cc_issuer) cc_disp_issuer
5* from payment_methods;
CC_NUMBER CC_TYPE CC_ISSUER CC_DISP_NUM CC_DISP_TYPE CC_DISP_ISSUER
______________________ __________ ____________ ____________________ ____________ ______________
1111 2222 3333 1234 20 1 **** **** **** 1234 DEBIT VISA
An dieser Gegenüberstellung erkennt man recht gut den Unterschied zwischen den gespeicherten Werten in der Tabelle zu deren Darstellung. Zu beachten ist, dass die Funktion DOMAIN_DISPLAY immer alle in der Domain definierten Spalten erwartet. Zu sehen ist das bei der Darstellung der Kreditkartennummer. Obwohl hier nur die Nummer und nicht die Gültigkeit oder der Kontrollcode angezeigt werden, müssen alle drei Werte übergeben werden. Ansonsten liefert die Funktion NULL zurück.
MARCO @ DB23AI:PDB1:>select domain_display(cc_number) cc_disp_num from payment_methods;
CC_DISP_NUM
____________________________
Ist man sich unsicher, welche Werte on einer Enumeration Domain überhaupt existieren, kann man die Domain einfach abfragen wie eine Tabelle.
MARCO @ DB23AI:PDB1:>select * from dom_cc_issuer;
ENUM_NAME ENUM_VALUE
____________ _____________
VISA 1
MASTER 2
AMEX 3
Alles in allem ein recht cooles Feature, dass vielleicht die eine oder andere Lookup Tabelle ersetzen wird.
Kommentare
Keine Kommentare