Para começar, algumas funcionalidades padrão do Oracle usam Types, por exemplo, XMLDB e Spatial (que inclui a declaração de colunas de tipos de dados de tabela aninhada).
Além disso, muitos desenvolvedores PL/SQL usam tipos o tempo todo, para declarar coleções PL/SQL ou funções em pipeline.
Mas concordo que poucos lugares usam Types extensivamente e criam APIs PL/SQL a partir deles. Há várias razões para isso.
- A Oracle implementou objetos muito lentamente. Embora tenham sido introduzidos na versão 8.0, não foi até 9.2 que eles suportaram totalmente Herança, Polimorfismo e construtores definidos pelo usuário. A programação orientada a objetos adequada é impossível sem esses recursos. Não obtivemos
SUPER()
até a versão 11g. Mesmo agora, faltam recursos, principalmente as declarações privadas no TYPE BODY. - A sintaxe é muitas vezes desajeitada ou frustrantemente obscura. A documentação não ajuda.
- A maioria das pessoas que trabalham com Oracle tende a vir da escola de programação relacional/procedural. Isso significa que eles tendem a não entender a POO ou não entendem onde ela pode ser útil na programação de banco de dados. Mesmo quando as pessoas têm uma boa ideia, elas acham difícil ou impossível implementar usando a sintaxe do Oracle.
Esse último ponto é o principal. Podemos aprender uma nova sintaxe, podemos persuadir a Oracle a completar o conjunto de recursos, mas só vale a pena se pudermos encontrar um uso para Tipos. Isso significa que precisamos de problemas que podem ser resolvidos usando Herança e Polimorfismo.
Trabalhei em um sistema que usava tipos extensivamente. Era um sistema de data warehouse, e o subsistema de carregamento de dados foi construído a partir de Types. A lógica subjacente era simples:
- precisamos aplicar o mesmo modelo de regra de negócios para todas as tabelas que carregamos, para que o processo seja genérico;
- cada tabela tem sua própria projeção, então as instruções SQL são únicas para cada uma.
A implementação do Type é limpa:o processo genérico é definido em um Type; a implementação para cada tabela é definida em um tipo que herda desse tipo genérico. Os tipos específicos podem ser gerados a partir de metadados. Eu apresentei sobre este tópico no UKOUG há alguns anos e escrevi com mais detalhes em meu blog.Saiba mais.
A propósito, a Teoria Relacional inclui o conceito de Domínios, que são tipos de dados definidos pelo usuário, incluindo restrições, etc. Nenhum tipo de RDBMS realmente suporta Domínios, mas a Implementação de Tipos da Oracle é definitivamente um passo no caminho.