Per cominciare, alcune funzionalità Oracle standard utilizzano i tipi, ad esempio XMLDB e Spatial (che include la dichiarazione di colonne di tipi di dati Nested Table).
Inoltre, molti sviluppatori PL/SQL utilizzano sempre i tipi per dichiarare raccolte PL/SQL o funzioni pipeline.
Ma sono d'accordo che pochi posti usano i tipi in modo estensivo e costruiscono API PL/SQL da essi. Ci sono diverse ragioni per questo.
- Oracle ha implementato gli oggetti molto lentamente. Sebbene siano stati introdotti nella versione 8.0, non è stato fino alla 9.2 che hanno supportato completamente l'ereditarietà, il polimorfismo e i costruttori definiti dall'utente. Una corretta programmazione orientata agli oggetti è impossibile senza queste funzionalità. Non abbiamo ricevuto
SUPER()
fino alla versione 11g. Anche ora mancano delle funzionalità, in particolare le dichiarazioni private nel TYPE BODY. - La sintassi è spesso goffa o frustrantemente oscura. La documentazione non aiuta.
- La maggior parte delle persone che lavorano con Oracle tende a provenire dalla scuola di programmazione relazionale/procedurale. Ciò significa che tendono a non capire l'OOP o non riescono a capire dove può essere utile nella programmazione del database. Anche quando le persone hanno un'idea chiara, trovano difficile o impossibile implementarla utilizzando la sintassi di Oracle.
Quest'ultimo punto è quello chiave. Possiamo imparare una nuova sintassi, possiamo persuadere Oracle a completare il set di funzionalità, ma vale la pena solo se riusciamo a trovare un uso per i tipi. Ciò significa che abbiamo bisogno di problemi che possono essere risolti usando l'ereditarietà e il polimorfismo.
Ho lavorato su un sistema che utilizzava ampiamente i tipi. Era un sistema di data warehouse e il sottosistema di caricamento dei dati era basato sui tipi. La motivazione di fondo era semplice:
- dobbiamo applicare lo stesso modello di regole aziendali per ogni tabella che carichiamo, quindi il processo è generico;
- ogni tabella ha la sua proiezione, quindi le istruzioni SQL sono uniche per ognuna.
L'implementazione del Tipo è pulita:il processo generico è definito in un Tipo; l'implementazione per ogni tabella è definita in un Tipo che eredita da quel Tipo generico. I tipi specifici possono essere generati dai metadati. Alcuni anni fa ho presentato questo argomento all'UKOUG e l'ho scritto in modo più dettagliato sul mio blog.Scopri di più.
A proposito, la teoria relazionale include il concetto di domini, che sono tipi di dati definiti dall'utente, inclusi i vincoli, ecc. Nessun tipo di RDBMS supporta effettivamente i domini, ma l'implementazione dei tipi di Oracle è sicuramente un passo avanti.