Escolar Documentos
Profissional Documentos
Cultura Documentos
Objeto-Relacionais em Oracle
V SECICOM
Semana de Ciência da Computação
Departamento de Ciência da Computação
Universidade Federal de Lavras
Abril de 2003
Bancos de Dados Objeto-Relacionais em Oracle
ÍNDICE
1 Introdução....................................................................................................................... 2
2 BD Relacional, Orientado a Objeto e Objeto-Relacional............................................... 2
2.1 A tecnologia de BD Objeto Relacionais................................................................. 3
2.2 Alguns conceitos básicos de Orientação a Objetos ................................................ 4
2.3 Características Objeto-Relacionais no Oracle ........................................................ 5
2.3.1 Representação de Atributos Multivalorados pela Utilização do VARRAY... 5
2.3.2 Utilização de Tabelas Aninhadas para Representar Objetos Complexos....... 6
3 SQL*Plus........................................................................................................................ 7
3.1 SQL e Oracle .......................................................................................................... 7
3.2 SQL*Plus Worksheet ............................................................................................. 8
4 DBA Studio .................................................................................................................... 9
5 Oracle e a Tecnologia Objeto Relacional ..................................................................... 13
5.1 O que é um banco de dados objeto-relacional? .................................................... 13
5.1.1 Tipo de Objeto .............................................................................................. 13
5.1.2 Referência..................................................................................................... 14
5.1.3 Coleções: Tipo de Tabela e Vetor ................................................................ 14
6 PL/SQL......................................................................................................................... 15
6.1 Objetos Armazenados........................................................................................... 15
6.1.1 Funções / Procedimentos Armazenados ....................................................... 15
6.1.2 Pacotes .......................................................................................................... 16
6.1.3 Gatilhos......................................................................................................... 16
6.2 Características da PL/SQL ................................................................................... 17
6.2.1 Conjunto de caracteres.................................................................................. 17
6.2.2 Variáveis....................................................................................................... 17
6.2.3 Palavras reservadas....................................................................................... 17
6.2.4 Tipos de dados comuns ................................................................................ 18
6.2.5 Estrutura de blocos ....................................................................................... 18
6.2.6 Estruturas de controle ................................................................................... 18
6.2.7 Exceções ....................................................................................................... 19
7 Uma Aplicação ............................................................................................................. 19
7.1 Criação do banco de dados ................................................................................... 20
7.1.1 Criação de tipos de array .............................................................................. 24
7.1.2 Criação dos demais tipos de objeto .............................................................. 25
7.1.3 Criação de tabelas......................................................................................... 27
7.2 Inserção de dados nas tabelas ............................................................................... 30
7.2.1 Inserção de dados na tabela de Clientes ....................................................... 30
7.2.2 Inserção de dados na tabela de Artistas ........................................................ 31
7.2.3 Inserção de dados na tabela de CDs ............................................................. 33
7.2.4 Inserção de dados na tabela de CDs ............................................................. 33
7.2.5 Inserção de dados na tabela de Vendas ........................................................ 36
7.3 Alterações de dados das tabelas............................................................................ 37
7.4 Remoção de dados das tabelas ............................................................................. 41
7.5 Consultas .............................................................................................................. 44
8 Referências ................................................................................................................... 49
1
Bancos de Dados Objeto-Relacionais em Oracle
1 Introdução
Banco de Dados (BD) é uma das áreas da ciência da computação de maior destaque,
atualmente. A grande maioria dos sistemas computacionais existentes necessita manipular e
gerenciar dados, usando algum Sistema Gerenciador de Bancos de Dados (SGBD). Dentre
os modelos de dados usados nos SGBD, o modelo relacional há anos domina o mercado,
devido principalmente a sua simplicidade.
Nos últimos anos, a tecnologia de BD tem evoluído de diversas formas, uma delas
através da expansão da capacidade de manipular dados complexos, utilizando conceitos da
tecnologia de Orientação a Objetos (OO). Desta forma, surgiu o SGBD Objeto-Relacional
(SGBDO-R), que mantêm as vantagens do modelo relacional e acrescentam características
de OO. Este novo SGBDO-R, é uma ferramenta de gerenciamento de dados muito mais
poderosa que as tradicionais.
A Oracle Corporation é uma das maiores empresas da atualidade na criação de
sistemas de BD. Um de seus principais produtos é o Oracle Database, um SGBDO-R
muito utilizado nos maiores BD de empresas por todo o mundo. O objetivo deste curso é
apresentar os principais conceitos de BD objeto-relacional e suas vantagens, assim como
apresentar as ferramentas do Oracle Database e a linguagem PL/SQL, mostrando como
utilizá-las na criação e gerenciamento destes bancos de dados. Este curso é destinado a
pessoas que já possuem conhecimento na área de bancos de dados.
2
Bancos de Dados Objeto-Relacionais em Oracle
3
Bancos de Dados Objeto-Relacionais em Oracle
4
Bancos de Dados Objeto-Relacionais em Oracle
5
Bancos de Dados Objeto-Relacionais em Oracle
6
Bancos de Dados Objeto-Relacionais em Oracle
3 SQL*Plus
SQL*Plus é a interface de definição e manipulação de dados no BD Relacional do
Oracle. A linguagem SQL (Strutured Query Language) é o padrão adotado por todos os
fornecedores de banco de dados relacionais. O SQL*Plus da Oracle é um superconjunto da
SQL padrão: ela obedece aos padrões de uma linguagem compatível com SQL e possui
alguns acessórios específicos para o Oracle. Antigamente, o SQL*Plus se chamava UFI, a
interface amigável com o usuário.
Figura 1: SQL*Plus.
7
Bancos de Dados Objeto-Relacionais em Oracle
8
Bancos de Dados Objeto-Relacionais em Oracle
Nota importante: O SQL*Plus Worksheet fornece uma interface mais amigável entre o
usuário e o SQL*Plus. Dessa forma, o SQL*Plus deve ser instalado para se poder utilizar o
SQL*Plus Worksheet. O SQL*Plus Worksheet no Oracle Enterprise Manager pode ser
usado para muitas atividades que são realizadas no SQL*Plus. Entretanto, a maioria dos
comandos de formatação só funciona no SQL*Plus.
4 DBA Studio
O DBA Studio é uma ferramenta integrada que permite ao usuário administrar num
único ambiente, instâncias, esquemas, segurança e armazenamento do banco de dados, com
uma visão unificada em forma de árvore. Por causa deste acesso unificado a funções de
administração, a troca entre as diversas tarefas do DBA é fácil e isso proporciona uma
melhor visão do estado e da configuração do BD.
Ao iniciar os uso desta ferramenta a tela apresentada na Figura 3 aparecerá, onde
você deve optar por executar o “DBA Studio standalone”.
9
Bancos de Dados Objeto-Relacionais em Oracle
10
Bancos de Dados Objeto-Relacionais em Oracle
11
Bancos de Dados Objeto-Relacionais em Oracle
12
Bancos de Dados Objeto-Relacionais em Oracle
13
Bancos de Dados Objeto-Relacionais em Oracle
“endereco”, onde este último poderia ser do tipo ENDERECO. Uma tabela de clientes
poderia ser criada a partir deste objeto CLIENTE.
Criando tipo de objeto: create type nome_objeto as object (atributos);
5.1.2 Referência
Um atributo pode ser declarado como uma referência (ref) para um tipo de dado
construído por um usuário. Isto só é possível pela característica de que cada objeto possui
um identificador único, chamado de Object Identificator (OId). A referência aponta para o
OId de um objeto, mesmo que este esteja armazenado em outro local.
Criando referência: create type nome_referência as ref of nome_objeto;
Um tipo de tabela (table type) define uma coleção de dados de um tipo de objeto
que já tenha sido criado. Por exemplo, para a tabela de clientes poderíamos criar a opção
destes possuírem vários endereços cadastrados, assim o atributo “endereco” não seria mais
definido como do tipo de objeto ENDERECO, e sim como uma tabela formada por este
tipo, ou em outras palavras, como um conjunto de endereços.
Criando tipo de tabela: create type nome_tipo as table of nome_objeto;
Sempre que usamos um tipo de tabela como tipo de atributo de uma tabela, estamos
colocando uma tabela dentro de outra, ou seja, estamos criando uma tabela aninhada
(nested table). No SGBD precisa ser definido um nome para que esta tabela seja
armazenada.
Criando tabela com tabela aninhada:
create table nome_tabela of nome_objeto (...)
nested table nome_atributo stores as nome_tab_aninhada;
Outra forma de criar coleções de dados é através de vetores de tamanhos fixos
(array) ou variados (varray). A principal diferença entre estes e o tipo de tabela, é que estes
vetores são ordenados, porém possuem um limite máximo predefinido de elementos do
conjunto. No caso dos clientes poderíamos, por exemplo, definir o número máximo de
endereços para cada cliente e usar um vetor em vez de um tipo de tabela.
Criando varray: create type nome_tipo as varray(max) of tipo_de_dado;
14
Bancos de Dados Objeto-Relacionais em Oracle
Além destas diferenças, estes dois tipos diferem também na forma de acesso aos
dados, como veremos em exemplos posteriormente, e na forma de armazenamento dos
dados, pois dados de tipos de tabelas são armazenados separadamente das tabelas, já que
não há previsão de seu tamanho máximo.
6 PL/SQL
A partir da versão 6 do Oracle, foi implementada uma linguagem procedural
chamada PL/SQL, que alia construtores comuns em linguagens de programação à
linguagem de consulta SQL, utilizada na maioria dos BDs. Ou seja, é uma linguagem de
manipulação de dados, onde é possível construir estruturas condicionais, estruturas de
repetição, etc.
A PL/SQL pode ser usada em diversas interfaces do Oracle, tanto para gerenciar
bancos de dados, como também em ferramentas de desenvolvimento de projetos e
aplicações. Aqui estaremos tratando da PL/SQL de banco de dados, onde funções e
procedimentos podem ser criados e armazenados, utilizando esta linguagem.
15
Bancos de Dados Objeto-Relacionais em Oracle
6.1.2 Pacotes
6.1.3 Gatilhos
16
Bancos de Dados Objeto-Relacionais em Oracle
6.2.2 Variáveis
17
Bancos de Dados Objeto-Relacionais em Oracle
Os programas da PL/SQL são escritos em blocos, que podem ou não possuir nome.
Caso o bloco seja armazenado, por exemplo como uma função, após a o tipo do bloco
podem ser colocados argumentos de entrada (in), de saída (out) ou de entrada e saída (in
out). As seções declare (para declaração de variáveis) e exception (uma parte do bloco só
é executado em caso de erro ou exceção) são opcionais. Os blocos podem ser aninhados,
criando diversos blocos de código dentro do principal, para isso usamos os limitadores
begin e end.
18
Bancos de Dados Objeto-Relacionais em Oracle
6.2.7 Exceções
7 Uma Aplicação
Um modelo de aplicação foi imaginado para servir de base aos exemplos utilizados
no curso. Estaremos implementando parte de um banco de dados para uma loja virtual de
CDs. A Figura 9 representa este BD.
19
Bancos de Dados Objeto-Relacionais em Oracle
20
Bancos de Dados Objeto-Relacionais em Oracle
Os comandos de criação dos objetos deste modelo, assim como os de qualquer outro
podem ser escritos em diversas interfaces, como SQL*Plus, SQL*Plus Worksheet, ou o
DBA Studio, como mostrado a seguir.
21
Bancos de Dados Objeto-Relacionais em Oracle
22
Bancos de Dados Objeto-Relacionais em Oracle
Figura 14: 4o passo - depois de definir todos os atributos, “Criar” o tipo de objeto.
Uma vantagem do DBA Studio é que a qualquer momento pode-se visualizar a
sintaxe do comando que está sendo executado no BD. Para isso basta que seja marcada a
opção “Mostrar SQL”.
Figura 15: Mensagem que aparece quando a criação ocorre sem erros.
23
Bancos de Dados Objeto-Relacionais em Oracle
Neste modelo temos dois casos onde deverão ser criados tipos de array: um para o
atributo “tels_cli” contendo uma lista de telefones do cliente, e outro “mus_cd” contendo
uma lista com as músicas de um CD. Sendo que o último depende da criação anterior do
tipo de objeto MUSICA. Desta forma, os comandos para a criação destes tipos devem
anteceder a dos objetos que irão usá-los, como se segue:
24
Bancos de Dados Objeto-Relacionais em Oracle
25
Bancos de Dados Objeto-Relacionais em Oracle
3 nome_art varchar2(40),
4 tipo_art varchar2(20),
5 desc_art varchar2(100),
6 hp_art varchar2(40),
7 cds_art refcds);
VENDA: SQL> create type venda as object (
2 cod_ven integer,
3 data_ven date,
4 valor_ven decimal(10, 2),
5 pago_ven char(1),
6 cli_ven ref cliente,
7 cds_ven refcds);
A criação de referências no DBA Studio é tão simples como qualquer outra
operação, basta que no momento da criação do objeto, a opção “Objeto definido pelo
usuário será uma referência (REF)” seja habilitada, como mostrada na próxima Figura.
26
Bancos de Dados Objeto-Relacionais em Oracle
Uma vez criado o tipo de objeto, a criação das tabelas deste tipo se torna bem
simples. Neste momento deve-se informar que atributos são obrigatórios no banco de
dados, através da cláusula not null, bem como o(s) atributo(s) que formam a chave primária
(primary key).
No SQL*Plus o comando seria o seguinte:
Nota importante: No exemplo anterior, a tabela CLIENTES foi criada com todos os
atributos descritos no tipo de objeto CLIENTE, apesar de termos colocado no comando os
atributos que estão sendo modificados.
No DBA Studio, uma vez escolhida a opção criar Tabela, basta colocar seu nome, e
marcar a opção “Tabela de Objeto”. Aparecerá a opção de escolha para o esquema e para o
tipo de objeto. Depois de selecionado o objeto é possível determinar os atributos
obrigatórios, desmarcando a opção “Nulo”.
27
Bancos de Dados Objeto-Relacionais em Oracle
28
Bancos de Dados Objeto-Relacionais em Oracle
Figura 22: Mensagem que aparece quando a criação ocorre sem erros.
Por fim, será apresentado o código referente à criação das últimas tabelas deste
modelo de banco de dados. Observe que estas tabelas possuem tabelas aninhadas (nested
table), e estas devem receber nomes para serem armazenadas no BD. Em outras palavras,
teremos nas tabelas de CDS, ARTISTAS e VENDAS, tabelas aninhadas de referências para
os artistas e CDs.
CDS: SQL> create table cds of cd (
2 cod_cd not null,
3 tit_cd not null,
4 primary key (cod_cd))
5 nested table art_cd store as lista_artistas;
ARTISTAS: SQL> create table artistas of artista (
2 cod_art not null,
3 nome_art not null,
4 primary key (cod_art))
5 nested table cds_art store as lista_cds_art;
VENDAS: SQL> create table vendas of venda (
2 cod_ven not null,
3 data_ven not null,
4 valor_ven not null,
5 pago_ven not null,
6 cli_ven not null,
7 primary key (cod_ven))
8 nested table cds_ven store as lista_cds_ven;
29
Bancos de Dados Objeto-Relacionais em Oracle
30
Bancos de Dados Objeto-Relacionais em Oracle
31
Bancos de Dados Objeto-Relacionais em Oracle
32
Bancos de Dados Objeto-Relacionais em Oracle
A inserção na tabela de CDs deverá ser feita por um procedimento, pois envolve
uma série de operações que devem ser executadas de uma só vez. O procedimento
“insere_cd”, faz o seguinte:
• Recebe como parâmetros de entrada, o título do CD, o seu preço, a quantidade deste em
estoque, e o código de um artista. Deve ser selecionado o valor da referência para o artista.
• O código do novo CD deve ser gerado pelo sistema, incrementando o maior código.
• Caso ocorra a tentativa de cadastrar um CD de um artista que não tenha ainda sido
cadastrado no banco de dados, este erro deverá ser tratado e a mensagem “Artista não
cadastrado” será informada.
Observações: Cada uma das músicas do CD deve ser cadastrada depois. E caso este CD
contenha mais de um artista, os dados deste CD devem ser alterados para incluir novos
valores.
Procedimentos podem ser criados em diversos ambientes do Oracle. Para criar um
procedimento usando o DBA Studio, basta colocar um nome e seu código, como pode ser
visto na próxima Figura.
A inserção na tabela de CDs deverá ser feita por um procedimento, pois envolve
uma série de operações que devem ser executadas de uma só vez. O procedimento
“insere_cd”, faz o seguinte:
• Recebe como parâmetros de entrada, o título do CD, o seu preço, a quantidade deste em
estoque, e o código de um artista. Deve ser selecionado o valor da referência para o artista.
• O código do novo CD deve ser gerado pelo sistema, incrementando o maior código.
• Caso ocorra a tentativa de cadastrar um CD de um artista que não tenha ainda sido
cadastrado no banco de dados, este erro deverá ser tratado e a mensagem “Artista não
cadastrado” será informada.
Observações: Cada uma das músicas do CD deve ser cadastrada depois. E caso este CD
contenha mais de um artista, os dados deste CD devem ser alterados para incluir novos
valores.
33
Bancos de Dados Objeto-Relacionais em Oracle
34
Bancos de Dados Objeto-Relacionais em Oracle
35
Bancos de Dados Objeto-Relacionais em Oracle
36
Bancos de Dados Objeto-Relacionais em Oracle
37
Bancos de Dados Objeto-Relacionais em Oracle
2 where cpf_cli=’123456789012345’;
1 linha atualizada.
A seguir serão apresentados exemplos de alterações de dados de tipos construídos
pelo usuário.
Exemplo 2: Mudar parte do endereço de um cliente.
SQL> update clientes c set c.end_cli.ender = 'Rua Pedro Moura, 100/2'
2 where cpf_cli='123456789012345';
1 linha atualizada.
Exemplo 3: Alterar um CD incluindo novo artista.
Algumas alterações em tabelas podem gerar uma série de outras operações
necessárias para manter o banco de dados consistente. Por exemplo, ao alterarmos um CD,
incluindo um novo artista neste, devemos alterar a lista de CDs deste artista. Assim será
preciso construir um procedimento que realize estas operações.
A seguir será apresentado o código para a criação do procedimento
“altera_cd_artista”.
SQL> create or replace procedure altera_cd_artista
2 (codcd number, codart number) as
3 begin
4 declare listacds refcds;
5 listaart refartistas;
6 refcd ref cd;
7 refart ref artista;
8 begin
9 select ref(cx), art_cd into refcd, listaart
10 from cds cx where cod_cd=codcd;
11
12 select ref(ax), cds_art into refart, listacds
13 from artistas ax where cod_art=codart;
14
15 listaart.extend;
16 listaart(listaart.last):=refart;
38
Bancos de Dados Objeto-Relacionais em Oracle
17
18 if listacds is null then
19 listacds:=refcds(refcd);
20 else
21 listacds.extend;
22 listacds(listacds.last):=refcd;
23 end if;
24
25 update cds set art_cd=listaart
26 where cod_cd=codcd;
27
28 update artistas set cds_art=listacds
29 where cod_art=codart;
30
31 commit;
32 exception
33 when no_data_found then
34 raise_application_error(-20100,”CD / Artista não encontrado”);
35 end;
36 end;
37 /
Procedimento criado.
SQL> execute altera_cd_artista(1,2);
Procedimento PL/SQL concluído com sucesso.
Exemplo 4: Alterar uma venda, incluindo um novo CD.
Como explicado anteriormente, a cada novo CD que um cliente compre, este deve
ser incluído na venda e seu valor acrescido ao valor total, além disso, este CD deve ser
retirado do estoque. O procedimento apresentado a seguir recebe como parâmetros o código
da venda e o código do novo CD a ser comprado.
SQL> create or replace procedure altera_venda
2 (codvenda number, codcd number) as
39
Bancos de Dados Objeto-Relacionais em Oracle
3 begin
4 declare preco number;
5 valor number;
6 quant number;
7 refcd ref cd;
8 listacds refcds;
9 begin
10
11 select ref(cx), preco_cd, qtd_cd
12 into refcd, preco, quant
13 from cds cx where cod_cd=codcd;
14
15 quant:=quant-1;
16 update cds set qtd_cd=quant
17 where cod_cd=codcd;
18
19 select cds_ven, valor_ven into listacds, valor
20 from vendas where cod_ven=codvenda;
21 valor := valor + preco;
22
23 if listacds is null then
24 listacds:=refcds(refcd);
25 else
26 listacds.extend;
27 listacds(listacds.last) := refcd;
28 end if;
29
30 update vendas set cds_ven=listacds, valor_ven=valor
31 where cod_ven=codvenda;
32
33 commit;
40
Bancos de Dados Objeto-Relacionais em Oracle
34 exception
35 when no_data_found then
36 raise_application_error(-20100,”CD não cadastrado”);
37 end;
38 end;
39 /
Procedimento criado.
SQL> execute altera_venda(1,2);
Procedimento PL/SQL concluído com sucesso.
41
Bancos de Dados Objeto-Relacionais em Oracle
42
Bancos de Dados Objeto-Relacionais em Oracle
Este gatilho será executado automaticamente (ou disparado) antes de cada operação
de delete a ser realizada sobre a tabela de vendas. O sincronismo (ou timing) que é
exatamente a escolha deste momento para a execução do gatilho, deve ser informado na
tela de sincronia, como mostrado na Figura a seguir:
43
Bancos de Dados Objeto-Relacionais em Oracle
7.5 Consultas
A seleção de dados nas tabelas é feita através do comando select, exatamente como
no SQL. Todas as cláusulas válidas no SQL, valem no PL/SQL.
Sintaxe: select atributos [into variáveis]
from tabelas [where condições];
Esta sintaxe pode ser alterada para selecionar dados de objetos definidos pelo
usuário, pois é preciso algumas usar um alias para a tabela, como mostrado em algumas das
consultas a seguir.
Consulta 1: Mostrar as diferentes cidades de clientes cadastrados.
SQL> select distinct (c.end_cli.cidade)
2 from clientes c;
Para enxergar dados de tabelas aninhadas é preciso usar o construtor the, que cria
uma tabela temporária para guardar estes dados e assim torná-los acessíveis, observe as
consultas 2 e 3.
Consulta 2: Mostrar os nomes das músicas cadastradas num CD.
SQL> select m.nome_mus
2 from the (select mus_cd from cds where cod_cd=1) m;
Consulta 3: Mostrar o nome de uma música cadastrada num CD.
SQL> select m.nome_mus
2 from the (select mus_cd from cds where cod_cd=1) m
3 where m.num_mus=3;
Todas as funções presentes no SQL podem ser usadas no PL/SQL, tais como as
funções COUNT, SUM, AVG, MAX, MIN, dentre outras. Estas também podem ser
aplicadas a objetos, como apresentado na consulta 4.
Consulta 4: Mostrar a quantidade de músicas cadastradas em um CD.
SQL> select count(m.nome_mus)
2 from the (select mus_cd from cds where cod_cd=1) m;
Consulta 5: Mostrar a soma de vendas que já foram pagas.
SQL> select SUM(valor_ven) from vendas where pago_ven='S';
44
Bancos de Dados Objeto-Relacionais em Oracle
As opções de agrupamento (group by) e ordenação (order by) também podem ser
usadas. Assim como operações sobre conjuntos, como UNION, INTERSECTION, IN,
EXISTS, etc.
Consulta 6: Mostrar músicas de um CD, ordenados pelo seu número e nome.
SQL> select m.num_mus, m.nome_mus
2 from the (select mus_cd from cds where cod_cd=1) m
3 order by 1,2;
Consulta 7: Mostrar as músicas de dois CDs diferentes.
SQL> select m.num_mus, m.nome_mus
2 from the (select mus_cd from cds where cod_cd=1) m
3 union
4 select m.num_mus, m.nome_mus
5 from the (select mus_cd from cds where cod_cd=2) m;
Consulta 8: Mostrar o nome do cliente que efetuou uma determinada venda.
Como os dados do cliente na tabela de vendas estão apenas referenciados,
precisamos o usar o deref, porém este retornará uma linha contendo todos os dados do
cliente e não só o seu nome. Assim precisaremos usar uma variável temporária para
armazenar estes dados e depois mostrar na tela apenas o valor do nome. Para isto usaremos
a função “dbms_output.put_line(...)” que imprime os resultados em linhas diferentes.
SQL> declare cli cliente;
2 begin
3 select deref(cli_ven) into cli
4 from vendas where cod_ven=1;
5
6 dbms_output.put_line(cli.nome_cli);
7 end;
8/
Nota importante: Para visualizar dados de saída no SQL*Plus, deve-se habilitar a opção
“set serveroutput on”, antes de executar o procedimento de consulta. Sem isto, o
procedimento poderá ser executado com sucesso, mas os resultados da consulta não
poderão ser visualizados.
45
Bancos de Dados Objeto-Relacionais em Oracle
Algumas consultas, a depender dos tipos de dados da tabela, podem ser tão
complexas que precisem de várias operações para solucioná-las. Sendo assim, pode-se criar
procedimentos ou funções para este tipo de consulta, como é o caso das consultas a seguir.
Consulta 9: Mostrar os títulos dos CDs vendidos, a partir do código da venda.
Na tabela VENDAS o atributo “cds_ven” é do tipo REFCDS, que, por sua vez, é de
um tipo de tabela formado por um conjunto de referências ao objeto CD. Uma variável do
mesmo tipo “listacds” será usada para receber os dados do BD. Esta lista será percorrida
numa estrutura de repetição, para que a referência de cada CD seja desfeita, obtendo todos
os dados do CD.
Uma vez obtidos os dados de cada CD, o título deste será mostrado na tela, como
resposta a consulta.
46
Bancos de Dados Objeto-Relacionais em Oracle
47
Bancos de Dados Objeto-Relacionais em Oracle
27
28 end;
29 end;
30 /
Procedimento criado.
Para executar este procedimento basta fazer:
SQL> exec cds_artista (código_do_artista);
Consulta 11: Mostrar o título de um CD e os nomes dos seus artistas.
SQL> create or replace procedure artistas_cd (codcd number) as
2 begin
3 declare
4 refart ref artista;
5 lista refartistas;
6 tit varchar2(30);
7 nome varchar2(40);
8 ind number;
9 begin
10 select art_cd, tit_cd into lista, tit
11 from artistas where cod_cd=codcd;
12
13 dbms_output.put_line(tit);
14
15 ind:=1;
16 loop /*repete até que a lista chegue ao fim*/
17 refart:=lista(ind);
18 select nome_art into nome
19 from artistas a where ref(a)=refart;
20 dbms_output.put_line(nome);
21 exit when lista(ind)=lista(lista.last);
22 ind:=ind + 1;
23 end loop;
48
Bancos de Dados Objeto-Relacionais em Oracle
24
25 exception /*para tratar um possível erro*/
26 when no_data_found then
27 raise_application_error(-20100, 'CD não cadastrado');
28
29 end;
30 end;
31 /
Procedimento criado.
Para executar este procedimento basta fazer:
SQL> exec artistas_cd (código_do_cd);
Foram apresentados apenas alguns exemplos de possíveis consultas realizadas sobre
esta aplicação. Estas consultas devem servir de base para a criação de outros exemplos que
poderiam ser implementados.
8 Referências
Abbey, M., Corey, M.J., Abramson, I., Oracle8i Guia Introdutório, Editora
Campus, autorizado pela Oracle Press, Rio de Janeiro, 2000.
Elmasri, Ramez; Navathe, B. Shamkant. Sistemas de Banco de Dados –
Fundamentos e Aplicações. Editora LTC. Versão Traduzida, Terceira Edição, Rio
de Janeiro, 2002.
Loney, K., Koch, G., Oracle8i: The Complete Reference, Editora McGraw-Hill,
autorizado pela Oracle Press, Berkeley, 2000.
Página oficial da Oracle Corporation na Internet. Disponível em:
http://www.oracle.com
49