P>

capaSQL15.JPG

Clique aqui para ler todos os artigos desta edição

A Implementação Objeto-Relacional no Oracle

 

por Methanias Colaço Rodrigues Júnior

A maior parte dos sistemas gerenciadores de bancos de dados (SGBDs) utilizados é baseada no modelo relacional. No entanto, SGBDs baseados em outros modelos têm surgido devido à demanda de novas aplicações. Muitas aplicações, impulsionadas pela WEB, requererem técnicas de acesso que melhorem o desempenho e estruturas de dados muito mais complexas que as tabelas relacionais, com diversos tipos adicionais, como imagem e vídeo, fundamentados na tecnologia de orientação a objetos.

A principal estrutura do modelo objeto-relacional são as tabelas, entretanto, com muito mais recursos do que as tabelas puramente relacionais. Entre esses recursos podemos destacar: definição de tipos pelo usuário, registros e vetores, métodos e funções, referências, herança e polimorfismo. São acrescentadas também estruturas a linguagens de consulta relacionais, como SQL, para tratar os tipos de dados acrescentados. O objetivo é preservar os fundamentos relacionais, em particular o acesso declaratório ao dado, acrescentando novas funcionalidades.

Para utilizar os recursos de orientação a objetos a Oracle, a partir da versão 8, implementou diversos conceitos que definem um modelo objeto-relacional tais como: tipo objeto, tabela de objetos, etc. Examinaremos os principais conceitos a seguir.

Modelo Objeto-Relacional Oracle

Tipo Objeto

O Oracle suporta o conceito de objetos complexos. Podemos criar tipos de dados adicionais e depois fazermos referência a esses tipos de dados dentro de outros objetos. Essa capacidade de estender o banco de dados com tipos adicionais é um recurso muito importante, pois ajuda a simplificar, por exemplo, a complexidade do tratamento a tipos de dados complexos.

Um outro ponto importante a observar é que os tipos criados são gravados no esquema armazenado no banco de dados. Então, outras declarações que acessam o banco de dados podem fazer uso das definições desses tipos. Tipicamente, as definições de tipo em linguagens de programação (incluindo linguagens de programação persistentes) não são armazenadas em um banco de dados e só podem ser vistas por programas que incluem um arquivo texto contendo as definições.

O exemplo da Listagem 1 demonstra a criação de um tipo de dados definido pelo usuário.

 

create type t_endereco as object (

                   rua varchar2(40)

                   cidade varchar2(30),

                   uf char(2),cep number(8) )

Listagem 1.

 

Ainda é possível usar tipos aninhados, ou seja, um tipo pode ser um atributo de outro tipo. O exemplo da Listagem 2 mostra o tipo t_endereco sendo referenciado por t_funcionario.

 

create type t_funcionario as object (

                   matricula number(5),

                   nome varchar2(30),

                   data_admissao date,

                   endereco t_endereco)

Listagem 2.

 

Tabela de objetos

Uma tabela de objetos (object table), é uma classe especial de tabela cujas linhas são objetos. São tabelas que possuem a estrutura definida por um tipo de dado estruturado, object type. Desta forma, as linhas das tabelas tornam-se instâncias – ou objetos – do tipo que define a sua estrutura. A estes objetos, denominamos "objetos de linha".  A Object Table é criada através de um Object Type. Suas colunas consistem exatamente dos atributos definidos no Object Type, e cada linha da Object Table é em si um objeto (instância do object type), possuindo um identificador de objeto (OID).

Por exemplo, uma tabela que manipula objetos do tipo t_funcionario definido anteriormente pode ser definida por:

 

create table funcionarios of t_funcionario;

 

Operador VALUE

Esse operador retorna o conteúdo de um objeto armazenado em uma object table. É usado quando for preciso referenciar uma linha de uma object table como um objeto em vez de uma lista de colunas.

Por exemplo, a declaração da Listagem 3 irá armazenar o objeto obtido pela consulta dentro da variável v_funcionario.

 

declare

         v_funcionario t_funcionario;

begin

...

Quer ler esse conteúdo completo? Tenha acesso completo