Eine Postleitzahl ist kein VARCHAR2
Eine Domain ist ein eigenes Schemaobjekt. Nehmen wir eine deutsche Postleitzahl:
CREATE DOMAIN deutsche_plz AS CHAR(5)
CONSTRAINT deutsche_plz_chk
CHECK (REGEXP_LIKE(deutsche_plz, '^[0-9]{5}$'));
Damit haben wir einmal festgelegt: Eine DEUTSCHE_PLZ besteht aus genau fünf Ziffern.
Beim Anlegen einer Tabelle lässt sich diese Domain einer Spalte zuordnen:
CREATE TABLE kunde (
kunden_id NUMBER PRIMARY KEY,
name VARCHAR2(100),
plz CHAR(5) DOMAIN deutsche_plz
);
Jetzt funktioniert es:
INSERT INTO kunde VALUES (1, 'Müller', '60311');
Das hier dagegen nicht:
INSERT INTO kunde VALUES (2, 'Meier', '60A11');
Der Check steckt nicht in KUNDE, sondern stammt aus der Domain. Dieselbe Domain kann anschließend auch für LIEFERADRESSE.PLZ, FILIALE.PLZ oder andere passende Spalten verwendet werden. Oracle wendet die Eigenschaften und Constraints der Domain auf die zugeordneten Spalten an.
Im Data Dictionary findet man sie hier:
SELECT * FROM dba_domains;
Und wo sie tatsächlich verwendet werden, sieht man es beispielsweise so:
SELECT owner, table_name, column_name,
domain_owner, domain_name
FROM dba_tab_columns
WHERE domain_name IS NOT NULL;
Kommentare
Kommentar veröffentlichen