Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Material de Apoio
Caso seja interessante, é importante que seja consultado o artigo E.F. Codd, The Relational
Model for Database Management.
Categorizar;
Descrever;
Especificar;
Investigar;
Desenvolver;
Analisar.
O objetivo é produzir um modelo que se adapte a vários usos, e que possa ser compreendido
por um usuário final contendo detalhes suficientes para que um desenvolvedor crie um sistema de
banco de dados.
PESSOA
Figura 1.1. Representação de Entidade em um DER.
PESSOA
NACIONALIDADE
CPF NOME DTNASC
CPF PESSOA
BAIRRO
ENDEREÇO PESSOA
CIDADE
1.9. Relacionamentos
Segundo Heuser [HEU 98] além de especificar os objetos sobre os quais deseja-se manter
informações, o DER deve permitir a especificação das propriedades dos objetos que serão
armazanedas no BD. Uma das propriedades sobre as quais pode ser desejável manter informações é
a associação entre objetos. Por exemplo, supondo que seja desejável saber quais pessoas estão
associadas as quais departamentos em uma organização. Ou seja, um relacionamento é um conjunto
de associações entre entidades.
gerente
EMPREGADO GERENCIA
gerenciado
Figura 1.6. Relacionamento Unário.
Relacionamento Binário
Relacionamento Ternário.
PEÇA
Figura 1.9. Cardinalidade Máxima. 1 DEPARTAMENTO pode ter no máximo 120 EMPREGADOS.
Isso não significa que uma ocorrência de DEPARTAMENTO pode estar associada a no
máximo 120 ocorrências de EMPREGADO, ou em outros termos, que um departamento pode ter
nele lotado no máximo 120 empregados.
Para fins práticos, não é necessário distinguir entre diferentes cardinalidades máximas
maiores que 1. Por este motivo, apenas duas cardinalidades máximas são relevantes: a cardinalidade
máxima 1 e a cardinalidade máxima “muitos”, referida pela letra n. Assim, no exemplo acima, diz-
se que a cardinalidade máxima da entidade DEPARTAMENTO no relacionamento LOTACAO é n.
Além da cardinalidade máxima, uma outra informação que pode ser representada por um
modelo ER é o número de ocorrências de entidade que são associadas a uma ocorrência de uma
entidade através de um relacionamento. Para fins de projeto de BD, consideram-se apenas duas
cardinalidades mínimas: a cardinalidade mínima 0 e a cardinalidade mínima 1. A cardinalidade
mínima 1 também recebe a denominação de “associação obrigatória”, já que ela indica que o
relacionamento deve obrigatoriamente associar uma ocorrência de entidade a cada ocorrência da
entidade em questão. Um exemplo prático do uso da cardinalidade mínima no relacionamento, seria
cada empregado deve ter a ele alocada obrigatoriamente uma mesa (cardinalidade mínima 1) e que
uma mesa pode existir sem que a ela esteja alocado um empregado (cardinalidade mínima 0).
CHEFIA
PAÍS PRESIDENTE
(1,1) (1,1)
OFERTA – CANDIDATO
CANDIDATO EMPREGO EMPRESA
(M,N) (M,N)
Concepção Construção
Transição
Elaboração
Figura 2.1. Ciclo de vida de software baseado em ciclos iterativos. (Fonte: Wazlawick [WAZ 04])
2.2. Concepção
Na fase de concepção é necessário que seja feito o estudo das necessidades comerciais e
transacionais. É importante que os usuários e gestores sejam entrevistados para identificar as
necessidades das informações a serem geradas. Além disso, deve-se incorporar as declarações de
objetivos da aplicação e da empresa, permitindo qualquer especificação futura do sistema.
Segundo Wazlawick [WAZ 04], a fase de concepção consiste em uma etapa na qual o
projetista deve buscar as primeiras informações sobre o sistema a ser desenvolvido. Portanto, nesta
12
etapa, assume-se pouco conhecimento do projetista sobre o sistema, e uma grande interação com o
usuário e cliente.
Trata-se do entendimento das principais regras de negócios existentes e terminologias a serem
usadas no desenvolvimento do sistema, entendendo a semântica dos dados a serem armazenados.
Através do levantamento de requisitos, que é uma atividade da etapa de concepção, é possível
se ter uma visão geral do sistema baseando-se nas descrições feitas pelos usuários e clientes
entrevistados.
O levantamento de requisitos é formalizado e documentado em requisitos funcionais e não-
funcionais do sistema a ser desenvolvido. Abaixo segue um exemplo de uma especificação de
requisitos funcionais e não-funcionais associados (Figura 2.2).
F1 Registrar Emprestimos
Descrição: O sistema deve registrar empréstimos de fitas, indicando o cliente e as fitas que foram
emprestadas, bem como a data do empréstimo e o valor previsto para pagamento na devolução.
Requisitos Não-Funcionais
Nome Restrição Categoria Desejável Permanente
NF 1.1 Controle de A função só pode ser acessada
Acesso por usuário com perfil de Segurança ( ) ( )
operador ou superior.
NF 1.2 Identificação As fitas devem ser identificadas
Interface ( ) ( )
de Fitas por um código de barras.
NF 1.3 Identificação O cliente deverá ser identificado
Interface ( ) ( )
do Cliente a partir de seu nome.
NF 1.4 Tempo de O tempo para registro de cada fita
Performance ( ) ( )
Registro deve ser inferior a um segundo.
NF 1.5 Janela Única Todos as funções relacionadas a
empréstimos devem ser efetuadas Interface ( ) ( )
em uma única janela.
Figura 2.2. Exemplo de tabelas que e specificam requisitos funcionais e não-funcionais associados.
Fonte : Wazlawick [WAZ 04].
a) Usabilidade: quais fatores humanos estão envolvidos no sistema? Quais tipos de ajuda
o sistema vai prover? Quais as formas de documentação ou manuais disponíveis?
Como esses manuais vão ser produzidos? Que tipo de informação eles vão conter? É
imprescindível que estes tópicos sejam definidos na fase de concepção.
b) Confiabilidade: que tipo de tratamento de falhas o sistema vai ter? O projetista não é
obrigado a produzir um ambiente tolerante a falhas, mas deve estabelecer que tipos de
falhas o sistema será capaz de gerenciar.
e) Segurança: quais são os tipos de usuários e que funções cada um pode executar?
Sugere-se definir os perfis de usuários como um requisito suplementar e adicionar um
requisito não-funcional de “controle de acesso” a todos os requisitos funcionais, para
indicar como o acesso às funções do sistema é controlado.
f) Implementação: qual linguagem deve ser usada? Por que motivo? Quais bibliotecas
estarão disponíveis? Quais banco de dados serão acessíveis?
Figura 2.4. Um modelo conceitual preliminar para a videolocadora Fonte: Wazlawick [WAZ 04].
Nessa fase, basta ao projetista saber que os conceitos identificados são informações
localizadas nos textos do documento de requisitos.
As associações, por sua vez, são ligações estruturais entre conceitos, que complementam a
informação registrada por eles.
Uma vez identificados os conceitos principais, pode-se definir uma tabela que indicará se eles
devem sofrer inserção ( I ), alteração ( A ), exclusão ( E ) ou consulta ( C ). Pode-se construir uma
tabela para indicar os conceitos e quais operações serão possíveis sobre eles (Figura 2.5). Nessa
tabela, também é possível identificar restrições ou regras de validação para a execução das
operações. Por exemplo, “um cliente só pode ser excluído se não houver nenhum empréstimo
alocado a ele”.
15
Conceito I A E C Observação Ref. Cruzada
Cliente Só é possível excluir se não houver F13
X X X X
empréstimos associados.
Reserva F15, F16
X X X X
2.6. Elaboração
A fase de elaboração inclui a comunicação com o cliente e atividades de modelagem do
modelo genérico de processo. A elaboração refina e expande os casos de uso preliminares que
foram desenvolvidos como parte da fase de concepção e expande a representação arquitetural para
incluir cinco visões diferentes do software - o modelo de casos de uso, o modelo de análise, o
modelo de projeto, o modelo de implementação e o modelo de implantação. Em alguns casos, a
elaboração cria uma "referência arquitetural executável" que representa uma primeira versão do
sistema executável [WAZ 04]. A referência arquitetural demonstra a viabilidade da arquitetura,
mas não fornece todas as características e funções requeridas para uso do sistema. Além disso, o
plano é cuidadosamente revisto no ápice da fase de elaboração para garantir que o escopo, os
riscos e as datas de entrega permaneçam razoáveis. As modificações no plano podem ser feitas
nessa etapa [PRE 06].
2.7. Construção
A fase de construção é idêntica à atividade de construção definida para o processo genérico de
software. Usando o modelo arquitetural como entrada, a fase de construção desenvolve ou adquire
os componentes de software que vão tornar cada caso de uso operacional para os usuários finais.
Para conseguir isso, os modelos de análise e projeto que foram iniciados durante a fase de
elaboração são completados de modo a refletir a versão final do incremento de software. Todas as
características e funções necessárias e requeridas do incremento de software (isto é, a versão)
serão implementadas no código-fonte. À medida que os componentes são implementados, testes
unitários são projetados e executados para cada um deles. Além disso, as atividades de integração
(montagem de componentes e testes de integração) são conduzidas. Casos de uso são usados para
derivar uma seqüência de testes de aceitação que serão executados antes do início da fase seguinte
do RUP [PRE 06].
2.8. Transição
Segundo Pressman [PRE 06], a fase de transição do PU abrange os últimos estágios da
atividade genérica de construção e a primeira parte da atividade genérica de implantação. O
software é dado aos usuários finais para teste beta e relatórios de feedback do usuário sobre
defeitos e modificações necessárias. Além disso, a equipe de software cria as informações de
apoio necessárias (por exemplo, manuais de usuário, guias de solução de problemas e
procedimentos de instalação) que precisam ser entregues. Na conclusão da fase de transição, o
incremento de software torna-se uma versão utilizável do software (Figura 2.6).
16
Fase de Concepção
Documento de visão
Modelo Inicial de Caso de Uso
Glossário Inicial do Projeto
Caso de negócio inicial do projeto
Plano de Projeto – fases e iterações
Fase de Elaboração
Fase de construção
Modelo de projeto
Componentes do software
Plano de procedimento de teste
Caso de teste
Manuais (de instalação, do sistema)
Fase de transição
Figura 2.6. Principais produtos de trabalho (artefatos) produzidos em cada fase do RUP. Fonte:
Pressman [PRE 06].
17
SELECT nome,
salario
FROM empregado;
Banco de
Nome Salario Dados
--------- -----------
JOAO 5000
JOSE 2500
PEDRO 4567
O Oracle SQL é compatível com os padrões aceitos pela indústria. A Oracle Corporation
garante a compatibilidade com padrões em desenvolvimento, envolvendo ativamente uma equipe-
chave nos comitês de padrões SQL. Os comitês aceitos pela indústria são o ANSI e o ISO aceitaram
o SQL como a linguagem padrão para os bancos de dados relacionais.
Instrução Descrição
SELECT Recupera dados do banco de
dados.
INSERT Informa novas linhas, altera
UPDATE linhas existentes e remove
DELETE linhas indesejáveis de tabelas
do banco de dados,
respectivamente. O conjunto
dessas instruções é conhecido
como DML (Data Manipulation
Language).
CREATE Configura, altera e remove
ALTER estruturas de dados de tabelas.
DROP O conjunto dessas instruções é
RENAME conhecido como DDL (Data
TRUNCATE Definition Language).
COMMIT Gerencia as alterações feitas
ROLLBACK pelas instruções DML. É possível
SAVEPOINT agrupar as alterações dos dados
em transações lógicas (Controle
de transação).
GRANT Fornece ou remove direitos de
REVOKE acesso ao banco de dados Oracle
e às estruturas contidas nele. O
conjunto dessas instruções é
conhecido como DCL (Data Control
Language).
19
CARG O DTNASC
NOME
(0,1) gerente
GERENCIA
EMPREGADO
(1,N)
gerenciado
SALARIO
NUEMP
G ERENTE
(1,N)
COMISSÃO
FAIXASALARIAL
LOTACAO
(1,1)
CODFAIXA
MENORSALARIO MAIORSALARIO
DEPARTAMENTO
NUDEPT
NOMEDEPT LOCALIZACAO
Figura 4.1. Diagrama de Entidades e Relacionamentos usado para modelar as tabelas do curso.
Para executar qualquer script no Oracle, basta digitar o arroba (@) antes do caminho
onde se encontra o arquivo contendo os comandos. No nosso caso, basta digitar:
@c:\tabelas_curso.sql (ENTER)
23
Seleção: É possível usar o recurso de seleção para selecionar as linhas de uma tabela que desejamos
ver o resultado. Além disso, podemos usar várias condições para restringir e selecionar as linhas.
Projeção: É possível usar o recurso de projeção para escolher as colunas as quais desejamos ver o
retorno na consulta.
Junção: É possível usar o recurso de junção para reunir vários dados armazenados em outras
tabelas diferentes, consolidando um vínculo entre os dados.
A sintaxe desta da seleção de dados permite que a na cláusula SELECT especifique as colunas
a serem exibidas. Já na cláusula FROM, é especificada a tabela que contém as colunas relacionadas
na cláusula SELECT.
De acordo com a sintaxe podemos definir:
SELECT É uma projeção de uma ou mais colunas.
Além disso, existe a precedência do uso de operadores aritméticos nas instruções SELECT.
No exemplo abaixo, é calculada a remuneração anual multiplicando 10 pelo salário mensal, mais
um adicional de R$ 300,00. Executando a instrução, observamos que a multiplicação será realizada
antes da adição.
Caso seja necessário, use os parênteses para reforçar a ordem de precedência padrão e
aumentar a compreensão. Por exemplo, a expressão acima poderia ser criada utilizando (10 *
SALARIO) + 300, sem que haja alteração no retorno dos dados. Outro exemplo, seria somar R$
300, 00 ao salário, e em seguida multiplicar por 10. Observe a instrução abaixo:
NOTA
O uso do AS é opcional entre o nome da coluna e o apelido.
Caso o apelido tenha espaços ou caracteres especiais, usando inclusive letras maiúsculas e
minúsculas, é necessário o uso de aspas.
Os exemplos a seguir mostram a construção de instruções SELECT com o uso de apelidos.
Com o uso da palavra-chave DISTINCT, o resultado é a eliminação das linhas duplicadas para
cada código de departamento (Figura 6.2).
6.11. Exercícios
1) Verifique se as instruções abaixo estão corretas ( C ) ou incorretas ( I ):
4) Mostre a estrutura da tabela EMPREGADO. Crie uma consulta para listar o nome, o cargo,
a data de admissão e o número do empregado. O nome do empregado deverá aparecer
primeiro. Salve esta consulta com o nome exer6_11.sql, dentro da raiz da unidade C:.
6) Crie uma consulta para exibir os cargos (de forma exclusiva) a apatir da tabela
EMPREGADO.
7) Concatene o nome do empregado com o seu cargo. A concatenação deve considerar uma
vírgula e um espção entre as colunas selecionadas. Nomeie a coluna como “Nome e Cargo
do Emp.”.
8) Crie uma consulta para exibir todos os dados da tabela EMPREGADO. Separe as colunas
por vírgula e nomeie a coluna como SAIDA_EMPREGADO.
28
Nome da coluna;
Operadores de comparação;
Nome da coluna, constante ou lista de valores.
Abaixo seguem alguns exemplos do uso da cláusula WHERE, com algumas considerações.
No exemplo acima, a instrução SELECT recupera o número e o nome dos empregado cujo o
cargo é igual a CONTADOR. Observe que o cargo CONTADOR foi especificado em letras
maiúsculas para garantir que a correspondência seja feita com a coluna do cargo existente na tabela
EMPREGADO.
No exemplo acima, a instrução SELECT recupera o nome e o salário dos empregado que tem
o salário maior ou igual a R$ 2.100,00. Observe que o valor comparado na cláusula WHERE não
precisou de aspas ( >=2100 ), pelo fato de ser do tipo numérico.
No Oracle as strings de caractere e valores de data aparecem entre aspas simples. Os valores
de caractere fazem distinção entre maiúsculas e minúsculas e os valores de data diferenciam
formatos. Além disso, o formato de data padrão é DD-MES-AA (01-JAN-07).
Os produtos da Oracle armazenam datas em um formato numérico interno, representando o
século, ano, mês, dia, horas, minutos e segundos.
29
7.2. Trabalhando com operadores de comparação
Os operadores de comparação são usados na cláusula WHERE através da seguinte sintaxe:
Operador Significado
= Igual a
> Maior do que
>= Maior do que ou igual a
< Menor do que
<= Menor ou igual a
<> Diferente de
BETWEEN
SELECT NOME, SALARIO FROM EMPREGADO WHERE SALARIO BETWEEN 200 AND
2000;
IN
LIKE
Além do símbolo de percentual, existem o símbolo que representa um caractere único para
ser usado com o operador LIKE. Segue uma tabela explicando os dois caracteres:
Símbolo Descrição
% Representa qualquer seqüência de zero ou mais caracteres.
Além destes símbolos usados no operador LIKE existe a opção de ESCAPE. Quando for
necessário ter uma correspondência exata para os caracteres ‘%’ e ‘_’, use a opção ESCAPE. Como
exemplo, caso a localização do departamento onde os empregados estão lotados tenha no nome o
símbolo ‘_’, como DEPARTAMENTO_VENDAS, a seguinte instrução deve ser usada:
IS NULL
O operador IS NULL testa os valores que são nulos. Um valor nulo significa que o valor não
está disponível, não-atribuído, desconhecido ou não-aplicável. Assim não é possível testar com o
sinal de igual, por que um valor nulo não pode ser igual ou diferente a qualquer valor.
O exemplo abaixo recupera o nome e o código de gerente de todos os empregados que não
possuem gerentes.
No exemplo acima, o uso do AND exige que as duas condições sejam verdadeiras, ou seja, só
será listado o registro que conseguir satisfazer as duas condições.
OR
No exemplo acima, o uso do OR exige apenas uma das condições seja verdadeira, ou seja, só
será listado o registro que conseguir satisfazer uma das duas condições.
NOT
No exemplo acima, o uso do NOT faz com que sejam listados o número, nome, cargo e o
salário de todos os empregados que não tenham os gerentes com o código 2, 4 ou 5.
NOTA
O operador NOT pode ser utilizado também com outros operadores SQL:
SELECT ... FROM ... WHERE CARGO NOT IN (‘GERENTE’, ‘CONTADOR’, ‘TRAINEE’);
SELECT ... FROM ... WHERE SALRIO NOT BETWEEN 2000 AND 2450;
SELECT ... FROM ... WHERE NOME NOT LIKE ‘A%’;
SELECT ... FROM ... WHERE COMISSAO IS NOT NULL;
NOTA
Regras de Precedência:
Ordem Operador
1 Todos os operadores de comparação
2 NOT
3 AND
4 OR
Caso seja necessário, sobreponha as regras de precedência usando parênteses.
NOTA
Quando não se usa a classificação ASC ou DESC da cláusula ORDER BY, é assumido ASC como padrão.
7.5. Exercícios
1) Crie uma consulta para exibir o nome, o cargo e o salario dos empregados que recebem mais
que R$ 1750,00. Salve esta consulta na raíz da unidade C:, com o nome de salario_1.sql.
2) Crie uma consulta que liste o número, o nome, o salário e o número do departamento, para o
número de empregado igual a 10.
3) Modifique a consulta salario_1.sql, para listar os empregados que tenham salários entre R$
450,00 e R$ 1.246,00. Em seguida execute a consulta.
4) Elabore uma consulta que liste o nome, o cargo e a data de nascimento, cuja data de
nascimento esteja entre 01 de janeiro de 1968 e 31 de janeiro de 1980, inclusive. Classifique a
consulta de modo descresente por data de nascimento.
5) Crie uma consulta que liste o nome do empregado e o número do departamento, onde os
empregados pertencem ao departamento 1 ou 3, por ordem alfabética de nome.
6) Crie uma consulta que liste a data de nascimento e o nome do empregado que nasceram em
1982.
7) Crie uma consulta que liste todos os campos da tabela empregado, para aqueles empregados
que não possuem gerente.
8) Crie uma consulta que liste todos os empregados que possuem comissão.
33
Função Saída
LOWER (‘CURSO ORACLE’) curso oracle
UPPER (‘Curso Oracle’) CURSO ORACLE
INITCAP (‘CURSO ORACLE’) Curso Oracle
CONCAT (‘CURSO’, ‘ORACLE’) CURSOORACLE
SUBSTR (‘CARACTERE’, 1, 2) CA
LENGTH (‘CARACTERE’) 9
INSTR (‘EVALDO’, ‘V’) 2
TRIM (‘E’ FROM ‘EVALDO’) VALDO
Abaixo seguem alguns exemplos de instruções SELECT com o uso das funções de caractere:
Função Saída
ROUND (35.939, 2) 35,94
TRUNC (35.939,2) 35,93
MOD (1500, 200) 100
Abaixo seguem alguns exemplos de instruções SELECT com o uso das funções de caractere:
Função Descrição
NEXT DAY(data, ´char´): Localiza a data do próximo dia especificado da data seguinte da
semana. O valor de char pode ser um número representando um dia ou uma string de caractere.
TRUNC(data, ['formato']): Retorna a data com a parte da hora do dia truncada para a unidade
37
especificada pelo modelo de formato. Se o modelo de formato for omitido, a data será truncada para
o dia mais próximo.
A seguir veremos alguns exemplos sobre o uso das funções de data existentes no Oracle:
Função Saída
MONTHS_BETWEEN (‘01-SEP-87’, ‘23-JAN-84’) 43,290
ADD_MONTHS(‘11-JAN-94’, 6) ‘11-JUL-94’
NEXT_DAY (‘08-MAR-07’, ‘SUNDAY’) ‘11-MAR-07’
LAST_DAY (‘10-FEB-07’) ‘28-FEB-07’
ROUND(‘06-JUL-95’, ‘MONTH’) 01-AUG-95
ROUND(‘06-JUL-95’, ‘YEAR’) 01-JAN-96
TRUNC(‘06-JUL-95’, ‘MONTH’) 01-JUL-95
TRUNC(‘06-JUL-95’, ‘YEAR’) 01-JAN-95
SELECT NUMEMP
, DTNASC
, MONTHS_BETWEEN(SYSDATE, DTNASC)
, ADD_MONTHS(DTNASC, 6)
, NEXT_DAY(DTNASC, ‘SUNDAY’)
, LAST_DAY (DTNASC)
FROM EMPREGADO
WHERE MONTHS_BETWEEN(SYSDATE, DTNASC)>310;
SELECT NUMEMP
, DTNASC
, ROUND(DTNASC, ‘MONTH’)
, TRUNC (DTNASC, ‘MONTH’)
FROM EMPREGADO
WHERE DTNASC LIKE '20/02%';
Elemento Descricão
Retorna apenas o ano da data
Anos em datas YYYY
formatada.
Últimos três, dois ou um dígitos do
YYY ou YY ou Y
ano.
Y.YYY Ano com vírgula nesta posição.
Retorna o trimestre do ano da data
Q
formatada.
MM Mês, com valor de dois dígitos.
Nome do Mês preenchido com espaços
MONTH
limitado em nove caracteres.
Nome do mês, abreviação de três
MON
letras.
W W ou W Retorna a semana do ano ou mês.
SS Segundo (0 a 59)
Segue abaixo alguns exemplos de instruções SELECT com o uso da função TO_CHAR na
formatação de datas.
Exemplo do
Elemento Descrição Resultado
Formato
Posição numérica (número de 9s
9 determinam o tamanho 999999 1331
do exibição)
Segue abaixo alguns exemplos de instruções SELECT com o uso da função TO_CHAR na
formatação de números.
NOTA
A função TO_DATE usa os formatos existentes na função TO_CHAR para a formatação de data.
Observe que após a execução da consulta a comissão que tem o valor nulo aparece com zero,
que é o valor real formatado para a exibição.
NOTA
A sintaxe da função NVL é NVL(coluna_tipo, valor). Não é possível converter valores que não sejam do
mesmo tipo determinado pela coluna.
8.15. Exercícios
1) Crie uma consulta para a exibir a data atual, somando a esta data mais 5. Coloque um apelido
com o nome de DATA_VENCIMENTO.
2) Exiba o número do empregado, o nome, o salário e um rejuste salarial para 20% formatado
como número inteiro. Coloque um apelido na coluna do cálculo com o nome “Salário Reajustado”.
Salve a instrução SQL em um arquivo com o nome sal_reaj.sql, e em seguida execute a consulta.
3) Modifique a consulta sal_reaj.sql para adicionar uma coluna que subtrairá o salário antigo do
novo salário. Crie um apelido com o nome ACRESCIMO. Execute a consulta novamente.
4) Para cada empregado exiba o nome do mesmo e calcule o número de meses entre hoje e a data
de nascimento. Coloque um apelido na coluna com o nome de MESES_NASC. Ordene as linhas do
resultado por número de meses de nascimento. Arredonde para cima o número de meses para o
número inteiro mais próximo.
5) Crie uma consulta que produza as seguintes informações para cada empregado: (nome do
empregado) recebe o salário de ( atributo salario) mensalmente, mas deseja receber (salário com o
acréscimo de 10 por cento). Coloque um apelido qualquer para a coluna.
6) Crie uma consulta que exiba o nome do empregado com a primeira letra maiúscula e todas as
outras minúsculas, bem como o tamanho de seus nomes, para todos os empregados cujo nome
começa com letra J, M ou P. Coloque um nome para o apelido na coluna.
7) Faça uma consulta que exiba o nome, a data de nascimento e o dia da semana em que o
empregado nasceu. Coloque um apelido para a coluna com o nome DIA. Classifique os resultados
por dia da semana, inciando por Domingo.
8) Crie uma consulta que liste o nome, o cargo e o nível para todos os empregados com base no
conteúdo da coluna CARGO, conforme a tabela demosntrada abaixo:
Cargo Nível
PRESIDENTE NIVEL_1
GERENTE NIVEL_2
CONTADOR NIVEL_3
VENDEDOR NIVEL_4
42
EMPREGADO
NUMEMP NOME NUMDEPT
DEPARTAMENTO
NUMDEPT NOMEDEPT
EMPREGADO_DEPARTAMENTO
NUMEMP NUMDEPT NOME NOMEDEPT
Existem algumas regras para a criação de instruções SELECT com relacionamentos. Abaixo
seguem algumas regras:
Ao criar uma instrução SELECT que relacione várias tabelas, nós antecedemos o nome da
coluna com o nome da tabela, com o objetivo de definir o acesso ao banco de dados.
Caso apareça o mesmo nome da coluna em mais de uma tabela , o nome da coluna deve estar
prefixado com o nome da tabela.
NOTA
Um relacionamento pode gerar um produto cartesiano. Um produto cartesiano é formado quando uma
condição de relacionamento estiver omitida, ou uma condição de relacionamento estiver inválida, ou ainda
quando todas as linhas na primeira tabela estão unidas às linhas da segunda tabela. Para evitar um produto
cartesiano, sempre inclua uma condição de relacionamento válida na cláusula WHERE.
43
Os relacionamentos podem ser idênticos, não idênticos, externos ou auto-relacionamentos.
Um relacionamento idêntico é quando os valores das colunas das tabelas envolvidas são iguais.
Com freqüência, esse relacionamento envolve complementos de chave primária e chave estrangeira.
Abaixo segue um exemplo de relacionamento idêntico:
SELECT EMPREGADO.NUMEMP
, EMPREGADO.NOME
, EMPREGADO.NUMDEPT
, DEPARTAMENTO.NUMDEPT
, DEPARTAMENTO.NOMEDEPT
FROM EMPREGADO
, DEPARTAMENTO
WHERE EMPREGADO.NUMDEPT = DEPARTAMENTO.NUMDEPT;
Além do relacionamento, é possível ter critérios para a cláusula WHERE. Por exemplo, para
listar o número do empregado, o nome e o número do departamento, cujo departamento seja igual a
VENDAS. Abaixo a instrução SELECT, exemplifica esta situação:
SELECT EMP.NUMEMP
, EMP.NOME
, EMP.NUMDEPT
FROM EMPREGADO EMP
, DEPARTAMENTO DEPT
WHERE EMP.NUMDEPT = DEPT.NUMDEPT AND DEPT.NOMEDEPT = 'VENDAS';
SELECT EMP.NOME
, EMP.SALARIO
, FAIXA.CODFAIXA
FROM EMPREGADO EMP
, FAIXASALARIAL FAIXA
, DEPARTAMENTO DEPT
WHERE EMP.NUMDEPT = DEPT.NUMDEPT
AND EMP.SALARIO BETWEEN FAIXA.MENORSALARIO
AND FAIXA.MAIORSALARIO AND DEPT.NOMEDEPT = 'VENDAS';
SELECT EMP_OPERACAO.NUMEMP
, EMP_OPERACAO.NOME
, EMP_GERENTE.NUMEMP
, EMP_GERENTE.NOME
FROM EMPREGADO EMP_OPERACAO
, EMPREGADO EMP_GERENTE
WHERE EMP_OPERACAO.GERENTE = EMP_GERENTE.NUMEMP(+)
9.1. Exercícios
1) Crie uma consulta para a exibir o nome, o número e o nome do departamento de todos os
empregados.
3) Crie uma consulta para exibir o nome do empregado, o nome do departamento e a localização
de todos os empregados que recebem comissão.
4) Liste o nome do empregado e o nome do departamento para todos os empregados que possuem
“A” em seus nomes. Salve esta consulta na raíz da unidade C: com o nome emp_A.sql, e em
seguida execute a consulta.
5) Crie uma consulta para listar o nome, o cargo, o número e o nome do departamento para todos
os empregados que trabalham em Belo Horizonte.
6) Liste o nome e o número do empregado junto com o nome e o número do gerente. Dê apelidos
para as respectivas colunas.
7) Crie uma consulta que exibirá o nome do empregado, o número do departamento e todos os
empregados que trabalham no mesmo departamento de um determinado empregado. Coloque o
apelido apropriado para cada coluna.
8) Baseando-se na estrutura da tabela FAIXASALARIAL, crie uma consulta que liste o nome, o
cargo, o nome do departamento, o salário e a classificação de todos os empregados.
45
Função Descrição
AVG (expressão) Valor médio ignorando valores nulos.
COUNT (expressão) Número de linhas, onde a expressão avalia
para um valor diferente de nulo, ou seja,
serve para contar as linhas selecionadas
usando *, inclusive linhas duplicadas e com
nulos.
MAX (expressão) Valor máximo ignorando valores nulos.
MIN (expressão) Valor mínimo ignorando valores nulos.
SUM (expressão) Soma dos valores ignorando nulos.
Todas as funções de grupo, exceto a função COUNT(*), ignoram valores nulos. Para
substituir um valor por valores nulos, use então a função NVL.
SELECT MAX(SALARIO)
, MIN(SALARIO)
, AVG(SALARIO)
, SUM(SALARIO)
FROM EMPREGADO;
Um outro exemplo do uso das funções de agregação é visto abaixo, com o uso da expressão
do tipo VARCHAR2.
SELECT MAX(NOME)
, MIN(NOME)
FROM EMPREGADO;
46
10.2. A função COUNT
A função COUNT, como foi visto anteriormente, serve para retornar o número de linhas em
um a tabela. Temos duas maneiras para usar a função COUNT: COUNT(*) ou COUNT(expressão).
O COUNT (*) retorna o número de linhas em uma tabela, inclusive as linhas duplicadas e
linhas contendo valores nulos em qualquer umas das colunas. Entretanto, o uso do
COUNT(expressão) retorna o número de linhas não nulas na coluna identificada pelo parâmetro de
expressão.
No exemplo abaixo, é mostrado o retorno do número de empregados do departamento 4.
Um outro exemplo importante para o uso da função COUNT, é visto abaixo, onde a coluna de
comissão é especificada como parâmetro. Neste caso, só será retornadas a quantidade de linhas que
tiverem valore de comissão.
NOTA
Caso seja necessário usar a palavra-chave DISTINCT para não contar linha duplicadas, a seguinte
instrução SELECT poderia ser criada: SELECT COUNT( DISTINCT (NUMDEPT)) FROM EMPREGADO.
NOTA
Uma outra forma de se utilizar as funções de grupo, é construir a instrução SELECT com a função NVL.
Neste caso a função NVL força as funções de grupo a incluírem valores nulos. Como por exemplo:
SELECT AVG(NVL(COMISSAO, 0)) FROM EMPREGADO.
O outro exemplo acrescenta a cláusula ORDER BY para classificar por média salarial.
A cláusula FROM especifica as tabelas que o banco de dados deve acessar: a tabela
EMPREGADO.
A cláusula WHERE especifica as linhas a serem recuperadas. Já que não há uma cláusula
WHERE, todas as linhas são recuperadas por padrão.
A cláusula GROUP BY especifica como as linhas devem ser agrupadas. As linhas são
agrupadas pelo número do departamento, de forma que a função AVG que esteja sendo
aplicada à coluna de salários calcule o salário médio para cada departamento.
É possível retornar resultados sumarizados para grupos e subgrupos listando mais de uma
coluna GROUP BY. Podemos determinar a ordem de classificação padrão dos resultados pela
ordem das colunas na cláusula GROUP BY. A instrução SELECT no exemplo a seguir contém
uma cláusula GROUP BY, é avaliada da seguinte forma:
Onde:
A cláusula FROM especifica as tabelas que o banco de dados deve acessar a tabela
EMPREGADO.
Dessa forma, a função SUM é aplicada à coluna de salários para todos os cargos dentro de
cada grupo de números de departamentos.
Assim como na situação acima, caso se deseja restringir grupos de dados em uma instrução
SELECT usando a cláusula WHERE, o Oracle11g irá recusar a execução da consulta, retornando
um erro de que não é possível usar a cláusula WHERE para restringir grupos. O exemplo abaixo,
mostra uma instrução SELECT que provocará um erro mostrando esta situação:
Para a restrição de grupos é usada a cláusula HAVING, especificando quais grupos serão
listados. Um exemplo do uso da cláusula HAVING é visto abaixo:
10.6. Exercícios
1. Crie uma consulta para a exibir os salários maior, menor e a soma de todos os salários de todos
os empregados. Dê apelidos apropriados para as colunas. Além disso, arredonde os resultados.
Salve a consulta como sal_agp.sql.
2. Modifique a consulta sal_agp.sql para exibir o salário maior, médio e a soma de todos os
salários para cada tipo de cargo. Salve a consulta como sal_tipo.sql. Execute a consulta.
3. Crie uma consulta para exibir o número de pessoas por localização de departamento.
4. Crie uma consulta para deteminar o número de gerentes existentes por departamento.
5. Crie uma consulta para exibir a diferença entre os maiores e menores salários.
6. Liste o número do empregado que é gerente e o respectivo salário com o menor salário de
empregado sob sua gerência. Exclua todos os grupos em que o menor salário seja menor que
R$ 1.300. Classifique em ordem descrescente de número de empregado.
49
Uma subconsulta é uma instrução SELECT que é incorporada em uma cláusula de outra
instrução SELECT. Pode-se desenvolver instruções sofisticadas a partir de instruções simples
usando subconsultas.
NOTA
As subconsultas são muito úteis quando é necessário selecionar linhas de uma tabela com uma condição
que dependa dos dados na própria tabela.
A subconsulta pode ser elaborada de forma semelhante a qualquer instrução SELECT, onde o
desenvolvedor pode usar várias cláusulas, como por exemplo, WHERE, HAVING e FROM.
Através da sintaxe vista anteriormente, o operador da expressão pode ser >, = ou IN. Os
operadores de comparação estão divididos em duas classes distintas: os operadores de uma única
linha (>, =, >=, <, <=, <>) e operadores de várias linhas (IN, ANY, ALL). O exemplo a seguir
mostra o uso de subconsulta:
SELECT NOME
FROM EMPREGADO
WHERE COMISSAO >
(SELECT COMISSAO
FROM EMPREGADO
WHERE NUMEMP = 15);
O exemplo mostra a lista de nomes de empregados que tem comissão maior que a do
empregado cujo número de cadastro é 15.
É importante destacar algumas regras para o uso de subconsultas. Vejamos algumas:
As subconsultas não podem conter clásusula ORDER BY. Só é possível haver uma cláusula
50
ORDER BY para uma instrução SELECT e, se estiver especificado, esta cláusula deve ser a última
cláusula na instrução SELECT principal.
Existem três tipos de subconsultas: Subconsultas de uma única linha, Subconsultas de várias
linhas e Subconsulta de várias colunas. Os próximos itens deste capítulo mostram esses tipos
exemplificando-os.
SELECT EMP.NOME
, DEPT.NOMEDEPT
FROM EMPREGADO EMP,
DEPARTAMENTO DEPT
WHERE EMP.NUMDEPT = DEPT.NUMDEPT
AND EMP.CARGO =
(SELECT CARGO
FROM EMPREGADO
WHERE NUMEMP = 10);
SELECT EMP.NOME
, DEPT.NOMEDEPT
FROM EMPREGADO EMP,
DEPARTAMENTO DEPT
WHERE EMP.NUMDEPT = DEPT.NUMDEPT
AND EMP.CARGO =
(SELECT CARGO
FROM EMPREGADO
WHERE NUMEMP = 10)
AND EMP.SALARIO >
(SELECT SALARIO
FROM EMPREGADO
WHERE NUMEMP = 12);
SELECT CARGO
, AVG(SALARIO)
FROM EMPREGADO
GROUP BY CARGO
HAVING AVG(SALARIO) = (SELECT MIN(AVG(SALARIO))
FROM EMPREGADO
GROUP BY CARGO);
SELECT NOME
, SALARIO
, NUMDEPT
FROM EMPREGADO
WHERE SALARIO IN (
SELECT MIN(SALARIO)
FROM EMPREGADO
GROUP BY NUMDEPT
);
O operador ANY serve como operador de comparação, e compara um valor a cada valor
retornada por uma subconsulta. O exemplo abaixo lista os empregados cujo salário é menor que o
de qualquer vendedor, que não são vendedores.
SELECT NUMEMP
, NOME
, CARGO
FROM EMPREGADO
WHERE SALARIO < ANY
(SELECT SALARIO
FROM EMPREGADO
WHERE CARGO = ‘VENDEDOR’)
AND CARGO <> ‘VENDEDOR’;
NOTA
O uso do ANY: < ANY Significa menos do que o máximo . > ANY Significa mais do que o
mínimo. = ANY Equivale ao IN.
O operador ALL compara um valor a todo valor retornado por uma subconsulta. O exemplo
abaixo lista os empregados cujo salário seja maior que os salários médios de todos os
departamentos, exibindo apenas o nome e o cargo do empregado.
52
SELECT NOME
, CARGO
FROM EMPREGADO
WHERE SALARIO > ALL
(SELECT AVG(SALARIO)
FROM EMPREGADO
GROUP BY NUMDEPT)
NOTA
O operador NOT não pode ser usado com os operadores de várias linhas (IN, ANY e ALL) .
11.3. Exercícios
1. Crie uma consulta para o número de cadastro do empregado e a data de nascimento de todos os
empregados do mesmo departamento de Sebastião. Não considere o Sebastião.
2. Elabore uma consulta para listar o número e o nome de todos os empregados que recebam mais
que o salário médio e ordene os resultados por ordem descrecente de nome do empregado.
3. Crie uma consulta que liste o nome de todos os empregados que trabalhem em um departamento
com qualquer localização de departamento cujo nome da localização contenha a letra L. Salve o
arquivo com o nome local_L.sql.
4. Crie uma consulta que exiba o nome do empregado, o número do departamento e o cargo de
todos os empregados cuja localização do departamento seja Rio de Janeiro.
5. Crie uma consulta que liste o número de cadastro e o salário dos empregados que tenham como
gerente o empregado Pedro Paulo.
53
Para inserir uma nova linha que contenha valores para cada coluna, a lista de colunas não é
requerida na cláusula INSERT. Entretanto, se não for usada a lista de colunas, os valores deverão
ser listados de acordo com a ordem padrão das colunas na tabela.
NOTA
Caso seja necessário saber as colunas da tabela que receberá as linhas de registros, devemos usar o
comando DESC[RIBE] . Por exemplo: DESC DEPARTAMENTO;
Observe na instrução acima que foram inseridos valores nulos. Mas é bom destacar que
54
devem ser analisadas as restrições na tabela, como por exemplo, uma coluna não poder aceitar nulo.
Neste caso o Oracle iria rejeitar a inserção do registro.
Outra observação a ser feita é a utilização da função TO_DATE. A data informada no
exemplo está diferente do formato de data padrão, portanto foi necessário fazer a conversão do
valor informado.
A cláusula WHERE na instrução UPDATE é opcional, caso seja necessário restringir as linhas
a serem atualizadas. O dois exemplos abaixo mostram esta situação:
UPDATE EMPREGADO
SET NUMDEPT = 3
WHERE NUMEMP = 12;
UPDATE EMPREGADO
SET COMISSAO = 0;
O primeiro exemplo apaga o empregado, cujo número de empregado é igual a 11. O segundo
exemplo, permite apagar todos os registros da tabela departamento.
Além das situações acima, o Oracle também permite a deleção de registros baseada em outra
tabela. Veja o exemplo abaixo:
Uma instrução COMMIT ou ROLLBACK for emitida. Uma instrução DDL, como CREATE,
for emitida. Uma instrução DCL for emitida;
Depois que uma transação termina, a próxima instrução SQL executável automaticamente inicia
apróxima transação.
56
Uma instrução DDL ou DCL(Data Control Language) é automaticamente processada e,
portanto, finaliza implicitamente uma transação.
As instruções COMMIT e ROLLBACK tem várias vantagens. Pode-se destacar a garantia
de consistência de dados, a visualização das alterações nos dados, antes de fazer alterações
permanentemente, e o agrupamento de operações relacionandas logicamente.
NOTA
DCL permite a implementação da segurança interna do Banco de dados. Seus comandos principais são
GRANT e REVOKE.
12.6. Exercícios
Execute o script tabela_exer.sql existente na unidade C: . Este processo irá criar a tabela
PRODUTO usada para execução dos exercícios deste capítulo.
Adicione as primeiras linhas de dados na tabela PRODUTO a partir dos dados do exemplo a
seguir.
Verifique a inserção das linhas de registro. Por exemplo, usando a instrução SELECT.
Altere a data para 15/09/2001 de todos os produtos que tenham valor unitário maior ou igual a
R$ 4,50.
Exibe as tabelas, visões, sinônimos e estruturas de seqüências que o usuário tem acesso.
Vários são os tipos de dados usados pelo Oracle criar as colunas de uma tabela. Abaixo
seguem os principais tipos:
58
Além de todos os comandos usados para alteração de uma tabela, também é possível apagá-la,
onde todos os seus dados e estrutura são excluídos, e também todos os índices serão eliminados.
Através da instrução DROP TABLE, mostrada no exemplo abaixo, é possível apagar uma tabela.
Após a criação de uma tabela é possível a alteração do nome da mesma usando a instrução
RENAME:
Modifique a tabela ITENS_PRODUTO para aceitar campo do tipo longo no campo da descrição
do motivo do desconto.
Crie uma tabela chamada ITENS_2 de acordo com a estrutura da tabela ITENS_PRODUTO.
Elimine a coluna do valor de venda do item, e confirme a alteração na tabela através da listagem
da estrutura.
Altere o tipo de dado da coluna COD_REG_ITEM, para o tipo NUMBER com o tamanho 10.
60
NOT NULL;
PRIMARY KEY;
FOREIGN KEY.
A restrição NOT NULL, especifica que a coluna não pode conter um valor nulo. Já a restrição
PRIMARY KEY identifica exclusivamente cada linha da tabela. Por último, a restrição FOREIGN
KEY impõe um relacionamento de chave estrangeira entre a coluna da tabela criada e a coluna da
tabela referencia. Abaixo segue um exemplo que mostra o uso de restrições do Oracle.
A restrição NOT NULL é especificada em nível de coluna e não de tabela. Observe que a
restrição NOT NULL é usada após o tipo de dado.
A restrição PRIMARY KEY cria uma chave primária para a tabela. Somente uma chave
primária pode ser criada para cada tabela. Além disso, a PRIMARY KEY é uma coluna ou conjunto
de colunas que identifica exclusivamente cada linha em uma tabela. Essa restrição impõe a
exclusividade da coluna ou combinação de colunas, assegurando que nenhuma coluna que seja parte
da chave primária possa conter um valor nulo. Observe no exemplo anterior que a restrição
PRIMARY KEY está sendo criada com o uso da cláusula CONSTRAINT (restrição), em seguida
vem o nome da chave, por exemplo, PKEMPREGADONUMEMP, e o nome da coluna entre parênteses
na restrição PRIMARY KEY.
A restrição FOREIGN KEY, permite criar uma restrição de integridade referencial, a qual
designa uma coluna ou combinação de colunas como chave estrangeira e estabelece um
relacionamento entre a chave primária ou uma chave exclusiva na mesma tabela ou uma tabela
diferente. No exemplo anterior novamente é usada cláusula CONSTRAINT (restrição) para o uso
da restrição FOREIGN KEY, onde outra cláusula é colocada (REFERENCES) para referenciar a
outra tabela que faz parte do relacionamento. No exemplo, a tabela que se relaciona com
EMPREGADO é a tabela DEPARTAMENTO através do campo NUMDEPT.
61
14.1. M odificando as restrições de uma tabela
Até o momentofoi visto a criação de restrição na instrução CREATE TABLE. Mas é possível
nós criarmos restrição após a instrução CREATE TABLE. Por meio da instrução ALTER TABLE,
as restrições são adicionadas ou removidas.
Abaixo segue dois exemplos mostrando estas situações:
Adiciona uma restrição FOREIGN KEY à tabela EMPREGADO, indicando que um gerente
deve existir como um empregado válido na tabela EMPREGADO.
14.2. Exercícios
1. Crie a tabela itens de produto com o nome ITENS_PRODUTO de acordo com o exemplo a
seguir, usando a restrição NOT NULL de forma adequada, em seguida confirme se a tabela foi
criada.
3. Crie a tabela produto com o nome PRODUTO de acordo com a tabela de exemplo a seguir,
usando a restrição NOT NULL e a criação do valor padrão de forma adequada, em seguida
confirme se a tabela foi criada.
Onde, OR REPLACE é opcional, e recria a view se ela já existir. Abaixo segue um exemplo
de criação de view:
No exemplo acima é criada uma view simples contendo apenas as colunas da tabela de
empregado. Para confirmar a criação da view, podemos executar o comando DESC[RIBE],
analisando a estrutura criada Logo após podemos usar a instrução SELECT para recuperar dados da
view. A seguir estão relacionados dois exemplos mostrando outras situações de criação de views.
O terceiro exemplo listado acima cria uma view com a estrutura mais complexa, onde lista no
campo QTDE_EMPREGADO_DEPT a quantidade de empregados do departamento 3.
Além das operações acima, o manuseio de views precisa de regras, onde só podemos executar
operações DML em views simples. Não podemos remover uma linha se a view contiver funções de
grupo, cláusula GROUP BY ou a palavra-chave DISTINCT.
15.1. Exercícios
Crie uma view chamada VW_EMPREGADO baseada no nome e número do empregado e
número e número do departamento da tabela de empregados. Coloque nomes de apelidos nas
colunas para nome do empregado.
Usando a view VW_EMPREGADO, elabore uma consulta para exibir todos os nomes dos
empregados e os números de departamento.
v$datafile: Lista os arquivos que contém os dados ou metadados que constam tabelas, índices,
áreas temporárias, entre outros;
v$controlfile: São os arquivos de controle responsáveis pelo sincronismo entre todos os arquivos
do SGBD;
v$logfile: Lista os arquivos que armazenam o histórico de transações efetuadas.
NOTA
No Oracle XE (eXpress Edition) não é permitido a criação de uma nova instância (ou banco de dados -
Database) além da instância XE, criada quando se instala o SGBD. Desta forma, somente é permit ida a
criação de usuários (Schemas), e logo em seguida as tabelas, índices, etc.
Ao instalar o Oracle XE, são criados usuários que servirão para manutenção de novos objetos
no banco de dados, e também a criação de novos usuários, tablespaces e schemas. Os usuários de
sistema são: SYSTEM, SYS e HR. Abaixo são comentadas as características de cada usuário
padrão:
SYSTEM: pode executar as tarefas de gerenciamento do banco de dados, mas não pode iniciar e
parar uma instância
SYS: possui o privilégio de SYSDBA e assim pode executar todas as tarefas administração
HR (Human Resource): corresponde a uma esquema-padrão que o banco de dados cria para fins
de estudo.
Para que um banco de dados esteja pronto para ser utilizado, é necessário executar algumas
etapas de inicialização. As três operações abaixo resumem as etapas de inicialização:
Nomouting: Estado que permite a criação de banco de dados ou recuperação de danos, como por
exemplo, nos arquivos de controle;
Mounting: Os arquivos de controle são lidos e determina-se a localização de demais arquivos;
Opening: Os arquivos de dados e logs são abertos.
66
O DBA pode utilizar algumas ferramentas para desativar o banco de dados e executar
manualmente as etapas citadas anteriormente. Primeiramente, de uma maneira prática, deve-se
utilizar o SQLPlus, e o DBA deve-se conectar como usuário SYS. O exemplo abaixo mostra como
deve ser feita esta conexão:
NOTA
Somente é possível executar os comandos de inicialização de banco como SYSDBA.
O comando SHUTDOWN
Serve para fechar uma Instância ou Banco de Dados. Exemplo:
SQL> SHUTDOWN
Database closed
Database dismounted
O comando STARTUP
Serve para abrir uma instância ou Banco de Dados. Exemplo:
SQL> STARTUP
Oracle instance started.
Total System Global Area 15077376 bytes.
Fixed Size 49152 bytes.
Variable Size 12906496 bytes.
Database Buffers 2048000 bytes.
Redo Buffers 73728 bytes.
Database mouted.
Database opened.
Também é possível iniciar o banco sem passar pela etapa de MOUNTING. Basta digitar o
comando STARTUP NOMOUNT, em seguida aplicar os comandos ALTER DATABASE MOUNT e
ALTER DATABASE OPEN.
NOTA
O comando STARTUP NOMOUNT pode ser usado quando o DBA precisa iniciar o banco de dados mas
mesmo assim necessita efetuar algumas alterações em arquivos físicos de dados ou de controle, para em
seguida montar e abrir o banco de dados.
67
16.2. Exercícios
Uma tablespace representa uma entidade lógica capaz de reunir dados (de controle,
temporários ou dados propriamente ditos) que guardem semelhanças entre si. É possível criar
tablespaces para tabelas ou índices. Além disso, as tablespaces podem ajudar na organização de
dados com relação ao tamanho, onde tabelas ou índices maiores podem ser organizados em
tablespaces maiores, e vice-versa.
Quando o Oracle XE é instalado, são criadas quatro tablespaces. Elas servem para organizar
logicamente as tabelas e os usuários de sistema. Um banco de dados pode ter uma ou várias
tablespaces, e uma tablespace pode ter um ou vários date files. Além disso, um banco de dados
pode ter vários usuários “donos” de schemas, e um schema pode ter tabelas e índices que estão
organizados pelas tablespaces dentro do banco de dados.
Cada tablespace criada após a instalação tem sua importância para o funcionamento do Oracle
XE. De forma resumida pode-se descrever as seguintes tablespaces:
Exemplo:
CREATE TABLESPACE tbl_teste_2
DATAFILE 'c:\auladba\tbl_teste_1.dbf' SIZE 1024K AUTOEXTEND ON
MAXSIZE 10M
,'c:\auladba\tbl_teste_2.dbf' SIZE 1024K AUTOEXTEND ON
MAXSIZE 10M
DEFAULT STORAGE(
INITIAL 100K
NEXT 10K
MINEXTENTS 1
MAXEXTENTS 255
PCTINCREASE 0)
69
NOTA
Ao criar um usuário, pode-se especificar Tablespaces de dados e/ou temporárias. Isto é altamente
recomendável, pois ajuda bastante quando for necessário exportar uma Tablespace para eliminar
fragmentação ou pode ser usada para exportar objetos. Por exemplo:
NOTA
O valores dos Parâmetros de Armazenamento (INITIAL, NEXT, etc.) devem ser obtidos após análise dos
scripts de criação das tabelas. A partir dos tamanhos de cada registro e previsão de volume de dados,
pode-se especificar o tamanho máximo que uma tabela com seus índices alcançará. Recomenda-se
superestimar esses valores. Outra dica importante, que os discos que conterão Tablspaces com dados
tenham entre 20 e 25% de espaço livre. O exemplo seguinte mostra a evolução do tamanho de uma tabela
criada com o INITIAL = 100K, NEXT 50K e PCTINCREASE 100.
À medida que Segmentos com seus EXTENTS vão sendo criados e apagados, a tendência é
que surjam várias “ilhas” de blocos disponíveis. Quanto mais “ilhas”, maior a fragmentação e pior a
performance.
Exemplo:
NOTA
É possível listar os arquivos de dados para as TableSpaces. Basta selecionar a visão DBA_DATA_FILES.
16.7. Exercícios
1. Crie uma TableSpace temporária em dois arquivos auto-expansíveis, tendo cada um o tamanho
de 500 KB. O tamanho máximo de cada arquivo será de 10M. O tamanho inicial dos EXTENTS
será de 100 KB, os seguintes de 200 KB e o crescimento percentual de 100%.
4. Apague a TableSpace.
72
16.8. Criação de Tabelas com parâmetros de armazenamento
Aplicação: Tende a ser grande e muito consultada, e após a carga inicial, é pouco atualizada. Por
exemplo: CEPs
Negócio: Bastante consultada, atualização moderada e possui uma taxa de crecimento muito
pequena. Por exemplo: Alunos e Instrutores.
Transacional: Sofre inserções, atualizações e exclusões constantes. Por exemplo: Histórico.
Uma tabela é criada por meio do comando CREATE TABLE, que possui uma sintaxe
bastante ampla do que a já conhecida, ou seja, além da especificação de constraints e campos, é
possível detalhar a TableSpace, os Parâmetros de Armazenamento e os Parâmetros de Utilização de
Espaço em disco. Tais parâmetros determinam como serão configurados os blocos da tabela.
A sintaxe ainda simplificada do comando é mostrada abaixo:
Exemplo:
CREATE TABLE cliente
(cd_cliente NUMBER(3), nm_cliente VARCHAR2(100))
TABLESPACE tbl_teste_2
PCTFREE 1
PCTUSED 10
INITRANS 1
MAXTRANS 255
STORAGE
(INITIAL 100K
NEXT 10k
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 50)
73
NOTA
É aconselhável a criação das constraints da tabela em um script separado. Por exemplo, usando o
comando ALTER TABLE que será estudado posteriormente no decorrer desta seção. Abaixo segue o
exemplo do comando:
--CRIAÇÃO DA PK
ALTER TABLE cliente ADD CONSTRAINT PK_CLIENTE PRIMARY KEY (cd_cliente);
A seguir, este material mostra uma série de comandos úteis para manutenir uma tabela.
Muitos deste comandos são utilizados durante a administração de um banco de dados, sem a
necessidade de recriar a tabela.
16.10.Adição de Colunas
16.12.Deleção de Colunas
16.13.Adição de Constraints
16.14.Primary Keys
16.15.Foreign Keys
NOTA
Para consultar as constraints criadas no banco, basta listar os dados da visão DBA_CONSTRAINTS.
75
16.16.Deleção de Constraints
NOTA
Existem algumas visões importantes para consulta de tabelas no banco de dados: DBA_TABLES e
USER_TABLES.
76
16.21.Exercícios
4. Execute o script de criação da tabela CLIENTE, usada como exemplo na seção 17.8.
5. Crie uma Foreign Key da tabela CLIENTE para tabela HISTORICO_PEDIDO, com o nome
FK_CLIENTE_HSTR_PEDIDO.
Índices representam objetos de Banco de Dados úteis para acelerar operações de busca.
Imagine uma tabela grande (25 campos, 1.000 bytes por linha, 1.000 registros) criada pelo
comando abaixo:
Ao acessar o campo10, o Oracle precisa carregar as colunas campo1, campo2, ..., campo25.
Como cada registro ocupa 25 X 40 = 1.000 bytes, a leitura de 100 linhas provocaria a carga de
100.000 bytes.
Um índice representa uma estrutura “auxiliar”, que permite a origanização interna utilizando
árvores binárias para localizar rapidamente os dados [MOR 00].
Quanto à unicidade dos dados, índices podem ser de dois tipos [MOR 00]:
Para remover os índices criados é usada a instrução DROP INDEX. Mas para isso é
necessário ter permissão para tal operação:
78
DROP INDEX <NOME DO ÍNDICE>;
Existem motivos para criar índices em um banco de dados. Criamos índices quando a coluna
for usada freqüentemente na cláusula WHERE ou em uma condição de relacionamento, quando a
coluna contiver uma faixa ampla de valores, quando duas ou mais colunas forem usadas juntas com
freqüência em uma cláusula WHERE, ou em uma condição de relacionamento, ou quando uma
tabela for muito grande.
NOTA
Algumas visões podem ser usadas para conferir e acompanhar os índices de uma base de dados. São elas:
DBA_INDEXES e USER_INDEXES.
16.23.Exercícios
2. Crie um índice para a tabela HISTORICO_PEDIDO. Caso não exista, utilize o exercício 1 da
seção 16.10. O índice deve ter os seguintes parâmetros:
16.24.Restrições de Integridade
Restrições baseadas em esquema (ou restrições implicitas): Restrições que podem ser
declaradas de forma não procedural na DDL (chave primária, integridade referencial, restrição de
domínio, etc.);
16.26.Restrições de Domínio
As restrições de domínio especificam dentro de cada tupla, o valor de cada atributo. Os tipos
de dados associados aos domínios incluem os tipos de dados numéricos padrões para inteiros (como
inteiro curto, inteiro e inteiro longo) e os números reais de ponto flutuante. Outros tipos de dados
também são disponibilizados em um SGBD, como, por exemplo, os tipos boleanos, data hora e em
alguns SGBDs, os tipos de dados moeda [ELM e NAV 05].
16.27.Restrições de Chave
Uma relação é definida como um conjunto de tuplas, e todos os elementos de um conjunto são
distintos, por isso, todas as tuplas da relação também devem ser distintas, ou seja, significa que duas
tuplas não podem ter a mesma combinação de valores para todos os seus atributos [ELM e NAV
05].
Para que ocorra unicidade e distinção entre as tuplas , é necessário a criação de uma chave ou
super-chave, chamada chave-primária. A chave primária permite criar a restrição de unicidade em
uma relação.
Existem outras formas de criar uma restrição de unicidade, quando, por exemplo, em uma
mesma relação existe uma chave primária, mas também existe outro atributo que não pode ter os
dados repetidos. Neste caso cria-se um índice único para este atributo, respeitando a restrição.
80
16.28.Check Constraint
Como foi dito anteriormente, as restrições baseadas em aplicação devem ser explicitamente
especificadas no SGBD por meio de programação, ou por meio de instruções especiais. A seguir
serão mostradas as sintaxes e comandos usados para se criar restrição baseadas em aplicação.
16.30.Assertion
Especificação declarativa de uma expressão boleana que deve ser verdadeira para toda a base
de dados (pode envolver várias tabelas). A restrição é criada sem depender de uma tabela
específica. Por exemplo, um cliente não pode ser um vendedor:
16.31.Triggers ou Gatilhos
Trigger ou gatilho é um mecanismo para tratar alterações no Banco de Dados. Deve ser
utilizado com cuidado, ou seja, em um ponto de execução de uma trigger pode ocorrer de outra
trigger ser “disparada”, ou até a mesma (triggers recursivas).
O uso comum de triggers é manter a consistência do Banco de Dados. Em muitos casos, pode-
se utilizar uma restrição para atingir o mesmo objetivo. Porém as triggers são mais flexíveis, vão
além de manter integridade, pois também podem ser utilizadas para estatísticas, e inserir dados de
auditoria das inserções ou alterções na base de dados.
Um exemplo prático do uso de triggers seria em um controle academico. Ao excluir uma
turma seria desejável eliminar automaticamente as entradas desta turma na tabela de Horários; ou
81
caso existam tabelas que representem itens avaliados pelos alunos que, ao matricular um aluno,
sejam inseridos tantos registros quantos forem os itens para a realização da avaliação [MOR 00].
Triggers são objetos do banco de dados que representam unidades de programas que são
executados, automaticamente, antes ou depois de um comando DELETE, INSERT ou UPDATE.
As vantagens obtidas na utilização de triggers são várias:
A crítica aos dados oferece mais possibilidades do que a realizada via constraints ;
Acessos que alterem linhas de uma tabela podem ser registrados em outra (auditoria);
Durante a execução de uma trigger que afete várias linhas , pode-se, eventualmente, consultar
ou modificar os valores antigos e novos da linha sendo alterada. Existem duas variáveis de
ambiente que representam a linha prévia (:old) e a posterior à alteração (:new). Porém, deve-se
observar as regras abaixo [MOR 00]:
Em triggers com o tempo BEFORE, pode-se tanto alterar como consultar :new;
16.32.Criação de Triggers
Para se criar uma trigger, deve-se editar um arquivo texto contendo o comando com a sintaxe
abaixo:
Exemplos:
NOTA
Para desabilitar ou habilitar uma trigger basta usar o seguinte comando:
:NEW.cd_vendedor:= novo_cd_vendedor;
END;
/
83
NOTA
Para execução da trigger anterior seria necessário a criação de uma sequence. O código abaixo mostra
esta criação:
SELECT COUNT(1)
INTO QTDE_VENDEDOR_AUDITORIA
FROM AUDITORIA_VENDEDOR
WHERE CD_VENDEDOR = :OLD.CD_VENDEDOR;
IF QTDE_VENDEDOR_AUDITORIA = 0 THEN
ELSE
UPDATE AUDITORIA_VENDEDOR
SET ATUALIZACAO_VENDEDOR = ATUALIZACAO_VENDEDOR + 1
WHERE CD_VENDEDOR = :OLD.CD_VENDEDOR;
END IF;
END;
/
A razão de ser de um Banco de Dados e seu DBA são os usuários. Tudo o que o DBA faz, em
última análise, tem por objetivo atender às necessidades do usuário. Infelizmente, nem sempre a
relação DBA-usuário é muito amistosa. O objetivo do DBA é atender aos usuários, e ele deve
adaptar da melhor forma às necessidades deles [MOR 00].
Para que o DBA possa atender os anseios dos usuários, ele deve conhecer em detalhes as
seguintes questões:
Um dos pontos fortes do Oracle XE é a segurança que ele oferece na manipulação de objetos.
Uma tabela, view ou synonym somente pode ser manipulado ou acessado por outros usuários caso o
dono ou o DBA dê o acesso.
Para entendimento melhor sobre segurança e nível de acesso, alguns conceitos devem ser
esclarecidos:
Conceito Descrição
Usuário Indivíduo que se conecta ao Banco e utiliza objetos dele. Também
pode criar objetos e permitir que outros usuários manipulem.
Schema Conjunto de objetos (tabelas, índices, visões, etc.) de um usuário.
Pode ser listado com o comando: SELECT * FROM CAT;
Privilégio Direito que um usuário recebe para fazer algo.
Papel (role) Conjunto de privilégios agrupados e com um nome. Facilita
bastante a gerência de privilégios.
O DBA deve saber criar usuários (comando CREATE USER), atribuir-lhes privilégios de
sistema ou objeto e, de preferência, criar papéis (roles) que concentrem grupos de privilégios que
possam ser atribuídos a mais de um usuário.
16.37.Usuários
Geralmente, quem cria usuários é o DBA, ou alguém designado por ele, e com privilégio para
tal. A sintaxe simplificada do comando cria usuários é a seguinte:
Em que:
Nome Identificação do usuário criado
Senha Senha com, no mínimo, seis caracteres, podendo conter números ou
letras. Não devem ser óbvias e freqüentemente devem ser alteradas.
Default tablespace TableSpace destino de tabelas ou índices criados pelo usuário,
quando outra não for especificada.
Temporary TableSpace temporária utilizada pelos comandos emitidos pelo
tablespace usuário.
quota Espaço que pode ser utilizado em determinada TableSpace.
Exemplo:
NOTA
Para comprovar a existência de um usuário, pode-se utilizar a visão ALL_USERS.
Usuários DBA possuem privilégios de sistema para mudar senhas, ou o próprio usuário, pode
alterar a senha de acesso ao Oracle XE, utilizando o comando ALTER USER. Por exemplo:
Usuários também pode ser apagados. É bom observar que todos os objetos criados por ele
também podem ser apagados, usando a seguinte de linha de comando:
Evidentemte, nem todos usuários tem o direito de apagar outros usuários. Somente aqueles
que tiverem direito para tal.
16.38.Privilégios de Sistema
Ao ser criado, um usuário não tem direito nem de se conectar. Para que possa ser considerado
como um usuário, ele deve receber alguns privilégios de sistema. Veja alguns exemplos:
create session
create table
alter table
create sequence
create view
create user
drop user
86
Para conceder privilégios de sistema ou qualquer outro tipo de privilégio, deve-se utilizar o
comando GRANT, cuja sintaxe é:
em que:
Uma vez criado o usuário, ele deve receber privilégios de conexão. Para que o usuário possa
“logar” no banco, deve-se conceder o privilégio de SESSION.
NOTA
Para comprovar a existência de um usuário, pode-se utilizar a visão ALL_USERS.
16.39.Privilégios de Objeto
Privilégios de obejto servem, basicamente, para que outros usuários, que não o dono, ou
aqueles que tenham privilégios de sistema de tipo ANY, possam ler, alterar ou até mesmo apagar
linhas de tabelas. Os privilégios de obejto são:
87
Privilégio Tabela View Sequence Procedure
alter X X
deleted X X
execute X
index X
insert X X
references X
select X X X
update X X
all X X X X
Para conceder privilégios de objeto, também utilizamos o comando GRANT. Sua sintaxe é:
Exemplo:
NOTA
É possível retirar algum privilégio de objeto. Para isso pode-se usar o comando REVOKE:
16.40.Roles
Role é um grupo de privilégios (sistema ou objeto), reunidos sob um único nome, que pode
ser concedido a um ou mais usuários. O Oracle XE já oferece algumas roles predefinidas. Por meio
da visão DBA_ROLES é possível identificá- la, por exemplo:
Toda ROLE é pública. Não se trata de um objeto que pertença a alguém. Quem tiver
privilégio para criar roles, o faz com o comando abaixo:
Uma vez criada, uma role pode receber privilégios e ser concedida a uma usuário:
88
CREATE ROLE GERENCIA;
GRANT CREATE TABLE, CREATE VIEW TO GERENCIA;
GRANT GERENCIA TO evaldo;
NOTA
Para visualizar roles, devem-se investigar as visões USER_ROLE_PRIVS e ROLE_ROLE_PRIVS ;
Também é possível retirar privilégio de roles, ou até mesmo retirar a role de um usuário.
Desta forma, utiliza-se o comando revoke:
16.41.Exercícios
5. Crie uma role com o privilégio de CREATE USER. Atribua a role criada ao usuário
EXERC1618.
O que copiar?
Qual a freqüência da realização das cópias?
Quem deve realizar as cópias?
Destino isto é, para onde (Disco, Fita)?
É possível realizar cópias ou exportação de dados por diversas razões: segurança, necessidade
de migração de dados (base de produção / base de desenvolvimento), necessidade de desfragmentar
tabelas, transporte de schemas [MOR, 2000].
O utilitário de exportação trabalha em três modos:
FULL: copia todos os Schemas. Permitido somente para quem tiver o papel
EXP_FULL_DATABASE;
USER: copia um Schema;
TABLE: copia uma tabela que pertença a uma dado Schema.
NOTA
É recomendado que a exportação e importação sejam feitas somente com o us uário DBA.
Esta seção descreve os passos necessários para efetuar um backup e uma restore no banco de
dados. O Oracle XE possibilita a realização de backup e a restauração do banco de dados de forma
muito simples, baseado na proteção física dos arquivos feitos pelo banco de dados, incluindo os
seguintes arquivos [SIL, 2007]:
Para incluir os arquivos de log, o banco de dados deve estar em modo de arquivamento, do
tipo ARCHIVELOG. No Oracle 10 XE, o backup é efetuado por scripts prontos do RMAN
(Recovery Manager), que é uma aplicação desenvolvida especificamente para backup e recover de
banco de dados Oracle [SIL, 2007].
O padrão do banco de dados que é criado no Oracle XE é o modo NOARCHIVELOG,
fazendo com que não sejam armazenados os arquivos de Logs. Nesta forma de trabalho, quando a
instância tiver algum dano, o DBA não conseguirá voltar completamente com todos os dados até o
último instante do problema ocorrido. Neste caso todas as transações e objetos deverão ser refeitos.
Para se utilizar o RMAN, o DBA deve-se trocar a opção NOARCHIVELOG para ARCHIVELOG,
seguindo orientações da Oracle. Em seguida, poderá retornar com a opeção anterior.
A rotina abaixo mostra os comandos básicos para a execução de backups e recoveries no
Oracle XE por meio do utilitário RMAN. Cada linha de comando está comentada explicando a
sintaxe de execução:
------------------------------------------------------------------
/*
1-)O comando ALTER SYSTEM permite alterar os parâmetros de
sistema.
O parâmetro DB_RECOREY_FILE_DEST, especifica a localização padrão
para área de recuperação de backup. A área de recovery contém a
cópia de arquivos de controle, logs e arquivos de dados.
Obs.: Deve-se logar com o usuário SYS como SYSDBA.
*/
------------------------------------------------------------------
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '/';
------------------------------------------------------------------
91
/*
2-) O parâmetro DB_RECOREY_FILE_DEST_SIZE, especifica (em bytes) o
limite máximo da área estabelecida no parâmetro
DB_RECOREY_FILE_DEST para backup e restauração de dados.
*/
------------------------------------------------------------------
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 2G;
------------------------------------------------------------------
/*
3-)Desativa o banco de dados. Esta operação deve ser executada
caso o banco de dados esteja com opção NOARCHIVELOG. Caso
contrários os comandos enumerados como 3, 4, 5 e 6 não devem ser
executados.
*/
------------------------------------------------------------------
SHUTDOWN;
------------------------------------------------------------------
/*
4-) Para habilitar a opção ARCHIVELOG, o banco de dados deve ser
iniciado sem montar os arquivos de sistema.
*/
------------------------------------------------------------------
STARTUP NOMOUNT;
------------------------------------------------------------------
/*
5-) Em seguida deve-se mudar o stauts do banco de dados para
MOUNT.
*/
------------------------------------------------------------------
ALTER DATABASE MOUNT;
---------------------------------------------------------- --------
/*
6-) Em seguida deve-se estabelecer a mudança para ARCHIVELOG.
*/
------------------------------------------------------------------
ALTER DATABASE ARCHIVELOG;
------------------------------------------------------------------
92
/*
7-) Em seguida o DBA deve logar no utilitário RMAN, por meio do
PROMPT do DOS, basta digitar “RMAN TARGET /”. A seguir são
definidos cada comando usados na execução do BACKUP incremental:
*/
------------------------------------------------------------------
RUN {
RECOVER COPY OF DATABASE WITH TAG 'backup';
BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'backup'
DATABASE;
}
/*
8-) Para recuperar o backup, basta digitar o comando abaixo.
*/
------------------------------------------------------------------
RESTORE DATABASE;
------------------------------------------------------------------
NOTA
É possível listar de arquivos de dados e arquivos temporários por meio do RMAN. Basta di gitar o comando
REPORT SCHEMA. Desta forma, é possível analisar o arquivo de dados que pode ser recuperado
separadamente.
/*
9-) Para recuperar um DATAFILE específico.
*/
------------------------------------------------------------------
RECOVER DATAFILE 2;
------------------------------------------------------------------
16.46.Exercícios
O comando COPY é um utilitário usado para copiar dados entre duas bases de dados por meio
do aplicativo SQLPlus.O comando COPY copia dados de uma instância para outra por meio de uma
conexão tanto no servidor quanto no client Oracle.
Os parâmetros do utilitário COPY são:
create: Se a tabela no destino já existe, o utilitário COPY emite um erro, se a tabela não existir
ele cria a tabela e copia os dados.
replace: Se a tabela no destino já existe, o utilitário faz o “drop” e “create” da tabela e copia os
dados novos para a tabela.
insert: Se a tabela de destino já existe, o utilitário COPY tenta inserir novas linhas na tabela. Se
já houver linhas na tabela, o COPY emite um erro e aborta a operação.
append: Insere as linhas que faltam na tabela de destino e que estão contidas no arquivo de
input.
Exemplo:
Exemplo:
Para testar se o dblink foi criado com sucesso pode-se utilizar o seguinte comendo SELECT:
NOTA
Para manter-se a transparência no acesso a objetos de outros bancos de dados pode-se criar sinônimos
públicos para os objetos acessados através remotamente.
Sintaxe do comando:
Exemplo:
16.49.Exercícios
1. Crie a tabela cliente detalhada na seção 16.8 com o nome CLIENTE_{COMPUTADOR}. Onde
COMPUTADOR é o número da máquina do laboratório do curso.
2. Crie um usuário para servir acessar a tabela do banco de dados remoto. O nome do usuário será
USUA_{COMPUTADOR}. O usuário deve ter direito de CREATE SESSION, direito de SELECT
na tabela criada.
Referências
[ELM e NAV 05] ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de Banco de Dados.
São Paulo: Addison Wesley, 2005.
[HEU 98] HEUSER, Carlos Alberto. Projeto de Banco de Dados. Porto Alegre: Sagra Luzzatto,
1998.
[MOR 00] MORELLI, Eduardo Terra. Oracle 8 SQL, PL/SQL & Administração. São
Paulo:Érica, 2000.
[PRE 06] PRESSMAN, Roger S. Engenharia de Software. 6 ed. São Paulo: McGraw-Hill, 2006.
[SER e REZ 06] SERSON, Roberto R.; REZENDE, Ricardo. Oracle 11g Express Edition.
SQLMagazine, Rio de Janeiro, v. 37, p. 34 – 39, 2006.
[SIL 07] SILVA, Robson Soares. Oracle 11g Express Edition. São Paulo: Érica, 2007.
[WAZ 04] WAZLAWICK, Raul Sidnei. Análise e Projeto de Informação Orientados a Objetos.
Rio de Janeiro: Campos, 2004.