Eine Postleitzahl ist kein VARCHAR2

Data Use Case Domains in Oracle 26ai

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;


Quelle: https://www.doag.org/de/home/news/doag-datenbank-kolumne-eine-postleitzahl-ist-kein-varchar2/

Kommentare

Beliebte Posts aus diesem Blog

trunc(sysdate) - nette Spiele mit dem Datum

Laufzeiten umrechnen, Sekundenangaben lesbar darstellen

Zufallszahlen und -text generieren - DBMS_RANDOM