Você está na página 1de 8

A Implementao Objeto-Relacional no Oracle

Methanias Colao Rodrigues Jnior maior parte dos sistemas gerenciadores de bancos de dados (SGBDs) utilizados baseada no modelo relacional. No entanto, SGBDs baseados em outros modelos tm surgido devido demanda de novas aplicaes. Muitas aplicaes, impulsionadas pela WEB, requererem tcnicas de acesso que melhorem o desempenho e estruturas de dados muito mais complexas que as tabelas relacionais, com diversos tipos adicionais, como imagem e vdeo, fundamentados na tecnologia de orientao a objetos. A principal estrutura do modelo objeto-relacional so as tabelas, entretanto, com muito mais recursos do que as tabelas puramente relacionais. Entre esses recursos podemos destacar: definio de tipos pelo usurio, registros e vetores, mtodos e funes, referncias, herana e polimorfismo. So acrescentadas tambm estruturas linguagens de consulta relacionais, como SQL, para tratar os tipos de dados acrescentados. O objetivo preservar os fundamentos relacionais, em particular o acesso declaratrio ao dado, acrescentando novas funcionalidades. Para utilizar os recursos de orientao a objetos a Oracle, a partir da verso 8, implementou diversos conceitos que definem um modelo objeto-relacional tais como: tipo objeto, tabela de objetos, etc. Examinaremos os principais conceitos a seguir.

so 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 so gravados no esquema armazenado no banco de dados. Ento, outras declaraes que acessam o banco de dados podem fazer uso das definies desses tipos. Tipicamente, as definies de tipo em linguagens de programao (incluindo linguagens de programao persistentes) no so armazenadas em um banco de dados e s podem ser vistas por programas que incluem um arquivo texto contendo as definies. O exemplo da C 1 demonstra a criao de um tipo de dados definido pelo usurio. C 1.
create type t_endereco as object ( rua varchar2(40) cidade varchar2(30), uf char(2),cep number(8) );

Modelo Objeto-Relacional Oracle


Tipo Objeto

Ainda possvel usar tipos aninhados, ou seja, um tipo pode ser um atributo de outro tipo. O exemplo da C 2 mostra o tipo t_endereco sendo referenciado por t_funcionario.

O Oracle suporta o conceito de objetos complexos. Podemos criar tipos de dados adicionais e depois fazermos referncia a esses tipos de dados dentro de outros objetos. Essa capacidade de estender o banco de dados com tipos adicionais um recur8 15 Edio

sql15.indb 8

24/11/2004 20:00:44

C 2.
create type t_funcionario as object ( matricula number(5), nome varchar2(30), data_admissao date, endereco t_endereco);

Tipos Referncia

Tabela de objetos

Uma tabela de objetos (object table), uma classe especial de tabela cujas linhas so objetos. So tabelas que possuem a estrutura definida por um tipo de dado estruturado, object type. Desta forma, as linhas das tabelas tornam-se instncias ou objetos do tipo que define a sua estrutura. A estes objetos, denominamos objetos de linha. A Object Table criada atravs de um Object Type. Suas colunas consistem exatamente dos atributos definidos no Object Type, e cada linha da Object Table em si um objeto (instncia 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 contedo 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 declarao da C 3 ir armazenar o objeto obtido pela consulta dentro da varivel v_funcionario. C 3.
declare v_funcionario t_funcionario; begin select value(f) into v_funcionario from funcionarios f where matricula = 1574; dbms_output.put_line (v_funcionario.nome); end;

No Oracle, o relacionamento entre duas entidades pode ser modelado nativamente atravs de ponteiros que referenciam as entidades relacionadas. Expressamos tais relacionamentos utilizando o identificador do objeto (OID) associado a cada instncia de um tipo de dado estruturado. Esse identificador atribudo automaticamente a objetos, permitindo que o objeto correspondente seja referenciado a partir de outros objetos. Isto feito atravs do tipo REF, que encapsula uma referncia para um objeto especificado. Ou seja, ao declararmos um tipo, podemos declarar como seu atributo um ponteiro para outro tipo atravs da expresso REF. Esclarecendo: OID (Object Identifier) - identificador nico global de um objeto em todo o banco de dados Oracle. produzido quando o objeto armazenado no banco como parte de uma Object Table. Apesar dos OIDs serem usados indiretamente pelos programas, voc nunca pode ver o seu valor; REF - ponteiro para um objeto. No um OID, mas sim a maneira pela qual ns os vemos. atravs dos REFs que o Oracle consegue fazer a juno de object tables usando navegao por ponto (dot navigation), tambm conhecida como expresso de caminho. REF tambm um operador que retorna o ponteiro para um objeto, dado um sinnimo de uma tabela. Veja exemplo do operador REF na C 9. A C 4 apresenta um exemplo no qual esto definidos o tipo de dado estruturado t_departamento, a tabela de objetos departamentos e a tabela funcionrios. Nesta ltima, a coluna depto contm uma referncia a um identificador nico para objetos do tipo t_departamento. C
4.

K
SGBD

create type t_departamento as object ( num_depto number, nome varchar2(30), endereco t_endereco );

create table departamentos of t_departamento;

create table funcionarios (

Para exibir a rua poderamos usar:


dbms_output.put_line (v_funcionario.endereco.rua);

matricula number, nome varchar2(30), depto ref t_departamento);

SQL Magazine . 9

sql15.indb 9

24/11/2004 20:00:55

Como j dissemos, uma coluna do tipo REF pode referenciar objetos de qualquer tipo presente em qualquer tabela. Para restringir o escopo de referncias para uma nica tabela, ou um nico tipo, utilizamos a clusula SCOPE, conforme mostra a C 5.
C 5. create table funcionarios ( matricula number, nome varchar2(30), depto ref t_departamento scope is departamentos);

C 8. declare v_depto departamento; v_nome_depto varchar2(30); begin select deref(depto) into v_depto from funcionarios where nome=Beatriz; select v_depto.nome into v_nome_depto from dual; end;

Pode existir tambm auto-relacionamento entre objetos. A C 6 mostra um exemplo onde o tipo t_pessoa pode incluir uma referncia outra pessoa (seu amigo).
C 6.

C 9. create or replace trigger departamento_d after delete on departamentos for each row declare d_ref REF t_departamento; begin

create type t_pessoa as object ( nome varchar2(30), endereco t_endereco, data_nasc date, amigo REF t_pessoa); end;

select REF(d) into d_ref from departamentos d where d.num_depto=:old.num_depto; update funcionarios f set f.depto = null where f.depto = d_ref;

Para demonstrar como os dados so inseridos nas tabelas de objetos que contm atributos do tipo referncia, so apresentados dois exemplos na C 7. Neste caso, o atributo conter uma referncia para o referido objeto departamento o qual o funcionrio est lotado.
C 7. insert into departamentos values (1, ITP, t_endereco (Rua Jos Seabra, 255, Aracaju, SE, 49000000));

Entretanto, vale atentar para o fato de que no permitido referenciar diretamente um atributo de uma coluna do tipo objeto. Por exemplo, a declarao abaixo invlida:
select nome, deref(depto).nome from funcionarios;

insert into funcionarios values (4036, Beatriz, (select ref(d) from departamentos d where d.nome=ITP));

Quando precisarmos recuperar um objeto a partir de uma referncia podemos utilizar o operador DEREF. A C 8 apresenta um exemplo onde o objeto departamento recuperado e armazenado dentro da varivel v_depto.
10 . 15 Edio

Uma das vantagens da utilizao de referncias no projeto de esquemas objeto-relacionais a possibilidade de referenciar atributos atravs dos tipos referncia. Como exemplo, suponhamos que queiramos obter o nome do departamento que um funcionrio trabalha a partir do seu nome. A declarao a seguir usa a referncia armazenada no atributo depto que um apontador para o respectivo objeto departamento. Ou seja, como depto do tipo REF e aponta para o departamento do funcionrio, podemos usar a navegao entre objetos (dot navigation ou navegao por ponto) e recuperar o nome do departamento sem a necessidade de uma juno tradicional com a tabela de departamentos.
select f.depto.nome from funcionarios f where nome=Beatriz;

sql15.indb 10

24/11/2004 20:01:48

Uma outra caracterstica importante a ser destacada refere-se ao uso do tipo REF como restrio de integridade referencial. Embora exista a imposio que uma instncia do REF (isto , OID) seja vlida quando armazenada em uma tabela, esta imposio no permanece vlida, sendo verificada pelos mecanismos de integridade referencial do SGBD. Isto , um objeto referenciado por um tipo REF pode ser excludo da tabela de objeto correspondente, e desta forma, a referncia a este objeto torna-se invlida, no sendo verificada pelo sistema. Tal verificao pode ser feita atravs de triggers que previnem a excluso de objetos referenciados por REFs ou simplesmente fazem o REF apontar para Null. Com a criao desses triggers para garantir a integridade referencial, adicionamos um processamento adicional (overhead) em nosso esquema. A C 9 apresenta um exemplo de trigger que atualiza a tabela de funcionrios quando um departamento excludo.
Tipos coleo

create type lista_telefones as varray(5) of varchar2(10);

possvel ainda fazer referncia a esse vetor em outra tabela, como o tipo de dados de uma coluna. Por exemplo:
create table pessoa ( nome varchar2(25), telefone lista_telefones);

K
SGBD

Tabelas Aninhadas (Nested tables)

Os tipos coleo (collection types, tambm conhecidos como sets ou bags) definem estruturas de dados que permitem manipular conjuntos de elementos do mesmo tipo. Portanto, uma coleo representar um conjunto de elementos de um determinado tipo. O Oracle implementa dois tipos de dados colees: o tipo vetor (varray) e a tabela aninhada (nested table).
Tipo Vetor (VARRAY)

Nested Tables so tabelas com colunas cujo tipo de dado de domnio outra tabela. Isto , as tabelas podem ser aninhadas dentro de outras tabelas como valores na coluna. Isto permite que os relacionamentos N-para-N possam ser representados por tabelas aninhadas. O tipo de dados nested table contm elementos desordenados, todos do mesmo tipo, e sem limite de elementos. Quando uma coluna de uma tabela do tipo nested table, seus dados so armazenados no mesmo lugar desta tabela, ou seja, os dados da nested table so fisicamente armazenados na mesma rea de disco. Assim, a substituio de um join por uma tabela aninhada, garante um desempenho superior.

B A partir da verso 9i, possvel que uma tabela aninhada


tenha outra tabela aninhada.

Neste caso, criada uma lista ordenada de elementos do mesmo tipo. Cada elemento tem um ndice, que um nmero da posio do elemento no vetor. No Oracle, o tipo vetor chamado de VARRAY porque possui tamanho varivel. Por isso, quando for criado necessrio especificar o seu tamanho mximo. importante notar que o banco de dados no aloca realmente qualquer espao; ele apenas define um novo tipo e o armazena no catlogo do sistema. O seguinte exemplo declara um tipo varray onde criada uma lista que suporta at cinco telefones:

Ao criarmos object tables de object types que contenham como atributo uma ou mais nested tables, devemos especificar para o Oracle o nome de uma tabela chamada store table, que usada para guardar a nested table. Inclumos ao final do comando create table a linha:
nested table store as <nome do atributo>

<nome da store table>;

nome do atributo - nome do atributo (coluna) que uma nested table; nome da store table - nome da tabela onde a nested table ser armazenada.

SQL Magazine . 11

sql15.indb 11

24/11/2004 20:01:49

Suponha que o material necessrio para o aprendizado de uma disciplina seja um conjunto de livros. Sejam os tipos de dados estruturados t_livro e lista_livros para representar um livro e uma lista de livros. No exemplo da C 10 ser criada uma tabela secundria (store table livros_requeridos_tab), que a tabela que ir armazenar os dados da nested table livros_requeridos.
C 10.

res, tambm possvel emitir o comando abaixo:


select m.departamento, m.livros_requeridos from material_disciplina m;

Com o comando acima, usamos dot navigation normalmente e o resultado apresentar todos os nmeros e ttulos de livros requeridos antecedidos pelos respectivos departamentos que fizeram a requisio.
Mtodos e funes

create type t_livro as object ( numero number(4), titulo varchar2(40) ); create type lista_livros as table of t_livro; -- A denio a seguir cria a tabela que ir -- armazenar todas as informaes do material -- necessrio disciplina:

create table material_disciplina ( departamento char(4), curso number(3),

Outro recurso importante a capacidade de vincular cdigo aos dados. O Oracle permite a definio deste cdigo fonte utilizando PL/SQL e Java. Isso uma tentativa de implementao da caracterstica encapsulamento, um dos fundamentos dos bancos de dados orientados a objetos. Entretanto, no temos um encapsulamento completo pelo fato de podermos acessar diretamente as colunas de uma tabela. Considere o tipo de objeto t_funcionario definido na C 13.
C 13. create type t_funcionario as object ( nome varchar2(30), data_nasc date,

livros_requeridos lista_livros) nested table livros_requeridos store as livros_requeridos_tab;

A C 11 apresenta como os dados so inseridos na tabela material_disciplina que contm uma tabela de objetos que ir armazenar uma lista de livros.
C 11. insert into material_disciplina values (ccft, 10, lista_livros ( t_livro (1, Oracle 9i), t_livro (2, Oracle 8i) ) );

member function idade return integer, member procedure altera_nome(p_nome IN varchar2), map member function retornar_nome return varchar2, order member function comparar_func (p_func in t_funcionario ) return number);

A C 12 mostra um exemplo de uma pesquisa na tabela criada na C 10. Neste caso, so listados os livros requeridos do curso nmero 10 do departamento CCFT. Observe que usamos a expresso TABLE para representar o conjunto de elementos armazenados na nested table livros_requeridos.
C 12. select l.titulo from material_disciplina m, table(m.lista_livros) l where m.departamento=ccft and m.curso=10;

Neste caso os mtodos e funes esto vinculados ao cdigo do tipo de dados t_funcionario. A C 14 apresenta como seria definida a criao da funo idade do tipo t_funcionario.
C 14. create type body t_funcionario is member function idade return integer is I integer;

begin select trunc(months_between (sysdate,self.data_nasc) / 12) into I from dual; end; member procedure altera_nome (p_nome IN varchar2) is begin nome := p_nome;

A notao anterior usada para aplicaes que no suportam receber valores num formato em mais de duas dimenses. Se for possvel recuperar estes valo12 . 15 Edio

end; end;

sql15.indb 12

24/11/2004 20:02:52

Herana

Tipos e mtodos FINAL e NOT FINAL

A partir do Oracle 9i, um tipo pode ser estendido criando subtipos que reutilizam a especificao e implementao (atributos e mtodos) do tipo que ele deriva. Assim, atravs dos objetos possvel criar uma hierarquia de tipos (ver A 1). Vale informar que no h suporte herana mltipla e sendo assim, um subtipo pode derivar apenas de um nico supertipo. Um subtipo se torna um tipo especial de seu pai pelo fato de possuir novos atributos e mtodos e tambm de poder redefinir os que foram herdados. Redefinir mtodos d ao subtipo um estilo prprio de executar esses mtodos.

A definio do tipo do objeto determina se um subtipo pode ser derivado. Por padro os tipos de objeto so do tipo FINAL. Por isso, para permitir subtipos, deve ser obrigatoriamente adicionada a expresso NOT FINAL na declarao do tipo do objeto. Por exemplo, a C 15 apresenta uma expresso onde declarado que o tipo t_pessoa pode ser derivado, permitindo que sejam criados subtipos a partir dele.
C 15. create type t_pessoa as object (codigo number, nome varchar2(30), endereo varchar2(100) ) not nal;

K
SGBD

A 1. Exemplo de uma hierarquia de tipos.

Assim como os tipos de objetos, os mtodos tambm podem ser declarados como FINAL ou NOT FINAL. Se um mtodo for definido como FINAL, os subtipos no podem redefinir sua implementao. Mtodos so definidos por padro como NOT FINAL. O exemplo da C 16 cria um tipo de objeto NOT FINAL contendo uma funo definida como FINAL.

SQL Magazine . 13

sql15.indb 13

24/11/2004 20:02:58

C 16. create type t as object (..., member procedure imprimir(), nal member function alterar(x number) ... ) not nal;

Criao de subtipos

Podemos criar um subtipo usando a declarao CREATE TYPE e especificar o seu supertipo atravs do parmetro UNDER. Por exemplo:
create type t_Estudante under t_pessoa ( cod_dep number, disciplina_principal varchar2(30) ) not nal;

A declarao acima cria um tipo t_Estudante que subtipo de t_pessoa. Ele herda todos os atributos e mtodos declarados em t_pessoa. So adicionados apenas dois novos atributos com nomes obrigatoriamente diferentes dos nomes e mtodos declarados no seu supertipo. Como dito anteriormente, um tipo pode ter mltiplos subtipos, e esses por sua vez tambm podem ter subtipos. A declarao abaixo cria outro subtipo t_Empregado herdando de t_Pessoa:
create type t_Empregado under t_Pessoa (cod_emp number, setor varchar2(30));

sistemas devem coexistir com as novas aplicaes orientadas a objeto. Para isto, os Bancos de Dados Relacionais esto adquirindo caractersticas de orientao a objetos, tornando-se um banco hbrido. Uma base objeto-relacional traz vantagens em relao ao desempenho, pois a utilizao de ponteiros e tabelas aninhadas tornam as consultas de um SGBDOR mais rpidas e compactas que as consultas feitas atravs de junes no modelo relacional. As linguagens de programao esto buscando a adaptao ao modelo objeto-relacional. J possvel, utilizando JDBC 3.0, por exemplo, mapear objetos Java para tipos Oracle. Num prximo artigo, abordaremos como feito esse mapeamento, bem como suas principais caractersticas. Por fim, vale uma ressalva: um dos grandes problemas do modelo Objeto Relacional a falta de padro. Isto implica problemas de portabilidade, pois cada SGBDOR possui suas particularidades. S

ABBEY, Michael; ABRAMSON, Ian; COREY, Michael. Oracle 8i: guia introdutrio. Rio de Janeiro: Campus, 2000. 701 p. pp. 58-82.

BOOCH, Grady; RUMBAUGH, James; JACOBSON, Ivar. UML, guia do usurio. Rio de Janeiro: Campus, 2000. 472 p. Maria de Ftima Almeida; RIBEIRO, Mateus de Freitas. Evoluo dos bancos de dados: Um enfoque para os sistemas psrelacionais. Trabalho de Concluso de Curso de Cincia da Computao. Aracaju: Universidade Federal de Sergipe, 2000. CHAUDHRI, Akmal B. e ZICARI, Roberto. Succeeding with Object Databases John Wiley & Sons, 2000. 464 p. - pp. 29-51 Oracle 9i - Application Developers Guide: Object-Relational Features. Oracle Corporation, 2001. SILBERSCHATZ, Abraham; KORTH, Henry F.; SUDARSHAN, S. Sistema de Banco de Dados. 3a. ed. So Paulo: Makron Books, 1999. URMAN, Scott. Oracle 8i: Advanced PL/SQL Programming. Oracle Press. Oracle 8: PL/SQL Programming. Oracle Press.

Criao de tabelas

Pode-se observar que no h estrutura de armazenamento associada com os tipos que pertencem hierarquia acima descrita. Um object type apenas um molde, um tipo; no se pode guardar dados nele. Deve-se ento, criar tabelas de objetos para manipular as instncias dos tipos, formando assim uma hierarquia de tabelas, como ilustra o exemplo da C 17.
C 17. create table pessoas of t_pessoa; create table estudantes of t_estudante under t_pessoa;

create table empregados of t_empregado under t_pessoa;

Concluses
O modelo relacional foi amplamente empregado nos ltimos quinze anos e no possvel simplesmente ignorar todas as aplicaes j construdas. Esses
14 . 15 Edio

G
Methanias Colao Rodrigues Jnior

(www.unit.br/methanias) Especialista em Cincia da Computao e TI, Mestre em Informtica pela UFCG e Professor da Universidade Tiradentes e FASER. Autor do livro Projetando Sistemas de Apoio Deciso Baseados em Data Warehouse, presta consultoria e d treinamentos em Bancos de Dados, Engenharia de Software, Data Warehouse e Sistemas de Carto de Crdito.

Comente esta matria em: www.sqlmagazine.com.br/sql15/

sql15.indb 14

24/11/2004 20:03:58

sql15.indb 15

24/11/2004 20:04:00