Você está na página 1de 270

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos


de SQL II

Guia do Aluno • Volume II

D64260BP10
Edição 1.0
Outubro de 2011
D74865
Autores Copyright © 2011, Oracle. Todos os direitos reservados.

Chaitanya Koratamaddi Isenção de Responsabilidade


Brian Pottle Este curso oferece uma visão geral dos recursos e aprimoramentos planejados na
Tulika Srivastava release 11g. Ele tem como único objetivo ajudar você a avaliar as vantagens
comerciais da atualização para 11g e planejar seus projetos de TI.

Revisores e Este curso, em qualquer formato, incluindo seu material prático e impresso, contém
informações proprietárias exclusivas da Oracle. Este curso e as informações contidas
Colaboradores Técnicos aqui não podem ser divulgadas, copiadas, reproduzidas nem distribuídas sem a
permissão por escrito da Oracle. Seu conteúdo não faz parte do contrato de licença e
Claire Bennett nem pode ser incluído em nenhum acordo contratual com a Oracle, suas empresas
Ken Cooper subsidiárias ou afiliadas.
Yanti Chang
Este curso se destina apenas a fins informativos e tem como único objetivo auxiliar
Laszlo Czinkoczki você no planejamento para implementação e atualização dos recursos descritos do
Burt Demchick produto. Não é assumido o compromisso de fornecimento de qualquer material,
código ou funcionalidade e não há a implicação em decisões de compra. O
Gerlinde Frenzen desenvolvimento, a liberação e a duração de qualquer recurso ou funcionalidade
Joel Goodman

Oracle Internal & Oracle Academy Use Only


descritos neste documento ficam a critério exclusivo da Oracle.
Laura Garza
Este documento contém informações de propriedade da Oracle Corporation e está
Richard Green protegido pela legislação de direitos autorais e outras leis de propriedade intelectual,
Nancy Greenberg podendo ser copiado e impresso somente para uso individual em um curso de
Akira Kinutani treinamento Oracle. O documento não pode ser modificado nem alterado de forma
alguma. Exceto em situações que constituam "uso justo" de acordo com a legislação
Wendy Lo de direitos autorais, não será permitido utilizar, compartilhar, descarregar, carregar,
Isabelle Marchand copiar, imprimir, executar, reproduzir, publicar, licenciar, divulgar, transmitir nem
distribuir este documento - total ou parcialmente - sem a expressa autorização da
Timothy Mcglue Oracle.
Alan Paulson
Manish Pawar As informações contidas neste documento estão sujeitas a alterações sem aviso
prévio. Se você encontrar algum problema no documento, envie à Oracle Corporation
Srinivas Putrevu ou à Oracle do Brasil Sistemas Ltda. uma descrição de tal problema por escrito.
Bryan Roberts Oracle University, 500 Oracle Parkway, Redwood Shores, California 94065 USA. A
Clinton Shaffer Oracle Corporation não garante que este documento esteja isento de erros.

Hilda Simson Aviso de Direitos Restritos


Abhishek Singh
Se esta documentação for entregue / distribuída ao Governo dos Estados Unidos ou
Jenny Tsai Smith a qualquer outra parte que a licencie ou utilize em nome daquele governo, a seguinte
James Spiller legenda será aplicável:
Lori Tritz
U.S. GOVERNMENT RIGHTS
Lex van der Werff The U.S. Government’s rights to use, modify, reproduce, release, perform, display, or
Marcie Young disclose these training materials are restricted by the terms of the applicable Oracle
license agreement and/or the applicable U.S. Government contract.

Redatores Aviso de Marca Comercial


Amitha Narayan
Oracle é uma marca comercial da Oracle Corporation e/ou de suas empresas
Daniel Milne afiliadas. Outros nomes podem ser marcas comerciais de seus respectivos
Raj Kumar proprietários.

Designer Gráfico
Satish Bettegowda

Editores
Veena Narasimhan
Pavithran Adka
Conteúdo

I Introdução
Objetivos da Lição I-2
Agenda de Lições I-3
Objetivos do Curso I-4
Pré-Requisitos do Curso I-5
Agenda do Curso I-6

Oracle Internal & Oracle Academy Use Only


Agenda de Lições I-7
Tabelas Usadas no Curso I-8
Apêndices Usados Neste Curso I-9
Ambientes de Desenvolvimento I-10
Agenda de Lições I-11
Verificação de Restringindo Dados I-12
Verificação de Classificando Dados I-13
Verificação de Funções SQL I-14
Verificação de Funções de Linha Única I-15
Verificação de Tipos de Funções de Agrupamento I-16
Verificação de Usando Subconsultas I-17
Verificação de Manipulando Dados I-18
Agenda de Lições I-19
Documentação SQL do Oracle Database I-20
Recursos Adicionais I-21
Sumário I-22
Exercício I: Visão Geral I-23

1 Controlando o Acesso do Usuário


Objetivos 1-2
Agenda de Lições 1-3
Controlando o Acesso do Usuário 1-4
Privilégios 1-5
Privilégios de Sistema 1-6
Criando Usuários 1-7
Privilégios de Sistema do Usuário 1-8
Concedendo Privilégios de Sistema 1-9
Agenda de Lições 1-10
O Que é uma Função? 1-11
Criando e Concedendo Privilégios a uma Função 1-12

iii
Alterando a Senha 1-13
Agenda de Lições 1-14
Privilégios de Objeto 1-15
Concedendo Privilégios de Objeto 1-17
Repassando seus Privilégios 1-18
Confirmando Privilégios Concedidos 1-19
Agenda de Lições 1-20
Revogando Privilégios de Objeto 1-21
Questionário 1-23
Sumário 1-24
Exercício 1: Visão Geral 1-25

Oracle Internal & Oracle Academy Use Only


2 Gerenciar Objetos de Esquema
Objetivos 2-2
Agenda de Lições 2-3
Instrução ALTER TABLE 2-4
Adicionando uma Coluna 2-6
Modificando uma Coluna 2-7
Eliminando uma Coluna 2-8
Opção SET UNUSED 2-9
Agenda de Lições 2-11
Adicionando uma Sintaxe de Restrição 2-12
Adicionando uma Restrição 2-13
Cláusula ON DELETE 2-14
Adiando Restrições 2-15
Diferença Entre INITIALLY DEFERRED e INITIALLY IMMEDIATE 2-16
Eliminando uma Restrição 2-18
Desativando Restrições 2-19
Ativando Restrições 2-20
Restrições em Cascata 2-22
Renomeando Colunas de Tabela e Restrições 2-24
Agenda de Lições 2-25
Visão Geral de Índices 2-26
CREATE INDEX com a instrução CREATE TABLE 2-27
Índices Baseados em Function 2-29
Removendo um índice 2-30
DROP TABLE … PURGE 2-31
Agenda de Lições 2-32
Instrução FLASHBACK TABLE 2-33
Usando a Instrução FLASHBACK TABLE 2-35

iv
Agenda de Lições 2-36
Tabelas Temporárias 2-37
Criando uma Tabela Temporária 2-38
Agenda de Lições 2-39
Tabelas Externas 2-40
Criando um Diretório para a Tabela Externa 2-41
Criando um Diretório para a Tabela Externa 2-43
Criando uma Tabela Externa Usando o ORACLE_LOADER 2-45
Consultando Tabelas Externas 2-47
Criando uma Tabela Externa Usando o ORACLE_DATAPUMP: Exemplo 2-48
Questionário 2-49

Oracle Internal & Oracle Academy Use Only


Sumário 2-51
Exercício 2: Visão Geral 2-52

3 Gerenciando Objetos com Views do Dicionário de Dados


Objetivos 3-2
Agenda de Lições 3-3
Dicionário de Dados 3-4
Estrutura do Dicionário de Dados 3-5
Como Usar Views de Dicionário 3-7
USER_OBJECTS e ALL_OBJECTS Views 3-8
USER_OBJECTS View 3-9
Agenda de Lições 3-10
Informações da Tabela 3-11
Informações da Coluna 3-12
Informações de Constraint 3-14
USER_CONSTRAINTS: Exemplo 3-15
Consultando USER_CONS_COLUMNS 3-16
Agenda de Lições 3-17
Informações da View 3-18
Informações de Sequência 3-19
Confirmando Sequências 3-20
Informações do Índice 3-21
USER_INDEXES: Exemplos 3-22
Consultando USER_IND_COLUMNS 3-23
Informações de Sinônimo 3-24
Agenda de Lições 3-25
Adicionando Comentários a uma Tabela 3-26

v
Questionário 3-27
Sumário 3-28
Exercício 3: Visão Geral 3-29

4 Manipulando Grandes Conjuntos de Dados


Objetivos 4-2
Agenda de Lições 4-3
Usando Subconsultas para Manipular Dados 4-4
Recuperando Dados Usando uma Subconsulta como Origem 4-5
Inserindo com o Uso de uma Subconsulta como Destino 4-7
Usando a Palavra-Chave WITH CHECK OPTION em Instruções DML 4-9

Oracle Internal & Oracle Academy Use Only


Agenda de Lições 4-11
Visão Geral do Recurso Default Explícito 4-12
Usando Valores Default Explícitos 4-13
Copiando linhas de outra tabela 4-14
Agenda de Lições 4-15
Visão Geral de Instruções INSERT em Várias Tabelas 4-16
Tipos de Instruções INSERT em Várias Tabelas 4-18
Instruções INSERT em Várias Tabelas 4-19
Incondicional INSERT ALL 4-21
Condicional INSERT ALL: Exemplo 4-23
Condicional INSERT ALL 4-24
Condicional INSERT FIRST: Exemplo 4-26
Condicional INSERT FIRST 4-27
Criar Pivôs com INSERT 4-29
Agenda de Lições 4-32
Instrução MERGE 4-33
Sintaxe da Instrução MERGE 4-34
Intercalando Linhas: Exemplo 4-35
Agenda de Lições 4-38
Rastreando Alterações nos Dados 4-39
Exemplo de Flashback de Consulta de Versão 4-40
Cláusula VERSIONS BETWEEN 4-42
Questionário 4-43
Sumário 4-44
Exercício 4: Visão Geral 4-45

5 Gerenciando Dados em Diferentes Fusos Horários


Objetivos 5-2
Agenda de Lições 5-3

vi
Fusos Horários 5-4
Parâmetro de Sessão TIME_ZONE 5-5
CURRENT_DATE, CURRENT_TIMESTAMP e LOCALTIMESTAMP 5-6
Comparando Data/Horário no Fuso Horário de uma Sessão 5-7
DBTIMEZONE e SESSIONTIMEZONE 5-9
Tipos de dados TIMESTAMP 5-10
Campos TIMESTAMP 5-11
Diferença Entre DATE e TIMESTAMP 5-12
Comparando Tipos de Dados de TIMESTAMP 5-13
Agenda de Lições 5-14
Tipos de Dados de INTERVAL 5-15

Oracle Internal & Oracle Academy Use Only


Campos INTERVAL 5-17
INTERVAL YEAR TO MONTH: Exemplo 5-18
Tipo de Dados de INTERVAL DAY TO SECOND: Exemplo 5-20
Agenda de Lições 5-21
EXTRACT 5-22
TZ_OFFSET 5-23
FROM_TZ 5-25
TO_TIMESTAMP 5-26
TO_YMINTERVAL 5-27
TO_DSINTERVAL 5-28
Horário de Verão 5-29
Questionário 5-31
Sumário 5-32
Exercício 5: Visão Geral 5-33

6 Recuperando Dados Usando Subconsultas


Objetivos 6-2
Agenda de Lições 6-3
Subconsultas de Várias Colunas 6-4
Comparações de Coluna 6-5
Subconsulta de Comparação em Pares 6-6
Subconsulta de Comparação em Não-pares 6-8
Agenda de Lições 6-10
Expressões de Subconsulta Escalar 6-11
Subconsultas Escalares: Exemplos 6-12
Agenda de Lições 6-14
Subconsultas Correlacionadas 6-15
Usando Subconsultas Correlacionadas 6-17
Agenda de Lições 6-19

vii
Usando o Operador EXISTS 6-20
Localize Todos os Departamentos que Não Possuem Funcionários 6-22
UPDATE Correlacionada 6-23
Usando uma Instrução UPDATE Correlacionada 6-24
DELETE Correlacionada 6-26
Usando a Instrução DELETE Correlacionada 6-27
Agenda de Lições 6-28
Cláusula WITH 6-29
Cláusula WITH: Exemplo 6-30
Cláusula Recursiva WITH 6-32
Cláusula Recursiva WITH: Exemplo 6-33

Oracle Internal & Oracle Academy Use Only


Questionário 6-34
Sumário 6-35
Exercício 6: Visão Geral 6-37

7 Suporte a Expressões Comuns


Objetivos 7-2
Agenda de Lições 7-3
O que São Expressões Comuns? 7-4
Vantagens do Uso de Expressões Comuns 7-5
Usando Functions e Condições de Expressões Comuns em SQL e PL/SQL 7-6
Agenda de Lições 7-7
O que São Metacaracteres? 7-8
Usando Metacaracteres com Expressões Comuns 7-9
Agenda de Lições 7-11
Functions e Condições de Expressões Comuns: Sintaxe 7-12
Executando uma Pesquisa Básica com a Condição REGEXP_LIKE 7-13
Substituindo Padrões com a Função REGEXP_REPLACE 7-14
Localizando Padrões com a Função REGEXP_INSTR 7-15
Extraindo Substrings com a Função REGEXP_SUBSTR 7-16
Agenda de Lições 7-17
Subexpressões 7-18
Usando Subexpressões com Suporte a Expressões Comuns 7-19
Por que Acessar a enésima Subexpressão? 7-20
REGEXP_SUBSTR: Exemplo 7-21
Agenda de Lições 7-22
Usando a Function REGEXP_COUNT 7-23
Expressões Comuns e Constraints de Verificação: Exemplos 7-24
Questionário 7-25

viii
Sumário 7-26
Exercício 7: Visão Geral 7-27

Apêndice A: Exercícios e Soluções

Apêndice B: Descrição das Tabelas

Apêndice C: Usando o SQL Developer


Objetivos C-2
O que É o Oracle SQL Developer? C-3
Especificações do SQL Developer C-4

Oracle Internal & Oracle Academy Use Only


Interface do SQL Developer 1.5 C-5
Criando uma Conexão de Banco de Dados C-7
Navegando por Objetos de Banco de Dados C-10
Exibindo a Estrutura da Tabela C-11
Procurando Arquivos C-12
Criando um Objeto de Esquema C-13
Criando uma Nova Tabela: Exemplo C-14
Usando a Planilha SQL C-15
Executando Instruções SQL C-18
Salvando Scripts SQL C-19
Executando Arquivos de Script Salvos: Método 1 C-20
Executando Arquivos de Script Salvos: Método 2 C-21
Formatando o Código SQL C-22
Usando Snippets C-23
Usando Snippets: Exemplo C-24
Depurando Procedures e Funções C-25
Geração de Relatórios de Banco de Dados C-26
Criando um Relatório Definido pelo Usuário C-27
Mecanismos de Pesquisa e Ferramentas Externas C-28
Definindo Preferências C-29
Redefinindo o Layout do SQL Developer C-30
Sumário C-31

Apêndice D: Usando o SQL*Plus


Objetivos D-2
Interação entre SQL e SQL*Plus D-3
Instruções SQL Versus Comandos do SQL*Plus D-4
Visão Geral do SQL*Plus D-5
Efetuando Login no SQL*Plus D-6
Exibindo a Estrutura da Tabela D-7

ix
Comandos de Edição do SQL*Plus D-9
Usando LIST, n e APPEND D-11
Usando o Comando CHANGE D-12
Comandos de Arquivo do SQL*Plus D-13
Usando os Comandos SAVE e START D-14
Comando SERVEROUTPUT D-15
Usando o Comando SPOOL do SQL*Plus D-16
Usando o Comando AUTOTRACE D-17
Sumário D-18

Apêndice E: Usando o JDeveloper

Oracle Internal & Oracle Academy Use Only


Objetivos E-2
Oracle JDeveloper E-3
Database Navigator E-4
Criando uma Conexão E-5
Navegando por Objetos de Banco de Dados E-6
Executando Instruções SQL E-7
Criando Unidades de Programa E-8
Compilando E-9
Executando uma Unidade de Programa E-10
Eliminando uma Unidade de Programa E-11
Janela Structure E-12
Janela Editor E-13
Application Navigator E-14
Implantando Procedures Java Armazenados E-15
Publicando Java em PL/SQL E-16
Como Posso Obter Mais Informações sobre o JDeveloper 11g? E-17
Sumário E-18

Apêndice F: Gerando Relatórios por Agrupamento de Dados Relacionados


Objetivos F-2
Verificar funções de grupo F-3
Análise da cláusula GROUP BY F-4
Análise da cláusula HAVING F-5
GROUP BY com os operadores ROLLUP e CUBE F-6
Operador ROLLUP F-7
Operador ROLLUP: Exemplo F-8
Operador CUBE F-9
Operador CUBE: Exemplo F-10
Função GROUPING F-11

x
Função GROUPING: Exemplo F-12
GROUPING SETS F-13
GROUPING SETS: Exemplo F-15
Colunas compostas F-17
Colunas compostas: Exemplo F-19
Agrupamentos concatenados F-21
Agrupamentos concatenados: Exemplo F-22
Sumário F-23

Apêndice G: Recuperação da Hierarquia


Objetivos G-2

Oracle Internal & Oracle Academy Use Only


Dados de amostra da tabela EMPLOYEES G-3
Estrutura em árvore natural G-4
Consultas hierárquicas G-5
Percorrendo a árvore G-6
Percorrendo a árvore: de baixo para cima G-8
Percorrendo a árvore: de cima para baixo G-9
Classificando linhas com pseudocoluna LEVEL G-10
Formatando relatórios hierárquicos usando LEVEL e LPAD G-11
Limpando ramificações G-13
Sumário G-14

Apêndice H: Scripts Avançados de Gravação


Objetivos H-2
Usando SQL para gerar SQL H-3
Criando um script básico H-4
Controlando o ambiente H-5
O quadro completo H-6
Fazendo dump do conteúdo de uma tabela para um arquivo H-7
Gerando um predicado dinâmico H-9
Sumário H-11

Apêndice I: Componentes da Arquitetura do Banco de Dados Oracle


Objetivos I-2
Arquitetura do banco de dados Oracle: Visão Geral I-3
Estruturas do servidor de banco de dados Oracle I-4
Conectando-se ao banco de dados I-5
Interagindo com um banco de dados Oracle I-6
Arquitetura de memória Oracle I-8
Arquitetura de Processo I-10
Processo database writer I-12

xi
Processo log writer I-13
Processo checkpoint I-14
Processo monitor do sistema I-15
Processo do monitor do processo I-16
Arquitetura de armazenamento do banco de dados Oracle I-17
Estruturas Lógicas e Físicas do Banco de Dados I-19
Processando uma instrução SQL I-21
Processando uma consulta I-22
Shared Pool I-23
Buffer cache do banco de dados I-25
PGA (Program Global Area) I-26

Oracle Internal & Oracle Academy Use Only


Processando uma instrução DML I-27
Buffer de redo log I-29
Segmento de rollback I-30
Processamento de COMMIT I-31
Resumo da arquitetura do banco de dados Oracle I-33

Exercícios e Soluções Adicionais

xii
Apêndice A
Exercícios e Soluções

Oracle Internal & Oracle Academy Use Only


Índice
Exercícios e Soluções da Lição I ........................................................................................ 3
Exercício I-1: Acessando Recursos do SQL Developer ................................................. 4
Exercício I-2: Usando o SQL Developer ........................................................................ 5
Soluções do Exercício I-1: Acessando Recursos do SQL Developer............................. 7
Soluções do Exercício I-2: Usando o SQL Developer.................................................... 8
Exercícios e Soluções da Lição 1...................................................................................... 17
Exercício 1-1: Controlando o Acesso do Usuário......................................................... 17
Soluções do Exercício 1-1: Controlando o Acesso do Usuário .................................... 20
Exercícios e Soluções da Lição 2...................................................................................... 25
Exercício 2-1: Gerenciando Objetos de Esquema ........................................................ 25
Soluções do Exercício 2-1: Gerenciando Objetos de Esquema .................................... 31

Oracle Internal & Oracle Academy Use Only


Exercícios e Soluções da Lição 3...................................................................................... 39
Exercício 3-1: Gerenciando Objetos com Views do Dicionário de Dados................... 39
Soluções do Exercício 3-1: Gerenciando Objetos com Views do Dicionário
de Dados.................................................................................................................... 43
Exercícios e Soluções da Lição 4...................................................................................... 47
Exercício 4-1: Manipulando Grandes Conjuntos de Dados.......................................... 47
Soluções do Exercício 4-1: Manipulando Grandes Conjuntos de Dados ..................... 51
Exercícios e Soluções da Lição 5...................................................................................... 56
Exercício 5-1: Gerenciando Dados em Diferentes Fusos Horários .............................. 56
Soluções do Exercício 5-1: Gerenciando Dados em Diferentes Fusos Horários.......... 59
Exercícios e Soluções da Lição 6...................................................................................... 62
Exercício 6-1: Recuperando Dados Usando Subconsultas ........................................... 62
Soluções do Exercício 6-1: Recuperando Dados Usando Subconsultas....................... 66
Exercícios e Soluções da Lição 7...................................................................................... 70
Exercício 7-1: Suporte a Expressões Comuns .............................................................. 70
Soluções do Exercício 7-1: Suporte a Expressões Comuns.......................................... 72

Oracle Database: Fundamentos de SQL II A - 2


Exercícios e Soluções da Lição I
Neste exercício, você deverá verificar os recursos disponíveis do SQL Developer. Você
também aprenderá a lidar com a conta de usuário que utiliza neste curso. Inicie o SQL
Developer, crie uma nova conexão de banco de dados e navegue até suas tabelas de RH.
Você deverá ajustar algumas preferências do SQL Developer, executar instruções SQL e
um bloco PL/SQL anônimo utilizando o SQL Worksheet. Por último, você acessará e
adicionará um marcador à documentação do Oracle Database 11g e a outros Web sites
úteis que poderá utilizar neste curso.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II A - 3


Exercício I-1: Acessando Recursos do SQL Developer
Neste exercício, você executará as seguintes ações:
1) Acesse a home page do SQL Developer.
a. Acesse a home page do SQL Developer disponível em:
http://www.oracle.com/technology/products/database/sql_developer/index.ht
ml
b. Salve-a nos favoritos para acessar mais facilmente no futuro.
2) Acesse o tutorial do SQL Developer, que está disponível on-line em:
http://st-curriculum.oracle.com/tutorial/SQLDeveloper/index.htm. Em seguida,
verifique as seguintes seções e demonstrações associadas:
a) What to Do First

Oracle Internal & Oracle Academy Use Only


b) Working with Database Objects
c) Accessing Data

Oracle Database: Fundamentos de SQL II A - 4


Exercício I-2: Usando o SQL Developer
1) Inicie o SQL Developer usando o ícone do desktop.
2) Crie uma conexão com o banco de dados utilizando as seguintes informações:
a) Nome da Conexão: myconnection
b) Nome de usuário: oraxxem que xx é o número de seu PC (Peça ao instrutor
para que atribua a você uma conta ora entre a faixa ora21-ora40.)
c) Senha: oraxx
d) Nome do host: localhost
e) Porta: 1521
f) SID: orcl (ou outro valor fornecido pelo instrutor)
3) Teste a nova conexão. Se o status for Bem-sucedido, estabeleça a conexão com o

Oracle Internal & Oracle Academy Use Only


banco de dados usando a nova conexão.
a) Clique no botão Test na janela New/Select Database Connection.
b) Se o status for Success, clique no botão Connect.
4) Navegue pela estrutura da tabela EMPLOYEES e exiba os dados.
a) Expanda a conexão myconnection clicando no sinal de mais ao lado dela.
b) Expanda o ícone Tables clicando no sinal de mais ao lado dele.
c) Exiba a estrutura da tabela EMPLOYEES.
d) Visualize os dados da tabela DEPARTMENTS.
5) Execute algumas instruções SELECT básicas para consultar os dados da tabela
EMPLOYEES na área da Planilha SQL. Clique nos ícones Execute Statement (ou
pressione [F9]) e Run Script (ou pressione [F5]) para executar as instruções
SELECT. Verifique os resultados dos dois métodos de execução das instruções
SELECTnas páginas com guias apropriadas.
a) Crie uma consulta para selecionar o sobrenome e o salário dos funcionários
cujos salários são inferiores ou equivalentes a US$ 3.000,00.
b) Crie uma consulta para exibir sobrenome, ID do cargo e comissão para todos
os funcionários não autorizados a receber uma comissão.
6) Defina sua preferência de caminho do script como /home/oracle/labs/sql2.
a) Selecione Tools > Preferences > Database > Worksheet Parameters.
b) Digite o valor no campo Select default path to look for scripts.
7) Informe o seguinte na caixa Enter SQL Statement:
SELECT employee_id, first_name, last_name,
FROM employees;
8) Salve a instrução SQL em um arquivo de script utilizando o item File > Save As,
no menu.
a) Selecione File > Save As.
b) Nomeie o arquivo como intro_test.sql.

Oracle Database: Fundamentos de SQL II A - 5


Exercício I-2: Usando o SQL Developer (continuação)
c) Coloque o arquivo na pasta /home/oracle/labs/sql2/labs.
9) Abra e execute confidence.sql da pasta /home/oracle/labs/sql2/labs e
observe o resultado.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II A - 6


Soluções do Exercício I-1: Acessando Recursos do SQL
Developer
1) Acesse a home page do SQL Developer.
a) Acesse a home page online do SQL Developer no endereço:
http://www.oracle.com/technology/products/database/sql_developer/index.html

A home page do SQL Developer é exibida da seguinte maneira:

Oracle Internal & Oracle Academy Use Only


b) Adicione um marcador à página para facilitar o acesso posteriormente.
2) Acesse o tutorial do SQL Developer, que está disponível on-line em:
http://st-curriculum.oracle.com/tutorial/SQLDeveloper/index.htm

Em seguida, examine as seções a seguir e as demonstrações associadas:


a) O Que Fazer em Primeiro Lugar
b) Trabalhando com Objetos de Banco de Dados
c) Acessando Dados

Oracle Database: Fundamentos de SQL II A - 7


Soluções do Exercício I-2: Usando o SQL Developer

1) Inicie o SQL Developer usando o ícone do desktop.

2) Crie uma conexão de banco de dados utilizando as seguintes informações:


a. Nome da Conexão: myconnection

Oracle Internal & Oracle Academy Use Only


b. Nome de usuário: oraxx (Solicite ao instrutor uma conta ora do intervalo de
contas ora21–ora40.)
c. Senha: oraxx
d. Nome do host: localhost
e. Porta: 1521
f. SID: orcl (ou outro valor fornecido pelo instrutor)

Oracle Database: Fundamentos de SQL II A - 8


Soluções do Exercício I-2: Usando o SQL Developer
(continuação)

Oracle Internal & Oracle Academy Use Only


3) Teste a nova conexão. Se o status for Bem-sucedido, estabeleça a conexão com o
banco de dados usando a nova conexão.
a) Clique no botão Test na janela New/Select Database Connection.

b) Se o status for Success, clique no botão Connect.

Navegando nas Tabelas


4) Navegue pela estrutura da tabela EMPLOYEES e exiba os dados.
a) Expanda a conexão myconnection clicando no sinal de mais ao lado dela.

Oracle Database: Fundamentos de SQL II A - 9


Soluções do Exercício I-2: Usando o SQL Developer
(continuação)

b) Expanda o ícone Tables clicando no sinal de mais ao lado dele.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II A - 10


Soluções do Exercício I-2: Usando o SQL Developer
(continuação)

Oracle Internal & Oracle Academy Use Only


c) Exiba a estrutura da tabela EMPLOYEES.
Clique na tabela EMPLOYEES. A tab Columns exibe as colunas da tabela
EMPLOYEES da seguinte maneira:

d) Visualize os dados da tabela DEPARTMENTS.


No Connections Navigator, clique na tabela DEPARTMENTS. Em seguida, clique na
tab Data.

Oracle Database: Fundamentos de SQL II A - 11


Soluções do Exercício I-2: Usando o SQL Developer
(continuação)

Oracle Internal & Oracle Academy Use Only


5) Execute algumas instruções básicas SELECT para consultar os dados na tabela
EMPLOYEES na área da Planilha SQL. Clique nos ícones Execute Statement (ou
pressione F9) e Run Script (ou pressione F5) para executar as instruções SELECT.
Verifique os resultados dos dois métodos de execução das instruções SELECTnas
páginas com guias apropriadas.
a) Crie uma consulta para selecionar o sobrenome e o salário dos funcionários cujos
salários são inferiores ou equivalentes a US$ 3.000,00.
SELECT last_name, salary
FROM employees
WHERE salary <= 3000;
b) Crie uma consulta para exibir sobrenome, ID do cargo e comissão para todos os
funcionários não autorizados a receber uma comissão.
SELECT last_name, job_id, commission_pct
FROM employees
WHERE commission_pct IS NULL;

6) Defina sua preferência de caminho do script como /home/oracle/labs/sql2.


a) Selecione Tools > Preferences > Database > Worksheet Parameters.
b) Informe o valor no campo Select default path to look for scripts. Clique em OK.

Oracle Database: Fundamentos de SQL II A - 12


Soluções do Exercício I-2: Usando o SQL Developer
(continuação)

Oracle Internal & Oracle Academy Use Only


7) Informe a seguinte instrução SQL:
SELECT employee_id, first_name, last_name
FROM employees;

8) Salve a instrução SQL em um arquivo de script utilizando o item File > Save As, no
menu.
a) Selecione File > Save As.

Oracle Database: Fundamentos de SQL II A - 13


Soluções do Exercício I-2: Usando o SQL Developer
(continuação)

b) O arquivo deve receber o nome intro_test.sql


Informe intro_test.sql na caixa de texto File_name .
c) Coloque o arquivo na pasta /home/oracle/labs/SQL2/labs .

Oracle Internal & Oracle Academy Use Only


Em seguida, clique em Save.
9) Abra e execute confidence.sql da pasta /home/oracle/labs/SQL2/labs e observe
o resultado.

Oracle Database: Fundamentos de SQL II A - 14


Soluções do Exercício I-2: Usando o SQL Developer
(continuação)
Abra o arquivo de script confidence.sql usando o item de menu File > Open.

Oracle Internal & Oracle Academy Use Only


Em seguida, pressione F5 para executar o script.
Este é o resultado esperado:

COUNT(*)
----------------------
8

1 rows selected

COUNT(*)
----------------------
107

1 rows selected

COUNT(*)
----------------------
25

1 rows selected

Oracle Database: Fundamentos de SQL II A - 15


Soluções do Exercício I-2: Usando o SQL Developer
(continuação)
COUNT(*)
----------------------
4

1 rows selected

COUNT(*)
----------------------
23

1 rows selected

Oracle Internal & Oracle Academy Use Only


COUNT(*)
----------------------
27

1 rows selected

COUNT(*)
----------------------
19

1 rows selected

COUNT(*)
----------------------
10

1 rows selected

Oracle Database: Fundamentos de SQL II A - 16


Exercícios e Soluções da Lição 1

Exercício 1-1: Controlando o Acesso do Usuário

1. Qual privilégio um usuário deve ter para efetuar logon no servidor Oracle? É um
privilégio de sistema ou de objeto?
_________________________________________________________________
2. Que privilégio deve ser concedido a um usuário para que ele possa criar tabelas?
_________________________________________________________________
3. Se você criar uma tabela, quem poderá conceder privilégios a outros usuários na sua
tabela?

Oracle Internal & Oracle Academy Use Only


_________________________________________________________________
4. Você é o DBA. Você está criando muitos usuários que requerem os mesmos
privilégios de sistema.
O que pode tornar sua tarefa mais fácil?
_________________________________________________________________
5. Que comando você usa para alterar sua senha?
_________________________________________________________________
6. O User21 é o proprietário da tabela EMP e concede o privilégio DELETE ao
User22 usando a cláusula WITH GRANT OPTION . User22 concede então o
privilégio DELETE em EMP para User23. O User21 agora sabe que o User23
possui o privilégio e o revoga do User22. Qual usuário pode ser excluído da tabela
EMP?
_________________________________________________________________
7. Você deseja conceder a SCOTT o privilégio para atualizar dados na tabela
DEPARTMENTS. Também deseja permitir que SCOTT conceda esse privilégio a
outros usuários. Que comando você deve usar?
_________________________________________________________________

Para concluir a pergunta 8 e as seguintes, será necessário estabelecer conexão com o


banco de dados usando o SQL Developer. Se você ainda não tiver estabelecido
conexão, faça o seguinte:
1. Clique no ícone de desktop SQL Developer.
2. Em Connections Navigator, use a conta oraxx e a senha correspondente
fornecidas pelo seu instrutor para efetuar logon no banco de dados.

8. Conceda a outro usuário o privilégio de consulta sobre sua tabela. Em seguida,


verifique se o usuário pode usar o privilégio.
Observação: Para este exercício, reúna-se com outro grupo. Por exemplo, se você for
o usuário ora21, reúna-se com outro usuário ora22.

Oracle Database: Fundamentos de SQL II A - 17


Exercício 1-1: Controlando o Acesso do Usuário (continuação)
a. Conceda a outro usuário o privilégio para exibir registros em sua tabela
REGIONS. Inclua uma opção para esse usuário a fim de conceder esse
privilégio a outros usuários.
b. Conceda ao usuário o privilégio de consulta sobre a tabela REGIONS.
c. Peça ao usuário que repasse o privilégio de consulta a um terceiro usuário (por
exemplo, ora23).
d. Retire o privilégio do usuário que executar a etapa b.
Observação:Cada equipe pode praticar os exercícios 9 e 10 independentemente.
9. Conceda a outro usuário os privilégios de consulta e manipulação de dados sobre sua
tabela COUNTRIES. Certifique-se de que o usuário não repasse esses privilégios a
outros usuários.
10. Retire os privilégios sobre a tabela COUNTRIES concedidos a outro usuário.
Observação:Para os exercícios 11 a 17, reúna-se com outro grupo.

Oracle Internal & Oracle Academy Use Only


11. Conceda a outro usuário acesso à sua tabela DEPARTMENTS. Faça com que o usuário
conceda com grant acesso de consulta à respectiva tabela DEPARTMENTS.
12. Consulte todas as linhas em sua tabela DEPARTMENTS.

...
13. Adicione uma nova linha à sua tabela DEPARTMENTS. A equipe 1 deve adicionar
Education como número do departamento 500. A equipe 2 deve adicionar Human
Resources como número do departamento 510. Consulte a tabela da outra equipe.
14. Crie um sinônimo para a tabela DEPARTMENTS da outra equipe.
15. Consulte todas as linhas na tabela DEPARTMENTS da outra equipe usando seu
sinônimo.
Resultados da instrução SELECT da Equipe 1:

Oracle Database: Fundamentos de SQL II A - 18


Exercício 1-1: Controlando o Acesso do Usuário (continuação)

Oracle Internal & Oracle Academy Use Only


Resultados da instrução SELECT da Equipe 2:

16. Revogue o privilégio SELECT da outra equipe.


17. Remova a linha que você inseriu na tabela DEPARTMENTS na etapa 13 e salve as
alterações.

Oracle Database: Fundamentos de SQL II A - 19


Soluções do Exercício 1-1: Controlando o Acesso do Usuário
Para concluir a pergunta 8 e as seguintes, será necessário estabelecer conexão com o
banco de dados usando o SQL Developer.

1. Qual privilégio um usuário deve ter para efetuar logon no servidor Oracle? Este é
um sistema ou privilégio de objeto?
O privilégio de sistema CREATE SESSION

2. Qual privilégio um usuário deve ter para criar tabelas?


O privilégio CREATE TABLE

Oracle Internal & Oracle Academy Use Only


3. Se você criar uma tabela, quem poderá transmitir privilégios a outros usuários da
sua tabela?
Você ou qualquer pessoa para quem você tenha cedido os privilégios,
usando WITH GRANT OPTION

4. Você é o DBA. Você cria muitos usuários que precisam dos mesmos privilégios
de sistema.
O que você deve fazer para tornar seu trabalho mais fácil?
Criar uma função contendo os privilégios do sistema e conceder a função aos
usuários.

5. Qual comando você usa para alterar sua senha?


A instrução ALTER USER

6. O User21 é o proprietário da tabela EMP e concede o privilégios DELETE ao


User22 usando a cláusula WITH GRANT OPTION . User22 concede então
privilégios DELETE em EMP para User23. O User21 agora sabe que o
User23 possui o privilégio e o revoga do User22. Qual usuário pode excluir
dados da tabela EMP agora?
Somente User21
7. Você deseja conceder a SCOTT o privilégio para atualizar dados na tabela
DEPARTMENTS. Também deseja permitir que SCOTT conceda esse privilégio a
outros usuários. Que comando você deve usar?
GRANT UPDATE ON departments TO scott WITH GRANT
OPTION;

Oracle Database: Fundamentos de SQL II A - 20


Soluções do Exercício 1-1: Controlando o Acesso do Usuário
(continuação)

8. Conceda a outro usuário o privilégio de consulta sobre sua tabela. Em seguida,


verifique se o usuário pode usar o privilégio.
Observação: Para este exercício, reúna-se com outro grupo. Por exemplo, se
você for o usuário ora21, reúna-se com outro usuário ora22.
a) Conceda a outro usuário o privilégio de visualizar registros na sua tabela
REGIONS. Inclua uma opção para esse usuário a fim de conceder esse
privilégio a outros usuários.
A Equipe 1 deve executar esta instrução:

Oracle Internal & Oracle Academy Use Only


GRANT select
ON regions
TO <team2_oraxx> WITH GRANT OPTION;

b) Solicite que o usuário consulte sua tabela REGIONS .


A Equipe 2 deve executar esta instrução:
SELECT * FROM <team1_oraxx>.regions;
c) Peça ao usuário que repasse o privilégio de consulta a um terceiro usuário (por
exemplo, ora23).
A Equipe 2 deve executar esta instrução:
GRANT select
ON <team1_oraxx>.regions
TO <team3_oraxx>;
d) Revogue o privilégio do usuário que executou a etapa b.
A Equipe 1 deve executar esta instrução:
REVOKE select
ON regions
FROM <team2_oraxx>;

9. Conceda a outro usuário os privilégios de consulta e manipulação de dados sobre


sua tabela COUNTRIES. Certifique-se de que o usuário não conceda esses
privilégios a outros usuários.

A Equipe 1 deve executar esta instrução:


GRANT select, update, insert
ON COUNTRIES
TO <team2_oraxx>;

Oracle Database: Fundamentos de SQL II A - 21


Soluções do Exercício 1-1: Controlando o Acesso do Usuário
(continuação)

10. Retire os privilégios sobre a tabela COUNTRIES concedidos a outro usuário.


A Equipe 1 deve executar esta instrução:
REVOKE select, update, insert ON COUNTRIES FROM <team2_oraxx>;

Observação:Para fazer os exercícios de 11 a 17, trabalhe em equipe com outro


grupo.

11. Conceda a outro usuário acesso à sua tabela DEPARTMENTS. Faça com que o
usuário conceda com grant acesso de consulta à respectiva tabela DEPARTMENTS.

A Equipe 2 deve executar a instrução GRANT.

Oracle Internal & Oracle Academy Use Only


GRANT select
ON departments
TO <team1_oraxx>;
A Equipe 1 deve executar a instrução GRANT.
GRANT select
ON departments
TO <team2_oraxx>;

Aqui, <team1_oraxx> é o nome de usuário da Equipe 1 e <team2_oraxx> é o


nome de usuário da Equipe 2.
12. Consulte todas as linhas em sua tabela DEPARTMENTS.

SELECT *
FROM departments;

13. Adicione uma nova linha à sua tabela DEPARTMENTS. A equipe 1 deve adicionar
Education como número do departamento 500. A equipe 2 deve adicionar
Human Resources como número do departamento 510. Consulte a tabela da
outra equipe.

A Equipe 1 deve executar a seguinte instrução INSERT:


INSERT INTO departments (department_id,
department_name)
VALUES (500, 'Education');
COMMIT;
A Equipe 2 deve executar a seguinte instrução INSERT:
INSERT INTO departments (department_id,
department_name)
VALUES (510, 'Human Resources');
COMMIT;

Oracle Database: Fundamentos de SQL II A - 22


Soluções do Exercício 1-1: Controlando o Acesso do Usuário
(continuação)

14. Crie um sinônimo para a tabela DEPARTMENTS da outra equipe.


A Equipe 1 deve criar um sinônimo com o nome team2.

CREATE SYNONYM team2


FOR <team2_oraxx>.DEPARTMENTS;
A Equipe 2 deve criar um sinônimo com o nome team1.
CREATE SYNONYM team1
FOR <team1_oraxx>. DEPARTMENTS;

Oracle Internal & Oracle Academy Use Only


15. Consulte todas as linhas na tabela DEPARTMENTS da outra equipe usando seu
sinônimo.

A Equipe 1 deve executar a instrução SELECT.


SELECT *
FROM team2;
A Equipe 2 deve executar a instrução SELECT.
SELECT *
FROM team1;

16. Revogue o privilégio SELECT da outra equipe.


A Equipe 1 deve revogar o privilégio.
REVOKE select
ON departments
FROM <team2_oraxx>;
A Equipe 2 deve revogar o privilégio.
REVOKE select
ON departments
FROM <team1_oraxx>;

Oracle Database: Fundamentos de SQL II A - 23


Soluções do Exercício 1-1: Controlando o Acesso do Usuário
(continuação)

17. Remova a linha que você inseriu na tabela DEPARTMENTS na etapa 8 e salve as
alterações.

A Equipe 1 deve executar a instrução DELETE.


DELETE FROM departments
WHERE department_id = 500;
COMMIT;
A Equipe 2 deve executar a instrução DELETE.

Oracle Internal & Oracle Academy Use Only


DELETE FROM departments
WHERE department_id = 510;
COMMIT;

Oracle Database: Fundamentos de SQL II A - 24


Exercícios e Soluções da Lição 2
Exercício 2-1: Gerenciando Objetos de Esquema
Neste exercício, você usará o comando ALTER TABLE para modificar colunas e
adicionar restrições. O comando CREATE INDEX é usado para criar índices durante a
criação de uma tabela, juntamente com o comando CREATE TABLE. Você criará tabelas
externas.
1. Crie a tabela DEPT2 com base no gráfico de instâncias de tabela a seguir. Informe a
sintaxe na Planilha SQL. Em seguida, execute a instrução para criar a tabela.
Confirme que a tabela foi criada.
Column Name ID NAME

Oracle Internal & Oracle Academy Use Only


Key Type
Nulls/Unique
FK Table
FK Column
Data type NUMBER VARCHAR2
Length 7 25

2. Preencha a tabela DEPT2 com os dados da tabela DEPARTMENTS. Inclua somente as


colunas necessárias.
3. Crie a tabela EMP2 com base no gráfico de instâncias de tabela a seguir. Informe a
sintaxe na Planilha SQL. Em seguida, execute a instrução para criar a tabela.
Confirme que a tabela foi criada.

Column Name ID LAST_NAME FIRST_NAME DEPT_ID


Key Type
Nulls/Unique
FK Table
FK Column
Data type NUMBER VARCHAR2 VARCHAR2 NUMBER
Length 7 25 25 7

Oracle Database: Fundamentos de SQL II A - 25


Exercício 2-1: Gerenciando Objetos de Esquema (continuação)

4. Modifique a tabela EMP2 para que aceite sobrenomes mais longos de funcionários.

Oracle Internal & Oracle Academy Use Only


Confirme as modificações.

5. Crie a tabela EMPLOYEES2 com base na estrutura da tabela EMPLOYEES. Inclua


apenas as colunas EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY e
DEPARTMENT_ID. Atribua um nome às colunas na nova tabela ID, FIRST_NAME,
LAST_NAME, SALARY e DEPT_ID, respectivamente.
6. Elimine a tabela EMP2.
7. Consulte a lixeira para verificar se a tabela está presente.

8. Restaure a tabela EMP2 para um estado anterior à instrução DROP.

9. Elimine a coluna FIRST_NAME da tabela EMPLOYEES2. Confirme a modificação


verificando a descrição da tabela.

Oracle Database: Fundamentos de SQL II A - 26


Exercício 2-1: Gerenciando Objetos de Esquema (continuação)

10. Na tabela EMPLOYEES2, marque a coluna DEPT_ID como UNUSED. Confirme a


modificação verificando a descrição da tabela.

Oracle Internal & Oracle Academy Use Only


11. Elimine todas as colunas UNUSED da tabela EMPLOYEES2. Confirme a modificação
verificando a descrição da tabela.
12. Adicione uma restrição PRIMARY KEY do nível de tabela à tabela EMP2 na coluna
ID. A constraint deve ser nomeada na criação. Nomeie a restrição como
my_emp_id_pk.
13. Crie uma restrição PRIMARY KEY do nível de tabela à tabela DEPT2 na coluna ID.
A restrição deve ser nomeada na criação. Nomeie a restrição como
my_dept_id_pk.
14. Adicione uma referência de chave estrangeira à tabela EMP2 que garante que o
funcionário não foi designado para um departamento inexistente. Nomeie a restrição
como my_emp_dept_id_fk.
15. Modifique a tabela EMP2. Adicione uma coluna COMMISSION do tipo de dados
NUMBER, precisão 2, escala 2. Adicione uma restrição à coluna COMMISSION que
garanta que o valor da comissão seja maior que zero.
16. Elimine as tabelas EMP2 e DEPT2 de modo que não possam ser restauradas.
Verifique a lixeira.
17. Crie a tabela DEPT_NAMED_INDEX com base no seguinte gráfico de instância de
tabela. Nomeie o índice para a coluna PRIMARY KEY como DEPT_PK_IDX.

Column Name Deptno Dname

Primary Key Yes


Data Type Number VARCHAR2
Length 4 30

Oracle Database: Fundamentos de SQL II A - 27


Exercício 2-1: Gerenciando Objetos de Esquema (continuação)

18. Crie uma tabela externa library_items_ext. Use o driver de acesso


ORACLE_LOADER.
Observação: O diretório emp_dir e o arquivo library_items.dat já foram
criados para este exercício. library_items.dat contém registros no seguinte
formato:
2354, 2264, 13.21, 150,
2355, 2289, 46.23, 200,
2355, 2264, 50.00, 100,
a. Abra o arquivo lab_02_18.sql Observe o exemplo de código para criar a tabela
externa library_items_ext. Em seguida, substitua <TODO1>, <TODO2>,

Oracle Internal & Oracle Academy Use Only


<TODO3> e <TODO4> conforme apropriado e salve o arquivo como
lab_02_18_soln.sql. Execute o script para criar a tabela externa.
b. Consulte a tabela library_items_ext.

19. O departamento de RH precisa de um relatório com o endereço de todos os


departamentos. Crie uma tabela externa como dept_add_ext usando o driver de
acesso ORACLE_DATAPUMP. O relatório deve mostrar o ID do local, o logradouro, a
cidade, o estado ou província e o país do item. Use uma NATURAL JOIN para gerar
os resultados.
Observação: O diretórioemp_dir já foi criado para este exercício.

a. Abra o arquivo lab_02_19.sql. Observe o exemplo de código para criar a


tabela externa dept_add_ext. Em seguida, substitua <TODO1>, <TODO2> e
<TODO3> pelo código apropriado. Substitua <oraxx_emp4.exp> e
<oraxx_emp5.exp> pelos nomes de arquivo apropriados. Por exemplo, se
você for o usuário ora21, seus nomes de arquivo serão ora21_emp4.exp e
ora21_emp5.exp. Salve o script como lab_02_19_soln.sql.
b. Execute o script lab_02_19_soln.sqlpara criar a tabela externa.
c. Consulte a tabela dept_add_ext.

Oracle Database: Fundamentos de SQL II A - 28


Exercício 2-1: Gerenciando Objetos de Esquema (continuação)

Observação: Durante a execução da etapa anterior, dois arquivos


oraxx_emp4.exp e oraxx_emp5.exp são criados no diretório padrão

Oracle Internal & Oracle Academy Use Only


emp_dir.

20. Crie a tabela emp_books e preencha-a com os dados. Defina a chave primária como
adiada e observe o que acontece no final da transação.
a. Execute o arquivo lab_02_20_a.sql para criar a tabela emp_books.
Observe que a chave primária emp_books_pk não é criada como adiável.

b. Execute o arquivo lab_02_20_b.sql para preencher os dados na tabela


emp_books. O que você pode observar?

c. Defina a restrição emp_books_pk como adiada. O que você pode observar?

d. Elimine a restrição emp_books_pk.

Oracle Database: Fundamentos de SQL II A - 29


Exercício 2-1: Gerenciando Objetos de Esquema (continuação)
e. Modifique a definição de tabela emp_books para adicionar a restrição
emp_books_pk como adiável desta vez.

f. Defina a restrição emp_books_pk como adiada.

g. Execute o arquivo lab_02_20_g.sql para preencher dados na tabela


emp_books. O que você pode observar?

Oracle Internal & Oracle Academy Use Only


h. Submeta a transação a commit. O que você pode observar?

Oracle Database: Fundamentos de SQL II A - 30


Soluções do Exercício 2-1: Gerenciando Objetos de Esquema
1. Crie a tabela DEPT2 com base no gráfico de instâncias de tabela a seguir. Informe a
sintaxe na Planilha SQL. Em seguida, execute a instrução para criar a tabela.
Confirme que a tabela foi criada.

Column Name ID NAME


Key Type
Nulls/Unique
FK Table
FK Column

Oracle Internal & Oracle Academy Use Only


Data type NUMBER VARCHAR2
Length 7 25

CREATE TABLE dept2


(id NUMBER(7),
name VARCHAR2(25));

DESCRIBE dept2

2. Preencha a tabela DEPT2 com os dados da tabela DEPARTMENTS. Inclua somente as


colunas necessárias.
INSERT INTO dept2
SELECT department_id, department_name
FROM departments;

3. Crie a tabela EMP2 com base no gráfico de instâncias de tabela a seguir. Informe a
sintaxe na Planilha SQL. Em seguida, execute a instrução para criar a tabela.
Confirme que a tabela foi criada.

Column Name ID LAST_NAME FIRST_NAME DEPT_ID


Key Type
Nulls/Unique
FK Table
FK Column
Data type NUMBER VARCHAR2 VARCHAR2 NUMBER
Length 7 25 25 7

Oracle Database: Fundamentos de SQL II A - 31


Soluções do Exercício 2-1: Gerenciando Objetos de Esquema
(continuação)

CREATE TABLE emp2


(id NUMBER(7),
last_name VARCHAR2(25),
first_name VARCHAR2(25),
dept_id NUMBER(7));

DESCRIBE emp2

4. Modifique a tabela EMP2 para que aceite sobrenomes mais longos de funcionários.

Oracle Internal & Oracle Academy Use Only


Confirme as modificações.
ALTER TABLE emp2
MODIFY (last_name VARCHAR2(50));

DESCRIBE emp2

5. Crie a tabela EMPLOYEES2 com base na estrutura da tabela EMPLOYEES. Inclua


apenas as colunas EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY e
DEPARTMENT_ID. Atribua um nome às colunas na nova tabela ID, FIRST_NAME,
LAST_NAME, SALARY e DEPT_ID, respectivamente.

CREATE TABLE employees2 AS


SELECT employee_id id, first_name, last_name, salary,
department_id dept_id
FROM employees;

6. Elimine a tabela EMP2.

DROP TABLE emp2;

Oracle Database: Fundamentos de SQL II A - 32


Soluções do Exercício 2-1: Gerenciando Objetos de Esquema
(continuação)
7. Consulte a lixeira para verificar se a tabela está presente.

SELECT original_name, operation, droptime


FROM recyclebin;

8. Restaure a tabela EMP2 para um estado anterior à instrução DROP.

FLASHBACK TABLE emp2 TO BEFORE DROP;


DESC emp2;

Oracle Internal & Oracle Academy Use Only


9. Elimine a coluna FIRST_NAME da tabela EMPLOYEES2. Confirme a modificação
verificando a descrição da tabela.
ALTER TABLE employees2
DROP COLUMN first_name;

DESCRIBE employees2

10. Na tabela EMPLOYEES2, marque a coluna DEPT_ID como UNUSED. Confirme a


modificação verificando a descrição da tabela.
ALTER TABLE employees2
SET UNUSED (dept_id);

DESCRIBE employees2

11. Elimine todas as colunas UNUSED da tabela EMPLOYEES2. Confirme a modificação


verificando a descrição da tabela.

ALTER TABLE employees2


DROP UNUSED COLUMNS;

DESCRIBE employees2

Oracle Database: Fundamentos de SQL II A - 33


Soluções do Exercício 2-1: Gerenciando Objetos de Esquema
(continuação)
12. Adicione uma restrição PRIMARY KEY do nível de tabela à tabela EMP2 na coluna
ID. A restrição deve ser nomeada na criação. Nomeie a restrição como
my_emp_id_pk.
ALTER TABLE emp2
ADD CONSTRAINT my_emp_id_pk PRIMARY KEY (id);

13. Crie uma restrição PRIMARY KEY do nível de tabela à tabela DEPT2 na coluna ID.
A restrição deve ser nomeada na criação. Nomeie a restrição my_dept_id_pk.

ALTER TABLE dept2


ADD CONSTRAINT my_dept_id_pk PRIMARY KEY(id);

Oracle Internal & Oracle Academy Use Only


14. Adicione uma referência de chave estrangeira à tabela EMP2 que garante que o
funcionário não foi designado para um departamento inexistente. Nomeie a restrição
como my_emp_dept_id_fk.
ALTER TABLE emp2
ADD CONSTRAINT my_emp_dept_id_fk
FOREIGN KEY (dept_id) REFERENCES dept2(id);

15. Modifique a tabela EMP2. Adicione uma coluna COMMISSION do tipo de dados
NUMBER, precisão 2, escala 2. Adicione uma constraint à coluna COMMISSION que
garanta que o valor da comissão seja maior que zero.

ALTER TABLE emp2


ADD commission NUMBER(2,2)
CONSTRAINT my_emp_comm_ck CHECK (commission > 0);

16. Elimine as tabelas EMP2 e DEPT2 para que não seja possível restaurá-las. Verifique a
lixeira.

DROP TABLE emp2 PURGE;


DROP TABLE dept2 PURGE;

SELECT original_name, operation, droptime


FROM recyclebin;

17. Crie a tabela DEPT_NAMED_INDEX com base no gráfico de instância de tabela a


seguir. Nomeie o índice para a coluna PRIMARY KEY como DEPT_PK_IDX.
Column Name Deptno Dname

Primary Key Yes


Data Type Number VARCHAR2
Length 4 30
Oracle Database: Fundamentos de SQL II A - 34
Soluções do Exercício 2-1: Gerenciando Objetos de Esquema
(continuação)

CREATE TABLE DEPT_NAMED_INDEX


(deptno NUMBER(4)
PRIMARY KEY USING INDEX
(CREATE INDEX dept_pk_idx ON
DEPT_NAMED_INDEX(deptno)),
dname VARCHAR2(30));

18. Crie uma tabela externa library_items_ext. Use o driver de acesso


ORACLE_LOADER.
Observação: O diretório emp_dir e o arquivo library_items.dat já foram

Oracle Internal & Oracle Academy Use Only


criados para este exercício. Verifique se o arquivo externo e o banco de dados estão
na mesma máquina.

library_items.dat tem registros no seguinte formato:

2354, 2264, 13.21, 150,

2355, 2289, 46.23, 200,

2355, 2264, 50.00, 100,

a) Abra o arquivo lab_02_18.sql. Observe o exemplo de código para criar a


tabela externa
library_items_ext. Em seguida, substitua <TODO1>, <TODO2>,
<TODO3> e <TODO4> conforme apropriado, e salve o arquivo como
lab_02_18_soln.sql.
Execute o script para criar a tabela externa.

CREATE TABLE library_items_ext ( category_id number(12)


, book_id number(6)
, book_price number(8,2)
, quantity number(8)
)
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY emp_dir
ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ',')
LOCATION ('library_items.dat')
)
REJECT LIMIT UNLIMITED;

Oracle Database: Fundamentos de SQL II A - 35


Soluções do Exercício 2-1: Gerenciando Objetos de Esquema
(continuação)

b) Consulte a tabela library_items_ext.


SELECT * FROM library_items_ext;

19. O departamento de RH precisa de um relatório com o endereço de todos os


departamentos. Crie uma tabela externa como dept_add_ext usando o driver de
acesso ORACLE_DATAPUMP. O relatório deve mostrar o ID do local, o logradouro, a
cidade, o estado ou província e o país do item. Use NATURAL JOIN para produzir
os resultados.

Observação: O diretório emp_dir já foi criado para este exercício. Certifique-se de


que o arquivo externo e o banco de dados estejam na mesma máquina.

Oracle Internal & Oracle Academy Use Only


a) Abra o arquivo lab_02_19.sql. Observe o exemplo de código para criar a
tabela externa
dept_add_ext. Depois, substitua <TODO1>, <TODO2> e <TODO3> com o
código apropriado. Substitua <oraxx_emp4.exp> e <oraxx_emp5.exp>
por nomes de arquivo apropriados. Por exemplo, se você for o usuário ora21,
seus nomes de arquivo serão ora21_emp4.exp e ora21_emp5.exp. Salve o
script como lab_02_19_soln.sql.
CREATE TABLE dept_add_ext (location_id,
street_address, city,
state_province,
country_name)
ORGANIZATION EXTERNAL(
TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY emp_dir
LOCATION ('oraxx_emp4.exp','oraxx_emp5.exp'))
PARALLEL
AS
SELECT location_id, street_address, city, state_province,
country_name
FROM locations
NATURAL JOIN countries;

Observação:Durante a execução da etapa anterior, dois arquivos


oraxx_emp4.exp e oraxx_emp5.exp são criados no diretório default
emp_dir.

Execute o script lab_02_19_soln.sqlpara criar a tabela externa.

Oracle Database: Fundamentos de SQL II A - 36


Soluções do Exercício 2-1: Gerenciando Objetos de Esquema
(continuação)

b) Consulte a tabela dept_add_ext.


SELECT * FROM dept_add_ext;

20. Crie a tabela emp_books e preencha-a com os dados. Defina a chave primária como
adiada e observe o que acontece no final da transação.

a) Execute o script lab_02_20a.sql para criar a tabela emp_books.


Observe que a chave primária emp_books_pk não é criada como adiável.

CREATE TABLE emp_books (book_id number,


title varchar2(20), CONSTRAINT

Oracle Internal & Oracle Academy Use Only


emp_books_pk PRIMARY KEY (book_id));

a) Execute o lab_02_20b.sql para preencher os dados na tabela


emp_books.
O que você pode observar?
INSERT INTO emp_books VALUES(300,'Organizations');
INSERT INTO emp_books VALUES (300,'Change Management');

A primeira linha foi inserida. No entanto, há o erro ora-00001 na inserção


da segunda linha.
c) Defina a restrição emp_books_pk como adiada. O que você observa?

SET CONSTRAINT emp_books_pk DEFERRED;

O seguinte erro deverá ser exibido: “ORA-02447: Não é possível diferir uma
constraint que não pode ser diferida”.

d) Elimine a restrição emp_books_pk.


ALTER TABLE emp_books DROP CONSTRAINT emp_books_pk;

e) Modifique a definição de tabela emp_books para adicionar a restrição


emp_books_pk como adiável desta vez.
ALTER TABLE emp_books ADD (CONSTRAINT emp_books_pk PRIMARY KEY
(book_id) DEFERRABLE);

f) Defina a restrição emp_books_pk como adiada.


SET CONSTRAINT emp_books_pk DEFERRED;

Oracle Database: Fundamentos de SQL II A - 37


Soluções do Exercício 2-1: Gerenciando Objetos de Esquema
(continuação)

g) Execute o lab_02_20g.sql para preencher os dados na tabela


emp_books.
O que você pode observar?
INSERT INTO emp_books VALUES (300,'Change Management');
INSERT INTO emp_books VALUES (300,'Personality');
INSERT INTO emp_books VALUES (350,'Creativity');

Todas as linhas foram inseridas.

h) Submeta a transação. O que você pode observar?

Oracle Internal & Oracle Academy Use Only


COMMIT;

A transação foi submetida a rollback.

Oracle Database: Fundamentos de SQL II A - 38


Exercícios e Soluções da Lição 3

Exercício 3-1: Gerenciando Objetos com Views do Dicionário de


Dados
Neste exercício, você consulta views do dicionário para localizar informações sobre
objetos em seu esquema.

1. Consulte o dicionário de dados USER_TABLES para ver as informações das suas


tabelas que você possui.

Oracle Internal & Oracle Academy Use Only



2. Consulte a view de dicionário de dados ALL_TABLES para ver as informações de
todas as tabelas que você pode acessar. Exclua tabelas que você possui.
Observação:Sua lista pode não ser exatamente igual à lista a seguir:

3. Em uma tabela específica, crie um script que mostre os nomes das colunas, os tipos
de dados, o comprimento dos tipos de dados e se são permitidos valores nulos.
Solicite ao usuário que informe o nome da tabela. Forneça apelidos apropriados às
colunas DATA_PRECISION e DATA_SCALE . Salve esse script em um arquivo
com o nome lab_03_01.sql.
Por exemplo, se o usuário informar DEPARTMENTS, serão obtidos os seguintes
resultados:

Oracle Database: Fundamentos de SQL II A - 39


Exercício 3-1: Gerenciando Objetos com Views do Dicionário de
Dados (continuação)

4. Crie um script que mostre o nome da coluna, o nome da constraint, o tipo de


constraint, a condição de pesquisa e o status de uma tabela específica. Você deve unir
por join as tabelas USER_CONSTRAINTS e USER_CONS_COLUMNS para obter
todas estas informações. Solicite ao usuário que informe o nome da tabela. Salve o

Oracle Internal & Oracle Academy Use Only


script em um arquivo com o nome lab_03_04.sql.
Por exemplo, se o usuário informar DEPARTMENTS, serão obtidos os seguintes
resultados:

5. Adicione um comentário à tabela DEPARTMENTS. Em seguida, consulte a view


USER_TAB_COMMENTS para verificar se existe o comentário.

6. Crie um sinônimo para a tabela EMPLOYEES. Chame-a de EMP. Em seguida, localize


os nomes de todos os sinônimos que estão no seu esquema.

7. Execute lab_03_07.sql para criar a view dept50 para este exercício.


Você deve determinar os nomes e definições de todas as views do esquema.
Crie um relatório que recupere informações da view: o nome e o texto da view a
partir da view do dicionário de dados USER_VIEWS.
Observação: EMP_DETAILS_VIEW foi criada como parte do seu esquema.
Observação: Você obterá a definição completa da view se usar Run Script (ou
pressionar F5) no SQL Developer. Se usar Execute Statement (ou pressionar F9) no
SQL Developer, role horizontalmente no painel de resultados. Se você usar o

Oracle Database: Fundamentos de SQL II A - 40


Exercício 3-1: Gerenciando Objetos com Views do Dicionário de
Dados (continuação)
SQL*Plus, para obter mais conteúdo de uma coluna LONG, use o comando SET
LONG n, em que n é o valor do número de caracteres da coluna LONG que você
deseja ver.

8. Localize os nomes das suas sequências. Crie uma consulta em um script para exibir as
seguintes informações sobre as suas sequências: nome, valor máximo, tamanho do
incremento e último número da sequência. Salve o script com o nome
lab_03_08.sql. Execute a instrução no seu script.

Oracle Internal & Oracle Academy Use Only


Execute o script lab_03_09_tab.sql como um pré-requisito para os exercícios 9 a
11.
Outra alternativa é abrir o arquivo de script para copiar e colar o código na
Planilha SQL.
Em seguida, execute o script. Este script:
• Será eliminado se houver tabelas DEPT2 e EMP2
• Cria as tabelas DEPT2 e EMP2
Observação:No Exercício 2, você deve ter eliminado as tabelas DEPT2 e EMP2 para que
elas não pudessem ser restauradas.

9. Confirme se as tabelas DEPT2 e EMP2 estão armazenadas no dicionário de dados.

10. Confirme se as constraints foram adicionadas por meio da consulta da view


USER_CONSTRAINTS. Observe os tipos e os nomes das constraints.

Oracle Database: Fundamentos de SQL II A - 41


Exercício 3-1: Gerenciando Objetos com Views do Dicionário de
Dados (continuação)
11. Exiba os nomes e os tipos do objeto da view do dicionário de dados
USER_OBJECTS para as tabelas EMP2 e DEPT2.
12. Crie a tabela SALES_DEPT com base no seguinte gráfico de instância de tabela.
Nomeie o índice da coluna PRIMARY KEY como SALES_PK_IDX. Em seguida,
consulte a view do dicionário de dados para exibir o nome do índice, o nome da
tabela e saber se o índice é exclusivo.

Column Name Team_Id Location

Primary Key Yes

Oracle Internal & Oracle Academy Use Only


Data Type Number VARCHAR2
Length 3 30

Oracle Database: Fundamentos de SQL II A - 42


Soluções do Exercício 3-1: Gerenciando Objetos com Views do
Dicionário de Dados
1. Consulte o dicionário de dados para obter informações sobre as tabelas que você
possui.
SELECT table_name
FROM user_tables;

2. Consulte a view do dicionário para obter informações sobre as tabelas que você pode
acessar. Exclua tabelas que você possui.
SELECT table_name, owner
FROM all_tables
WHERE owner <>'ORAxx';
3. Para obter uma determinada tabela, crie um script que informe nomes das colunas,

Oracle Internal & Oracle Academy Use Only


tipos de dados e comprimentos de tipos de dados, bem como se são permitidos
valores nulos. Solicite ao usuário que informe o nome da tabela. Forneça apelidos
apropriados às colunas DATA_PRECISION e DATA_SCALE . Salve esse script em
um arquivo com o nome lab_03_01.sql.
SELECT column_name, data_type, data_length,
data_precision PRECISION, data_scale SCALE, nullable
FROM user_tab_columns
WHERE table_name = UPPER('&tab_name');

Para testar, execute o script e digite DEPARTMENTS como o nome da tabela.


4. Crie um script que mostre o nome da coluna, o nome da constraint, o tipo de
constraint, a condição de pesquisa e o status de uma tabela específica. Você deve unir
por join as tabelas USER_CONSTRAINTS e USER_CONS_COLUMNS para obter
todas estas informações. Solicite ao usuário que informe o nome da tabela. Salve esse
script em um arquivo denominado lab_03_04.sql

SELECT ucc.column_name, uc.constraint_name,


uc.constraint_type,
uc.search_condition, uc.status
FROM user_constraints uc JOIN user_cons_columns ucc
ON uc.table_name = ucc.table_name
AND uc.constraint_name = ucc.constraint_name
AND uc.table_name = UPPER('&tab_name');

Para testar, execute o script e digite DEPARTMENTS como o nome da tabela.

Oracle Database: Fundamentos de SQL II A - 43


Soluções do Exercício 3-1: Gerenciando Objetos com Views do
Dicionário de Dados (continuação)

5. Adicione um comentário à tabela DEPARTMENTS. Em seguida, consulte a view


USER_TAB_COMMENTS para verificar se existe o comentário.

COMMENT ON TABLE departments IS


'Company department information including name, code, and
location.';

SELECT COMMENTS
FROM user_tab_comments
WHERE table_name = 'DEPARTMENTS';

Oracle Internal & Oracle Academy Use Only


6. Crie um sinônimo para a tabela EMPLOYEES. Chame-a de EMP. Em seguida, localize
os nomes de todos os sinônimos que estão no seu esquema.

CREATE SYNONYM emp FOR EMPLOYEES;


SELECT *
FROM user_synonyms;

7. Execute o arquivo lab_03_07.sql para criar a view dept50 para este exercício.
É necessário determinar os nomes e as definições de todas as views em seu esquema.
Crie um relatório que recupere informações da view: o nome e o texto da view a
partir da view do dicionário de dados USER_VIEWS.

Observação: EMP_DETAILS_VIEW foi criada como parte de seu esquema.

Observação: Você obterá a definição completa da view se usar Run Script (ou
pressionar F5) no SQL Developer. Se usar Execute Statement (ou pressionar F9) no
SQL Developer, role horizontalmente no painel de resultados. Se você usar o
SQL*Plus, para obter mais conteúdo de uma coluna LONG, use o comando SET
LONG n, em que n é o valor do número de caracteres da coluna LONG que você
deseja ver.

SELECT view_name, text


FROM user_views;

Oracle Database: Fundamentos de SQL II A - 44


Soluções do Exercício 3-1: Gerenciando Objetos com Views do
Dicionário de Dados (continuação)
8. Localize os nomes das suas sequências. Crie uma consulta em um script para exibir as
seguintes informações sobre as suas sequências: nome, valor máximo, tamanho do
incremento e último número da sequência. Salve o script com o nome
lab_03_08.sql. Execute a instrução no seu script.

SELECT sequence_name, max_value, increment_by, last_number


FROM user_sequences;

Execute o script lab_03_09_tab.sql como um pré-requisito para os exercícios


de 9 a 11. Como alternativa, abra o arquivo de script para copiar o código e colar na
sua Planilha SQL. Em seguida, execute o script. Este script:

Oracle Internal & Oracle Academy Use Only


• Elimina as tabelas DEPT2 e EMP2

• Cria as tabelas DEPT2 e EMP2

Observação:No Exercício 2, você deve ter eliminado as tabelas DEPT2 e EMP2 para
que elas não pudessem ser restauradas.
9. Confirme se as tabelas DEPT2 e EMP2 estão armazenadas no dicionário de dados.

SELECT table_name
FROM user_tables
WHERE table_name IN ('DEPT2', 'EMP2');

10. Consulte o dicionário de dados para descobrir os nomes e os tipos das constraints nas
duas tabelas.

SELECT constraint_name, constraint_type


FROM user_constraints
WHERE table_name IN ('EMP2', 'DEPT2');
11. Consulte o dicionário de dados para exibir os nomes e os tipos dos objetos nas duas
tabelas.

SELECT object_name, object_type


FROM user_objects
WHERE object_name LIKE 'EMP%'
OR object_name LIKE 'DEPT%';

Oracle Database: Fundamentos de SQL II A - 45


Soluções do Exercício 3-1: Gerenciando Objetos com Views do
Dicionário de Dados (continuação)

12. Crie a tabela SALES_DEPT com base no seguinte gráfico de instância de tabela.
Nomeie o índice para a coluna PRIMARY KEY como SALES_PK_IDX. Em seguida,
consulte a view do dicionário de dados para exibir o nome do índice, o nome da
tabela e saber se o índice é exclusivo.

Column Name Team_Id Location

Primary Key Yes


Data Type Number VARCHAR2
Length 3 30

Oracle Internal & Oracle Academy Use Only


CREATE TABLE SALES_DEPT
(team_id NUMBER(3)
PRIMARY KEY USING INDEX
(CREATE INDEX sales_pk_idx ON
SALES_DEPT(team_id)),
location VARCHAR2(30));

SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS


FROM USER_INDEXES
WHERE TABLE_NAME = ‘SALES_DEPT’;

Oracle Database: Fundamentos de SQL II A - 46


Exercícios e Soluções da Lição 4
Exercício 4-1: Manipulando Grandes Conjuntos de Dados
Neste exercício, você executará operações INSERT e MERGE em várias tabelas e
controlará versões da linha.

1. Execute o script lab_04_01.sqlna pasta lab para criar a tabela SAL_HISTORY.


2. Exiba a estrutura da tabela SAL_HISTORY.

Oracle Internal & Oracle Academy Use Only


3. Execute o script lab_04_03.sql na pasta lab para criar a tabela MGR_HISTORY.
4. Exiba a estrutura da tabela MGR_HISTORY.

5. Execute o script lab_04_05.sql na pasta lab para criar a tabela SPECIAL_SAL.


6. Exiba a estrutura da tabela SPECIAL_SAL.

7. a. Crie uma consulta para fazer o seguinte:


- Obter detalhes como o ID do funcionário, a data de contratação, o salário e o ID
do gerente de funcionários cujos IDs sejam inferiores a 125 na tabela
EMPLOYEES.
- Se o salário for superior a $ 20.000, insira detalhes como ID do funcionário e
salário na tabela SPECIAL_SAL.
- Insira detalhes como ID do funcionário, data de contratação e salário na tabela
SAL_HISTORY.

Oracle Database: Fundamentos de SQL II A - 47


Exercício 4-1: Manipulando Grandes Conjuntos de Dados
(continuação)
- Insira detalhes como ID do funcionário, ID do gerente e salário na tabela
MGR_HISTORY.

b. Exiba os registros da tabela SPECIAL_SAL.

c. Exiba os registros da tabela SAL_HISTORY.

Oracle Internal & Oracle Academy Use Only


d. Exiba os registros da tabela MGR_HISTORY.

8.
a. Execute o script lab_04_08_a.sql na pasta lab para criar a tabela
SALES_WEEK_DATA.
b. Execute o script lab_04_08b.sql na pasta do laboratório para inserir registros
na tabela SALES_WEEK_DATA.

Oracle Database: Fundamentos de SQL II A - 48


Exercício 4-1: Manipulando Grandes Conjuntos de Dados
(continuação)
c. Exiba a estrutura da tabela SALES_WEEK_DATA.

d. Exiba os registros da tabela SALES_WEEK_DATA.

Oracle Internal & Oracle Academy Use Only


e. Execute o script lab_04_08_e.sql na pasta do laboratório para criar a tabela
EMP_SALES_INFO .
f. Exiba a estrutura da tabela EMP_SALES_INFO .

g. Crie uma consulta para fazer o seguinte:


- Recupere detalhes como ID, ID da semana, quantidade de vendas em cada
dia da semana, de segunda a sexta-feira a partir da tabela
SALES_WEEK_DATA .
- Crie uma transformação de modo que cada registro recuperado da tabela
SALES_WEEK_DATA seja convertido em vários registros para a tabela
EMP_SALES_INFO
Dica: Use uma instrução de criação de pivô INSERT.
h. Exiba os registros da tabela EMP_SALES_INFO.

9. Você tem os dados de funcionários antigos armazenados em um flat file chamado


emp.data. Você deseja armazenar os IDs de nomes e e-mail de todos os

Oracle Database: Fundamentos de SQL II A - 49


Exercício 4-1: Manipulando Grandes Conjuntos de Dados
(continuação)
funcionários, antigos e atuais, em uma tabela. Para fazer isso, crie uma tabela externa
chamada EMP_DATA usando o arquivo de origem emp.dat no diretório emp_dir.
Use o script lab_04_09.sql para fazer isso.
10. Em seguida, execute o script the lab_04_10.sql para criar a tabela
EMP_HIST.
a. Aumente o tamanho da coluna de e-mail para 45.
b. Intercale os dados da tabela EMP_DATA criada no último laboratório com os
dados da tabela EMP_HIST. Suponha que os dados na tabela externa
EMP_DATA sejam os mais atualizados. Se uma linha na tabela EMP_DATA
tiver correspondência na tabela EMP_HIST, atualize a coluna de e-mail da
tabela EMP_HIST para corresponder à linha da tabela EMP_DATA. Se uma

Oracle Internal & Oracle Academy Use Only


linha da tabela EMP_DATA não corresponder, insira-a na tabela EMP_HIST.
As linhas são consideradas correspondentes quando o nome e o sobrenome do
funcionário forem idênticos.
c. Recupere as linhas de EMP_HIST depois da intercalação.

11. Crie a tabela EMP3 usando o script lab_04_11.sql. Na tabela EMP3, altere o
departamento Kochhar para 60 e submeta sua alteração a commit. Em seguida,
altere o departamento Kochhar para 50 e submeta sua alteração a commit. Rastreie
as alterações de Kochhar usando o recurso Row Versions.

Oracle Database: Fundamentos de SQL II A - 50


Soluções do Exercício 4-1: Manipulando Grandes Conjuntos de
Dados
1. Execute o script lab_04_01.sqlna pasta lab para criar a tabela
SAL_HISTORY.

2. Exiba a estrutura da tabela SAL_HISTORY.

DESC sal_history

3. Execute o script lab_04_03.sql na pasta lab para criar a tabela


MGR_HISTORY.

Oracle Internal & Oracle Academy Use Only


4. Exiba a estrutura da tabela MGR_HISTORY.

DESC mgr_history

5. Execute o script lab_04_05.sql na pasta lab para criar a tabela


SPECIAL_SAL.

6. Exiba a estrutura da tabela SPECIAL_SAL.

DESC special_sal

7. a) Crie uma instrução para fazer o seguinte:


- Obter detalhes como o ID do funcionário, a data de contratação, o salário e o
ID do gerente de funcionários cujos IDs sejam inferiores a 125 na tabela
EMPLOYEES.
- Se o salário for superior a $ 20.000, insira detalhes como ID do funcionário
e salário na tabela SPECIAL_SAL.
- Insira detalhes como ID do funcionário, data de contratação e salário na
tabela SAL_HISTORY.
- Insira detalhes como ID do funcionário, ID do gerente e salário na tabela
MGR_HISTORY.

Oracle Database: Fundamentos de SQL II A - 51


Soluções do Exercício 4-1: Manipulando Grandes Conjuntos de
Dados (continuação)

INSERT ALL
WHEN SAL > 20000 THEN
INTO special_sal VALUES (EMPID, SAL)
ELSE
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID, hire_date HIREDATE,
salary SAL, manager_id MGR
FROM employees
WHERE employee_id < 125;

Oracle Internal & Oracle Academy Use Only


b) Exiba os registros da tabela SPECIAL_SAL.

SELECT * FROM special_sal;

c) Exiba os registros da tabela SAL_HISTORY.

SELECT * FROM sal_history;

d) Exiba os registros da tabela MGR_HISTORY.

SELECT * FROM mgr_history;

8. a) Execute o script lab_04_08a.sql na pasta lab para criar a tabela


SALES_WEEK_DATA.

b) Execute o script lab_04_08b.sql na pasta do laboratório para inserir


registros na tabela
SALES_WEEK_DATA.

c) Exiba a estrutura da tabela SALES_WEEK_DATA.

DESC sales_week_data

d) Exiba os registros da tabela SALES_WEEK_DATA.

SELECT * FROM SALES_WEEK_DATA;

Oracle Database: Fundamentos de SQL II A - 52


Soluções do Exercício 4-1: Manipulando Grandes Conjuntos de
Dados (continuação)

e) Execute o script lab_04_08_e.sql na pasta do laboratório para criar a


tabela EMP_SALES_INFO .

f) Exiba a estrutura da tabela EMP_SALES_INFO.

DESC emp_sales_info

g) Crie uma consulta para fazer o seguinte:

Oracle Internal & Oracle Academy Use Only


- Obter detalhes como o ID do funcionário, o ID da semana, o volume de
vendas na segunda-feira, o volume de vendas na terça-feira, o volume de
vendas na quarta-feira, o volume de vendas na quinta-feira e o volume de
vendas na sexta-feira na tabela SALES_WEEK_DATA.
- Crie uma transformação de modo que cada registro recuperado da tabela
SALES_WEEK_DATA seja convertido em vários registros para a tabela
EMP_SALES_INFO.

Dica: Use uma instrução de criação de pivô INSERT.

INSERT ALL
INTO emp_sales_info VALUES (id, week_id, QTY_MON)
INTO emp_sales_info VALUES (id, week_id, QTY_TUE)
INTO emp_sales_info VALUES (id, week_id, QTY_WED)
INTO emp_sales_info VALUES (id, week_id, QTY_THUR)
INTO emp_sales_info VALUES (id, week_id, QTY_FRI)
SELECT ID, week_id, QTY_MON, QTY_TUE, QTY_WED,
QTY_THUR,QTY_FRI FROM sales_week_data;

h) Exiba os registros da tabela SALES_INFO.

SELECT * FROM emp_sales_info;

Oracle Database: Fundamentos de SQL II A - 53


Soluções do Exercício 4-1: Manipulando Grandes Conjuntos de
Dados (continuação)
9. Você tem os dados de funcionários antigos armazenados em um flat file chamado
emp.data. Você deseja armazenar os IDs de nomes e e-mail de todos os
funcionários, antigos e atuais, em uma tabela. Para fazer isso, crie uma tabela
externa chamada EMP_DATA usando o arquivo de origem emp.dat no diretório
emp_dir. Você pode usar o script em lab_04_09.sql para fazer isso.

CREATE TABLE emp_data


(first_name VARCHAR2(20)
, last_name VARCHAR2(20)
, email VARCHAR2(30)
)
ORGANIZATION EXTERNAL

Oracle Internal & Oracle Academy Use Only


(
TYPE oracle_loader
DEFAULT DIRECTORY emp_dir
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII
NOBADFILE
NOLOGFILE
FIELDS
( first_name POSITION ( 1:20) CHAR
, last_name POSITION (22:41) CHAR
, email POSITION (43:72) CHAR )
)
LOCATION ('emp.dat') ) ;

10. Em seguida, execute o script lab_04_10.sql para criar a tabela EMP_HIST.


a) Aumente o tamanho da coluna de e-mail para 45.

ALTER TABLE emp_hist MODIFY email varchar(45);

b) Intercale os dados da tabela EMP_DATA criada no último laboratório com os


dados da tabela EMP_HIST. Suponha que os dados na tabela externa
EMP_DATA sejam os mais atualizados. Se uma linha na tabela EMP_DATA
tiver correspondência na tabela EMP_HIST, atualize a coluna de e-mail da
tabela EMP_HIST para corresponder à linha da tabela EMP_DATA. Se uma
linha da tabela EMP_DATA não corresponder, insira-a na tabela EMP_HIST.
As linhas são consideradas correspondentes quando o nome e o sobrenome do
funcionário forem idênticos.

Oracle Database: Fundamentos de SQL II A - 54


Soluções do Exercício 4-1: Manipulando Grandes Conjuntos de
Dados (continuação)
MERGE INTO EMP_HIST f USING EMP_DATA h
ON (f.first_name = h.first_name
AND f.last_name = h.last_name)
WHEN MATCHED THEN
UPDATE SET f.email = h.email
WHEN NOT MATCHED THEN
INSERT (f.first_name
, f.last_name
, f.email)
VALUES (h.first_name
, h.last_name
, h.email);

Oracle Internal & Oracle Academy Use Only


c) Recupere as linhas de EMP_HIST depois da intercalação.

SELECT * FROM emp_hist;

11. Crie a tabela EMP3 usando o script lab_04_11.sql. Na tabela EMP3, altere o
departamento Kochhar para 60 e submeta sua alteração a commit. Em seguida,
altere o departamento Kochhar para 50 e submeta sua alteração a commit.
Rastreie as alterações em Kochhar com o recurso Row Versions.

UPDATE emp3 SET department_id = 60


WHERE last_name = ‘Kochhar’;
COMMIT;
UPDATE emp3 SET department_id = 50
WHERE last_name = ‘Kochhar’;
COMMIT;

SELECT VERSIONS_STARTTIME "START_DATE",


VERSIONS_ENDTIME "END_DATE", DEPARTMENT_ID
FROM EMP3
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE LAST_NAME ='Kochhar';

Oracle Database: Fundamentos de SQL II A - 55


Exercícios e Soluções da Lição 5
Exercício 5-1: Gerenciando Dados em Diferentes Fusos Horários
Neste exercício, você exibe os deslocamentos de fuso horário, CURRENT_DATE,
CURRENT_TIMESTAMP e LOCALTIMESTAMP Define também os fusos horários e usa a
função EXTRACT.
1. Altere a sessão para definir o NLS_DATE_FORMAT como DD-MON-YYYY
HH24:MI:SS.
2. a. Crie consultas para exibir os deslocamentos do fuso horário (TZ_OFFSET) para
os seguintes fusos horários:
- EUA/Pacífico-Novo

Oracle Internal & Oracle Academy Use Only


- Cingapura

- Egito

b. Altere a sessão para definir o valor do parâmetro TIME_ZONE no


deslocamento do fuso horário dos EUA/Pacífico-novo.
c. Exiba CURRENT_DATE, CURRENT_TIMESTAMP e LOCALTIMESTAMP
para esta sessão.
d. Altere a sessão para definir o valor do parâmetro TIME_ZONE como o
deslocamento do fuso horário de Cingapura.
e. Exiba CURRENT_DATE, CURRENT_TIMESTAMP e LOCALTIMESTAMP
para esta sessão.
Observação: O resultado poderá ser diferente com base na data em que o
comando foi executado.

Observação: Observe na questão anterior que CURRENT_DATE,


CURRENT_TIMESTAMP e LOCALTIMESTAMP diferenciam o fuso
horário da sessão.
3. Crie uma consulta para exibir DBTIMEZONE e SESSIONTIMEZONE.

Oracle Database: Fundamentos de SQL II A - 56


Exercício 5-1: Gerenciando Dados em Diferentes Fusos Horários
(continuação)
4. Crie uma consulta para extrair o YEAR da coluna HIRE_DATE da tabela
EMPLOYEES em relação aos funcionários que trabalham no departamento 80.

Oracle Internal & Oracle Academy Use Only


5. Altere a sessão para definir NLS_DATE_FORMAT como DD-MON-YYYY.
6. Examine e execute o script lab_05_06.sql para criar a tabela SAMPLE_DATES e
preenchê-la.
a. Selecione na tabela e exiba os dados.

b. Modifique o tipo de dados da coluna DATE_COL e altere-o para


TIMESTAMP. Selecione na tabela para exibir os dados.

c. Tente modificar o tipo de dados da coluna DATE_COL e altere-o para


TIMESTAMP WITH TIME ZONE. O que acontecerá?

7. Crie uma consulta para recuperar os sobrenomes com base na tabela EMPLOYEES e
calcular o status da avaliação. Se o ano de contratação for 1998, exiba Needs
Review para o status da avaliação, caso contrário, exiba not this year!
Nomeie a coluna de status da avaliação como Review. Classifique os resultados pela
coluna HIRE_DATE.
Dica: Use uma expressão CASE com a função EXTRACT para calcular o status da
avaliação.

Oracle Database: Fundamentos de SQL II A - 57


Exercício 5-1: Gerenciando Dados em Diferentes Fusos Horários
(continuação)


8. Crie uma consulta para imprimir os sobrenomes e o tempo de serviço (em anos) de
cada funcionário. Se o funcionário estiver empregado há 5 anos ou mais, imprima 5

Oracle Internal & Oracle Academy Use Only


years of service. Se o funcionário estiver empregado há 10 anos ou mais,
imprima 10 years of service. Se o funcionário estiver empregado há 15 anos
ou mais, imprima 15 years of service. Se não for o caso de nenhuma dessas
condições, imprima maybe next year! Classifique os resultados pela coluna
HIRE_DATE. Use a tabela EMPLOYEES.
Dica: Use as expressões CASE e TO_YMINTERVAL.

...

Oracle Database: Fundamentos de SQL II A - 58


Soluções do Exercício 5-1: Gerenciando Dados em Diferentes
Fusos Horários

1. Altere a sessão para definir o NLS_DATE_FORMAT como DD-MON-YYYY


HH24:MI:SS.
ALTER SESSION SET NLS_DATE_FORMAT =
'DD-MON-YYYY HH24:MI:SS';

2. a. Crie consultas para exibir os deslocamentos do fuso horário (TZ_OFFSET) para


os seguintes fusos horários: EUA/Pacífico-novo, Cingapura e Egito.

Oracle Internal & Oracle Academy Use Only


EUA/Pacífico-Novo
SELECT TZ_OFFSET ('US/Pacific-New') from dual;
Cingapura
SELECT TZ_OFFSET ('Singapore') from dual;
Egito
SELECT TZ_OFFSET ('Egypt') from dual;

b. Altere a sessão para definir o valor do parâmetro TIME_ZONE no deslocamento


do fuso horário dos EUA/Pacífico-novo.

ALTER SESSION SET TIME_ZONE = '-7:00';

c. Exiba CURRENT_DATE, CURRENT_TIMESTAMP e LOCALTIMESTAMP para


esta sessão.
Observação: Os resultados poderão variar com base na data em que o comando
for executado.
SELECT CURRENT_DATE, CURRENT_TIMESTAMP,
LOCALTIMESTAMP FROM DUAL;

d. Altere a sessão para definir o valor do parâmetro TIME_ZONE como o


deslocamento do fuso horário de Cingapura.

ALTER SESSION SET TIME_ZONE = '+8:00';

e. Exiba CURRENT_DATE, CURRENT_TIMESTAMP e LOCALTIMESTAMP para


esta sessão.
Observação: Os resultados poderão variar com base na data em que o comando é
executado.

Oracle Database: Fundamentos de SQL II A - 59


Soluções do Exercício 5-1: Gerenciando Dados em Diferentes
Fusos Horários (continuação)
SELECT CURRENT_DATE, CURRENT_TIMESTAMP,
LOCALTIMESTAMP FROM DUAL;

Observação: Observe na questão anterior que CURRENT_DATE,


CURRENT_TIMESTAMP e LOCALTIMESTAMP diferenciam o fuso horário da
sessão.

3. Crie uma consulta para exibir DBTIMEZONE e SESSIONTIMEZONE.


SELECT DBTIMEZONE,SESSIONTIMEZONE
FROM DUAL;

Oracle Internal & Oracle Academy Use Only


4. Crie uma consulta para extrair o YEAR da coluna HIRE_DATE da tabela
EMPLOYEES em relação aos funcionários que trabalham no departamento 80.
SELECT last_name, EXTRACT (YEAR FROM HIRE_DATE)
FROM employees
WHERE department_id = 80;

5. Altere a sessão para definir NLS_DATE_FORMAT como DD-MON-YYYY.

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

6. Examine e execute o script lab_05_06.sql para criar a tabela SAMPLE_DATES e


preenchê-la.

a. Selecione na tabela e exiba os dados.

SELECT * FROM sample_dates;

b. Modifique o tipo de dados da coluna DATE_COL e altere-o para TIMESTAMP.


Selecione na tabela para exibir os dados.

ALTER TABLE sample_dates MODIFY date_col TIMESTAMP;


SELECT * FROM sample_dates;

c. Tente modificar o tipo de dados da coluna DATE_COL e altere-o para


TIMESTAMP WITH TIME ZONE. O que acontece?

ALTER TABLE sample_dates MODIFY date_col


TIMESTAMP WITH TIME ZONE;

Oracle Database: Fundamentos de SQL II A - 60


Soluções do Exercício 5-1: Gerenciando Dados em Diferentes
Fusos Horários (continuação)
Você não pode alterar o tipo de dados da coluna DATE_COL, pois o Oracle Server
não permite converter de TIMESTAMP para TIMESTAMP WITH TIMEZONE
usando a instrução ALTER.
7. Crie uma consulta para recuperar os sobrenomes com base na tabela EMPLOYEES e
calcular o status da avaliação. Se o ano de contratação for 1998, exiba Needs
Review para o status da avaliação, caso contrário, exiba not this year! Nomeie
a coluna de status da avaliação como Review. Classifique os resultados pela coluna
HIRE_DATE.
Dica: Use uma expressão CASE com a função EXTRACT para calcular o status da
avaliação.

Oracle Internal & Oracle Academy Use Only


SELECT e.last_name
, (CASE extract(year from e.hire_date)
WHEN 1998 THEN 'Needs Review'
ELSE 'not this year!'
END ) AS "Review "
FROM employees e
ORDER BY e.hire_date;

8. Crie uma consulta para imprimir os sobrenomes e o número de anos de serviço de


cada funcionário. Se o funcionário tiver sido empregado por cinco ou mais anos,
imprima 5 years of service. Se o funcionário tiver sido empregado por cinco
ou mais anos, imprima 10 years of service. Se o funcionário tiver sido
empregado por 15 ou mais anos, imprima 15 years of service. Se não for o
caso de nenhuma dessas condições, imprima maybe next year! Classifique os
resultados pela coluna HIRE_DATE. Use a tabela EMPLOYEES.
Dica: Use as expressões CASE e TO_YMINTERVAL.
SELECT e.last_name, hire_date, sysdate,
(CASE
WHEN (sysdate -TO_YMINTERVAL('15-0'))>=
hire_date THEN '15 years of service'
WHEN (sysdate -TO_YMINTERVAL('10-0'))>= hire_date
THEN '10 years of service'
WHEN (sysdate - TO_YMINTERVAL('5-0'))>= hire_date
THEN '5 years of service'
ELSE 'maybe next year!'
END) AS "Awards"
FROM employees e;

Oracle Database: Fundamentos de SQL II A - 61


Exercícios e Soluções da Lição 6

Exercício 6-1: Recuperando Dados Usando Subconsultas


Neste exercício, você cria subconsultas de várias colunas e subconsultas correlacionadas
e escalares. Também pode solucionar problemas criando a cláusula WITH.

1. Crie uma consulta para exibir o sobrenome, o número de departamento e o salário de


qualquer funcionário cujo número de departamento e salário coincidam com o
número de departamento e salário de qualquer funcionário que receba comissão.

Oracle Internal & Oracle Academy Use Only


2. Exiba sobrenome, nome do departamento e salário de qualquer funcionário cujo
salário e comissão correspondam ao de qualquer funcionário localizado no ID de
local 1700.

3. Crie uma consulta para exibir o sobrenome, a data de contratação e o salário de todos
os funcionários com o mesmo salário e comissão de Kochhar.
Observação:Não exiba Kochhar no conjunto de resultados.

4. Crie uma consulta para exibir os funcionários que ganham um salário maior que o
salário de qualquer gerentes de vendas (JOB_ID = 'SA_MAN'). Classifique os
resultados desde o maior até o menor.

Oracle Database: Fundamentos de SQL II A - 62


Exercício 6-1: Recuperando Dados Usando Subconsultas
(continuação)

5. Exiba detalhes como o ID do funcionário, o sobrenome e o ID do departamento dos


funcionários que moram em cidades com nomes que começam com a letra T.

6. Crie uma consulta para localizar todos os funcionários que ganham acima do salário

Oracle Internal & Oracle Academy Use Only


médio em seus departamentos. Exiba sobrenome, salário, ID do departamento e
salário médio do departamento. Classifique por salário médio e arredonde para duas
casas decimais. Use apelidos para as colunas obtidas pela consulta, como mostrado na
saída de amostra.

7. Localize todos os funcionários que não são supervisores.


a. Primeiramente, faça isto usando o operador NOT EXISTS.

Oracle Database: Fundamentos de SQL II A - 63


Exercício 6-1: Recuperando Dados Usando Subconsultas
(continuação)

b. Isso pode ser feito com o operador NOT IN? Como ou por que não?
8. Crie uma consulta para exibir o sobrenome dos funcionários quem ganham menos
que o salário médio em seus respectivos departamentos.

Oracle Internal & Oracle Academy Use Only


9. Crie uma consulta para exibir os sobrenomes dos funcionários que têm um ou mais
colegas de trabalho nos respectivos departamentos com datas de admissão
posteriores, mas com salários mais altos.

10. Crie uma consulta para exibir o ID, os sobrenomes e os nomes de departamento de
todos os funcionários.
Observação: Use uma subconsulta escalar para recuperar o nome do departamento
na instrução SELECT.

Oracle Database: Fundamentos de SQL II A - 64


Exercício 6-1: Recuperando Dados Usando Subconsultas
(continuação)

Oracle Internal & Oracle Academy Use Only


11. Crie uma consulta para exibir o nome dos departamentos cujos totais de salários
sejam superiores a 1/8 do total de salários de toda a empresa. Use a cláusula WITH
para criar essa consulta. Nomeie a consulta como SUMMARY.

Oracle Database: Fundamentos de SQL II A - 65


Soluções do Exercício 6-1: Recuperando Dados Usando
Subconsultas
1. Crie uma consulta para exibir o sobrenome, o número de departamento e o salário
dos funcionários cujos números de departamento e salários correspondem a
números de departamento e salários de funcionários que ganham comissão.
SELECT last_name, department_id, salary
FROM employees
WHERE (salary, department_id) IN
(SELECT salary, department_id
FROM employees
WHERE commission_pct IS NOT NULL);

Oracle Internal & Oracle Academy Use Only


2. Mostre o sobrenome, o número de departamento e o salário dos funcionários
cujos salários e comissões correspondem aos salários e comissões de funcionários
localizados na localidade ID1700.
SELECT e.last_name, d.department_name, e.salary
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND (salary, NVL(commission_pct,0)) IN
(SELECT salary, NVL(commission_pct,0)
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND d.location_id = 1700);

3. Crie uma consulta para exibir o sobrenome, a data de contratação e o salário de


todos os funcionários com o mesmo salário e comissão de Kochhar.
Observação: Não exiba Kochhar no conjunto de resultados.

SELECT last_name, hire_date, salary


FROM employees
WHERE (salary, NVL(commission_pct,0)) IN
(SELECT salary, NVL(commission_pct,0)
FROM employees
WHERE last_name = 'Kochhar')
AND last_name != 'Kochhar';
4. Crie uma consulta para exibir os funcionários que ganham um salário maior que o
salário de qualquer gerentes de vendas (JOB_ID = 'SA_MAN'). Classifique os
resultados por salário na ordem decrescente.
SELECT last_name, job_id, salary
FROM employees
WHERE salary > ALL
(SELECT salary
FROM employees

Oracle Database: Fundamentos de SQL II A - 66


Soluções do Exercício 6-1: Recuperando Dados Usando
Subconsultas (continuação)
WHERE job_id = 'SA_MAN')
ORDER BY salary DESC;

5. Exiba detalhes como o ID do funcionário, o sobrenome e o ID do departamento


dos funcionários que moram em cidades com nomes que começam com a letra T.
SELECT employee_id, last_name, department_id
FROM employees
WHERE department_id IN (SELECT department_id
FROM departments
WHERE location_id IN
(SELECT location_id
FROM locations

Oracle Internal & Oracle Academy Use Only


WHERE city LIKE 'T%'));

6. Crie uma consulta para localizar todos os funcionários que ganham acima do
salário médio em seus departamentos. Exiba sobrenome, salário, ID do
departamento e salário médio do departamento. Classifique pelo salário médio.
Use apelidos para as colunas obtidas pela consulta, como mostrado na saída de
amostra.
SELECT e.last_name ename, e.salary salary,
e.department_id deptno, AVG(a.salary) dept_avg
FROM employees e, employees a
WHERE e.department_id = a.department_id
AND e.salary > (SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id )
GROUP BY e.last_name, e.salary, e.department_id
ORDER BY AVG(a.salary);

Oracle Database: Fundamentos de SQL II A - 67


Soluções do Exercício 6-1: Recuperando Dados Usando
Subconsultas (continuação)

7. Localize todos os funcionários que não são supervisores.


a. Primeiro, faça isso usando o operador NOT EXISTS.

SELECT outer.last_name
FROM employees outer
WHERE NOT EXISTS (SELECT 'X'
FROM employees inner
WHERE inner.manager_id =
outer.employee_id);

Oracle Internal & Oracle Academy Use Only


b. Isso pode ser feito com o operador NOT IN? Como, ou por que não?

SELECT outer.last_name
FROM employees outer
WHERE outer.employee_id
NOT IN (SELECT inner.manager_id
FROM employees inner);

Essa solução alternativa não é aconselhável. A subconsulta escolhe um valor NULL, por
isso nenhuma linha é retornada em toda a consulta. O motivo é que todas as condições
que comparam um valor NULL resultam em NULL. Sempre que houver probabilidade
de valores NULL fazerem parte do conjunto de valores não use NOT IN como substituto
de NOT EXISTS.

8. Crie uma consulta para exibir o sobrenome dos funcionários quem ganham menos
que o salário médio em seus respectivos departamentos.
SELECT last_name
FROM employees outer
WHERE outer.salary < (SELECT AVG(inner.salary)
FROM employees inner
WHERE inner.department_id
= outer.department_id);

Oracle Database: Fundamentos de SQL II A - 68


Soluções do Exercício 6-1: Recuperando Dados Usando
Subconsultas (continuação)

9. Crie uma consulta para exibir o sobrenome dos funcionários quem têm um ou
mais colegas em seus departamentos que foram contratados depois mas que
ganham salários maiores.
SELECT last_name
FROM employees outer
WHERE EXISTS (SELECT 'X'
FROM employees inner
WHERE inner.department_id =
outer.department_id
AND inner.hire_date > outer.hire_date

Oracle Internal & Oracle Academy Use Only


AND inner.salary > outer.salary);

10. Crie uma consulta para exibir o ID, os sobrenomes e os nomes de departamento
de todos os funcionários.
Observação: Use uma subconsulta escalar para recuperar o nome do
departamento na instrução SELECT.

SELECT employee_id, last_name,


(SELECT department_name
FROM departments d
WHERE e.department_id =
d.department_id ) department
FROM employees e
ORDER BY department;

11. Crie uma consulta para exibir o nome dos departamentos cujos totais de salários
sejam superiores a 1/8 do total de salários de toda a empresa. Use a cláusula
WITH para criar essa consulta. Nomeie a consulta como SUMMARY.

WITH
summary AS (
SELECT d.department_name, SUM(e.salary) AS dept_total
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name)
SELECT department_name, dept_total
FROM summary
WHERE dept_total > ( SELECT SUM(dept_total) * 1/8
FROM summary )
ORDER BY dept_total DESC;

Oracle Database: Fundamentos de SQL II A - 69


Exercícios e Soluções da Lição 7

Exercício 7-1: Suporte a Expressões Comuns


Neste exercício, você pode usar funções de expressões comuns para pesquisar, substituir
e manipular dados. Também é possível criar uma nova tabela CONTACTS e adicionar
uma constraint CHECK à coluna p_number para garantir que os números de telefone
sejam informados no banco de dados em um formato padrão específico.
1. Crie uma consulta para pesquisar na tabela EMPLOYEES todos os funcionários cujos
nomes comecem com “Ki” ou “Ko”.

Oracle Internal & Oracle Academy Use Only


2. Crie uma consulta para remover os espaços na coluna STREET_ADDRESS da tabela
LOCATIONS na exibição. Use “Street Address” como o cabeçalho da coluna.

3. Crie uma consulta que exiba “St” substituído por “Street” na coluna
STREET_ADDRESS da tabela LOCATIONS. Tome cuidado para não afetar nenhuma
linha que já contenha “Street”. Exiba somente as linhas afetadas.

4. Crie uma tabela de contatos e adicione uma constraint de verificação à coluna


p_number para aplicar a seguinte máscara de formato e garantir que os números
telefônicos sejam inseridos no banco de dados no seguinte formato padrão: (XXX)
XXX-XXXX. A tabela deve ter as seguintes colunas:
- l_name varchar2(30)
- p_number varchar2 (30)

Oracle Database: Fundamentos de SQL II A - 70


Exercício 7-1: Suporte a Expressões Comuns (continuação)
5. Execute o script lab_07_05.sql para inserir estes sete números telefônicos na
tabela contacts. Quais são os números adicionados?

l_name Column Value p_number Column Value


NULL ‘(650) 555-5555’
NULL ‘(215) 555-3427’
NULL ‘650 555-5555’
NULL ‘650 555 5555’
NULL ‘650-555-5555’
NULL ‘(650)555-5555’

Oracle Internal & Oracle Academy Use Only


NULL ‘ (650) 555-5555’

6. Crie uma consulta para localizar o número de ocorrências do padrão de DNA ctc na
string gtctcgtctcgttctgtctgtcgttctg. Ignore a distinção de maiúsculas e
minúsculas.

Oracle Database: Fundamentos de SQL II A - 71


Soluções do Exercício 7-1: Suporte a Expressões Comuns
1. Crie uma consulta para pesquisar na tabela EMPLOYEES todos os funcionários
cujos nomes iniciem com “Ki” ou “Ko.”

SELECT first_name, last_name


FROM employees
WHERE REGEXP_LIKE (last_name, '^K(i|o).');

2. Crie uma consulta que remova os espaços na coluna STREET_ADDRESS da


tabela LOCATIONS na tela. Use “Street Address” como cabeçalho da coluna.

Oracle Internal & Oracle Academy Use Only


SELECT regexp_replace (street_address, ' ', '') AS "Street
Address"
FROM locations;

3. Crie uma consulta para exibir “St” substituído por “Street” na coluna
STREET_ADDRESS da tabela LOCATIONS. Tenha cuidado para não afetar as linhas
que já têm o termo “Street”. Mostre apenas as linhas que serão afetadas.

SELECT regexp_replace (street_address, 'St$',


'Street')
FROM locations
WHERE regexp_like (street_address, 'St');

4. Crie uma tabela de contatos e adicione uma constraint de verificação à coluna


p_number para aplicar a seguinte máscara de formato e garantir que os números
telefônicos sejam inseridos no banco de dados no seguinte formato padrão: (XXX)
XXX-XXXX. A tabela deve ter as seguintes colunas:
• l_name varchar2(30)
• p_number varchar2 (30)

CREATE TABLE contacts


(
l_name VARCHAR2(30),
p_number VARCHAR2(30)
CONSTRAINT p_number_format
CHECK ( REGEXP_LIKE ( p_number, '^\(\d{3}\) \d{3}-
\d{4}$' ) )
);

Oracle Database: Fundamentos de SQL II A - 72


Soluções do Exercício 7-1: Suporte a Expressões Comuns
(continuação)

5. Execute o script lab_07_05.sql para inserir estes sete números telefônicos na


tabela de contatos. Quais são os números adicionados?
Somente as duas primeiras instruções INSERT usam um formato em
conformidade com a restrição c_contacts_pnf; as demais instruções
geram erros de constraint CHECK.
6. Crie uma consulta para localizar o número de ocorrências do padrão de DNA ctc
na string gtctcgtctcgttctgtctgtcgttctg. Use o apelido Count_DNA.
Ignore a distinção de maiúsculas e minúsculas. Esta função, introduzida com o
11g Release 2, retorna o número de vezes que a correspondência de um
padrão é localizada na string de entrada.

Oracle Internal & Oracle Academy Use Only


SELECT REGEXP_COUNT('gtctcgtctcgttctgtctgtcgttctg','ctc')
AS Count_DNA
FROM dual;

Oracle Database: Fundamentos de SQL II A - 73


Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II A - 74


Descrição das Tabelas

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.
Descrição do esquema
Descrição Geral
Os esquemas de amostra do banco de dados Oracle ilustram uma empresa fictícia que opera em todo
o mundo e atende pedidos de diversos produtos diferentes. A empresa contém três divisões:
• Human Resources: controla informações sobre funcionários e instalações
• Order Entry: controla inventários de produtos e vendas por meio de vários canais
• Sales History: controla as estatísticas dos negócios para facilitar a tomada de decisões
Cada uma dessas divisões é representada por um esquema. Neste curso, você tem acesso aos objetos
de todos os esquemas. No entanto, a ênfase dos exemplos, das demonstrações e das práticas está no
esquema Human Resources (HR).
Todos os scripts necessários para criar os exemplos de esquemas estão na pasta
$ORACLE_HOME/demo/schema/.
Human Resources (HR)

Oracle Internal & Oracle Academy Use Only


Este é o esquema utilizado neste curso. Nos registros de Human Resource (HR), cada funcionário
apresenta um número de identificação, um endereço de e-mail, um código de identificação do cargo,
um salário e um gerente. Além do salário, alguns funcionários recebem comissões.
A empresa também rastreias as informações sobre os cargos na organização. Há um código de
identificação, um título e uma faixa salarial com os valores mínimo e máximo. Alguns funcionários
estão na empresa há muito tempo e já ocuparam várias posições. Quando um funcionário sai, são
registrados o tempo de permanência na empresa, o número de identificação do cargo e o
departamento.
A empresa fictícia é regionalmente diversa, assim ela controla as localizações de armazéns e
departamentos. Cada funcionário está atribuído a um departamento e cada departamento é
identificado por um número de departamento exclusivo ou nome abreviado. Cada departamento está
associado a um local e cada local tem um endereço completo que inclui o nome da rua, o código
postal, a cidade, o estado, ou província, e o código do país.
Nos lugares onde os departamentos e armazéns estão localizados, os detalhes dos registros da
empresa contêm, por exemplo, nome do país, símbolo monetário, nome da moeda e região de
localização geográfica do país.

Oracle Database: Fundamentos de SQL II B - 2


O Diagrama de Relacionamento da Entidade HR

LOCATION
HR DEPARTAMENTS
department_id location_id
department_name street_address
manager_id postal_code
location_id cidade
state_province
country_id
JOB_HISTORY
employee_id
start_date EMPLOYEES
end_date employee_id
job_id first_name
last_name
COUNTRY
department_id country_id

Oracle Internal & Oracle Academy Use Only


email
country_name
phone_number
region_id
hire_date
job_id
JOBS salário
job_id commission_pct
job_title manager_id
min_salary department_id REGION
max_salary region_id
region_name

Oracle Database: Fundamentos de SQL II B - 3


As descrições da tabela Human Resources (HR)
DESCRIBE countries

SELECT * FROM countries;

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II B - 4


As descrições da tabela Human Resources (HR) (continuação)
DESCRIBE departments

SELECT * FROM departments;

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II B - 5


As descrições da tabela Human Resources (HR) (continuação)
DESCRIBE employees

Oracle Internal & Oracle Academy Use Only


SELECT * FROM employees;

Oracle Database: Fundamentos de SQL II B - 6


As descrições da tabela Human Resources (HR) (continuação)
DESCRIBE job_history

Oracle Internal & Oracle Academy Use Only


SELECT * FROM job_history

Oracle Database: Fundamentos de SQL II B - 7


As descrições da tabela Human Resources (HR) (continuação)
DESCRIBE jobs

SELECT * FROM jobs

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II B - 8


As descrições da tabela Human Resources (HR) (continuação)
DESCRIBE locations

SELECT * FROM locations

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II B - 9


As descrições da tabela Human Resources (HR) (continuação)
DESCRIBE regions

SELECT * FROM regions

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II B - 10


Usando o SQL Developer

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.
Objetivos

Ao concluir este apêndice, você será capaz de:


• Listar os principais recursos do Oracle SQL Developer
• Identificar itens de menu do Oracle SQL Developer
• Criar uma conexão de banco de dados
• Gerenciar objetos de banco de dados
• Usar a Planilha SQL

Oracle Internal & Oracle Academy Use Only


• Salvar e executar scripts SQL
• Criar e salvar relatórios

Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Neste apêndice, você será apresentado à ferramenta gráfica chamada SQL Developer. Você
aprenderá a usar o SQL Developer nas tarefas de desenvolvimento de seu banco de dados. Você
aprenderá a usar a Planilha SQL para executar instruções e scripts SQL.

Oracle Database: Fundamentos de SQL II C - 2


O que É o Oracle SQL Developer?
• O Oracle SQL Developer é uma ferramenta gráfica que
melhora a produtividade e simplifica as tarefas de
desenvolvimento de banco de dados.
• Você pode se conectar a qualquer esquema de banco de
dados Oracle de destino usando a autenticação de banco
de dados padrão Oracle.

Oracle Internal & Oracle Academy Use Only


SQL Developer

Copyright © 2011, Oracle. Todos os direitos reservados.

O que É o Oracle SQL Developer?


O Oracle SQL Developer é uma ferramenta gráfica gratuita projetada para melhorar sua
produtividade e simplificar o desenvolvimento das tarefas diárias de banco de dados. Com
apenas alguns cliques, você poderá criar e depurar com facilidade procedures armazenados,
testar instruções SQL e exibir planos do otimizador.
O SQL Developer, a ferramenta visual para o desenvolvimento de banco de dados, simplifica as
seguintes tarefas:
• Pesquisa e gerenciamento de objetos de banco de dados
• Execução de scripts e instruções SQL
• Edição e depuração de instruções PL/SQL
• Criação de relatórios
Você pode se conectar a qualquer esquema de banco de dados Oracle de destino usando a
autenticação padrão de banco de dados Oracle. Quando estiver conectado, você poderá executar
operações em objetos no banco de dados.
O SQL Developer release 1.2 está totalmente integrado ao Developer Migration Workbench, que
oferece aos usuários um único ponto para navegar pelos dados e objetos de bancos de dados em
bancos de dados de terceiros e para migrar desses bancos de dados para o Oracle. Você também
pode se conectar a esquemas de bancos de dados de terceiros (não Oracle) como, por exemplo,
MySQL, Microsoft SQL Server e Microsoft Access e pode também visualizar dados e
metadados nesses bancos de dados.
Além disso, o SQL Developer inclui suporte para o Oracle Application Express 3.0.1 (Oracle
APEX).
Oracle Database: Fundamentos de SQL II C - 3
Especificações do SQL Developer

• É fornecido com o Oracle Database 11g Release 2


• Desenvolvido em Java
• Suporta as plataformas Windows, Linux e Mac OS X
• Conectividade default usando o driver JDBC (Java
Database Connectivity) Thin
• Conecta-se ao Oracle Database versão 9.2.0.1 e posterior

Oracle Internal & Oracle Academy Use Only


• O download pode ser executado gratuitamente no link a
seguir:
– http://www.oracle.com/technology/products/database/sql_de
veloper/index.html

Copyright © 2011, Oracle. Todos os direitos reservados.

Especificações do SQL Developer


O Oracle SQL Developer 1.5 é fornecido com o Oracle Database 11g Release 2. O SQL
Developer é desenvolvido em Java e utiliza o Oracle JDeveloper IDE (Integrated Development
Environment) do Oracle JDeveloper (IDE). Portanto, é uma ferramenta multiplataforma. A
ferramenta funciona nas plataformas X de sistema operacional (OS) Windows, Linux e Mac.
A conectividade default para o banco de dados se dá pelo driver JDBC thin e, portanto, não há a
necessidade de um Oracle Home. O SQL Developer não necessita de um instalador e você
precisa apenas descompactar o arquivo transferido por download. Com o SQL Developer, os
usuários podem se conectar a Oracle Databases 9.2.0.1 e posteriores e a todas as versões de
banco de dados Oracle, incluindo a Express Edition.
Observação
Em versões do Oracle Database anteriores à Oracle Database 11g Release 2, você deverá fazer
o download e instalar o SQL Developer. O SQL Developer 1.5 está disponível para download
gratuito a partir do seguinte link:
http://www.oracle.com/technology/products/database/sql_developer/index.html.
Para obter instruções sobre como instalar o SQL Developer, você pode visitar este link:
http://download.oracle.com/docs/cd/E12151_01/index.htm

Oracle Database: Fundamentos de SQL II C - 4


Interface do SQL Developer 1.5

Você precisa definir


uma conexão para

Oracle Internal & Oracle Academy Use Only


começar a usar o SQL
Developer para a
execução de consultas
SQL em um esquema
de banco de dados.

Copyright © 2011, Oracle. Todos os direitos reservados.

Interface do SQL Developer 1.5


A interface do SQL Developer 1.5 contém três tabs principais de navegação, da esquerda para a
direita:
• Tab Connections: Com esta tab, você pode navegar pelos objetos e usuários de banco de
dados aos quais tem acesso.
• Tab Files: Identificado pelo ícone de pasta de arquivos, essa tab permite que você acesse
os arquivos pela máquina local, sem precisar usar o menu File > Open.
• Tab Reports: Identificada pelo ícone Reports, essa tab permite que você execute relatórios
predefinidos ou crie e adicione seus próprios relatórios.
Uso e Navegação Geral
O SQL Developer usa o lado esquerdo de navegação para localizar e selecionar objetos e o lado
direito para exibir informações sobre objetos selecionados. Você pode personalizar diversos
aspectos da aparência e do comportamento do SQL Developer configurando preferências.
Observação: Você precisa definir pelo menos uma conexão para poder conectar-se a um
esquema de banco de dados e emitir consultas SQL ou executar procedimentos/funções.

Oracle Database: Fundamentos de SQL II C - 5


Interface do SQL Developer 1.5 (continuação)
Menus
Os menus a seguir contêm entradas padrão, além de entradas para recursos específicos do
SQL Developer:
• View: Contém opções que afetam o que é exibido na interface do SQL Developer
• Navigate: Contém opções para navegar para diversos painéis e para executar
subprogramas
• Run: Contém as opções Run File e Execution Profile que são relevantes quando uma
função ou um procedure é selecionado, além de opções de depuração
• Source: Contém opções para serem usadas quando você editar funções e procedures
• Versioning: Oferece suporte integrado para os seguintes sistemas de controle de origem
e de versão: CVS (Concurrent Versions System) e Subversion
• Migration: Contém opções relacionadas à migração de bancos de dados de terceiros
para o Oracle

Oracle Internal & Oracle Academy Use Only


• Tools: Chama as ferramentas do SQL Developer como, por exemplo, SQL*Plus,
Preferences e Planilha SQL
Observação:O menu Run também contém opções que são relevantes quando uma função ou
um procedure é selecionado para depuração. Essas são as mesmas opções encontradas no
menu Debug na versão 1.2.

Oracle Database: Fundamentos de SQL II C - 6


Criando uma Conexão de Banco de Dados

• Você precisa ter pelo menos uma conexão de banco de


dados para usar o SQL Developer.
• Você pode criar e testar conexões para vários:
– Bancos de dados
– Esquemas
• O SQL Developer importa automaticamente as conexões

Oracle Internal & Oracle Academy Use Only


definidas no arquivo tnsnames.ora em seu sistema.
• Você pode exportar conexões para um arquivo XML
(Extensible Markup Language).
• Cada conexão adicional com o banco de dados que é
criada é listada na hierarquia do Connections Navigator.

Copyright © 2011, Oracle. Todos os direitos reservados.

Criando uma Conexão de Banco de Dados


Uma conexão é um objeto do SQL Developer que especifica as informações necessárias para
conexão com determinado banco de dados como um usuário específico desse banco de dados.
Para usar o SQL Developer, será necessário ter ao menos uma conexão de banco de dados, que
poderá ser existente, criada ou importada.
Você pode criar e testar conexões com vários bancos de dados e vários esquemas.
Por default, o arquivo tnsnames.ora está localizado no diretório
$ORACLE_HOME/network/admin, mas ele também pode estar no diretório especificado
pelo valor de Registro ou pela variável de ambiente TNS_ADMIN. Quando você iniciar o SQL
Developer e exibir a caixa de diálogo Database Connections, o SQL Developer importará
automaticamente as conexões definidas no arquivo tnsnames.ora do sistema.
Observação: No Windows, se existir o arquivo tnsnames.ora, mas suas conexões não
estiverem sendo usadas pelo SQL Developer, defina TNS_ADMIN como uma variável de
ambiente do sistema.
Você pode exportar conexões para um arquivo XML para que você possa reutilizá-las
posteriormente.
Você pode criar conexões adicionais como usuários diferentes do mesmo banco de dados ou
para conectar-se aos diferentes bancos de dados.

Oracle Database: Fundamentos de SQL II C - 7


Criando uma Conexão de Banco de Dados

1 2

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Criando uma Conexão de Banco de Dados (continuação)


Para criar uma conexão de banco de dados, faça o seguinte:
1. Na página com a tab Connections, clique com o botão direito do mouse em Connections e
selecione New Connection.
2. Na janela New/Select Database Connection, informe o nome da conexão. Informe o nome
de usuário e a senha do esquema ao qual deseja se conectar.
a) Na caixa drop-down Role, você pode selecionar o default ou SYSDBA (você
escolheSYSDBA para o usuário sys ou para qualquer usuário com privilégios de
administrador de banco de dados).
b) Você pode selecionar o tipo de conexão como:
- Basic:Nesse tipo, digite o nome do host e o SID para o banco de dados ao qual
deseja se conectar. A porta já foi configurada como 1521. Você também tem a
opção de informar diretamente o nome do serviço, se usar uma conexão remota
com o banco de dados.
- TNS: Você pode selecionar qualquer apelido de banco de dados importado do
arquivo tnsnames.ora.
- LDAP: Você pode pesquisar serviços de bancos de dados no Oracle Internet
Directory, que é um componente do Oracle Identity Management.
- Advanced: Você pode definir um URL JDBC personalizado para se conectar ao
banco de dados.
Oracle Database: Fundamentos de SQL II C - 8
Criando uma Conexão de Banco de Dados (continuação)
c) Clique em Test para garantir que a conexão foi definida corretamente.
d) Clique em Connect.
Se você marcar a caixa de seleção Save Password, a senha será salva em um arquivo XML.
Assim, depois que você fechar a conexão com o SQL Developer e abri-la novamente, a
senha não será solicitada.
3. A conexão será adicionada ao Connections Navigator. Você pode expandir a conexão para
exibir os objetos de banco de dados e exibir as definições de objeto, por exemplo,
dependências, detalhes, estatísticas e assim por diante.
Observação: Na mesma janela New/Select Database Connection, você poderá definir conexões
com origens de dados não Oracle usando as tabs Access, MySQL e SQL Server. No entanto,
essas conexões são somente para leitura, as quais permitem que você navegue por objetos e
dados nessa origem de dados.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II C - 9


Navegando por Objetos de Banco de Dados
Use o Connections Navigator para:
• Navegar por vários objetos em um esquema de banco
de dados
• Analisar rapidamente as definições de objetos

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Navegando por Objetos de Banco de Dados


Após criar uma conexão de banco de dados, você poderá usar o Connections Navigator para
procurar dentre vários objetos em um esquema de banco de dados, incluindo Tabelas, Views,
Índices, Pacotes, Procedures, Triggers e Tipos.
Você pode visualizar a definição dos objetos dividida em tabs de informações que são obtidas do
dicionário de dados. Por exemplo, se você tiver selecionado uma tabela no Navigator, os
detalhes sobre colunas, constraints, grants, estatísticas, triggers e assim por diante serão exibidos
em uma página com tabs fácil de ler.
Se desejar visualizar a definição da tabela EMPLOYEES conforme mostrada no slide, execute as
seguintes etapas:
1. Expanda o nó Connections no Connections Navigator.
2. Expanda Tables.
3. Clique em EMPLOYEES. Por default, a tab Columns é selecionada. Ela mostra a descrição
da coluna da tabela. Usando a tab Data, você poderá exibir os dados da tabela, assim como
incluir novas linhas, atualizar dados e fazer commit dessas alterações no banco de dados.

Oracle Database: Fundamentos de SQL II C - 10


Exibindo a Estrutura da Tabela

Use o comando DESCRIBE para exibir a estrutura de uma


tabela:

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Exibindo a Estrutura da Tabela


No SQL Developer, também é possível exibir a estrutura de uma tabela usando o comando
DESCRIBE. O resultado do comando é uma exibição de nomes de colunas e tipos de dados,
assim como uma indicação informando se a coluna deve conter dados.

Oracle Database: Fundamentos de SQL II C - 11


Procurando Arquivos

Use o File Navigator para explorar o sistema de arquivos


e abrir os arquivos do sistema.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Navegando por Objetos de Banco de Dados


Você pode usar o File Navigator para procurar e abrir os arquivos do sistema.
• Para exibir o File Navigator, clique na tab Files ou clique em View > Files.
• Para exibir o conteúdo de um arquivo, clique duas vezes no nome de um arquivo para
exibir seu conteúdo na área da Planilha SQL.

Oracle Database: Fundamentos de SQL II C - 12


Criando um Objeto de Esquema

• O SQL Developer oferece suporte para a criação de


qualquer objeto de esquema:
– Executando uma instrução SQL em uma Planilha SQL
– Usando o menu de contexto
• Edite os objetos usando uma caixa de diálogo de edição
ou um dos muitos menus contextuais.
• Exiba a DDL (data definition language) referente aos

Oracle Internal & Oracle Academy Use Only


ajustes como, por exemplo, a criação de um novo objeto
ou a edição de um objeto de esquema existente.

Copyright © 2011, Oracle. Todos os direitos reservados.

Criando um Objeto de Esquema


O SQL Developer oferece suporte para a criação de qualquer objeto de esquema com a execução
de uma instrução SQL em uma planilha SQL. Como alternativa, você poderá criar objetos
usando os menus de contexto. Depois de criados, você poderá editar os objetos usando uma
caixa de diálogo de edição ou um dos muitos menus contextuais.
À medida que os novos objetos são criados ou que os objetos existentes são editados, a DDL
referente a esses ajustes se torna disponível para análise. A opção Export DDL estará disponível
se você quiser criar a DDL completa para um ou mais objetos no esquema.
As apresentações de slides mostram como criar uma tabela usando o menu de contexto. Para
abrir uma caixa de diálogo a fim de criar uma nova tabela, clique com o botão direito do mouse
em Tables e selecione New Table. As caixas de diálogo para criar e editar objetos de banco de
dados possuem diversas tabs, cada uma delas refletindo um agrupamento lógico de propriedades
para esse tipo de objeto.

Oracle Database: Fundamentos de SQL II C - 13


Criando uma Nova Tabela: Exemplo

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Criando uma Nova Tabela: Exemplo


Na caixa de diálogo Create Table, se você não marcar a caixa de seleção Advanced, poderá criar
uma tabela rapidamente especificando colunas e alguns recursos usados com frequência.
Se você marcar a caixa de seleção Advanced a caixa de diálogo Create Table será alterada para
outra com diversas opções, na qual será possível especificar um amplo conjunto de recursos
durante a criação da tabela.
O exemplo do slide mostra como criar a tabela DEPENDENTS, marcando a caixa de seleção
Advanced.
Para criar uma nova tabela, execute as seguintes etapas:
1. No Connections Navigator, clique com o botão direito do mouse em Tables.
2. Selecione Create TABLE.
3. Na caixa de diálogo Create Table, selecione Advanced.
4. Especifique as informações da coluna.
5. Clique em OK.
Ainda que não seja obrigatório, você deve especificar também uma chave primária usando a tab
Primary Key na caixa de diálogo. Às vezes, talvez você queira editar a tabela que criou. Para
fazê-lo, clique com o botão direito do mouse na tabela no Connections Navigator e selecione
Edit.

Oracle Database: Fundamentos de SQL II C - 14


Usando a Planilha SQL

• Use a Planilha SQL para inserir e executar instruções


SQL, PL/SQL e SQL *Plus.
• Especifique as ações que podem ser processadas pela
conexão de banco de dados associada à planilha.

Oracle Internal & Oracle Academy Use Only


Selecione SQL Worksheet
no menu Tools ou Clique no ícone Open
SQL Worksheet .

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando a Planilha SQL


Quando você estabelecer uma conexão com um banco de dados, uma janela da Planilha SQL
será aberta automaticamente para essa conexão. Você pode usar a Planilha SQL para informar e
executar instruções SQL, PL/SQL e SQL*Plus. A Planilha SQL oferece suporte a instruções
SQL*Plus até determinado ponto. As instruções SQL*Plus que não são compatíveis com a
Planilha SQL serão ignoradas e não passarão para o banco de dados.
Você pode especificar as ações que podem ser processadas pela conexão de banco de dados
associada à planilha, como:
• Criar uma tabela
• Inserir dados
• Criar e editar um trigger
• Selecionando dados de uma tabela
• Salvar os dados selecionados em um arquivo
Você pode exibir uma Planilha SQL usando uma das seguintes opções:
• Selecione Tools > SQL Worksheet.
• Clique no ícone Open SQL Worksheet.

Oracle Database: Fundamentos de SQL II C - 15


Usando a Planilha SQL

2 4 6 8

Oracle Internal & Oracle Academy Use Only


1 3 5 7 9

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando a Planilha SQL (continuação)


Você poderá usar as teclas de atalho ou os ícones para executar determinadas tarefas como a
execução de uma instrução SQL, de um script e a exibição do histórico de instruções SQL
executadas por você. Você poderá usar a barra de ferramentas da Planilha SQL que contém
ícones para a execução das seguintes tarefas:
1. Execute Statement: Executa a instrução no local onde o cursor está na caixa Enter SQL
Statement. Você poderá usar variáveis de bind nas instruções SQL, mas não poderá usar
variáveis de substituição.
2. Run Script: Executa todas as instruções na caixa Enter SQL Statement usando o Script
Runner. Você poderá usar variáveis de substituição nas instruções SQL, mas não poderá
usar variáveis de bind.
3. Commit: Grava as alterações no banco de dados e finaliza a transação
4. Rollback: Descarta as alterações no banco de dados sem gravá-las e finaliza a transação.
5. Cancel: Interrompe as instruções em execução no momento.
6. SQL History: Exibe uma caixa de diálogo com informações sobre instruções SQL
executadas por você
7. Execute Explain Plan: Gera o plano de execução, que você pode visualizar clicando na
tab Explain.
8. Autotrace: Gera informações de rastreamento da instrução.
9. Clear: Apaga a(s) instrução(ões) na caixa Enter SQL Statement.
Oracle Database: Fundamentos de SQL II C - 16
Usando a Planilha SQL

• Use a Planilha SQL para informar e executar instruções


SQL, PL/SQL e SQL*Plus.
• Especifique as ações que podem ser processadas pela
conexão de banco de dados associada à planilha.

Oracle Internal & Oracle Academy Use Only


Informe
instruções SQL.

Os resultados são
mostrados aqui.

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando a Planilha SQL (continuação)


Quando você estabelecer uma conexão com um banco de dados, uma janela da Planilha SQL
será aberta automaticamente para essa conexão. Você pode usar a Planilha SQL para informar e
executar instruções SQL, PL/SQL e SQL*Plus. Todos os comandos SQL e PL/SQL são
suportados, já que passam diretamente da Planilha SQL para o banco de dados Oracle. Os
comandos SQL*Plus usados no SQL Developer precisam ser interpretados pela Planilha SQL
antes de passarem para o banco de dados.
Atualmente, a Planilha SQL oferece suporte a diversos comandos do SQL*Plus. Os comandos
não suportados pela Planilha SQL serão ignorados e não serão enviados para o banco de dados
Oracle. Com a Planilha SQL, você pode executar instruções SQL e alguns dos comandos do
SQL*Plus.
Você pode exibir uma Planilha SQL usando uma das duas opções a seguir:
• Selecione Tools > SQL Worksheet.
• Clique no ícone Open SQL Worksheet.

Oracle Database: Fundamentos de SQL II C - 17


Executando Instruções SQL

Use a caixa Enter SQL Statement para informar uma ou várias


instruções SQL.

F9 F5

Oracle Internal & Oracle Academy Use Only


F5
F9

Copyright © 2011, Oracle. Todos os direitos reservados.

Executando Instruções SQL


O exemplo no slide mostra a diferença no resultado da mesma consulta quando a tecla F9 ou
Execute Statement é usada em vez de F5 ou Run Script.

Oracle Database: Fundamentos de SQL II C - 18


Salvando Scripts SQL
Clique no ícone Save para
1 salvar sua instrução SQL
em um arquivo.

Identifique um local,
2 informe um nome de

Oracle Internal & Oracle Academy Use Only


O conteúdo do arquivo
3 salvo estará visível e
arquivo e clique em
Save.
poderá ser editado na
janela da Planilha SQL.

Copyright © 2011, Oracle. Todos os direitos reservados.

Salvando Scripts SQL


Você pode salvar as instruções SQL da Planilha SQL em um arquivo de texto. Para salvar o
conteúdo da caixa Enter SQL Statement, siga estas etapas:
1. Clique no ícone Save ou use o item de menu File > Save.
2. Na caixa de diálogo Salvar do Windows, informe um nome de arquivo e o local no qual
deseja salvar o arquivo.
3. Clique em Save.
Depois de salvar o conteúdo em um arquivo, a janela Enter SQL Statement exibirá uma página
com uma tab do conteúdo do arquivo. Você pode abrir vários arquivos ao mesmo tempo. Cada
arquivo será exibido como uma página com tab.
Script Pathing
Você pode selecionar um caminho default no qual poderá procurar e salvar scripts. Em Tools >
Preferences > Database > Worksheet Parameters, informe um valor no campo “Select default
path to look for scripts” .

Oracle Database: Fundamentos de SQL II C - 19


Executando Arquivos de Script Salvos: Método 1

1. Use a tab Files para localizar o


arquivo de script que deseja abrir.
2. Clique duas vezes no script para
exibir o código na Planilha SQL.
1
Para executar o código,
clique em:
• Execute Script (F9) ou 2
• Run Script (F5) 3 Selecione uma conexão
na lista drop-down.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Executando Arquivos de Script Salvos: Método 1


Para abrir um arquivo de script e exibir o código na área da Planilha SQL, faça o seguinte:
• No Files Navigator, selecione (ou navegue até) o arquivo de script que deseja abrir.
• Clique duas vezes no arquivo para abri-lo. O código do arquivo de script será exibido na
área da Planilha SQL.
• Selecione uma conexão na lista drop-down.
• Para executar o código, clique no ícone Run Script (F5) na barra de ferramentas da
Planilha SQL. Se você não tiver selecionado uma conexão na lista drop-down, uma caixa
de diálogo de conexão será exibida. Selecione a conexão que deseja usar na execução do
script.
Opcionalmente, você também pode:
1. Selecionar File > Open. A caixa de diálogo Open será exibida.
2. Na caixa de diálogo Open, selecione (ou navegue até) o arquivo de script que deseja abrir.
3. Clique em Open. O código do arquivo de script será exibido na área da Planilha SQL.
• Selecione uma conexão na lista drop-down da conexão.
• Para executar o código, clique no ícone Run Script (F5) na barra de ferramentas da
Planilha SQL. Se você não tiver selecionado uma conexão na lista drop-down, uma caixa
de diálogo de conexão será exibida. Selecione a conexão que deseja usar na execução do
script.

Oracle Database: Fundamentos de SQL II C - 20


Executando Arquivos de Script Salvos: Método 2

Use o comando @ seguido


pelo local e pelo nome do
arquivo que deseja executar
e clique no ícone Run
Script.

Oracle Internal & Oracle Academy Use Only


A saída do script é
exibida na página com
a tab Script Output.

Copyright © 2011, Oracle. Todos os direitos reservados.

Executando Arquivos de Script Salvos: Método 2


Para executar um script SQL salvo, faça o seguinte:
1. Use o comando @ seguido pelo local e pelo nome do arquivo que deseja executar na janela
Enter SQL Statement.
2. Clique no ícone Run Script.
Os resultados da execução do arquivo são exibidos na página com a tab Script Output. Você
também poderá salvar a saída do script clicando no ícone Save na página com a tab Script
Output. A caixa de diálogo Salvar arquivo do Windows será exibida e você poderá identificar
um nome e um local para o arquivo.

Oracle Database: Fundamentos de SQL II C - 21


Formatando o Código SQL

Antes da
formatação

Oracle Internal & Oracle Academy Use Only


Depois da
formatação

Copyright © 2011, Oracle. Todos os direitos reservados.

Formatando o Código SQL


Você poderá aprimorar a endentação, o espaçamento, a capitalização e a separação de linha do
código SQL. O SQL Developer possui um recurso para a formatação do código SQL.
Para formatar o código SQL, clique com o botão direito do mouse na área da instrução e
selecione Format SQL.
No exemplo do slide, antes da formatação, as palavras-chave do código SQL não estão
capitalizadas e a endentação adequada não foi aplicada à instrução. Após a formatação, o código
SQL é aprimorado com a capitalização das palavras-chave e a endentação adequada.

Oracle Database: Fundamentos de SQL II C - 22


Usando Snippets

Snippets são fragmentos de códigos que podem ser apenas


sintaxe ou exemplos.
Quando você posiciona o cursor
aqui, ele mostra a janela
Snippets. Na lista drop-down, é
possível selecionar a categoria
de função desejada.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Usando Snippets
Você poderá usar determinados fragmentos de códigos quando usar a Planilha SQL ou criar ou
editar uma função ou um procedure PL/SQL. O SQL Developer possui o recurso chamado
Snippets. Snippets são fragmentos de códigos como funções SQL, dicas do Optimizer e diversas
técnicas de programação de PL/SQL. Você pode arrastar snippets para a janela Editor.
Para exibir os Snippets, selecione View > Snippets.
A janela Snippets será exibida à direita. Você poderá usar a lista drop-down para selecionar um
grupo. O botão Snippets é exibido na margem da janela à direita para que você possa exibir a
janela Snippets se ela ficar oculta.

Oracle Database: Fundamentos de SQL II C - 23


Usando Snippets: Exemplo

Inserindo
um snippet

Oracle Internal & Oracle Academy Use Only


Editando o
snippet

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando Snippets: Exemplo


Para inserir um Snippet em seu código em uma Planilha SQL ou em uma função ou um
procedure PL/SQL, arraste o snippet da janela Snippets para o local desejado no código. Em
seguida, você poderá editar a sintaxe para que a função SQL seja válida no contexto atual. Para
exibir uma breve descrição de uma função SQL em uma dica de ferramenta, posicione o cursor
sobre o nome da função.
O exemplo no slide mostra que CONCAT(char1, char2)é arrastado do grupo Character
Functions na janela Snippets. Em seguida, a sintaxe de função CONCAT é editada e o restante da
instrução é adicionado conforme a seguir:
SELECT CONCAT(first_name, last_name)
FROM employees;

Oracle Database: Fundamentos de SQL II C - 24


Depurando Procedures e Funções

• Use o SQL Developer para


depurar procedures e funções
PL/SQL.
• Use a opção Compile for Debug
para executar uma compilação
PL/SQL de modo que o
procedure possa ser depurado.

Oracle Internal & Oracle Academy Use Only


• Use as opções do menu Debug
para definir pontos de
interrupção e para executar
tarefas Step Into e Step Over.

Copyright © 2011, Oracle. Todos os direitos reservados.

Depurando Procedures e Funções


No SQL Developer, você pode depurar procedures e funções PL/SQL. Usando as opções do
menu Debug, você pode executar as seguintes tarefas de depuração:
• Find Execution Point vai para o próximo ponto de execução.
• Resume continua a execução.
• Step Over ignora o próximo método e vai para a instrução seguinte após o método.
• Step Into vai para a primeira instrução no próximo método.
• Step Out deixa o método atual e vai para a próxima instrução.
• Step to End of Method vai para a última instrução do método atual.
• Pause interrompe a execução, mas não sai, permitindo que a execução seja retomada.
• Terminate interrompe e sai da execução. Não é possível retomar a execução a partir deste
ponto. Em vez disso, para iniciar a execução ou a depuração no início da função ou do
procedure, clique no ícone Run ou Debug, na barra de ferramentas da tab Source.
• Garbage Collection remove objetos inválidos do cache para armazenar objetos acessados
com mais frequência e mais válidos.
Essas opções também estão disponíveis como ícones na barra de ferramentas de depuração.

Oracle Database: Fundamentos de SQL II C - 25


Geração de Relatórios de Banco de Dados

O SQL Developer oferece diversos relatórios predefinidos


sobre o banco de dados e seus objetos.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Geração de Relatórios de Banco de Dados


O SQL Developer oferece diversos relatórios sobre o banco de dados e seus objetos. Esses
relatórios podem ser agrupados nas seguintes categorias:
• About Your Database
• Database Administration
• Table
• PL/SQL
• Security
• XML
• Jobs
• Streams
• All Objects
• Data Dictionary
• Relatórios Definidos pelo Usuário
Para exibir os relatórios, clique na tab Reports à esquerda da janela. Os relatórios individuais são
exibidos em painéis com tab à direita da janela. Para cada relatório, você poderá selecionar
(usando uma lista suspensa) a conexão de banco de dados para a qual exibir o relatório. Nos
relatórios sobre objetos, aqueles mostrados são apenas os objetos visíveis para o usuário do
banco de dados associado à conexão com o banco de dados selecionada, e as linhas são
normalmente ordenadas por Owner. Você também pode criar seus próprios relatórios definidos
pelo usuário.
Oracle Database: Fundamentos de SQL II C - 26
Criando um Relatório Definido pelo Usuário

Crie e salve relatórios definidos pelo usuário para reutilização.

Oracle Internal & Oracle Academy Use Only


Organize os relatórios em pastas.

Copyright © 2011, Oracle. Todos os direitos reservados.

Criando um Relatório Definido pelo Usuário


Os relatórios definidos pelo usuário são aqueles criados pelos usuários do SQL Developer. Para
criar um relatório definido pelo usuário, faça o seguinte:
1. Clique com o botão direito do mouse no nó User Defined Reports em Reports e selecione
Add Report.
2. Na caixa de diálogo Create Report, especifique o nome do relatório e a consulta SQL para
recuperar as informações do relatório. Em seguida, clique em Apply.
No exemplo do slide, o nome do relatório foi especificado como emp_sal. Uma descrição
opcional é oferecida, indicando que o relatório contém detalhes de funcionários com salary
>= 10000. A instrução SQL completa para a recuperação das informações a serem exibidas no
relatório definido pelo usuário está especificada na caixa SQL. Você também poderá incluir uma
dica de ferramenta opcional, a ser exibida quando o cursor for posicionado brevemente sobre o
nome do relatório na opção Reports do navegador.
Você pode organizar os relatórios definidos pelo usuário em pastas e pode criar uma hierarquia
de pastas e subpastas. Para criar uma pasta para os relatórios definidos pelo usuário, clique com
o botão direito do mouse no nó User Defined Reports ou em qualquer nome de pasta nesse nó e
selecione Add Folder. As informações sobre os relatórios definidos pelo usuário, incluindo as
pastas desses relatórios, são armazenadas em um arquivo chamado UserReports.xml no
diretório de informações específicas do usuário.

Oracle Database: Fundamentos de SQL II C - 27


Mecanismos de Pesquisa e Ferramentas Externas

Atalhos para
ferramentas usadas
com frequência
1

Oracle Internal & Oracle Academy Use Only


Links para
mecanismos de
pesquisa e fóruns de
discussão populares

Copyright © 2011, Oracle. Todos os direitos reservados.

Mecanismos de Pesquisa e Ferramentas Externas


Para melhorar a produtividade dos desenvolvedores de SQL, o SQL Developer adicionou links
rápidos para mecanismos de pesquisa e fóruns de discussão populares como AskTom, Google e
assim por diante. Além disso, você tem disponíveis ícones de atalho para algumas das
ferramentas usadas com mais frequência, como Bloco de Notas, Microsoft Word e
Dreamweaver.
Você pode adicionar ferramentas externas à lista existente ou até mesmo deletar atalhos para
ferramentas que não usa com frequência. Para isso, faça o seguinte:
1. No menu Tools, selecione External Tools.
2. Na caixa de diálogo External Tools, selecione New para adicionar novas ferramentas.
Selecione Delete para remover qualquer ferramenta da lista.

Oracle Database: Fundamentos de SQL II C - 28


Definindo Preferências

• Personalize a interface e o ambiente do SQL Developer.


• No menu Tools, selecione Preferences.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Definindo Preferências
Você pode personalizar muitos aspectos da interface e do ambiente do SQL Developer
modificando as preferências do SQL Developer de acordo com suas preferências e necessidades.
Para modificar as preferências do SQL Developer, selecione Tools e Preferences.
As preferências estão agrupadas nas seguintes categorias:
• Environment
• Accelerators (atalhos do teclado)
• Code Editors
• Database
• Debugger
• Documentation
• Extensions
• File Types
• Migration
• PL/SQL Compilers
• PL/SQL Debugger e assim por diante

Oracle Database: Fundamentos de SQL II C - 29


Redefinindo o Layout do SQL Developer

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Redefinindo o Layout do SQL Developer


Ao trabalhar com o SQL Developer, se o Connections Navigator desaparecer, ou se você não
puder encaixar a janela Log em seu local original, execute as seguintes etapas para corrigir o
problema:
1. Saia do SQL Developer.
2. Abra uma janela de terminal e use o comando locate para encontrar o local de
windowinglayout.xml.
3. Vá para o diretório em que windowinglayout.xml está e delete esse arquivo.
4. Reinicie o SQL Developer.

Oracle Database: Fundamentos de SQL II C - 30


Sumário

Neste apêndice, você aprendeu a usar o SQL Developer para:


• Criar, editar e navegar por objetos de banco de dados
• Executar scripts e instruções SQL na Planilha SQL
• Criar e salvar relatórios personalizados

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
O SQL Developer é uma ferramenta gráfica gratuita que simplifica as tarefas de
desenvolvimento de banco de dados. Com o SQL Developer, você pode criar, editar e navegar
por objetos de banco de dados. Você pode usar a Planilha SQL para executar scripts e instruções
SQL. O SQL Developer permite que você crie e salve seu próprio conjunto especial de relatórios
para reutilização.

Oracle Database: Fundamentos de SQL II C - 31


Oracle Internal & Oracle Academy Use Only
Usando o SQL*Plus

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.
Objetivos

Ao concluir este apêndice, você será capaz de:


• Efetuar login no SQL*Plus
• Editar comandos SQL
• Formatar a saída usando comandos do SQL*Plus
• Interagir com arquivos de script

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
É possível criar instruções SELECT que possam ser usadas indefinidamente. Este apêndice também
aborda o uso de comandos do SQL*Plus para executar instruções SQL. Você aprenderá a formatar a
saída usando comandos do SQL*Plus, a editar comandos SQL e a salvar scripts no SQL*Plus.

Oracle Database: Fundamentos de SQL II D - 2


Interação entre SQL e SQL*Plus

Instruções SQL
Servidor
SQL*Plus

Resultados da consulta

Oracle Internal & Oracle Academy Use Only


Buffer

SQL
SQL

Copyright © 2011, Oracle. Todos os direitos reservados.

SQL e SQL*Plus
SQL é uma linguagem de comando usada para comunicação com o servidor Oracle por meio de
qualquer ferramenta ou aplicativo. O Oracle SQL contém diversas extensões. Quando você informa
uma instrução SQL, ela é armazenada em uma parte da memória chamada de buffer SQL e
permanece lá até que você especifique uma nova instrução SQL. O SQL*Plus é uma ferramenta da
Oracle que reconhece e envia instruções SQL para o Oracle9i Server para serem executadas. Ele
contém sua própria linguagem de comandos.
Recursos da linguagem SQL
• Ela pode ser usada por diferentes usuários, incluindo aqueles com pouca ou nenhuma
experiência em
programação
• É uma linguagem não procedural
• Reduz a quantidade de tempo necessária para a criação e a manutenção de sistemas
• É uma linguagem semelhante ao idioma inglês
Recursos do SQL*Plus
• Aceita a entrada ad hoc de instruções
• Aceita a entrada SQL de arquivos
• Oferece um editor de linha para a modificação de instruções SQL
• Controla as configurações do ambiente
• Formata os resultados da consulta em relatórios básicos
• Acessa bancos de dados locais e remotos
Oracle Database: Fundamentos de SQL II D - 3
Instruções SQL Versus
Comandos do SQL*Plus
SQL SQL*Plus
• Uma linguagem • Um ambiente
• Padrão ANSI • Proprietário da Oracle
• Palavras-chave não • Palavras-chave podem
podem ser abreviadas. ser abreviadas.
• Instruções manipulam • Os comandos não

Oracle Internal & Oracle Academy Use Only


dados e definições de permitem a manipulação
tabela no banco de de valores no banco de
dados. dados.

SQL SQL SQL*Plus SQL*Plus


SQL SQL*Plus do SQL*Plus SQL*Plus

Copyright © 2011, Oracle. Todos os direitos reservados.

SQL e SQL*Plus (continuação)


A tabela a seguir compara o SQL e o SQL*Plus:

SQL SQL*Plus
É uma linguagem para a comunicação com Reconhece instruções SQL e as envia ao servidor
o servidor Oracle a fim de acessar os dados
É baseada no padrão ANSI (American É a interface proprietária da Oracle para a
National Standards Institute) SQL execução de instruções SQL
Manipula dados e definições de tabelas no Não permite a manipulação de valores no banco
banco de dados de dados
É incluída no buffer SQL em uma ou mais É incluído em uma linha de cada vez; não é
linhas armazenado no buffer SQL
Não tem um caractere de continuação Utiliza um traço (–) como caractere de
continuação se o comando ultrapassa uma linha
Não pode ser abreviada Pode ser abreviado
Utiliza um caractere de finalização para Não requer caracteres de finalização; executa os
executar os comandos imediatamente comandos imediatamente
Utiliza funções para aplicar formatação Utiliza comandos para formatar dados

Oracle Database: Fundamentos de SQL II D - 4


Visão Geral do SQL*Plus

• Efetue login no SQL*Plus.


• Descreva a estrutura da tabela.
• Edite sua instrução SQL.
• Execute o SQL pelo SQL*Plus.
• Salve as instruções SQL em arquivos e anexe instruções
SQL a arquivos.

Oracle Internal & Oracle Academy Use Only


• Execute os arquivos salvos.
• Carregue comandos do arquivo para o buffer, para edição.

Copyright © 2011, Oracle. Todos os direitos reservados.

SQL*Plus
O SQL*Plus é um ambiente no qual você pode:
• Executar instruções SQL para recuperar, modificar, adicionar e remover dados do banco de
dados
• Formatar, executar cálculos, armazenar e imprimir resultados de consultas no formato de
relatórios
• Criar arquivos de script para armazenar instruções SQL para uso repetido no futuro
Os comandos do SQL*Plus podem ser divididos nas seguintes categorias principais:
Categoria Objetivo
Environment Afeta o comportamento geral das instruções SQL na sessão.
Format Formata os resultados da consulta.
File manipulation Salva, carrega e executa arquivos de script.
Execution Envia instruções SQL do buffer SQL para o servidor Oracle.
Edit Modifica as instruções SQL no buffer.
Interaction Cria e especifica variáveis para instruções SQL, imprime valores de
variáveis e imprime mensagens na tela.
Miscellaneous Conecta-se ao banco de dados, manipula o ambiente SQL*Plus e exibe
definições de colunas.

Oracle Database: Fundamentos de SQL II D - 5


Efetuando Login no SQL*Plus

Oracle Internal & Oracle Academy Use Only


sqlplus [username[/password[@database]]]

Copyright © 2011, Oracle. Todos os direitos reservados.

Efetuando Login no SQL*Plus


O modo como você chama o SQL*Plus depende do tipo de sistema operacional no qual você está
executando o Oracle Database.
Para fazer login em um ambiente Linux:
• Clique com o botão direito do mouse na área de trabalho Linux e selecione o terminal.
• Digite o comando sqlplus mostrado no slide.
• Digite o nome do usuário, a senha e o nome do banco de dados.
Na sintaxe:
username Seu nome de usuário do banco de dados
password Sua senha do banco de dados (Ela estará visível se você digitá-la aqui).
@database A string de conexão do banco de dados
Observação: Para assegurar a integridade de sua senha, não digite-a no prompt do sistema
operacional. Em vez disso, digite apenas seu nome de usuário. Digite a senha no prompt de senha.

Oracle Database: Fundamentos de SQL II D - 6


Exibindo a Estrutura da Tabela

Use o comando DESCRIBE do SQL*Plus para exibir a estrutura


de uma tabela:

DESC[RIBE] tablename

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Exibindo a Estrutura da Tabela


No SQL*Plus, você pode exibir a estrutura de uma tabela usando o comando DESCRIBE. O
resultado do comando é uma exibição de nomes de colunas e tipos de dados, assim como uma
indicação informando se a coluna deve conter dados.
Na sintaxe:
tablename O nome de qualquer tabela, view ou sinônimo acessível para o
o usuário
Para descrever a tabela DEPARTMENTS, use este comando:
SQL> DESCRIBE DEPARTMENTS
Name Null? Type
----------------------- -------- ---------------

DEPARTMENT_ID NOT NULL NUMBER(4)


DEPARTMENT_NAME NOT NULL VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)

Oracle Database: Fundamentos de SQL II D - 7


Exibindo a Estrutura da Tabela

DESCRIBE departments

Name Null? Type

Oracle Internal & Oracle Academy Use Only


----------------------- -------- ------------
DEPARTMENT_ID NOT NULL NUMBER(4)
DEPARTMENT_NAME NOT NULL VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)

Copyright © 2011, Oracle. Todos os direitos reservados.

Exibindo a Estrutura da Tabela (continuação)


O exemplo no slide exibe informações sobre a estrutura da tabela DEPARTMENTS. No resultado:
Null?: Especifica se uma coluna deve conter dados (NOT NULL indica que a coluna deve conter
dados.)
Type: Exibe o tipo de dados de uma coluna

Oracle Database: Fundamentos de SQL II D - 8


Comandos de Edição do SQL*Plus

• A[PPEND] text
• C[HANGE] / old / new
• C[HANGE] / text /
• CL[EAR] BUFF[ER]
• DEL
• DEL n

Oracle Internal & Oracle Academy Use Only


• DEL m n

Copyright © 2011, Oracle. Todos os direitos reservados.

Comandos de Edição do SQL*Plus


Os comandos do SQL*Plus são inseridos em uma linha por vez e não são armazenados no buffer
SQL.
Comando Descrição
A[PPEND] text Adiciona texto ao final da linha atual
C[HANGE] / old / new Altera o texto old para o texto new na linha atual

C[HANGE] / text / Deleta text da linha atual


CL[EAR] BUFF[ER] Deleta todas as linhas do buffer SQL
DEL Deleta a linha atual
DEL n Deleta a linha n
DEL m n Deleta as linhas m a n inclusive
Diretrizes
• Se você pressionar Enter antes da conclusão de um comando, o SQL*Plus solicitará um número
de linha.
• Você pode finalizar o buffer SQL digitando um dos caracteres finalizadores (ponto e vírgula ou
barra) ou pressionando Enter duas vezes. O prompt SQL será exibido.

Oracle Database: Fundamentos de SQL II D - 9


Comandos de Edição do SQL*Plus

• I[NPUT]
• I[NPUT] text
• L[IST]
• L[IST] n
• L[IST] m n
• R[UN]

Oracle Internal & Oracle Academy Use Only


• n
• n text
• 0 text

Copyright © 2011, Oracle. Todos os direitos reservados.

Comandos de Edição do SQL*Plus (continuação)


Comando Descrição
I[NPUT] Insere um número indefinido de linhas
I[NPUT] text Insere uma linha que consiste em text
L[IST] Lista todas as linhas no buffer SQL
L[IST] n Lista uma linha (especificada por n)
L[IST] m n Lista uma faixa de linhas (m a n) inclusive
R[UN] Exibe e executa a instrução SQL atual no buffer
n Especifica a linha que se tornará a atual
n text Substitui a linha n por text
0 text Insere uma linha antes da linha 1
Observação: Você pode informar apenas um comando do SQL*Plus para cada prompt SQL. Os
comandos do SQL*Plus não são armazenados no buffer. Para continuar um comando do SQL*Plus
na linha seguinte, finalize a primeira linha com um hífen (-).

Oracle Database: Fundamentos de SQL II D - 10


Usando LIST, n e APPEND

LIST
1 SELECT last_name
2* FROM employees

1
1* SELECT last_name

Oracle Internal & Oracle Academy Use Only


A , job_id
1* SELECT last_name, job_id

LIST
1 SELECT last_name, job_id
2* FROM employees

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando LIST, n e APPEND


• Use o comando L[IST] para exibir o conteúdo do buffer SQL. O asterisco (*) ao lado da linha
2 no buffer indica que a linha 2 é a linha atual. Quaisquer edições feitas se aplicam à linha atual.
• Altere o número da linha atual digitando o número (n) da linha que você deseja editar. A nova
linha atual será exibida.
• Use o comando A[PPEND] para adicionar texto à linha atual. A linha recém-editada será
exibida. Verifique o novo conteúdo do buffer usando o comando LIST.
Observação: Muitos comandos do SQL*Plus, incluindo LIST e APPEND, podem ser abreviados
para apenas sua primeira letra. LIST pode ser abreviado para L; APPEND pode ser abreviado para A.

Oracle Database: Fundamentos de SQL II D - 11


Usando o Comando CHANGE

LIST
1* SELECT * from employees

c/employees/departments

Oracle Internal & Oracle Academy Use Only


1* SELECT * from departments

LIST
1* SELECT * from departments

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando o Comando CHANGE


• Use o comando L[IST] para exibir o conteúdo do buffer.
• Use o comando C[HANGE] para alterar o conteúdo da linha atual no buffer SQL. Neste caso,
substitua a tabela employees pela tabela departments. A nova linha atual será exibida.
• Use o comando L[IST] para verificar o novo conteúdo do buffer.

Oracle Database: Fundamentos de SQL II D - 12


Comandos de Arquivo do SQL*Plus

• SAVE nome de arquivo


• GET nome de arquivo
• START nome de arquivo
• @ nome de arquivo
• EDIT nome de arquivo
• SPOOL nome de arquivo

Oracle Internal & Oracle Academy Use Only


• EXIT

Copyright © 2011, Oracle. Todos os direitos reservados.

Comandos de Arquivo do SQL*Plus


As instruções SQL se comunicam com o servidor Oracle. Os comandos do SQL*Plus controlam o
ambiente, formatam os resultados das consultas e gerenciam arquivos. Você pode usar os comandos
descritos na seguinte tabela:
Comando Descrição
SAV[E] filename [.ext] Salva o conteúdo atual do buffer SQL em um arquivo. Use APPEND
[REP[LACE]APP[END]] para adicionar o conteúdo a um arquivo existente e REPLACE para
sobregravar um arquivo existente. A extensão default é .sql.
GET filename [.ext] Grava o conteúdo de um arquivo salvo anteriormente no buffer SQL. A
extensão default do nome do arquivo é .sql.
STA[RT] filename [.ext] Executa um arquivo de comandos salvo anteriormente
@ filename Executa um arquivo de comandos salvo anteriormente (igual a START)
ED[IT] Acessa o editor e salva o conteúdo do buffer no arquivo afiedt.buf

ED[IT] [filename[.ext]] Acessa o editor para editar o conteúdo de um arquivo salvo


SPO[OL] [filename[.ext]| Armazena os resultados da consulta em um arquivo. OFF fecha o
OFF|OUT] arquivo de spool. OUT fecha o arquivo de spool e envia os resultados
do arquivo para a impressora.
EXIT Encerra o SQL*Plus

Oracle Database: Fundamentos de SQL II D - 13


Usando os Comandos SAVE e START

LIST
1 SELECT last_name, manager_id, department_id
2* FROM employees

SAVE my_query
Created file my_query

Oracle Internal & Oracle Academy Use Only


START my_query

LAST_NAME MANAGER_ID DEPARTMENT_ID


------------------------- ---------- -------------
King 90
Kochhar 100 90
...
107 rows selected.

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando os Comandos SAVE e START


SAVE
Use o comando SAVE para armazenar o conteúdo atual do buffer em um arquivo. Dessa maneira,
você pode armazenar scripts usados frequentemente para emprego futuro.
START
Use o comando START para executar um script no SQL*Plus. Você também pode, como alternativa,
usar o símbolo @ para executar um script.
@my_query

Oracle Database: Fundamentos de SQL II D - 14


Comando SERVEROUTPUT
• Use o comando SET SERVEROUT[PUT] para controlar se
o resultado dos procedimentos armazenados ou os blocos
PL/SQL deverão ser exibidos no SQL*Plus.
• O limite de comprimento da linha DBMS_OUTPUT
é aumentado de 255 bytes para 32767 bytes.
• O tamanho default agora é ilimitado.
• Os recursos não são pré-alocados quando

Oracle Internal & Oracle Academy Use Only


SERVEROUTPUT está definido.
• Como não há penalidades de desempenho, use
UNLIMITED, a não ser que você deseje preservar
a memória física.

SET SERVEROUT[PUT] {ON | OFF} [SIZE {n | UNL[IMITED]}]


[FOR[MAT] {WRA[PPED] | WOR[D_WRAPPED] | TRU[NCATED]}]

Copyright © 2011, Oracle. Todos os direitos reservados.

Comando SERVEROUTPUT
A maioria dos programas PL/SQL executa entrada e saída por meio de instruções SQL, para
armazenar dados em tabelas de banco de dados ou consultar essas tabelas. Toda a entrada/saída
PL/SQL restante é feita por meio de APIs que interagem com outros programas. Por exemplo, o
pacote DBMS_OUTPUT possui procedures como PUT_LINE. Para ver o resultado fora do código
PL/SQL, é necessário outro programa, como o SQL*Plus, para ler e exibir os dados passados para
DBMS_OUTPUT.
O SQL*Plus não exibirá os dados de DBMS_OUTPUT a não ser que você primeiro envie o comando
SET SERVEROUTPUT ON do SQL*Plus conforme a seguir:
SET SERVEROUTPUT ON
Observação
• SIZE define o número de bytes da saída, que pode ser armazenado em buffer no servidor do
Oracle Database. O default é UNLIMITED. n não pode ser menor que 2000 ou mais que
1.000.000.
• Para obter informações adicionais sobre SERVEROUTPUT, consulte o Oracle Database PL/SQL
User’s Guide and Reference 11g.

Oracle Database: Fundamentos de SQL II D - 15


Usando o Comando SPOOL do SQL*Plus

SPO[OL] [file_name[.ext] [CRE[ATE] | REP[LACE] |


APP[END]] | OFF | OUT]

Opção Descrição
file_name[.ext] Envia a saída para o nome de arquivo especificado

CRE[ATE] Cria um novo arquivo com o nome especificado

Oracle Internal & Oracle Academy Use Only


REP[LACE] Substitui o conteúdo de um arquivo existente. Se o
arquivo não existir, REPLACE criará o arquivo.

APP[END] Adiciona o conteúdo do buffer ao final do arquivo


especificado

OFF Interrompe o spooling

OUT Para o spooling e envia o arquivo para a impressora


padrão (default) do computador

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando o Comando SPOOL do SQL*Plus


O comando SPOOL armazena os resultados da consulta em um arquivo ou, como opção, envia o
arquivo para uma impressora. O comando SPOOL foi aprimorado. Você agora pode anexar ou
substituir um arquivo existente; anteriormente, só era possível usar o comando SPOOL para criar (e
substituir) um arquivo. REPLACE é o default.
Para enviar a saída gerada pelos comandos em um script sem exibir a saída na tela, use SET
TERMOUT OFF. SET TERMOUT OFF não afeta a saída de comandos executados de forma
interativa.
Você deve usar aspas simples nos nomes de arquivos que contêm espaço em branco. Para criar um
arquivo HTML válido usando os comandos SPOOL APPEND, você deve usar PROMPT ou um
comando similar para criar o cabeçalho e o rodapé da página HTML. O comando SPOOL APPEND
não efetua parse de tags HTML. Defina SQLPLUSCOMPAT[IBILITY] para 9.2 ou anterior para
desativar os parâmetros CREATE, APPEND e SAVE.

Oracle Database: Fundamentos de SQL II D - 16


Usando o Comando AUTOTRACE

• Ele exibe um relatório depois da execução bem-sucedida


das instruções SQL DML (data manipulation statements),
como SELECT, INSERT, UPDATE ou DELETE.
• Agora, o relatório pode incluir estatísticas de execução e o
caminho de execução da consulta.

Oracle Internal & Oracle Academy Use Only


SET AUTOT[RACE] {ON | OFF | TRACE[ONLY]} [EXP[LAIN]]
[STAT[ISTICS]]

SET AUTOTRACE ON
-- The AUTOTRACE report includes both the optimizer
-- execution path and the SQL statement execution
-- statistics

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando o Comando AUTOTRACE


EXPLAIN mostra o caminho de execução da consulta executando EXPLAIN PLAN. STATISTICS
exibe as estatísticas da instrução SQL. A formatação do relatório AUTOTRACE poderá variar
dependendo da versão do servidor ao qual você está conectado e da configuração desse servidor. O
pacote DBMS_XPLAN oferece uma maneira fácil de exibir o resultado do comando EXPLAIN PLAN
em vários formatos predefinidos.
Observação
• Para obter informações adicionais sobre o package e os subprogramas, consulte o tab Oracle
Database PL/SQL Packages and Types Reference 11g .
• Para obter informações adicionais sobre EXPLAIN PLAN, consulte Oracle Database SQL
Reference 11g.
• Para obter informações adicionais sobre Planos de Execução e estatísticas, consulte Oracle
Database Performance Tuning Guide 11g.

Oracle Database: Fundamentos de SQL II D - 17


Sumário

Neste apêndice, você aprendeu a usar o SQL*Plus como um


ambiente para:
• Executar instruções SQL
• Editar instruções SQL
• Formatar a saída
• Interagir com arquivos de script

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
O SQL*Plus é um ambiente de execução que pode ser usado para enviar comandos SQL para o
servidor de banco de dados e para editar e salvar comandos SQL. Você pode executar comandos no
prompt do SQL ou em um arquivo de script.

Oracle Database: Fundamentos de SQL II D - 18


Usando o JDeveloper

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.
Objetivos

Ao concluir este apêndice, você será capaz de:


• Listar os principais recursos do Oracle JDeveloper
• Criar uma conexão de banco de dados no JDeveloper
• Gerenciar objetos de banco de dados no JDeveloper
• Usar o JDeveloper para executar Comandos do SQL
• Criar e executar Unidades de Programa PL/SQL

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Neste apêndice, você será apresentado à ferramenta JDeveloper. Você aprenderá a usar o
JDeveloper nas tarefas de desenvolvimento de seu banco de dados.

Oracle Database: Fundamentos de SQL II E - 2


Oracle JDeveloper

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle JDeveloper
O Oracle JDeveloper é um IDE (Integrated Development Environment) para o desenvolvimento
e a disponibilização de aplicações Java e serviços Web. Ele suporta todos os estágios do SDLC
(Software Development Life Cycle), desde a modelagem até a implantação. Também dispõe dos
recursos que permitem usar os padrões mais recentes do setor para Java, XML e SQL no
desenvolvimento de aplicações.
O Oracle JDeveloper 11g introduz uma nova abordagem para o desenvolvimento em J2EE ao
oferecer recursos que permitem desenvolvimento visual e declarativo. Essa abordagem
inovadora torna o desenvolvimento em J2EE simples e eficiente.

Oracle Database: Fundamentos de SQL II E - 3


Database Navigator

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Database Navigator
Usando o Oracle JDeveloper, é possível armazenar em um objeto denominado “connection”
(conexão) as informações necessárias para se conectar a um banco de dados. Uma conexão é
armazenada como parte das definições do IDE e pode ser exportada e importada, a fim de
facilitar o compartilhamento entre grupos de usuários. As conexões são usadas para várias
finalidades, desde a navegação no banco de dados e a criação de aplicações até a implantação.

Oracle Database: Fundamentos de SQL II E - 4


Criando uma Conexão

Clique no ícone New Connection


1 no Database Navigator.

2 Na janela Create Database

Oracle Internal & Oracle Academy Use Only


Connection, insira o username, a
password e o SID.

3 Teste a conexão.

4 Clique em OK.

Copyright © 2011, Oracle. Todos os direitos reservados.

Criando uma Conexão


Uma conexão é um objeto que especifica as informações necessárias para se conectar com um
determinado banco de dados como um usuário específico desse banco de dados. Você pode criar
e testar conexões com vários bancos de dados e vários esquemas.
Para criar uma conexão de banco de dados, execute as seguintes etapas:
1. Clique no ícone New Connection no Database Navigator.
2. Na janela Create Database Connection, informe o nome da conexão. Informe o nome de
usuário e a senha do esquema ao qual deseja se conectar. Informe o SID do banco de dados
com o qual deseja se conectar.
3. Clique em Test para garantir que a conexão foi definida corretamente.
4. Clique em OK.

Oracle Database: Fundamentos de SQL II E - 5


Navegando por Objetos de Banco de Dados

Use o Database Navigator para:


• Navegar por vários objetos em um esquema de banco
de dados
• Analisar rapidamente as definições de objetos

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Navegando por Objetos de Banco de Dados


Após criar uma conexão com o banco de dados, você poderá usar o Database Navigator para
navegar por vários objetos em um esquema de banco de dados, incluindo tabelas, views, índices,
pacotes, procedures, triggers e tipos.
Você pode visualizar a definição dos objetos dividida em tabs de informações que são obtidas do
dicionário de dados. Por exemplo, se você tiver selecionado uma tabela no Navigator, os
detalhes sobre colunas, constraints, grants, estatísticas, triggers e assim por diante serão exibidos
em uma página com tabs fácil de ler.

Oracle Database: Fundamentos de SQL II E - 6


Executando Instruções SQL

Oracle Internal & Oracle Academy Use Only


3

Copyright © 2011, Oracle. Todos os direitos reservados.

Executando Instruções SQL


Para executar uma instrução SQL, siga estas etapas:
1. Clique no ícone Open SQL Worksheet.
2. Selecione a conexão.
3. Execute o comando SQL:
• Clicando no botão Execute statement ou pressionando F9. A saída é a seguinte:

• Clicando no botão Run Script ou pressionando F5. A saída é a seguinte:

Oracle Database: Fundamentos de SQL II E - 7


Criando Unidades de Programa

Oracle Internal & Oracle Academy Use Only


1

3
Esqueleto da função

Copyright © 2011, Oracle. Todos os direitos reservados.

Criando Unidades de Programa


Para criar uma unidade de programa PL/SQL:
1. Selecione View > Database Navigator. Selecione e expanda uma conexão com o banco de
dados. Clique com o botão direito do mouse na pasta correspondente ao tipo de objeto
(Procedures, Pacotes, Funções). Selecione “New [Procedures|Packages|Functions]”.
2. Informe um nome válido para a função, o pacote ou o procedure e clique em OK.
3. Uma definição de esqueleto é criada e aberta no Code Editor. Em seguida, você poderá
editar o subprograma para adequá-lo às suas necessidades.

Oracle Database: Fundamentos de SQL II E - 8


Compilando

Compilação com erros

Oracle Internal & Oracle Academy Use Only


Compilação sem erros

Copyright © 2011, Oracle. Todos os direitos reservados.

Compilando
Após editar a definição de esqueleto, você precisa compilar a unidade de programa. Clique com
o botão direito do mouse no objeto PL/SQL a ser compilado no Connection Navigator e
selecione Compile. Como alternativa, também é possível pressionar CTRL + SHIFT + F9 para
fazer a compilação.

Oracle Database: Fundamentos de SQL II E - 9


Executando uma Unidade de Programa

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Executando uma Unidade de Programa


Para executar uma unidade de programa, clique com o botão direito do mouse no objeto e,
depois, clique em Run. A caixa de diálogo Run PL/SQL será exibida. Talvez seja preciso alterar
os valores NULL para valores aceitáveis que serão especificados na unidade de programa. Após
alterar os valores, clique em OK. A saída será exibida na janela Message-Log.

Oracle Database: Fundamentos de SQL II E - 10


Eliminando uma Unidade de Programa

Oracle Internal & Oracle Academy Use Only


1

Copyright © 2011, Oracle. Todos os direitos reservados.

Eliminando uma Unidade de Programa


Para eliminar uma unidade de programa:
1. Clique com o botão direito do mouse no objeto e selecione Drop.
A caixa de diálogo Drop Confirmation será exibida.
2. Clique em Apply.
O objeto será eliminado do banco de dados.

Oracle Database: Fundamentos de SQL II E - 11


Janela Structure

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Janela Structure
A janela Structure permite uma visão estrutural dos dados do documento selecionado na janela
ativa, que pode ser um dos elementos que formam a estrutura: navegadores, editores, modos de
exibição e o Property Inspector.
Na janela Structure, é possível exibir os dados do documento de várias maneiras. As estruturas
que estão disponíveis para exibição se baseiam no tipo do documento. No caso de um arquivo
Java, é possível exibir a estrutura de código, a estrutura da interface do usuário ou os dados de
modelo da interface do usuário. No caso de um arquivo XML, é possível exibir a estrutura XML,
a estrutura do projeto ou os dados de modelo da interface do usuário.
A janela Structure é dinâmica, controlando sempre a seleção atual da janela ativa (a menos que
você congele o conteúdo da janela em uma view específica), como acontece com o editor ativo
no momento. Quando a seleção atual é um nó no navegador, o editor default é utilizado. Se
quiser alterar a view da estrutura para a seleção atual, escolha outra tab de estrutura.

Oracle Database: Fundamentos de SQL II E - 12


Janela Editor

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Janela Editor
É possível exibir todos os arquivos de projeto em apenas uma janela do editor, abrir várias views
do mesmo arquivo ou abrir views de arquivos diferentes.
Na parte superior da janela do editor, encontram-se as tabs de documentos. A seleção de uma tab
de documento coloca esse arquivo em destaque, trazendo-o para o primeiro plano da janela do
editor atual.
Na parte inferior da janela do editor referente a um determinado arquivo, estão as tabs de editor.
A seleção de uma dessas tabs abre o arquivo no editor correspondente.

Oracle Database: Fundamentos de SQL II E - 13


Application Navigator

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Application Navigator
O Application Navigator permite uma visão lógica da aplicação e dos dados contidos nela. Esse
navegador fornece uma infraestrutura à qual as diversas extensões podem se conectar. Essas
extensões também podem usar a infraestrutura para organizar seus dados e menus de forma
consistente e abstrata. Embora o Application Navigator possa conter arquivos individuais (como
arquivos-fonte Java), ele foi projetado para consolidar dados complexos. Nesse navegador, os
tipos de dados complexos, como objetos de entidades, diagramas UML (Unified Modeling
Language), EJBs (Enterprise JavaBeans) ou serviços Web aparecem como nós únicos. Os
arquivos brutos que compõem esses nós abstratos são exibidos na janela Structure.

Oracle Database: Fundamentos de SQL II E - 14


Implantando Procedures Java Armazenados

Antes de implantar procedures Java armazenados, execute as


seguintes etapas:
1. Crie uma conexão de banco de dados.
2. Crie um perfil de implantação.
3. Implante os objetos.

Oracle Internal & Oracle Academy Use Only


1 2 3

Copyright © 2011, Oracle. Todos os direitos reservados.

Implantando Procedures Java Armazenados


Crie um perfil de implantação para os procedures Java armazenados e implante as classes. Se
quiser, você também poderá implantar métodos estáticos públicos no JDeveloper usando as
definições do perfil.
A implantação no banco de dados usa as informações fornecidas no Deployment Profile Wizard,
além de dois utilitários do Oracle Database:
• loadjava carrega em um banco de dados Oracle a classe Java que contém os procedures
armazenados.
• publish gera os encapsuladores específicos de chamada PL/SQL para os métodos
estáticos públicos carregados. A publicação permite que os métodos Java sejam chamados
como funções ou procedures PL/SQL.

Oracle Database: Fundamentos de SQL II E - 15


Publicando Java em PL/SQL

Oracle Internal & Oracle Academy Use Only


2

Copyright © 2011, Oracle. Todos os direitos reservados.

Publicando Java em PL/SQL


O slide mostra o código Java e ilustra como publicá-lo em um procedure PL/SQL.

Oracle Database: Fundamentos de SQL II E - 16


Como Posso Obter Mais Informações
sobre o JDeveloper 11g?

Tópico Web site


Página do Produto Oracle
JDeveloper http://www.oracle.com/technology/products/jdev/index.html

Tutoriais do Oracle
http://www.oracle.com/technology/obe/obe11jdev/11/index.html
JDeveloper 11g

Oracle Internal & Oracle Academy Use Only


Documentação do Produto
http://www.oracle.com/technology/documentation/jdev.html
doOracle JDeveloper 11g
Fórum de Discussão do
http://forums.oracle.com/forums/forum.jspa?forumID=83
Oracle JDeveloper 11g

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II E - 17


Sumário

Neste apêndice, você aprendeu a usar o JDeveloper para:


• Listar os principais recursos do Oracle JDeveloper
• Criar uma conexão de banco de dados no JDeveloper
• Gerenciar objetos de banco de dados no JDeveloper
• Usar o JDeveloper para executar Comandos do SQL
• Criar e executar Unidades de Programa PL/SQL

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Neste apêndice, você será apresentado à ferramenta JDeveloper. Você aprenderá a usar o
JDeveloper nas tarefas de desenvolvimento de seu banco de dados.

Oracle Database: Fundamentos de SQL II E - 18


Gerando relatórios por agrupamento
de dados relacionados

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.
Objetivos

Ao concluir este apêndice, você será capaz de usar:


• A operação ROLLUP para produzir valores de subtotal
• A operação CUBE para produzir os valores da tabela de
referência cruzada
• A função GROUPING para identificar os valores das linhas
criadas por ROLLUP ou CUBE

Oracle Internal & Oracle Academy Use Only


• GROUPING SETS para produzir um único conjunto de
resultados

Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Neste apêndice, você aprenderá a:
• Agrupar dados para obter os valores de subtota, usando o operador ROLLUP
• Agrupar dados para obter os valores de tabulação cruzada, usando o operador CUBE
• Use a função GROUPING para identificar o nível de agregação no conjunto de resultados
produzido por um operador ROLLUP ou CUBE
• Usar GROUPING SETS para produzir um único conjunto de resultados que seja equivalente
a uma abordagem UNION ALL

Oracle Database: Fundamentos de SQL II F - 2


Verificar funções de grupo

• As funções de grupo operam em conjuntos de linhas para


fornecer um resultado por grupo.
SELECT [column,] group_function(column). . .
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];

Oracle Internal & Oracle Academy Use Only


• Exemplo:
SELECT AVG(salary), STDDEV(salary),
COUNT(commission_pct),MAX(hire_date)
FROM employees
WHERE job_id LIKE 'SA%';

Copyright © 2011, Oracle. Todos os direitos reservados.

Funções de grupo
Você pode usar a cláusula GROUP BY para dividir as linhas de uma tabela em grupos. Em
seguida, você poderá usar as funções de grupo para retornar as informações resumidas para cada
grupo. As funções de grupo podem aparecer nas listas de seleção e nas cláusulas ORDER BY e
HAVING. O Oracle Server aplica tais funções a cada grupo de linhas e retorna uma única linha
de resultados para cada grupo.
Tipos de funções de grupo: Cada uma das funções de grupo (AVG, SUM, MAX, MIN, COUNT,
STDDEV e VARIANCE) aceita um argumento. As funções AVG, SUM, STDDEV e VARIANCE
operam apenas em valores numéricos. MAX e MIN podem operar em valores de dados
numéricos, de caracteres e de data. COUNT retorna o número de linhas não NULAS para
determinada expressão. O exemplo no slide calcula o salário médio, o desvio padrão no salário,
o número de funcionários que recebem comissão e a data de contratação máxima dos
funcionários cujo JOB_ID inicia com SA.
Diretrizes para utilização das funções de grupo
• Os tipos de dados dos argumentos podem ser CHAR, VARCHAR2, NUMBER ou DATE.
• Todas as funções de grupo, exceto COUNT(*), ignoram valores nulos. Para substituir um
valor por valores nulos, use a função NVL. COUNT retorna um número ou zero.
• O Oracle Server classifica implicitamente o conjunto de resultados em ordem crescente das
colunas de agrupamento especificadas, quando você usa uma cláusula GROUP BY. Para
substituir a ordenação padrão, use DESC em uma cláusula ORDER BY.
Oracle Database: Fundamentos de SQL II F - 3
Análise da cláusula GROUP BY

• Sintaxe:
SELECT [column,] group_function(column). . .
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];

Oracle Internal & Oracle Academy Use Only


• Exemplo:

SELECT department_id, job_id, SUM(salary),


COUNT(employee_id)
FROM employees
GROUP BY department_id, job_id;

Copyright © 2011, Oracle. Todos os direitos reservados.

Análise da cláusula GROUP BY


O exemplo ilustrado no slide é avaliado pelo Oracle Server, como segue:
• A cláusula SELECT especifica se as seguintes colunas foram recuperadas:
- ID do departamento e ID do cargo na tabela EMPLOYEES
- A soma de todos os salários e o número do funcionário em cada grupo especificado na
cláusula GROUP BY
• A cláusula GROUP BY especifica como as linhas devem ser agrupadas na tabela. O salário
total e o número de funcionários são calculados para cada ID de cargo dentro de cada
departamento. As linhas são agrupadas por ID de departamento e, em seguida, por cargo
dentro de cada departamento.

Oracle Database: Fundamentos de SQL II F - 4


Análise da cláusula HAVING

• Use a cláusula HAVING para especificar que grupos


devem ser exibidos.
• É possível restringir grupos adicionalmente na base de
uma limitação de condição.

SELECT [column,] group_function(column)...


FROM table

Oracle Internal & Oracle Academy Use Only


[WHERE condition]
[GROUP BY group_by_expression]
[HAVING having_expression]
[ORDER BY column];

Copyright © 2011, Oracle. Todos os direitos reservados.

Cláusula HAVING
Os grupos são formados e as funções de grupo são calculadas antes de a cláusula HAVING ser
aplicada aos grupos. A cláusula HAVING pode preceder a cláusula GROUP BY, mas é
recomendável que você insira a cláusula GROUP BY antes, porque é mais lógico.
O Oracle Server executa as seguintes etapas quando você usa a cláusula HAVING:
1. Agrupas linhas.
2. Aplica as funções de grupo aos grupos e exibe os aqueles que correspondem aos critérios
na cláusula HAVING.

Oracle Database: Fundamentos de SQL II F - 5


GROUP BY com os operadores ROLLUP e CUBE

• Use ROLLUP ou CUBE com GROUP BY para produzir linhas


superagregadas por colunas de referência cruzada.
• O grupo ROLLUP produz um conjunto de resultados que
contém as linhas e os valores de subtotais regularmente
agrupados.
• O agrupamento CUBE produz um conjunto de resultados
contendo as linhas de ROLLUP e as linhas de tabela de

Oracle Internal & Oracle Academy Use Only


referência cruzada.

Copyright © 2011, Oracle. Todos os direitos reservados.

GROUP BY com os operadores ROLLUP e CUBE


Especifique os operadores ROLLUP e CUBE na cláusula GROUP BY de uma consulta. O
agrupamento ROLLUP produz um conjunto de resultados que contém as linhas e as linhas de
subtotais regularmente agrupadas. O operador ROLLUP também calcula um total geral. A
operação CUBE na cláusula GROUP BY agrupa as linhas selecionadas com base nos valores de
todas as combinações de expressões possíveis na especificação e retorna uma única linha de
informações de resumo para cada grupo. É possível usar a operação CUBE para produzir linhas
de tabela de referência cruzada.
Observação: Ao trabalhar com ROLLUP e CUBE, assegure que haja entre as colunas que
seguem a cláusula GROUP BY relacionamentos reais e significativos; caso contrário, os
operadores retornarão informações irrelevantes.

Oracle Database: Fundamentos de SQL II F - 6


Operador ROLLUP

• ROLLUP é uma extensão da cláusula GROUP BY.


• Use a operação ROLLUP para produzir agregações
cumulativas, como subtotais.

SELECT [column,] group_function(column). . .


FROM table
[WHERE condition]

Oracle Internal & Oracle Academy Use Only


[GROUP BY [ROLLUP] group_by_expression]
[HAVING having_expression];
[ORDER BY column];

Copyright © 2011, Oracle. Todos os direitos reservados.

Operador ROLLUP
O operador ROLLUP retorna agregações e superagregações para as expressões dentro de uma
instrução GROUP BY. O operador ROLLUP pode ser usado pelos autores de relatórios para
extrair estatística e informações resumidas de conjuntos de resultados. As agregações
cumulativas podem ser usadas em relatórios, gráficos e diagramas.
O operador ROLLUP cria agrupamentos por mover em uma direção, da direita para a esquerda,
juntamente com a lista de colunas especificada na cláusula GROUP BY. Ele aplica a função de
agregação a esses agrupamentos.
Observação
• Para gerar subtotais em n dimensões (ou seja, n colunas na cláusula GROUP BY), sem um
operador ROLLUP, n+1 instruções SELECT devem estar vinculadas a UNION ALL. Isso
torna a execução de consultas ineficiente porque cada instrução SELECT provoca um
acesso a tabela. O operador ROLLUP coleta os resultados com apenas um acesso à tabela. O
operador ROLLUP é útil quando há muitas colunas envolvidas na geração de subtotais.
• Os subtotais e os totais são produzidos com ROLLUP. CUBE também produz totais e faz um
roll-up eficiente dos valores em todas as direções possíveis, produzindo dados de referência
cruzada.

Oracle Database: Fundamentos de SQL II F - 7


Operador ROLLUP: Exemplo

SELECT department_id, job_id, SUM(salary)


FROM employees
WHERE department_id < 60
GROUP BY ROLLUP(department_id, job_id);

Oracle Internal & Oracle Academy Use Only


2

Copyright © 2011, Oracle. Todos os direitos reservados.

Exemplo de um operador ROLLUP


No exemplo do slide:
• Os salários totais para cada ID de cargo em um departamento, para os departamentos cujo
ID é menor que 60, são exibidos pela cláusula GROUP BY
• O operador ROLLUP exibe:
- O salário total de cada departamento cujo ID é menor que 60
- O salário total dos departamentos cujo ID é menor que 60, sem levar em consideração
os IDs dos cargos
Neste exemplo, 1 indica um grupo totalizado por DEPARTMENT_ID e JOB_ID, 2 indica um
grupo totalizado apenas por DEPARTMENT_ID e 3 indica o total geral.
O operador ROLLUP cria subtotais que fazem um roll-up do nível mais detalhado ao total geral,
seguindo a lista de agrupamentos especificada na cláusula GROUP BY. Primeiro, calcula os
valores agregados padrão para os grupos especificados na cláusula GROUP BY (no exemplo, a
soma dos salários agrupados em cada cargo dentro de um departamento). Em seguida, cria
subtotais com níveis progressivamente mais altos, movendo da direita para a esquerda pela lista
de colunas do agrupamento. (No exemplo, a soma dos salários de cada departamento é
calculada, seguida pela soma dos salários de todos os departamentos.)
• Para n expressões no operador ROLLUP da cláusula GROUP BY, a operação resulta em n + 1
(neste caso, 2 + 1 = 3) agrupamentos.
• As linhas que se baseiam nos valores das primeiras n expressões são chamadas linhas ou
linhas regulares, as demais são chamada linha superagregadas.
Oracle Database: Fundamentos de SQL II F - 8
Operador CUBE

• CUBE é uma extensão da cláusula GROUP BY.


• É possível usar o operador CUBE para produzir valores de
referência cruzada com uma única instrução SELECT.

SELECT [column,] group_function(column)...


FROM table
[WHERE condition]

Oracle Internal & Oracle Academy Use Only


[GROUP BY [CUBE] group_by_expression]
[HAVING having_expression]
[ORDER BY column];

Copyright © 2011, Oracle. Todos os direitos reservados.

Operador CUBE
O operador CUBE é uma alternância adicional na cláusula GROUP BY em uma instrução
SELECT. O operador CUBE pode ser aplicado a todas as funções agregadas, incluindo AVG,
SUM, MAX, MIN e COUNT. É usado para produzir conjuntos de resultados normalmente
utilizados para relatórios com tabela cruzada. ROLLUP produz apenas uma fração das
combinações de subtotais possíveis, ao passo que CUBE produz subtotais para todas as
combinações possíveis de agrupamentos especificadas na cláusula GROUP BY, e um total geral.
O operador CUBE é utilizado com uma função de agregação para gerar linhas adicionais em um
conjunto de resultados. As colunas incluídas na cláusula GROUP BY são de referência cruzada
para a geração de superconjuntos de grupos. A função de agregação especificada na lista de
seleção é aplicada a esses grupos para produzir valores de sumarização para as linhas adicionais
de superagregação. O número de grupos extra no conjunto de resultados é determinado pelo
número de colunas incluídas na cláusula GROUP BY.
Na verdade, cada combinação possível de colunas ou expressões na cláusula GROUP BY é usada
para produzir superagregações. Para n colunas ou expressões na cláusula GROUP BY, há 2n
combinações possíveis de superagregação. Matematicamente, essas combinações formam um
cubo n-dimensional, de onde o operador derivou seu nome.
Com o uso de ferramentas de aplicação ou de programação, esses valores superagregados podem
ser alimentados em gráficos e tabelas que transportam resultados e relacionamentos de maneira
visual e eficaz.
Oracle Database: Fundamentos de SQL II F - 9
Operador CUBE: Exemplo

SELECT department_id, job_id, SUM(salary)


FROM employees
WHERE department_id < 60
GROUP BY CUBE (department_id, job_id) ;

Oracle Internal & Oracle Academy Use Only


2

Copyright © 2011, Oracle. Todos os direitos reservados.

Exemplo de um Operador CUBE


A saída da instrução SELECT no exemplo pode ser interpretada como segue:
• O salário total de cada cargo dentro de um departamento (para departamentos cujo ID é
menor que 60)
• O salário total de cada departamento cujo ID é menor que 60
• O salário total para cada cargo, sem levar em consideração o departamento
• O salário total dos departamentos cujo ID é menor que 60, sem levar em consideração os
cargos
Neste exemplo, 1 indica o total geral, 2 indica as linhas totalizadas por JOB_ID apenas, 3 indica
algumas linhas totalizadas por DEPARTMENT_ID e JOB_ID, e 4 indica algumas linhas
totalizadas por DEPARTMENT_ID apenas.
O operador CUBE também executou a operação ROLLUP para exibir os subtotais dos
departamentos cujo ID é menor que 60, e o salário total dos departamentos (com ID menor que
60) sem levar em consideração os cargos. Ademais, o operador CUBE exibe o salário total de
cada cargo, sem levar em consideração o departamento.
Observação: Da mesma forma que o operador ROLLUP, a produção de subtotais em n
dimensões (ou seja, n colunas na cláusula GROUP BY) sem um operador CUBE requer que as
instruções 2n SELECT sejam vinculadas ao UNION ALL. Assim, um relatório com três
dimensões requer que as instruções 23 = 8 SELECT sejam vinculadas a UNION ALL.

Oracle Database: Fundamentos de SQL II F - 10


Função GROUPING

A função GROUPING:
• É usada com o operador CUBE ou ROLLUP
• É usada para localizar os grupos que formam o subtotal
em uma linha
• É usada para diferenciar os valores NULL armazenados
dos valores NULL criados por ROLLUP ou CUBE
• Retorna 0 ou 1

Oracle Internal & Oracle Academy Use Only


SELECT [column,] group_function(column) .. ,
GROUPING(expr)
FROM table
[WHERE condition]
[GROUP BY [ROLLUP][CUBE] group_by_expression]
[HAVING having_expression]
[ORDER BY column];

Copyright © 2011, Oracle. Todos os direitos reservados.

Função GROUPING
A função GROUPING pode ser usada com o operador CUBE ou ROLLUP para ajudar no
entendimento de como um valor sumarizado foi obtido.
A função GROUPING usa uma única coluna como argumento. A expr na função GROUPING
deve corresponder a uma das expressões na cláusula GROUP BY. A função retorna um valor
igual a 0 ou 1.
Os valores retornados pela função GROUPING são úteis para:
• Determinar o nível de agregação de determinado subtotal (ou seja, o grupo ou os grupos em
que o subtotal se baseia)
• Identifica se um valor NULL na coluna da expressão de uma linha do conjunto de resultados
indica:
- Um valor NULL da tabela base (valor NULL armazenado)
- Um valor NULL criado por ROLLUP ou CUBE (como resultado de uma função de
agrupamento nessa expressão)
Um valor igual a 0 retornado pela função GROUPING que se baseia em uma expressão que
indica uma das seguintes condições:
• A expressão foi usada para calcular o valor agregado.
• O valor NULL na coluna da expressão é um valor NULL armazenado.
Um valor igual a 1 retornado pela função GROUPING que se baseia em uma expressão que
indica uma das seguintes condições:
• A expressão não foi usada para calcular o valor agregado.
• O valor NULL na coluna da expressão é criado por ROLLUP ou CUBE como um resultado
de agrupamento.
Oracle Database: Fundamentos de SQL II F - 11
Função GROUPING: Exemplo
SELECT department_id DEPTID, job_id JOB,
SUM(salary),
GROUPING(department_id) GRP_DEPT,
GROUPING(job_id) GRP_JOB
FROM employees
WHERE department_id < 50
GROUP BY ROLLUP(department_id, job_id);

Oracle Internal & Oracle Academy Use Only


1
2

Copyright © 2011, Oracle. Todos os direitos reservados.

Exemplo de uma função GROUPING


No exemplo no slide, considere o valor sumarizado 4400 na primeira linha (rótulo 1). Esse é o
salário total do ID do cargo AD_ASST no departamento 10. Para calcular esse valor sumarizado,
as colunas DEPARTMENT_ID e JOB_ID foram levadas em consideração. Desse modo, o valor
0 foi retornado para as expressões GROUPING(department_id) e GROUPING(job_id).
Considere o valor sumarizado 4400 na segunda linha (rótulo 2). Esse valor é o salário total do
departamento 10 e foi calculado considerando a coluna DEPARTMENT_ID; assim, o valor 0 foi
retornado por GROUPING(department_id). Como a coluna JOB_ID não foi contabilizada
nesse cálculo, o valor 1 foi retornado para GROUPING(job_id). É possível observar uma
saída similar na quinta linha.
Na última linha, considere o valor sumarizado 54800 (rótulo 3). Esse é o salário total dos
departamentos cujo ID é menor que 50 e todos os cargos. No cálculo desse valor sumarizado, as
colunas DEPARTMENT_ID e JOB_ID não foram contabilizadas. Desse modo, o valor 1 foi
retornado para as expressões GROUPING(department_id) e GROUPING(job_id).

Oracle Database: Fundamentos de SQL II F - 12


GROUPING SETS

• A sintaxe GROUPING SETS é usada para definir vários


agrupamentos na mesma consulta.
• Todos os agrupamentos especificados na cláusula
GROUPING SETS são computados e os resultados dos
agrupamentos individuais são combinados com uma
operação UNION ALL.
• Eficácia do conjunto de agrupamentos:

Oracle Internal & Oracle Academy Use Only


– É necessário omitir a tabela base apenas uma vez.
– Não é preciso escrever instruções UNION complexas.
– Quanto mais elementos GROUPING SETS houver, maior o
benefício para o desempenho.

Copyright © 2011, Oracle. Todos os direitos reservados.

GROUPING SETS
GROUPING SETS é uma extensão adicional da cláusula GROUP BY e você pode usar para
especificar vários agrupamentos de dados. Isso facilita a agregação de eficiência e, portanto,
simplifica a análise dos dados em várias dimensões.
É possível agora escrever uma única instrução SELECT usando GROUPING SETS para
especificar vários agrupamentos (que também podem incluir os operadores ROLLUP ou CUBE),
em vez de várias instruções SELECT combinadas por operadores UNION ALL. Por exemplo:
SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY
GROUPING SETS
((department_id, job_id, manager_id),
(department_id, manager_id),(job_id, manager_id));
Essa instrução calcula agregações sobre três agrupamentos:
(department_id, job_id, manager_id), (department_id,
manager_id)and (job_id, manager_id)
Sem esse recurso, várias consultas combinadas com UNION ALL são necessárias para obter a
saída da instrução SELECT precedente. Uma abordagem multiconsulta é ineficiente porque
requer várias varreduras dos mesmos dados.

Oracle Database: Fundamentos de SQL II F - 13


GROUPING SETS (continuação)
Compare o exemplo anterior com a seguinte alternativa:
SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY CUBE(department_id, job_id, manager_id);
Essa instrução calcula todos os 8 (2 *2 *2) agrupamentos, embora apenas os
grupos(department_id, job_id, manager_id), (department_id,
manager_id) e (job_id, manager_id) sejam de interesse.
Outra alternativa é a seguinte instrução:
SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY department_id, job_id, manager_id
UNION ALL

Oracle Internal & Oracle Academy Use Only


SELECT department_id, NULL, manager_id, AVG(salary)
FROM employees
GROUP BY department_id, manager_id
UNION ALL
SELECT NULL, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY job_id, manager_id;
Essa instrução requer três varreduras da tabela base, o que a torna ineficiente.
CUBE e ROLLUP podem ser considerados como conjuntos de agrupamento com semântica e
resultados bem específicos. As seguintes equivalências confirmam esse fato:

CUBE(a, b, c) GROUPING SETS


é equivalente a ((a, b, c), (a, b), (a, c), (b, c),
(a), (b), (c), ())
ROLLUP(a, b,c) GROUPING SETS ((a, b, c), (a, b),(a), ())
é equivalente a

Oracle Database: Fundamentos de SQL II F - 14


GROUPING SETS: Exemplo

SELECT department_id, job_id,


manager_id,AVG(salary)
FROM employees
GROUP BY GROUPING SETS
((department_id,job_id), (job_id,manager_id));

Oracle Internal & Oracle Academy Use Only


2

Copyright © 2011, Oracle. Todos os direitos reservados.

GROUPING SETS: Exemplo


A consulta no slide calcula agregações em dois agrupamentos. A tabela é dividida nos seguintes
grupos:
• ID do Departamento, ID do Cargo
• ID do Cargo, ID do Gerente
É calculada a média de salário de cada um desses grupos. O conjunto de resultados exibe a
média de salário de cada dois grupos.
Na saída, o grupo marcado como 1 pode ser interpretado como segue:
• A média de salário de todos os funcionários com ID de cargo SH_CLERK e gerente 122 é
3.200.
• A média de salário de todos os funcionários com o ID de cargo AC_MGR e gerente 101 é
12.000, e assim por diante.
O grupo marcado como 2 na saída é interpretado como segue:
• A média de salário de todos os funcionários com ID de cargo AC_MGR e no departamento
110 é 12.000.
• A média de salário de todos os funcionários com o ID de cargo AD_PRES e no
departamento 90 é 24.000, e assim por diante.

Oracle Database: Fundamentos de SQL II F - 15


GROUPING SETS: Exemplo (continuação)
O exemplo no slide também pode ser escrito como segue:
SELECT department_id, job_id, NULL as manager_id,
AVG(salary) as AVGSAL
FROM employees
GROUP BY department_id, job_id
UNION ALL
SELECT NULL, job_id, manager_id, avg(salary) as AVGSAL
FROM employees
GROUP BY job_id, manager_id;
Na ausência de um otimizador que percorra os blocos de consulta para gerar o plano de
execução, a consulta precedente precisará de duas varreduras da tabela base, EMPLOYEES. Isso
pode ser muito ineficiente. Assim, a utilização da instrução GROUPING SETS é recomendada.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II F - 16


Colunas compostas

• Uma coluna composta é uma coleção de colunas que são


tratadas como uma unidade.
ROLLUP (a, (b, c) , d)
• Use parênteses dentro da cláusula GROUP BY para
agrupar colunas, de modo que elas sejam tratadas como
uma unidade durante o processamento das operações
ROLLUP ou CUBE.

Oracle Internal & Oracle Academy Use Only


• Quando usadas com ROLLUP ou CUBE, as colunas
compostas precisarão ignorar a agregação em
determinados níveis.

Copyright © 2011, Oracle. Todos os direitos reservados.

Colunas compostas
Uma coluna composta é uma coleção de colunas que são tratadas como uma unidade durante o
processamento dos agrupamentos. Você especifica as colunas em parênteses como nas
instruções a seguir: ROLLUP (a, (b, c), d)
Aqui, (b, c) formam uma coluna composta e são tratadas como uma unidade. No geral, as
colunas compostas são úteis em ROLLUP, CUBE e GROUPING SETS. Por exemplo, em CUBE
ou ROLLUP, as colunas compostas precisarão ignorar a agregação em determinados níveis.
Ou seja, GROUP BY ROLLUP(a, (b, c) )é equivalente a:
GROUP BY a, b, c UNION ALL
GROUP BY a UNION ALL
GROUP BY ()
Aqui, (b, c) é tratado como unidade e ROLLUP não é aplicado em (b, c). É similar a ter
um alias - por exemplo, z como alias para (b, c) - e reduzir a expressão GROUP BY para:
GROUP BY ROLLUP(a, z).
Observação: GROUP BY( ) é, normalmente, uma instrução SELECT com valores NULL para
as colunas a e b e é apenas a função agregada. Normalmente, é usado para produzir totais
gerais.
SELECT NULL, NULL, aggregate_col
FROM <table_name>
GROUP BY ();
Oracle Database: Fundamentos de SQL II F - 17
Colunas compostas (continuação)
Compare isso com o ROLLUP normal como em:
GROUP BY ROLLUP(a, b, c)
Isso seria:
GROUP BY a, b, c UNION ALL
GROUP BY a, b UNION ALL
GROUP BY a UNION ALL
GROUP BY ()
Similarmente:
GROUP BY CUBE((a, b), c)
Isso seria equivalente a:
GROUP BY a, b, c UNION ALL
GROUP BY a, b UNION ALL

Oracle Internal & Oracle Academy Use Only


GROUP BY c UNION ALL
GROUP By ()
A tabela a seguir apresenta a especificação GROUPING SETS e a especificação GROUP BY
equivalente.

Instruções GROUP BY Equivalentes


Instruções GROUPING SETS

GROUP BY GROUPING SETS(a, b, c) GROUP BY a UNION ALL


GROUP BY b UNION ALL
GROUP BY c
GROUP BY GROUPING SETS(a, b,(b, c)) GROUP BY a UNION ALL
(A expressão GROUPING SETS tem uma coluna GROUP BY b UNION ALL
composta.) GROUP BY b, c
GROUP BY GROUPING SETS((a, b, c)) GROUP BY a, b, c
GROUP BY GROUPING SETS(a, (b), ()) GROUP BY a UNION ALL
GROUP BY b UNION ALL
GROUP BY ()

GROUP BY GROUPING SETS GROUP BY a UNION ALL


(a,ROLLUP(b, c)) GROUP BY ROLLUP(b, c)
(A expressão GROUPING SETS tem uma coluna
composta.)

Oracle Database: Fundamentos de SQL II F - 18


Colunas compostas: Exemplo

SELECT department_id, job_id, manager_id,


SUM(salary)
FROM employees
GROUP BY ROLLUP( department_id,(job_id, manager_id));

Oracle Internal & Oracle Academy Use Only


2

4
Copyright © 2011, Oracle. Todos os direitos reservados.

Colunas compostas: Exemplo


Considere o exemplo:
SELECT department_id, job_id,manager_id, SUM(salary)
FROM employees
GROUP BY ROLLUP( department_id,job_id, manager_id);
Essa consulta resulta no processamento dos seguintes agrupamentos pelo Oracle Server:
• (job_id, manager_id)
• (department_id, job_id, manager_id)
• (department_id)
• Total geral
Se estiver interessado apenas em grupos específicos, não será possível limitar o cálculo aos
agrupamentos sem utilizar colunas compostas. Com as colunas compostas, isso é possível
tratando as colunas JOB_ID e MANAGER_ID como uma única unidade durante um roll-up. As
colunas encerradas entre parênteses são tratadas como uma unidade durante o processamento de
ROLLUP e CUBE. Isso é ilustrado no exemplo do slide. Por colocar as colunas JOB_ID e
MANAGER_ID entre parênteses, indique que o Oracle Server deve tratar JOB_ID e
MANAGER_ID como uma única unidade, ou seja, uma coluna composta.

Oracle Database: Fundamentos de SQL II F - 19


Colunas compostas: Exemplo (continuação)
O exemplo do slide computa os seguintes agrupamentos:
• (department_id, job_id, manager_id)
• (department_id)
• ( )

O exemplo do slide exibe o que segue:


• Total de salário de cada cargo e gerente (rótulo 1)
• Total de salário de cada departamento, cargo e gerente (rótulo 2)
• Total de salário de cada departamento (rótulo 3)
• Total Geral (rótulo 4)
O exemplo no slide também pode ser escrito como segue:
SELECTdepartment_id, job_id, manager_id, SUM(salary)
FROM employees

Oracle Internal & Oracle Academy Use Only


GROUP BY department_id,job_id, manager_id
UNION ALL
SELECT department_id, TO_CHAR(NULL),TO_NUMBER(NULL),
SUM(salary)
FROM employees
GROUP BY department_id
UNION ALL
SELECT TO_NUMBER(NULL), TO_CHAR(NULL),TO_NUMBER(NULL),
SUM(salary)
FROM employees
GROUP BY ();
Na ausência de um otimizador que percorra os blocos de consulta para gerar o plano de
execução, a consulta precedente precisará de três varreduras da tabela base, EMPLOYEES. Isso
pode ser muito ineficiente. Assim, o uso de colunas compostas é recomendado.

Oracle Database: Fundamentos de SQL II F - 20


Agrupamentos concatenados

• Os agrupamentos concatenados oferecem uma maneira


concisa para gerar combinações úteis de agrupamentos.
• Para especificar conjuntos de agrupamentos
concatenados, separe por vírgulas vários conjuntos de
agrupamentos e operações ROLLUP e CUBE, de modo que
o Oracle Server os combine em uma única cláusula
GROUP BY.

Oracle Internal & Oracle Academy Use Only


• O resultado são agrupamentos de produtos híbridos em
cada GROUPING SET.
GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)

Copyright © 2011, Oracle. Todos os direitos reservados.

Agrupamentos concatenados
Os agrupamentos concatenados oferecem uma maneira concisa para gerar combinações úteis de
agrupamentos. Os agrupamentos concatenados são especificados listando vários conjuntos de
agrupamentos, CUBEs e ROLLUPs, e separando-os por vírgulas. Este é um exemplo de
conjuntos de agrupamentos concatenados:
GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)
Esse exemplo de SQL define os seguintes agrupamentos:
(a, c), (a, d), (b, c), (b, d)
A concatenação de conjuntos de agrupamento é muito útil pelos seguintes motivos:
• Facilidade de desenvolvimento de consulta: Não é necessário enumerar manualmente
todos os agrupamentos.
• Uso por aplicações: A SQL gerada pelo OLAP (online analytical processing)
frequentemente envolve concatenação de conjuntos de agrupamentos, com cada
GROUPING SET definindo os agrupamentos necessários para uma dimensão.

Oracle Database: Fundamentos de SQL II F - 21


Agrupamentos concatenados: Exemplo

SELECT department_id, job_id, manager_id,


SUM(salary)
FROM employees
GROUP BY department_id,
ROLLUP(job_id),
CUBE(manager_id);

Oracle Internal & Oracle Academy Use Only



1


2
3

Copyright © 2011, Oracle. Todos os direitos reservados.

Agrupamentos concatenados: Exemplo


O exemplo do slide resulta nos seguintes agrupamentos:
• (department_id,job_id,) (1)
• (department_id,manager_id) (2)
• (department_id) (3)

O total de salário de cada grupo é calculado.


Segue outro exemplo de agrupamento concatenado.
SELECT department_id, job_id, manager_id, SUM(salary) totsal
FROM employees
WHERE department_id<60
GROUP BY GROUPING SETS(department_id),
GROUPING SETS (job_id, manager_id);

Oracle Database: Fundamentos de SQL II F - 22


Sumário

Neste apêndice, você aprendeu a usar:


• A operação ROLLUP para produzir valores de subtotal
• A operação CUBE para produzir os valores da tabela de
referência cruzada
• A função GROUPING para identificar os valores das linhas
criadas por ROLLUP ou CUBE

Oracle Internal & Oracle Academy Use Only


• A sintaxe GROUPING SETS para definir vários
agrupamentos na mesma consulta
• A cláusula GROUP BY para combinar expressões de
diversos modos:
– Colunas compostas
– Conjuntos de agrupamentos concatenados

Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
• ROLLUP e CUBE são extensões da cláusula GROUP BY.
• ROLLUP é usado para exibir valores de subtotais e de total geral.
• CUBE é usado para exibir os valores da tabela de referência cruzada.
• A função GROUPING permite que você determine se uma linha é uma
agregação produzida por um operador CUBE or ROLLUP.
• Com a sintaxe GROUPING SETS, é possível definir vários agrupamentos na mesma
consulta. GROUP BY calcula todos os agrupamentos e usa UNION ALLpara combiná-los.
• Dentro da cláusula GROUP BY, é possível combinar expressões de diversos modos:
- Para especificar colunas compostas, agrupe colunas entre parênteses de modo que o
Oracle Server as trate como uma unidade ao calcular as operações ROLLUP ou CUBE.
- Para especificar conjuntos de agrupamentos concatenados, separe por vírgulas vários
conjuntos de agrupamentos e operações ROLLUP e CUBE, de modo que o Oracle
Server os combine em uma única cláusula GROUP BY. O resultado são agrupamentos
de produtos híbridos em cada conjunto de agrupamentos.

Oracle Database: Fundamentos de SQL II F - 23


Oracle Internal & Oracle Academy Use Only
Recuperação da hierarquia

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.
Objetivos

Ao concluir este apêndice, você será capaz de:


• Interpretar o conceito de uma consulta hierárquica
• Criar um relatório estruturado em árvore
• Formatar dados hierárquicos
• Excluir ramificações da estrutura em árvore

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Neste apêndice, você aprenderá a usar as consultas hierárquicas para criar relatórios estruturados
em árvore.

Oracle Database: Fundamentos de SQL II G - 2


Dados de amostra da tabela EMPLOYEES

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Dados de amostra da tabela EMPLOYEES


Usando consultas hierárquicas, é possível recuperar dados com base em um relacionamento
hierárquico natural entre as linhas de uma tabela. Um banco de dados relacional não armazena
os registros de um modo hierárquico. No entanto, onde há um relacionamento hierárquico entre
as linhas de uma única tabela, um processo denominado percurso da árvore permite que a
hierarquia seja construída. Uma consulta hierárquica é um método de relatório, com
ramificações de uma árvore em uma ordem específica.
Imagine uma árvore genealógica com os membros mais velhos da família localizados próximos
à base ou ao tronco da árvore e os mais jovens representando os ramos. Os ramos pode ter suas
próprias ramificações e assim por diante.
Um consulta hierárquica é possível quando há um relacionamento entre as linhas em uma tabela.
Por exemplo, no slide, é possível ver que Kochhar, De Haan e Hartstein reportam-se ao
MANAGER_ID 100, que é o EMPLOYEE_ID de King.
Observação: as árvores hierárquicas são usadas em vários campos como genealogia humana
(árvores genealógicas), bens semoventes (para fins de reprodução), gestão corporativa
(hierarquia de gerenciamento), fabricação (montagem de produtos), pesquisa evolucionária
(desenvolvimento de espécies) e pesquisa científica.

Oracle Database: Fundamentos de SQL II G - 3


Estrutura em árvore natural

EMPLOYEE_ID = 100 (Pai)


King
MANAGER_ID = 100 (Filho)

Kochhar De Haan Mourgos Zlotkey Hartstein

Oracle Internal & Oracle Academy Use Only


Whalen Higgins Hunold Rajs Davies Matos Vargas

Fay

Gietz Ernst Lorentz Abel Taylor Grant

Copyright © 2011, Oracle. Todos os direitos reservados.

Estrutura em árvore natural


A tabela EMPLOYEES tem uma estrutura em árvore que representa a linha de subordinação de
gerenciamento. A hierarquia pode ser criada examinando o relacionamento entre os valores
equivalentes nas colunas EMPLOYEE_ID e MANAGER_ID. Esse relacionamento pode ser
explorado pela junção da tabela a ela mesma. A coluna MANAGER_ID contém o número de
funcionário do gerente do funcionário.
O relacionamento pai-filho de uma estrutura em árvore permite que você controle:
• A direção em que a hierarquia se estende
• O ponto de início dentro da hierarquia
Observação: o slide apresenta uma estrutura em árvore invertida da hierarquia de
gerenciamento dos funcionários na tabela EMPLOYEES.

Oracle Database: Fundamentos de SQL II G - 4


Consultas hierárquicas

SELECT [LEVEL], column, expr...


FROM table
[WHERE condition(s)]
[START WITH condition(s)]
[CONNECT BY PRIOR condition(s)] ;

Oracle Internal & Oracle Academy Use Only


condition:
expr comparison_operator expr

Copyright © 2011, Oracle. Todos os direitos reservados.

Palavras-chave e cláusulas
As consultas hierárquicas podem ser identificadas pela presença das cláusulas CONNECT BY e
START WITH.
Na sintaxe:
SELECT É a cláusula SELECT padrão
LEVEL Para cada linha retornada pela consulta hierárquica, a pseudocoluna LEVEL
retorna 1 para uma linha-raiz, 2 para um filho de uma raiz e assim por
diante.
FROM table Especifica a tabela, a view ou o snapshot que contém as colunas. É possível
selecionar em uma tabela apenas.
WHERE Restringe as linhas retornadas pela consulta sem afetar as linhas
da hierarquia
condition É uma comparação com as expressões
START WITH Especifica as linhas-raiz da hierarquia (onde iniciar). Essa cláusula é
necessária para se obter uma consulta hierárquica verdadeira.
CONNECT BY Especifica as colunas em que há o relacionamento entre linhas
PRIOR mãe e filha. Essa cláusula é necessária para se obter uma consulta
hierárquica.

Oracle Database: Fundamentos de SQL II G - 5


Percorrendo a árvore

Ponto inicial
• Especifica a condição que deve ser correspondida
• Aceita qualquer condição válida
START WITH column1 = value

Oracle Internal & Oracle Academy Use Only


Usando a tabela EMPLOYEES, comece com o funcionário que o
sobrenome é Kochhar.
...START WITH last_name = 'Kochhar'

Copyright © 2011, Oracle. Todos os direitos reservados.

Percorrendo a árvore
A linha ou as linhas que serão a raiz da árvore são determinadas pela cláusula START WITH. A
cláusula START WITH pode conter qualquer condição válida.
Exemplos
Usando a tabela EMPLOYEES, inicie com King, o presidente da empresa.
... START WITH manager_id IS NULL
Usando a tabela EMPLOYEES, inicie com o funcionário Kochhar. Uma condição START WITH
pode conter uma subconsulta.
... START WITH employee_id = (SELECT employee_id
FROM employees
WHERE last_name = 'Kochhar')
Se a cláusula START WITH for omitida, o percurso da árvore iniciará com todas as linhas na
tabela como linhas-raiz.
Observação: as cláusulas CONNECT BY e START WITH não são do padrão ANSI SQL.

Oracle Database: Fundamentos de SQL II G - 6


Percorrendo a árvore

CONNECT BY PRIOR column1 = column2

Percorra de cima para baixo, usando a tabela EMPLOYEES.


... CONNECT BY PRIOR employee_id = manager_id

Oracle Internal & Oracle Academy Use Only


Direção

De cima Column1 = Chave-pai


para baixo Column2 = Chave-filha

De baixo Column1 = Chave-filha


para cima Column2 = Chave-pai

Copyright © 2011, Oracle. Todos os direitos reservados.

Percorrendo a árvore (continuação)


A direção da consulta é determinada pela localização da coluna CONNECT BY PRIOR. De cima
para baixo, o operador PRIOR refere-se à linha-mãe. De baixo para cima, o operador PRIOR
refere-se à linha-filha. Para localizar as linhas-filha de uma linha-mãe, o Oracle Server avalia a
expressão PRIOR da linha-mãe e outras expressões de cada linha na tabela. As linhas para as
quais a condição é verdadeira são filhas da linha-mãe. O Oracle Server sempre seleciona linhas-
filha avaliando a condição CONNECT BY com respeito a uma linha-mãe atual.
Exemplos
Percorra de cima para baixo, usando a tabela EMPLOYEES. Defina um relacionamento
hierárquico em que o valor EMPLOYEE_ID da linha-mãe seja igual ao valor MANAGER_ID da
linha-filha:
... CONNECT BY PRIOR employee_id = manager_id
Percorra de baixo para cima usando a tabela EMPLOYEES:
... CONNECT BY PRIOR manager_id = employee_id
O operador PRIOR não precisa necessariamente estar codificado imediatamente após CONNECT
BY. Assim, a cláusula CONNECT BY PRIOR a seguir atribui o mesmo resultado que o do
exemplo precedente:
... CONNECT BY employee_id = PRIOR manager_id
Observação: a cláusula CONNECT BY não pode conter uma subconsulta.

Oracle Database: Fundamentos de SQL II G - 7


Percorrendo a árvore: de baixo para cima

SELECT employee_id, last_name, job_id, manager_id


FROM employees
START WITH employee_id = 101
CONNECT BY PRIOR manager_id = employee_id ;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Percorrendo a árvore: de baixo para cima


O exemplo no slide exibe uma lista de gerentes iniciando com o funcionário cujo ID é 101.

Oracle Database: Fundamentos de SQL II G - 8


Percorrendo a árvore: de cima para baixo

SELECT last_name||' reports to '||


PRIOR last_name "Walk Top Down"
FROM employees
START WITH last_name = 'King'
CONNECT BY PRIOR employee_id = manager_id;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Percorrendo a árvore: de cima para baixo


Percorrendo de cima para baixo, exiba os nomes dos funcionários com seus respectivos gerentes.
Use o funcionário King como ponto de partida. Imprima apenas uma coluna.
Exemplo
No exemplo a seguir, os valores EMPLOYEE_ID são avaliados pela linha-mãe e os valores
MANAGER_ID e SALARY são avaliados pelas linhas-filha. O operador PRIOR aplica-se apenas
ao valor EMPLOYEE_ID.
... CONNECT BY PRIOR employee_id = manager_id
AND salary > 15000;
Para qualificar uma linha-filha, uma linha deve ter um valor MANAGER_ID igual ao valor
EMPLOYEE_ID da linha-mãe e ter um valor SALARY maior que US$ 15.000.

Oracle Database: Fundamentos de SQL II G - 9


Classificando linhas com pseudocoluna LEVEL

Nível 1
King raiz/
pai

Nível 2
Kochhar De Haan Mourgos Zlotkey Hartstein pai/
filho/folha

Oracle Internal & Oracle Academy Use Only


Nível 3
Whalen Higgins Hunold Rajs Davies Matos Vargas Fay pai/
filho/folha

Gietz Ernst Lorentz Abel Taylor Grant Nível 4


folha

Copyright © 2011, Oracle. Todos os direitos reservados.

Classificando linhas com pseudocoluna LEVEL


É possível demonstrar explicitamente a classificação ou o nível de uma linha na hierarquia
usando a pseudocoluna LEVEL. Isso tornará o seu relatório mais legível. As bifurcações em que
uma ou mais ramificações saem de uma ramificação mais larga são chamadas nós e a
extremidade da ramificação é chamada de folha ou nó-folha. O gráfico do slide apresenta os nós
da árvore invertida com os valores LEVEL. Por exemplo, o funcionário Higgens é pai e filho, e o
funcionário Davies é filho e folha.
Pseudocoluna LEVEL
Valor Nível para Cima para Baixo Nível para Baixo para Cima
1 Um nó-raiz Um nó-raiz
2 Um filho de um nó-raiz O pai de um nó raiz
3 Um filho de um filho, e assim por diante Um pai de um pai, e assim por diante

No slide, King é raiz ou o pai (LEVEL = 1). Kochhar, De Haan, Mourgos, Zlotkey, Hartstein,
Higgens e Hunold são filhos e, ao mesmo tempo, pais (LEVEL = 2). Whalen, Rajs, Davies,
Matos, Vargas, Gietz, Ernst, Lorentz, Abel, Taylor, Grant e Fay são filhos e folhas (LEVEL = 3 e
LEVEL = 4).
Observação: um nó-raiz é o nó mais elevado dentro de uma árvore invertida. Um nó-filho é
qualquer nó que não-raiz. Um nó-pai é qualquer nó que tenha filhos. Um nó-folha é qualquer nó
sem filhos. O número de níveis retornados por uma consulta hierárquica pode ser limitado pela
memória disponível do usuário.
Oracle Database: Fundamentos de SQL II G - 10
Formatando relatórios hierárquicos usando
LEVEL e LPAD

Crie um relatório que exiba os níveis de gerenciamento da


empresa, iniciando com o nível mais alto e fazendo uma
indentação a cada nível subsequente.

COLUMN org_chart FORMAT A12

Oracle Internal & Oracle Academy Use Only


SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'_')
AS org_chart
FROM employees
START WITH first_name='Steven' AND last_name='King'
CONNECT BY PRIOR employee_id=manager_id

Copyright © 2011, Oracle. Todos os direitos reservados.

Formatando relatórios hierárquicos usando LEVEL eLPAD


Os nós em uma árvore são os números de níveis atribuídos a partir da raiz. Use a função LPAD
em conjunto com a pseudocoluna LEVEL para exibir um relatório hierárquico como uma árvore
indentada.
No exemplo no slide:
• LPAD(char1,n [,char2]) retorna char1, completado à esquerda até o
comprimento n com a sequência de caracteres em char2. O argumento n é o comprimento
total do valor de retorno como ele á exibido na tela do terminal.
• LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'_')define o formato
de exibição
• char1 é o LAST_NAME, n, o comprimento total do valor de retorno, é o comprimento de
LAST_NAME +(LEVEL*2)-2; e char2 é '_'
Ou seja, ele diz à SQL para tomar o LAST_NAME e preencher à esquerda com o caractere '_'
até o comprimento da sequência de caracteres resultante que é igual ao valor determinado por
LENGTH(last_name)+(LEVEL*2)-2.
Para King, LEVEL = 1. Assim, (2 * 1) – 2 = 2 – 2 = 0. Portanto, King não tem nenhum
caractere '_' de preenchimento e é exibido na coluna 1.
Para Kochhar, LEVEL = 2. Assim, (2 * 2) – 2 = 4 – 2 = 2. Portanto, Kochhar é preenchido
com 2 caracteres '_' e é exibido recuado.
O resto dos registros na tabela EMPLOYEES é exibido de modo similar.
Oracle Database: Fundamentos de SQL II G - 11
Formatando relatórios hierárquicos usando LEVEL e LPAD (continuação)

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II G - 12


Limpando ramificações

Use a cláusula WHERE Use a cláusula CONNECT BY


para eliminar um nó. para eliminar uma ramificação.

WHERE last_name != 'Higgins'CONNECT BY PRIOR


employee_id = manager_id
AND last_name != 'Higgins'

Oracle Internal & Oracle Academy Use Only


Kochhar Kochhar

Whalen Higgins Whalen Higgins

Gietz Gietz

Copyright © 2011, Oracle. Todos os direitos reservados.

Limpando ramificações
É possível usar as cláusulas WHERE e CONNECT BY para limpar a árvore (ou seja, controlar
quais nós ou linhas são exibidos). O predicado utilizado aciona uma condição Booleana.
Exemplos
A partir da raiz, percorra de cima para baixo e elimine o funcionário Higgins no resultado, mas
processe as linhas-filha.
SELECT department_id, employee_id,last_name, job_id, salary
FROM employees
WHERE last_name != 'Higgins'
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id;
A partir da raiz, percorra de cima para baixo e elimine o funcionário Higgins e todas as linhas-
filha.
SELECT department_id, employee_id,last_name, job_id, salary
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id
AND last_name != 'Higgins';

Oracle Database: Fundamentos de SQL II G - 13


Sumário

Neste apêndice, você aprendeu que:


• É possível usar consultas hierárquicas para exibir um
relacionamento hierárquico entre linhas em uma tabela
• É possível especificar a direção e o ponto de início da
consulta
• É possível eliminar nós ou ramificações por meio da

Oracle Internal & Oracle Academy Use Only


compactação

Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
É possível usar consultas hierárquicas para recuperar dados com base em um relacionamento
hierárquico natural entre as linhas em uma tabela. A pseudocoluna LEVEL conta a profundidade
na árvore hierárquica que você atingiu. É possível especificar a direção da consulta usando a
cláusula CONNECT BY PRIOR. Você pode especificar o ponto de partida usando a cláusula
START WITH. Para limpar as ramificações da árvore, use as cláusulas WHERE e CONNECT BY.

Oracle Database: Fundamentos de SQL II G - 14


Scripts avançados de gravação

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.
Objetivos

Ao concluir este apêndice, você será capaz de:


• Descrever o tipo de problemas que são resolvidos usando
SQL para gerar SQL
• Gravar um script que gera um script de instruções DROP
TABLE
• Gravar um script que gera um script de instruções INSERT

Oracle Internal & Oracle Academy Use Only


INTO

Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Neste apêndice, você aprenderá a gravar um script SQL para gerar um script SQL.

Oracle Database: SQL Fundamentals II H - 2


Usando SQL para gerar SQL

• A SQL pode ser usada para gerar scripts em SQL.


• O dicionário de dados é:
– Uma coleção das tabelas e views que contém as
informações do banco de dados
– Criado e mantido pelo Oracle Server

Oracle Internal & Oracle Academy Use Only


SQL Dicionário de dados

Script SQL

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando SQL para gerar SQL


A SQL pode ser uma ferramenta sofisticada para a geração de outras instruções SQL. Na
maioria dos casos, isso envolve gravar um arquivo de script. É possível usar SQL de SQL para:
• Impedir código repetitivo
• Acessar informações do dicionário de dados
• Eliminar ou recriar objetos do banco de dados
• Gerar predicados dinâmicos que contenham parâmetros do tempo de execução
Os exemplos usados neste apêndice envolvem a seleção de informações no dicionário de dados.
O dicionário de dados é uma coleção das tabelas e views que contém as informações sobre o
banco de dados. Essa coleção é criada e mantida pelo Oracle Server. Todas as tabelas do
dicionário de dados são de propriedade do usuário SYS. As informações armazenadas no
dicionário de dados incluem os nomes dos usuários do Oracle Server, os privilégios concedidos
aos usuários, os nomes de objetos do banco de dados, as restrições de trabalho e as informações
de auditoria. Há quatro categorias de views do dicionário de dados. Cada categoria tem um
prefixo distinto que reflete o uso ao qual se destina.
Prefixo Descrição
USER_ Contém detalhes dos objetos pertencentes ao usuário
ALL_ Contém detalhes dos objetos para os quais o usuário ganhou direitos de acesso e dos objetos
pertencentes ao usuário
DBA_ Contém detalhes dos usuários com privilégios de DBA para acessar qualquer objeto do banco de dados
V$_ Armazena informações sobre o desempenho e o bloqueio do servidor do banco de dados; disponível
apenas para o DBA
Oracle Database: SQL Fundamentals II H - 3
Criando um script básico

SELECT 'CREATE TABLE ' || table_name ||


'_test ' || 'AS SELECT * FROM '
|| table_name ||' WHERE 1=2;'
AS "Create Table Script"
FROM user_tables;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Um script básico
O exemplo no slide produz um relatório com as instruções CREATE TABLE em cada tabela de
sua propriedade. Cada instrução CREATE TABLE produzida no relatório inclui a sintaxe para
criar uma tabela usando o nome da tabela com um sufixo _test e tendo apenas a estrutura da
tabela existente correspondente. O nome antigo da tabela é obtido da coluna TABLE_NAME da
view de dicionário de dados USER_TABLES.
A próxima etapa é melhorar o relatório para automatizar o processo.
Observação: Você pode consultar as tabelas do dicionário de dados para exibir vários objetos
de banco de dados de sua propriedade. As views do dicionário de dados frequentemente usadas
incluem:
• USER_TABLES: Exibe a descrição das tabelas de propriedade do usuário
• USER_OBJECTS: Exibe todos os objetos de propriedade do usuário
• USER_TAB_PRIVS_MADE: Exibe todas as concessões nos objetos de propriedade do
usuário
• USER_COL_PRIVS_MADE: Exibe todas as concessões nas colunas de objetos de
propriedade do usuário

Oracle Database: SQL Fundamentals II H - 4


Controlando o ambiente

SET ECHO OFF


SET FEEDBACK OFF Defina as variáveis do
SET PAGESIZE 0 sistema com os
valores apropriados.

Oracle Internal & Oracle Academy Use Only


Instrução SQL

SET FEEDBACK ON
SET PAGESIZE 24 Defina as variáveis do
SET ECHO ON sistema novamente
para os valores
default.

Copyright © 2011, Oracle. Todos os direitos reservados.

Controlando o ambiente
Para executar as instruções SQL geradas, você deve capturá-las em um arquivo que possa ser
executado. Você também dever planejar a limpeza da saída gerada e confirmar a supressão dos
elementos, como cabeçalhos, mensagens de feedback, títulos superiores e assim por diante. No
SQL Developer, é possível salvar essas instruções em um script. Para salvar o conteúdo da caixa
Informar Instrução SQL, clique no ícone Salvar ou use o item de menu Arquivo > Salvar. Além
disso, é possível clicar com o botão direito do mouse na caixa Informar Instrução SQL e
selecionar a opção Salvar Arquivo no menu drop-down.
Observação: Algumas instruções SQL*Plus não são suportadas pela Planilha SQL. Para obter a
lista completa de instruções SQL*Plus com ou sem suporte na Planilha SQL, consulte o tópico
Instruções SQL*Plus com e sem Suporte na Planilha SQL na Ajuda on-line do SQL Developer.

Oracle Database: SQL Fundamentals II H - 5


O quadro completo

SET ECHO OFF


SET FEEDBACK OFF
SET PAGESIZE 0

SELECT 'DROP TABLE ' || object_name || ';'


FROM user_objects

Oracle Internal & Oracle Academy Use Only


WHERE object_type = 'TABLE'
/

SET FEEDBACK ON
SET PAGESIZE 24
SET ECHO ON

Copyright © 2011, Oracle. Todos os direitos reservados.

O quadro completo
A saída do comando no slide é salva em um arquivo denominado dropem.sql no SQL
Developer. Para salvar a saída em um arquivo no SQL Developer, use a opção Salvar Arquivo
no painel Saída do Script. O arquivo dropem.sql contém os seguintes dados. Esse arquivo
pode agora ser iniciado a partir do SQL Developer localizando, carregando e executando o
arquivo de script.

Oracle Database: SQL Fundamentals II H - 6


Fazendo dump do conteúdo de uma tabela
para um arquivo

SET HEADING OFF ECHO OFF FEEDBACK OFF


SET PAGESIZE 0

SELECT
'INSERT INTO departments_test VALUES

Oracle Internal & Oracle Academy Use Only


(' || department_id || ', ''' || department_name ||
''', ''' || location_id || ''');'
AS "Insert Statements Script"
FROM departments
/

SET PAGESIZE 24
SET HEADING ON ECHO ON FEEDBACK ON

Copyright © 2011, Oracle. Todos os direitos reservados.

Fazendo dump de conteúdo para um arquivo


Algumas vezes, é útil ter os valores das linhas de uma tabela em um arquivo de texto no formato
de uma instrução INSERT INTO VALUES. Esse script pode ser executado para preencher a
tabela, caso esta seja eliminada acidentalmente.
O exemplo no slide produz instruções INSERT para a tabela DEPARTMENTS_TEST, capturada
no arquivo data.sql usando a opção Salvar Arquivo no SQL Developer.
O conteúdo do arquivo de script data.sql é apresentado a seguir:
INSERT INTO departments_test VALUES
(10, 'Administration', 1700);
INSERT INTO departments_test VALUES
(20, 'Marketing', 1800);
INSERT INTO departments_test VALUES
(50, 'Shipping', 1500);
INSERT INTO departments_test VALUES
(60, 'IT', 1400);
...

Oracle Database: SQL Fundamentals II H - 7


Fazendo dump do conteúdo de uma tabela
para um arquivo

Aplicativo de Resultado
'''X''' 'X'

'''' '

''''||department_name||'''' 'Administration'

Oracle Internal & Oracle Academy Use Only


''', ''' ','

''');' ');

Copyright © 2011, Oracle. Todos os direitos reservados.

Fazendo dump de conteúdo para um arquivo (continuação)


Talvez você tenha percebido o grande número de sinais de aspas simples no slide anterior. Um
conjunto de quatro sinais de aspas simples produz um único sinal de aspas na instrução final.
Lembre-se de que esse caractere e os valores de data devem ser colocados entre aspas.
Dentro dessa string, para exibir um sinal de aspas simples, adicione outro sinal de aspas simples
como prefixo. Por exemplo, no quinto exemplo no slide, as aspas circundantes são para toda a
string. O segundo sinal de aspas atua como um prefixo para a exibição do terceiro sinal de aspas.
Assim, o resultado é um único sinal de aspas, seguido por um parêntese, seguindo por um ponto-
e-vírgula.

Oracle Database: SQL Fundamentals II H - 8


Gerando um predicado dinâmico

COLUMN my_col NEW_VALUE dyn_where_clause

SELECT DECODE('&&deptno', null,


DECODE ('&&hiredate', null, ' ',
'WHERE hire_date=TO_DATE('''||'&&hiredate'',''DD-MON-YYYY'')'),
DECODE ('&&hiredate', null,

Oracle Internal & Oracle Academy Use Only


'WHERE department_id = ' || '&&deptno',
'WHERE department_id = ' || '&&deptno' ||
' AND hire_date = TO_DATE('''||'&&hiredate'',''DD-MON-YYYY'')'))
AS my_col FROM dual;

SELECT last_name FROM employees &dyn_where_clause;

Copyright © 2011, Oracle. Todos os direitos reservados.

Gerando um predicado dinâmico


O exemplo no slide gera uma instrução SELECT que recupera os dados de todos os funcionários
em um departamento que tenham sido admitidos em um dia específico. O script gera a cláusula
WHERE dinamicamente.
Observação: Depois de posicionar a variável do usuário, use o comando UNDEFINE para
deletá-lo.
A primeira instrução SELECT solicita que você informe o número do departamento. Se você
não especificar um número de departamento, este será tratado como nulo pela função DECODE e
o usuário receberá uma solicitação para informar a data de admissão. Se você não informar a
data de admissão, esta será tratada como nula pela função DECODE e a cláusula WHERE
dinâmica gerada também será nula, fazendo com que a segunda instrução SELECT recupere
todas a linhas da tabela EMPLOYEES.
Observação: A variável NEW_V[ALUE] especifica uma variável para reter um valor de coluna.
É possível referenciar a variável nos comandos TTITLE. Use NEW_VALUE para exibir os
valores de coluna ou a data no título superior. Inclua a coluna em um comando BREAK com a
ação SKIP PAGE. O nome da variável não pode conter um símbolo de cerquilha (#).
NEW_VALUE é útil para relatórios-mestre/detalhados em que haja um novo registro-mestre para
cada página.

Oracle Database: SQL Fundamentals II H - 9


Gerando um predicado dinâmico (continuação)
Observação: Aqui, a data de admissão deve ser especificada no formato DD-MON-YYYY.
A instrução SELECT no slide pode ser interpretada como segue:
IF (<<deptno>> is not entered) THEN
IF (<<hiredate>> is not entered) THEN
return empty string
ELSE
return the string ‘WHERE hire_date =
TO_DATE('<<hiredate>>', 'DD-MON-YYYY')’
ELSE
IF (<<hiredate>> is not entered) THEN
return the string ‘WHERE department_id =
<<deptno>> entered'
ELSE
return the string ‘WHERE department_id =

Oracle Internal & Oracle Academy Use Only


<<deptno>> entered
AND hire_date =
TO_DATE(' <<hiredate>>', 'DD-MON-YYYY')’
END IF
A string retornada torna-se o valor da variável DYN_WHERE_CLAUSE, que será usada na
segunda instrução SELECT.
Observação: Use SQL*Plus para esses exemplos.

Quando o primeiro exemplo no slide é executado, o usuário recebe uma solicitação para
informar os valores DEPTNO e HIREDATE:

O seguinte valor para MY_COL é gerado:

Quando o segundo exemplo no slide for executado, a seguinte saída será gerada:

Oracle Database: SQL Fundamentals II H - 10


Sumário

Neste apêndice, você aprendeu que:


• É possível gravar um script SQL para gerar outro script
SQL
• Os arquivos de script frequentemente usam o dicionário
de dados
• É possível capturar a saída em um arquivo

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
A SQL pode ser usada para gerar scripts SQL. Esses scripts podem ser usados para impedir
código repetitivo, eliminar ou recriar objetos, obter ajuda a partir do dicionário de dados e gerar
predicados dinâmicos que contenham parâmetros de tempo de execução.

Oracle Database: SQL Fundamentals II H - 11


Oracle Internal & Oracle Academy Use Only
Componentes da arquitetura do banco
de dados Oracle

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.
Objetivos

Ao concluir este apêndice, você será capaz de:


• Listar os principais componentes da arquitetura do banco
de dados
• Descrever os processos de segundo plano
• Explicar as estruturas da memória
• Correlacionar as estruturas de armazenamento lógicas

Oracle Internal & Oracle Academy Use Only


e físicas

Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Este apêndice apresenta uma visão geral da arquitetura do Oracle Database. Você conhecerá as
estruturas físicas e lógicas e os diversos componentes do Oracle Database com suas respectivas
funções.

Oracle Database: Fundamentos de SQL II I - 2


Arquitetura do banco de dados Oracle: Visão Geral

O Oracle RDBMS (Relational Database Management System)


é um sistema de gerenciamento de banco de dados que
apresenta uma abordagem aberta, abrangente e integrada
para o gerenciamento de informações.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Arquitetura do banco de dados Oracle: Visão Geral


Um banco de dados é uma coleção de dados tratada como unidade. O objetivo de um banco de
dados é armazenar e recuperar informações relacionadas.
Um banco de dados Oracle gerencia de modo confiável uma grande quantidade de dados em um
ambiente multiusuário de modo que usuários possam acessar simultaneamente os mesmos
dados. E faz isso enquanto produz alto desempenho. Ao mesmo tempo, impede acesso não
autorizado e apresenta soluções eficientes para recuperação de falhas.

Oracle Database: Fundamentos de SQL II I - 3


Estruturas do servidor de banco de dados Oracle
Instância
Estruturas de memória SGA Shared pool

Biblioteca
Cache de ASM
Buffer de
buffer do
redo log Cache do
banco de dados
dicionário
Processo Processo de dados
do usuário do servidor

Processos DBWn CKPT LGWR SMON PMON ARCn RECO Outros

Oracle Internal & Oracle Academy Use Only


Database

Estruturas de
armazenamento

Arquivos Arquivos
Arquivos de de redo log
de dados controle on-line

Copyright © 2011, Oracle. Todos os direitos reservados.

Estruturas do servidor de banco de dados Oracle


O banco de dados Oracle é composto por dois componentes principais—a instância e o banco de
dados.
• A instância é composta pela SGA (System Global Area), que é uma coleção das estruturas
da memória, e pelos processos de segundo plano que executam tarefas dentro do banco de
dados. Cada vez que uma instância é iniciada, a SGA é alocada e os processos de segundo
plano iniciam.
• O banco de dados é composto tanto por estruturas físicas como lógicas. Como as estruturas
físicas e lógicas são separadas, o armazenamento físico de dados pode ser gerenciado sem
afetar o acesso às estruturas lógicas de armazenamento. As estruturas físicas de
armazenamento incluem:
- Os arquivos de controle em que a configuração do banco de dados está armazenada
- Os arquivos de Redo Log contendo as informações necessárias para recuperação do
banco de dados
- Os arquivos de dados em que todos os dados são armazenados
Uma instância do Oracle usa os processos e as estruturas de memória para gerenciar e acessar as
estruturas de armazenamento do banco de dados. Todas as estruturas de memória se situam na
memória principal dos computadores que compõem o servidor do banco de dados. Os processos
são jobs que trabalham na memória desses computadores. Um processo é definido como um
“thread de controle” ou um mecanismo, em um sistema operacional, que pode executar uma
série de procedimentos.
Oracle Database: Fundamentos de SQL II I - 4
Conectando-se ao banco de dados

• Conexão: Via de comunicação entre um processo de


usuário e uma instância do banco de dados
• Sessão: Uma conexão específica de um usuário para uma
instância do banco de dados por meio de um processo do
usuário

Oracle Internal & Oracle Academy Use Only


SQL> Select … Usuário Sessão
Usuário

Conexão

Copyright © 2011, Oracle. Todos os direitos reservados.

Conectando-se ao banco de dados


Para acessar as informações no banco de dados, o usuário precisa se conectar ao banco de dados
usando uma ferramenta (por exemplo, SQL*Plus). Depois que o usuário estabelece a conexão,
uma sessão é criada para o usuário. A conexão e a sessão estão intimamente relacionadas ao
processo do usuário, mas são muito diferentes em significados.
Uma conexão é uma via de comunicação entre um processo do usuário e uma instância do banco
de dados Oracle. Uma via de comunicação é estabelecida por meio dos mecanismos de
comunicação entre processos disponíveis ou do software de rede (quando diferentes
computadores executam o aplicativo do banco de dados e o banco de dados Oracle em uma
rede).
Uma sessão representa o estado do login do usuário atual na instância do banco de dados. Por
exemplo, quando um usuário inicia o SQL*Plus, ele deve fornecer um nome de usuário e uma
senha válidos; isso estabelece uma sessão para esse usuário. Uma sessão se estende do horário
em que o usuário se conecta até o momento em que ele se desconecta ou sai do aplicativo do
banco de dados.
No caso de uma conexão dedicada, a sessão é atendida por um processo dedicado permanente.
No caso de uma conexão compartilhada, a sessão é atendida por um processo de servidor
disponível selecionado em um pool, quer pela camada intermediária, quer pela arquitetura de
servidor compartilhado da Oracle.
É possível criar várias sessões e elas podem coexistir para um único usuário do banco de dados
Oracle usando o mesmo nome do usuário, quer por aplicativos diferentes, quer por várias
chamadas do mesmo aplicativo.
Oracle Database: Fundamentos de SQL II I - 5
Interagindo com um banco de dados Oracle

Instância
Processo Processo
do usuário do servidor SGA
Shared pool

Cache de Biblioteca
buffer do Buffer de ASM
banco de redo log Cache do
dados dicionário
de dados

DBWn CKPT LGWR SMON PMON ARCn RECO Outros

Oracle Internal & Oracle Academy Use Only


Usuário

Copyright © 2011, Oracle. Todos os direitos reservados.

Interagindo com um banco de dados Oracle


Os exemplos a seguir descrevem as operações do banco de dados Oracle no nível mais básico.
Eles ilustram uma configuração do banco de dados Oracle em que o usuário e os processos de
servidor associados estão em computadores diferentes, conectados por uma rede.
1. Uma instância iniciou em um nó onde o banco de dados Oracle está instalado, muitas vezes
chamado host ou servidor de banco de dados.
2. Um usuário inicia um aplicativo gerando um processo de usuário. O aplicativo tenta
estabelecer uma conexão com o servidor. (Esta pode ser uma conexão local, cliente-servidor
ou de três camadas em uma camada intermediária.)
3. O servidor executa o listener que possui o handler do Oracle Net Services apropriado. O
servidor detecta a solicitação de conexão do aplicativo e cria um processo de servidor
dedicado autorizado pelo processo do usuário.
4. O usuário executa a instrução SQL tipo DML e efetua o commit da transação. Por exemplo,
o usuário altera o endereço de um cliente em uma tabela e faz o commit da alteração.
5. O processo do servidor recebe a instrução e verifica o shared pool (um componente SGA)
para qualquer área SQL compartilhada que contenha uma instrução SQL similar. Se a área
SQL compartilhada for encontrada, o processo do servidor verificará os privilégios de
acesso do usuário aos dados solicitados, e a área SQL compartilhada existente
anteriormente será usada para processar a instrução. Caso contrário, uma nova área SQL
compartilhada será alocada para a instrução, de modo que possa ser analisada por parse ou
processada.
Oracle Database: Fundamentos de SQL II I - 6
Interagindo com um banco de dados Oracle (continuação)
6. O processo do servidor recupera todos os valores de dados necessários, quer a partir do
arquivo de dados real (em que a tabela está armazenada), quer a partir do cache na SGA.
7. O processo do servidor modifica os dados na SGA. Quando a transação é submetida a
commit, o processo log writer (LGWR) registra imediatamente a transação no arquivo de
redo log. O processo database writer (DBWn) grava os blocos modificados
permanentemente no disco quando fazer isso for eficiente.
8. Se a transação for bem-sucedida, o processo do servidor enviará uma mensagem pela rede
ao aplicativo. Caso contrário, uma mensagem de erro será transmitida.
9. Durante todo esse procedimento, os outros processos de segundo plano são executados,
procurando condições que exigem intervenção. Além disso, o servidor de banco de dados
gerencia outras transações do usuário e impede a contenção entre as transações que
solicitam os mesmos dados.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II I - 7


Arquitetura de memória Oracle Estruturas de BD
ÆMemória
- Processo
- Armazenamento

Processo de Processo de Processos


PGA PGA de segundo PGA
servidor 1 servidor 2 plano

Cache do dicio- SGA


Área SQL
compar- nário de dados
tilhada

Oracle Internal & Oracle Academy Use Only


Cache de Outras
biblioteca

Buffer de Shared pool


redo log
Buffer de Memória
Buffer cache E/S livre
do banco de
dados Fila de Fila de
Java Streams respostas solicitações
pool pool Large pool

Copyright © 2011, Oracle. Todos os direitos reservados.

Estruturas de Memória Oracle


O Oracle Database cria e usa estruturas de memória para diversos fins. Por exemplo, a memória
armazena o código do programa que está sendo executado, os dados compartilhados entre
usuários e as áreas de dados privadas para cada usuário conectado.
Duas estruturas básicas de memória estão associadas a uma única instância:
• A SGA (System Global Area) é um grupo de estruturas de memória compartilhadas,
conhecidas como componentes SGA, que contém dados e informações de controle de uma
instância do banco de dados Oracle. A SGA é compartilhada por todos os processos de
servidor e de background. Alguns exemplos de dados armazenados na SGA são blocos de
dados em cache e as áreas SQL compartilhadas.
• As PGAs (Program Global Area) são regiões da memória que contêm dados e informações
de controle referentes a um processo de servidor ou de segundo plano. Uma PGA é uma
memória não compartilhada criada pelo Oracle Database quando um processo de servidor
ou de background é iniciado. O acesso à PGA é exclusivo do processo de servidor. Cada
processo de servidor e de background tem sua própria PGA.

Oracle Database: Fundamentos de SQL II I - 8


Estruturas de memória Oracle (continuação)
A SGA é a área da memória que contém dados e informações de controle da instância. Ela inclui
as seguintes estruturas de dados:
• Buffer cache do banco de dados: Armazena no cache blocos de dados recuperados do
banco de dados
• Buffer de redo log: Armazena no cache informações de redo (usadas na recuperação da
instância) até que elas possam ser gravadas nos arquivos físicos de redo log armazenados no
disco
• Shared pool: Armazena no cache várias estruturas que podem ser compartilhadas pelos
usuários
• Large pool: É uma área opcional que aloca parte considerável da memória para alguns
processos grandes, como operações de backup e recuperação Oracle e processos de
entrada/saída (E/S) do servidor

Oracle Internal & Oracle Academy Use Only


• Java pool: Usado para armazenar todos os códigos Java específicos da sessão e dados da
JVM (Java Virtual Machine)
• Streams pool: É usado pelo Oracle Streams para armazenar as informações necessárias
para captura e aplicação
Quando você iniciar a instância usando o Enterprise Manager ou o SQL*Plus, será exibido o
volume de memória alocado para a SGA.
A infraestrutura dinâmica da SGA permite alterar o tamanho do buffer cache do banco de dados,
do shared pool, do large pool, do Java pool e do Streams pool sem fazer shutdown da instância.
O Oracle Database usa parâmetros de inicialização para criar e configurar estruturas de
memória. Por exemplo, o parâmetro SGA_TARGET especifica o tamanho total dos componentes
SGA. Se você definir o parâmetro SGA_TARGET como 0, o Gerenciamento Automático da
Memória Compartilhada será desativado.

Oracle Database: Fundamentos de SQL II I - 9


Arquitetura de Processo Estruturas de BD
- Memória
Æ Participante
• Processo do usuário: - Armazenamento

– É iniciado quando um usuário do banco de dados ou


processo de batch se conecta ao banco de dados Oracle
• Processos do banco de dados:
– Processo de servidor: Conecta-se à instância do Oracle
e é iniciado quando um usuário estabelece uma sessão
– Processos de background: São iniciados quando uma
instância do Oracle inicia

Oracle Internal & Oracle Academy Use Only


Instância
SGA

PGA
Processos de background
Processo Processo
do usuário do servidor DBWn CKPT LGWR SMON PMON
ARCn RECO Outros

Copyright © 2011, Oracle. Todos os direitos reservados.

Arquitetura de Processo
Os processos em um servidor de banco de dados Oracle podem ser categorizados em dois grupos
principais:
• Os processos de usuário que executam a aplicação ou o código da ferramenta Oracle
• Os processos do banco de dados Oracle que executam o código do servidor de banco de
dados Oracle. Esses incluem os processos de servidor e os processos de segundo plano.
Quando um usuário executa um programa aplicativo ou uma ferramenta Oracle (por exemplo,
SQL*Plus), o banco de dados Oracle cria um processo de usuário para executar o aplicativo do
usuário. O banco de dados Oracle também cria um processo de servidor para executar os
comandos emitidos pelo processo de usuário. Além disso, o servidor Oracle também cria um
conjunto de processos de segundo plano para uma instância, que interagem entre si e com o
sistema operacional, no intuito de gerenciar estruturas da memória e executar assincronamente
E/S para fins de gravação de dados em disco e execução de outras tarefas necessárias.
A estrutura dos processos varia nas diferentes configurações do Oracle Database, dependendo do
sistema operacional e das opções selecionadas para o banco de dados. O código dos usuários
conectados pode ser configurado como um servidor dedicado ou um servidor compartilhado.
• Com o servidor dedicado, para cada usuário, o aplicativo do banco de dados é executado
pelo processo do usuário, que é servido pelo processo de servidor dedicado que executa o
código do servidor do banco de dados Oracle.
• Um servidor compartilhado elimina a necessidade de um processo de servidor dedicado
para cada conexão. Um dispatcher encaminha várias solicitações de sessão de rede
recebidas a um pool de processos de servidor compartilhado. Um processo de servidor
compartilhado atende a qualquer solicitação do cliente.
Oracle Database: Fundamentos de SQL II I - 10
Arquitetura de processo (continuação)
Processos de Servidor
O Oracle Database cria processos de servidor para atender às solicitações dos processos de
usuário conectados à instância. Em algumas situações, quando o aplicativo e o banco de dados
Oracle operam no mesmo computador, é possível combinar o processo de usuário e o processo
de servidor correspondente em um único processo, a fim de reduzir o overhead do sistema.
Contudo, quando eles operarem em computadores diferentes, um processo de usuário sempre se
comunicará com o banco de dados Oracle usando um processo de servidor separado.
Os processos de servidor criados em nome de cada aplicação do usuário podem executar uma ou
mais das seguintes ações:
• Analisar por parse e executar instruções SQL por meio do aplicativo.
• Ler os blocos de dados necessários dos arquivos de dados em disco, nos buffers de banco de
dados compartilhados da SGA, caso os blocos ainda não estejam presentes na SGA.

Oracle Internal & Oracle Academy Use Only


• Retornar os resultados de modo que o aplicativo possa processar as informações.
Processos de Background
Para maximizar o desempenho e acomodar muitos usuários, o sistema do banco de dados Oracle
multiprocessos usa alguns processos de banco de dados adicionais denominados processos de
segundo plano. Uma instância do Oracle Database pode ter vários processos de background.
Os processos de segundo plano a seguir são necessários para uma inicialização bem-sucedida da
instância do banco de dados:
• DBW (Database writer n)
• LGWR (Log Writer)
• CKPT (Checkpoint)
• Sistema monitor (SMON)
• PMON (Process monitor):
Os processos de segundo plano a seguir são alguns exemplos de processos opcionais que podem
ser iniciados, se necessário:
• Recoverer (RECO)
• Fila de jobs
• Archiver (ARCn)
• Queue Monitor (QMNn)
Outros processos de background podem ser encontrados em configurações mais avançadas,
como o RAC (Real Application Clusters). Consulte a view V$BGPROCESS para obter mais
informações sobre os processos de segundo plano.
Em muitos sistemas operacionais, os processos de segundo plano são criados automaticamente
quando uma instância é iniciada.

Oracle Database: Fundamentos de SQL II I - 11


Processo database writer

Grava os buffers modificados (sujos) no buffer cache do banco


de dados para o disco:
• Assincronamente, ao executar outro processamento
• Periodicamente, para avançar o checkpoint

Oracle Internal & Oracle Academy Use Only


DBWn

Buffer cache do Processo Arquivos de


banco de dados database writer dados

Copyright © 2011, Oracle. Todos os direitos reservados.

Processo database writer


O processo database writer (DBWn) grava os conteúdos dos buffers em arquivos de dados. Os
processos DBWn são responsáveis por gravar em disco os buffers modificados (sujos) no buffer
cache do banco de dados: Embora um processo database writer (DBW0) seja adequado para a
maioria dos sistemas, é possível configurar processos adicionais (DBW1 a DBW9 e DBWa
DBWj) para melhorar o desempenho da gravação se o sistema modificar dados intensamente.
Esses processos DBWn adicionais não são úteis em sistemas uniprocessador.
Quando um buffer no buffer cache do banco de dados é modificado, ele é marcado como "sujo"
e adicionado à lista LRUW de buffers sujos mantida na ordem SCN (system change number),
adequando-se à ordem de redo correspondente a tais buffers modificados que é gravada nos redo
logs. Quando o número de buffers disponíveis no buffer cache ficar abaixo de um limite interno,
dificultando para os processos do servidor a obtenção dos buffers disponíveis, o DBWn grava os
buffers nos arquivos de dados na ordem em que foram modificados, seguindo a ordem da lista
LRUW.

Oracle Database: Fundamentos de SQL II I - 12


Processo log writer
• Grava o buffer de redo log em um arquivo de redo log no
disco
• O LGWR grava:
– Um processo que faz commit de uma transação
– Quando um terço do buffer de redo log está cheio
– Antes de um processo DBWn gravar em disco os buffers
modificados

Oracle Internal & Oracle Academy Use Only


LGWR

Buffer de redo Processo log Arquivos de redo


log writer log

Copyright © 2011, Oracle. Todos os direitos reservados.

Processo log writer


O processo log writer (LGWR) é responsável pelo gerenciamento do buffer de redo log por
gravar as entradas de buffer para um arquivo de redo log no disco. O LGWR grava todas as
entradas de redo copiadas para o buffer desde a última gravação.
O buffer de redo log é circular. Quando o LGWR grava as entradas do buffer de redo log em um
arquivo de redo log, os processos do servidor podem copiar novas entradas sobrescrevendo as
entradas no buffer que já foram gravadas em disco. A gravação do LGWR é rápida o suficiente
para assegurar que sempre haja espaço disponível no buffer para novas entradas, mesmo quando
o acesso ao redo log estiver intenso.
O LGWR grava uma parte contígua do buffer no disco. O LGWR grava:
• Quando um processo de usuário efetuar commit de uma transação
• Quando um terço do buffer de redo log está cheio
• Antes de um processo DBWn gravar em disco os buffers modificados, se necessário

Oracle Database: Fundamentos de SQL II I - 13


Processo checkpoint

Registra as informações de checkpoint:


• O arquivo de controle
• Em cada cabeçalho de arquivo de dados

Oracle Internal & Oracle Academy Use Only


Arquivo de
CKPT controle

Processo
checkpoint

Arquivos
de dados

Copyright © 2011, Oracle. Todos os direitos reservados.

Processo checkpoint
Um checkpoint é uma estrutura de dados que define um SCN no thread de redo de um banco de
dados. Os checkpoints são registrados no arquivo de controle e em cada cabeçalho de arquivo de
dados e são essenciais para recuperação.
Na ocorrência de um checkpoint, o banco de dados Oracle deve atualizar os cabeçalhos de todos
os arquivos de dados para registrar os detalhes do checkpoint. Isso é feito pelo processo CKPT.
O processo CKPT não grava blocos no disco; o DBWn sempre executa esse trabalho. Os SCNs
registrados nos cabeçalhos de arquivo garantem que todas as alterações feitas nos blocos de
banco de dados antes desse SCN sejam gravadas em disco.
Os checkpoints DBWR estatísticos exibidos pelo monitor SYSTEM_STATISTICS no Oracle
Enterprise Manager indicam o número de solicitações de checkpoint concluídas.

Oracle Database: Fundamentos de SQL II I - 14


Processo monitor do sistema

• Executa a recuperação na inicialização da instância


• Limpa segmentos temporários não utilizados

Oracle Internal & Oracle Academy Use Only


SMON Instância

Processo
monitor do
sistema

Segmento
temporário

Copyright © 2011, Oracle. Todos os direitos reservados.

Processo monitor do sistema


Esse processo executa a recuperação, se necessário, na inicialização da instância. O SMON
também é responsável pela limpeza de segmentos temporários que não sejam mais utilizados. Se
alguma transação encerrada for ignorada durante a recuperação da instância devido a erros de
leitura de arquivo ou de desconexão, o SMON a recuperará quando o tablespace ou o arquivo
ficar on-line novamente. O SMON verifica constantemente se for necessário. Outros processos
poderão chamar o SMON se detectarem alguma necessidade.

Oracle Database: Fundamentos de SQL II I - 15


Processo do monitor do processo

• Executa a recuperação do processo quando um processo


de usuário falha:
– Limpa o buffer cache do banco de dados
– Libera os recursos usados pelo processo do usuário
• Monitora o timeout para sessão inativa
• Registra dinamicamente serviços de banco de dados com

Oracle Internal & Oracle Academy Use Only


os listeners

PMON Usuário
Processo de
Processo do usuário com
monitor do falha
Buffer cache do
processo
banco de dados

Copyright © 2011, Oracle. Todos os direitos reservados.

Processo do monitor do processo


Este processo executa a recuperação de processo quando um processo de usuário falha. O
PMON é responsável pela limpeza do buffer cache do banco de dados e pela liberação dos
recursos que o processo de usuário estava usando. Por exemplo, ele redefine o status da tabela de
transações ativas, libera os bloqueios e remove o ID do processo da lista de processos ativos.
O PMON verifica periodicamente o status do dispatcher e dos processos do servidor e reinicia
todos que estiverem parados (exceto os que foram encerrados intencionalmente pelo banco de
dados Oracle). O PMON também registra informações sobre os processos da instância e do
dispatcher com o listener da rede.
Como o SMON, o PMON faz uma verificação periódica das necessidades e pode ser chamado
por qualquer outro processo que detecte alguma precisão.

Oracle Database: Fundamentos de SQL II I - 16


Arquitetura de armazenamento
do banco de dados Oracle Estruturas de BD
- Memória
- Processo
Æ Armazenamento

Database

Oracle Internal & Oracle Academy Use Only


Arquivos Arquivos
Arquivos de de redo log
de dados controle on-line

Arquivo de parâmetros
Arquivo de senha
Arquivos de rede
Arquivos de alerta Arquivos de backup Arquivos de log arquivados
e de rastreamento

Copyright © 2011, Oracle. Todos os direitos reservados.

Arquitetura de armazenamento do banco de dados Oracle


Os arquivos que constituem um banco de dados Oracle são organizados da seguinte forma:
• Arquivos de controle: Contêm dados sobre o próprio banco de dados (isto é, informações
sobre a sua estrutura física). Eles são fundamentais para o banco de dados. Sem eles, não é
possível abrir os arquivos de dados para acessar os dados do banco de dados.
• Arquivos de dados: Contêm os dados do usuário ou da aplicação do banco de dados, além
dos metadados e do dicionário de dados
• Arquivos de redo log on-line: Permitem a recuperação de uma instância do banco de
dados. Se o servidor do banco de dados travar sem perder arquivos de dados, a instância
poderá recuperar o banco de dados com as informações desses arquivos.
Estes outros arquivos são importantes para a execução bem-sucedida do banco de dados:
• Arquivos de backup: Usados para a recuperação do bancos de dados. Geralmente,
restaura-se um arquivo de backup quando uma falha de mídia ou um erro do usuário
danifica ou deleta o arquivo original.
• Arquivos de log arquivados: Contêm um histórico contínuo das alterações de dados (redo)
geradas pela instância. Usando esses arquivos e um backup do banco de dados, é possível
recuperar um arquivo de dados perdido. Isto é, os logs de arquivamento permitem a
recuperação de arquivos de dados restaurados.

Oracle Database: Fundamentos de SQL II I - 17


Arquitetura de armazenamento do banco de dados Oracle (continuação)
• Arquivo de parâmetros: Usado para definir o modo de configuração da instância durante
sua inicialização.
• Arquivo de senha: Permite que sysdba/sysoper/sysasm se conecte remotamente ao
banco de dados e execute tarefas administrativas
• Arquivos de rede: Usados para iniciar o listener do banco de dados e armazenar as
informações necessárias das conexões de usuário
• Arquivos de rastreamento: Todo processo do servidor e de segundo plano pode gravar em
um arquivo de rastreamento associado. Quando um processo detecta um erro interno, ele
descarrega as informações sobre o erro no respectivo arquivo de rastreamento. Algumas das
informações gravadas em um arquivo de rastreamento são destinadas ao administrador do
banco de dados, enquanto outras destinam-se ao Oracle Support Services.
• Arquivos de log de alerta: São entradas de rastreamento especiais. O log de alerta de um

Oracle Internal & Oracle Academy Use Only


banco de dados consiste em um log cronológico de mensagens e erros. Cada instância tem
um arquivo de log de alerta. A Oracle recomenda que você verifique o log de alerta
periodicamente.

Oracle Database: Fundamentos de SQL II I - 18


Estruturas Lógicas e Físicas do Banco de Dados

Lógicos Arquitetura

Database

Schema Tablespace Backups

Oracle Internal & Oracle Academy Use Only


Segmento

Extensão

Bloco de dados Bloco do


Oracle sistema
operacional

Copyright © 2011, Oracle. Todos os direitos reservados.

Estruturas Lógicas e Físicas do Banco de Dados


Um banco de dados Oracle tem estruturas de armazenamento lógicas e físicas.
Tablespaces
Um banco de dados é dividido em unidades lógicas de armazenamento denominadas tablespaces
que agrupam estruturas lógicas relacionadas. Por exemplo, tablespaces geralmente agrupam
todos os objetos de uma aplicação para simplificar algumas operações administrativas. Você
pode ter um tablespace para os dados da aplicação e outro para os índices da aplicação.
Bancos de dados, Tablespaces e Arquivos de Dados
O relacionamento entre bancos de dados, tablespaces e arquivos de dados é ilustrado no slide.
Cada banco de dados está dividido logicamente em um ou mais tablespaces. Um ou mais
arquivos de dados são criados de forma explícita para cada tablespace a fim de armazenar
fisicamente os dados de todas as estruturas lógicas em um tablespace. No caso de um tablespace
TEMPORARY, em vez de um arquivo de dados, o tablespace terá um arquivo temporário.

Oracle Database: Fundamentos de SQL II I - 19


Estruturas Lógicas e Físicas do Banco de Dados (continuação)
Esquemas
Um esquema é uma coleção de objetos de banco de dados pertencentes a um usuário de banco
de dados. Os objetos de um esquema são as estruturas lógicas que fazem referência direta aos
dados do banco de dados. Esses objetos incluem estruturas como tabelas, views, sinônimos,
seqüências, procedures armazenados, índices, clusters e links de banco de dados. Em geral, os
objetos do esquema incluem tudo que a aplicação cria no banco de dados.
Blocos de Dados
No nível mais fino de granularidade, os dados de um banco de dados Oracle são armazenados
em blocos de dados. Um bloco de dados corresponde a um número específico de bytes de espaço
no banco de dados físico no disco. Um tamanho de bloco de dados é especificado para cada
tablespace quando ele é criado. Um banco de dados usa e aloca o espaço livre em blocos de
dados do Oracle.

Oracle Internal & Oracle Academy Use Only


Extensões
O próximo nível de espaço no banco de dados lógico é chamado de extensão. Uma extensão é
um número específico de blocos de dados contíguos (obtidos de uma única alocação) que são
usados para armazenar um tipo específico de informação.
Segmentos
O nível de armazenamento do banco de dados lógico acima de uma extensão é chamado de
segmento. Um segmento é um conjunto de extensões alocadas para uma estrutura lógica
específica. Por exemplo, os tipos diferentes de segmentos incluem:
• Segmentos de dados: Cada tabela organizada não indexada e não clusterizada tem um
segmento de dados, exceto as tabelas externas, as tabelas temporárias globais e as tabelas
particionadas, que têm um ou mais segmentos. Todos os dados da tabela são armazenados
nas extensões de seu segmento de dados. Em uma tabela particionada, cada partição tem um
segmento de dados. Cada cluster tem um segmento de dados. Os dados de cada tabela no
cluster são armazenados no segmento de dados do cluster.
• Segmentos de índice: Cada índice tem um segmento de índice que armazena todos os seus
dados. Em um índice particionado, cada partição tem um segmento de índice.
• Segmentos de undo: Um tablespace UNDO é criado por instância de banco de dados que
contém numerosos segmentos de undo para armazenar temporariamente informações de
undo. As informações de um segmento de undo são usadas para gerar informações de banco
de dados com leitura consistente e, durante a recuperação do banco de dados, para fazer
rollback de transações sem commit para usuários.
• Segmentos temporários:Os segmentos temporários são criados pelo banco de dados Oracle
quando uma instrução SQL precisar de uma área de trabalho temporária para concluir a
execução. Quando a execução da instrução é concluída, as extensões do segmento
temporário são retornadas à instância para uso futuro. Especifique um tablespace
temporário default para cada usuário ou um tablespace temporário default usado em todo o
banco de dados.
O banco de dados Oracle aloca espaço dinamicamente. Quando as extensões existentes de um
segmento ficam cheias, são adicionadas outras extensões. Como as extensões são alocadas
conforme necessário, as extensões de um segmento podem ou não ser contíguas no disco.

Oracle Database: Fundamentos de SQL II I - 20


Processando uma instrução SQL

• Conecte-se a uma instância usando:


– O processo do usuário
– O processo do servidor
• Os componentes do servidor Oracle que são utilizados
dependem do tipo de instrução SQL:
– Consultas que retornam linhas.

Oracle Internal & Oracle Academy Use Only


– Instruções DML (Data manipulation language) que registram
alterações.
– Commit que assegura a recuperação da transação.
• Alguns componentes do Oracle Server não participam no
processamento da instrução SQL.

Copyright © 2011, Oracle. Todos os direitos reservados.

Processando uma instrução SQL


Nem todos os componentes de uma instância Oracle são usados para processar instruções SQL.
Os processos de usuário e de servidor são usados para conectar um usuário a uma instância
Oracle. Esses processos não são parte da instância Oracle, mas são necessários para processar
uma instrução SQL.
Alguns processos de segundo plano, estruturas SGA e arquivos de banco de dados são usados
para processar instruções SQL. Dependendo do tipo de instrução SQL, diferentes componentes
são usados:
• Consultas requerem processamento adicional para retornar linhas para o usuário.
• Instruções DML requerem processamento adicional para registrar as alterações feitas nos
dados.
• O processamento do commit assegura que os dados modificados em uma transação possam
ser recuperados.
Alguns processos de segundo plano necessários não participam diretamente no processamento
de uma instrução SQL, mas são usados para melhorar o desempenho e recuperar o banco de
dados. Por exemplo, o processo de segundo plano Archiver opcional, ARCn, é usado para
assegurar que um banco de dados de produção possa ser recuperado.

Oracle Database: Fundamentos de SQL II I - 21


Processando uma consulta

• Efetuar parse:
– Procure uma instrução idêntica.
– Verifique a sintaxe, os nomes de objeto e os privilégios.
– Bloqueie os objetos usados durante a parse.
– Crie e armazene o plano de execução.
• Executar: Identifique as linhas selecionadas.

Oracle Internal & Oracle Academy Use Only


• Extrair: Retorna as linhas ao processo do usuário.

Copyright © 2011, Oracle. Todos os direitos reservados.

Processando uma consulta


As consultas são diferentes de outros tipos de instruções SQL porque, quando bem-sucedidas,
retornam dados como resultados. Outras instruções simplificam o êxito ou a falha do retorno,
considerando que uma consulta pode retornar uma ou milhares de linhas.
Há três estágios principais no processamento de uma consulta:
• Efetuar parse
• Executar
• Extrair
Durante o estágio efetuar parse, a instrução SQL passa do processo de usuário ao processo de
servidor e uma representação analisada da instrução SQL é carregada em uma área SQL
compartilhada.
Neste estágio, o processo do servidor executa as seguintes funções:
• Procura uma cópia existente da instrução SQL no shared pool
• Valida a instrução SQL verificando sua sintaxe
• Executa pesquisas no dicionário de dados para validar definições de tabela e de coluna
O estágio Executar executa a instrução usando a melhor abordagem do otimizador e Extrair
retorna as linhas para o usuário.

Oracle Database: Fundamentos de SQL II I - 22


Shared pool

• O cache de biblioteca contém o texto da instrução SQL,


o código analisado por parse e o plano de execução.
• O cache de dicionário de dados contém tabela, coluna e
outras definições e privilégios de objeto.
• O shared pool é dimensionado por SHARED_POOL_SIZE.

Shared pool

Oracle Internal & Oracle Academy Use Only


Biblioteca
ASM

Cache do
dicionário
de dados

Copyright © 2011, Oracle. Todos os direitos reservados.

Shared pool
Durante o estágio Efetuar Parse, o processo do servidor usa a área na SGA conhecida como
shared pool para compilar a instrução. O shared pool tem dois componentes primários:
• Cache de biblioteca
• Cache de dicionário de dados
Cache de biblioteca
O cache de biblioteca armazena informações sobre as instruções SQL usadas mais recentemente
em uma estrutura de memória conhecida como uma área SQL compartilhada. A área SQL
compartilhada contém:
• O texto da instrução SQL
• A árvore de parse, que é uma versão compilada da instrução
• O plano de execução, com as etapas envolvidas na execução da instrução
O otimizador é a função no Oracle Server que determina o plano de execução ideal.
Se uma instrução SQL for reexecutada e uma área SQL compartilhada já contiver o plano de
execução da instrução, o processo do servidor não precisará efetuar o parse da instrução. O
cache de biblioteca melhora o desempenho dos aplicativos que reutilizam instruções SQL,
reduzindo o tempo de parse e os requisitos de memória. Se a instrução SQL não for reutilizada,
ela será, eventualmente, eliminada do cache de biblioteca.

Oracle Database: Fundamentos de SQL II I - 23


Shared pool (continuação)
Cache de dicionário de dados
O cache de dicionário de dados, também conhecido como cache de dicionário ou cache de linha,
é uma coleção das definições usadas mais recentemente no banco de dados. Inclui informações
sobre arquivos do banco de dados, tabelas, índices, colunas, usuários, privilégios e outros objetos
do banco de dados.
Durante a fase efetuar parse, o processo do servidor procura as informações no cache de
dicionário para resolver os nomes de objetos especificados na instrução SQL e para validar os
privilégios de acesso. Se necessário, o processo de servidor inicia o carregamento dessas
informações nos arquivos de dados.
Dimensionando o shared pool
O tamanho do shared pool é especificado pelo parâmetro de inicialização

Oracle Internal & Oracle Academy Use Only


SHARED_POOL_SIZE.

Oracle Database: Fundamentos de SQL II I - 24


Buffer cache do banco de dados

• O buffer cache do banco de dados armazena os blocos


utilizados mais recentemente.
• O tamanho de um buffer te como base DB_BLOCK_SIZE.
• O número de buffers é definido por DB_BLOCK_BUFFERS.

Buffer cache

Oracle Internal & Oracle Academy Use Only


do banco
de dados

Copyright © 2011, Oracle. Todos os direitos reservados.

Buffer cache do banco de dados


Quando uma consulta é processada, o processo de servidor procura no buffer cache de banco de
dados quaisquer blocos de que necessitar. Se o bloco não for encontrado no cache, o processo de
servidor lê o bloco no arquivo de dados e coloca uma cópia no buffer cache. Como é possível
que solicitações subsequentes para o mesmo bloco localizem o bloco na memória, talvez as
solicitações não necessitem de leituras físicas. O Oracle Server usa o algoritmo usado mais
recentemente para eliminar buffers que não tenham sido acessados recentemente a fim de criar
espaço para os novos blocos no buffer cache.
Dimensionamento do buffer cache do banco de dados
O tamanho de cada buffer no buffer cache é igual ao tamanho de um bloco Oracle e é
especificado pelo parâmetro DB_BLOCK_SIZE. O número de buffers é igual ao valor do
parâmetro DB_BLOCK_BUFFERS.

Oracle Database: Fundamentos de SQL II I - 25


PGA (Program Global Area)

• Não compartilhada
• Gravável apenas por processo de servidor
• Contém:
– Área de classificação
– Informações da sessão
– Estado do cursor

Oracle Internal & Oracle Academy Use Only


– Espaço da pilha

Processo
do servidor
PGA

Copyright © 2011, Oracle. Todos os direitos reservados.

PGA (Program Global Area)


A PGA (Program Global Area) é uma região da memória que contém dados e informações de
controle referentes a um processo do servidor. É uma memória não-compartilhada criada pela
Oracle quando um processo de servidor é iniciado. É acessível apenas para processo de servidor
e pode ser lida e gravada apenas por código do Oracle Server autorizado. A memória PGA
alocada por cada processo de servidor associado a uma instância Oracle é chamada de memória
PGA agregada alocada pela instância.
Em uma configuração de servidor dedicada, a PGA do servidor inclui os seguintes componentes:
• Área de classificação: Usada para quaisquer classificações que possam ser necessárias para
processar a instrução SQL
• Informações da sessão: Inclui privilégios do usuário e estatísticas de desempenho para a
sessão
• Estado do cursor: Indica o estágio no processamento das instruções SQL atualmente
utilizadas pela sessão
• Espaço da pilha: Contém outras variáveis de sessão
A PGA é alocada quando um processo é criado e desalocada quando ele é terminado.

Oracle Database: Fundamentos de SQL II I - 26


Processando uma instrução DML

Processo SGA Shared pool


do usuário Cache de
buffer do Buffer de
banco redo log
de dados
UPDATE
employees ...
4 1 2 3

Oracle Internal & Oracle Academy Use Only


Processo
do servidor
Arq. de Arq. de Arqs.
dados controle arquivados

Database

Copyright © 2011, Oracle. Todos os direitos reservados.

Processando uma instrução DML


Uma instrução DML (data manipulation language) requer apenas duas fases de processamento:
• Efetuar Parse é a mesma usada para o processamento de uma consulta.
• Executar requer processamento adicional para fazer alterações de dados.
DML - Fase Executar
Para executar uma instrução DML:
• Se os blocos de dados e de rollback ainda não estiverem no buffer cache, o processo de
servidor fará a leitura deles a partir dos arquivos de dados para o buffer cache
• O processo de servidor coloca bloqueios nas linhas que não devem ser modificadas
• No buffer de redo log, o processo do servidor registra as alterações a serem feitas nos
blocos de dados e de rollback
• As alterações no bloco de rollback registram os valores dos dados antes de eles serem
modificados. O bloco de rollback é usado para armazenar a "imagem anterior" dos dados,
de modo que as instruções DML possam ser submetidas a rollback.
• As alterações do bloco de dados registram os novos valores dos dados

Oracle Database: Fundamentos de SQL II I - 27


Processando uma instrução DML (continuação)
O processo de servidor registra a "imagem anterior" no bloco de rollback e atualiza o bloco de
dados. Essas duas alterações são feitas no buffer cache do banco de dados. Quaisquer blocos
alterados no buffer cache são marcados como buffers sujos (ou seja, buffers não idênticos aos
blocos correspondentes no disco).
O processamento de um comando DELETE ou INSERT usa etapas similares. A “imagem
anterior” a um DELETE contém os valores das colunas na linha deletada e a "imagem anterior" a
um INSERT contém as informações de localização das linhas.
Como as alterações feitas nos blocos são registradas apenas nas estruturas de memória e não são
gravadas imediatamente no disco, é possível que uma falha do computador que provoque a
perda da SGA também cause a perda de tais alterações.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II I - 28


Buffer de redo log

• Tem o tamanho definido por LOG_BUFFER


• Registra as alterações pela instância
• Usado sequencialmente
• É um buffer circular

Oracle Internal & Oracle Academy Use Only


Buffer de redo log

Copyright © 2011, Oracle. Todos os direitos reservados.

Buffer de redo log


O processo do servidor registra a maioria das alterações feitas nos blocos do arquivo de dados no
buffer de redo log, que é uma parte da SGA. Tal buffer apresenta as seguintes características:
• Seu tamanho em bytes é definido pelo parâmetro LOG_BUFFER.
• Registra o bloco alterado, o local da alteração e o novo valor em uma entrada de redo. Uma
entrada de redo não faz nenhuma distinção entre os tipos de bloco alterados; apenas registra
que bytes foram alterados no bloco.
• O buffer de redo log é usado sequencialmente e as alterações feitas por uma transação
podem ser intercaladas com alterações feitas por outras transações.
• É um buffer circular que é reutilizado depois de estar cheio, mas somente depois que todas
as entradas antigas de redo forem registradas nos arquivos de redo log.

Oracle Database: Fundamentos de SQL II I - 29


Segmento de rollback

Imagem antiga

Segmento de
rollback Nova imagem

Oracle Internal & Oracle Academy Use Only


Tabela

Instrução DML

Copyright © 2011, Oracle. Todos os direitos reservados.

Segmento de rollback
Antes de fazer uma alteração, o processo de servidor salva os valores de dados antigos em um
segmento de rollback. Essa “imagem anterior” é utilizada para:
• Desfazer as alterações se a transação for submetida a rollback
• Prover consistência na leitura assegurando que outras transações não vejam alterações não
submetidas a commit que sejam realizadas pela instrução DML
• Recuperar o banco de dados para um estado consistente no caso de falhas
Os segmentos de rollback (por exemplo, tabelas e índices) existem nos arquivos de dados e os
blocos de rollback são inseridos no buffer cache do banco de dados conforme necessário. Os
segmentos de rollback são criados pelo DBA.
As alterações nos segmentos de rollback são registradas no buffer de redo log.

Oracle Database: Fundamentos de SQL II I - 30


Processamento de COMMIT

1 Instância
SGA Shared pool
Processo Cache de
do servidor buffer do Buffer de
4 banco redo log
de dados
3

Oracle Internal & Oracle Academy Use Only


DBWn LGWR

Processo Arq. de Arqs.


Arq. de 2
do usuário dados controle arquivados

Database

Copyright © 2011, Oracle. Todos os direitos reservados.

Processamento de COMMIT
O Oracle Server usa um mecanismo rápido de COMMIT, o que garante que as alterações
submetidas a commit possam ser recuperadas no caso de falha da instância.
System Change Number
Sempre que uma transação for submetida a commit, o Oracle Server designa um SCN de commit
para a transação. O SCN é incrementado sequencialmente e é exclusivo dentro do banco de
dados. O Oracle Server o utiliza como um timestamp interno para sincronizar os dados e
oferecer consistência na leitura quando os dados forem recuperados a partir dos arquivos de
dados. O uso do SCN permite que o Oracle Server execute verificações de consistência sem
depender da data e hora do sistema operacional.
Etapas no processamento de COMMITs
Quando um COMMIT for emitido, as seguintes etapas serão executadas:
1. O processo de servidor coloca um registro de commit junto com o SCN no buffer de redo
log.
2. O LGWR executa uma gravação contígua de todas as entradas do buffer de redo log até e
inclusive
o registro de commit para os arquivos de redo log. Depois desse ponto, o Oracle Server
pode garantir que as alterações não serão perdidas mesmo depois de uma falha na
instância.
Oracle Database: Fundamentos de SQL II I - 31
Processamento de COMMIT (continuação)
3. O usuário é informado que o COMMIT foi concluído.
4. O processo de servidor registra as informações para indicar que a transação foi concluída e
que os bloqueios de recursos podem ser liberados.
A descarga dos buffers sujos para os arquivos de dados é executada pelo DBW0 de modo
independente e pode ocorrer antes ou depois do commit.
Vantagens do COMMIT Rápido
O mecanismo de COMMIT rápido assegura a recuperação de dados gravando as alterações para o
buffer de redo log em vez de para os arquivos de dados. Apresenta as seguintes vantagens:
• As gravações sequenciais para os arquivos de log são mais rápidas do que as gravações para
blocos diferentes no arquivo de dados.
• Apenas as informações mínimas necessárias para registrar as alterações são gravadas nos
arquivos de log; a gravação para os arquivos de dados requer que blocos inteiros de dados

Oracle Internal & Oracle Academy Use Only


sejam gravados.
• Se várias solicitações de transações forem submetidas a commit ao mesmo tempo, a
instância executará um piggyback dos registros do redo log para uma única gravação.
• A menos que o buffer de redo log esteja particularmente cheio, é necessário apenas uma
gravação síncrona por transação. Se ocorrer um piggyback, poderá haver menos de uma
gravação síncrona por transação.
• Como o buffer de redo log pode ser descarregado antes do COMMIT, o tamanho da
transação não afeta a quantidade de tempo necessária para uma operação de COMMIT real.
Observação: O rollback de uma transação não iniciará o LGWR para gravação em disco. O
Oracle Server sempre faz rollback das alterações não submetidas a commit ao recuperar de
falhas. No caso de uma falha depois de um rollback, antes que as entradas de rollback sejam
registradas em disco, a ausência de um registro de commit será suficiente para garantir que as
alterações feitas pela transação sejam submetidas a rollback.

Oracle Database: Fundamentos de SQL II I - 32


Resumo da arquitetura do banco de dados Oracle
Instância
SMON PMON RECO Outros

SGA
Shared pool
Biblioteca
Cache de ASM
Buffer de
buffer do
redo log
banco de dados Cache do
dicion. de dados
PGA
Processo

Oracle Internal & Oracle Academy Use Only


do servidor DBWn CKPT LGWR ARCn

Arquivos
Processo de redo
do usuário Arquivos Arquivos arquivados
de controle de redo log
Arquivos
de dados Database on-line

Copyright © 2011, Oracle. Todos os direitos reservados.

Resumo da arquitetura do banco de dados Oracle


Um banco de dados Oracle é composto por uma instância e seu banco de dados associado:
• Uma instância compreende o SGA e os processos de background
- SGA: Buffer cache de banco de dados, buffer de redo log, shared pool etc.
- Processos de background: SMON, PMON, DBWn, CKPT, LGWR etc.
• Um banco de dados é composto por estruturas de armazenamento:
- Lógicas: Tablespaces, esquemas, segmentos, extensões e bloco Oracle
- Físicas: Arquivos de dados, arquivos de controle e arquivos de log
Quando um usuário acessa o banco de dados Oracle usando um aplicativo, um processo de
servidor se comunica com a instância em nome de tal processo.

Oracle Database: Fundamentos de SQL II I - 33


Oracle Internal & Oracle Academy Use Only
Exercícios e Soluções Adicionais

Oracle Internal & Oracle Academy Use Only


Índice
Exercícios Adicionais ......................................................................................................... 3
Exercícios Adicionais ..................................................................................................... 4
Exercícios Adicionais: Estudo de Caso ........................................................................ 10
Soluções dos Exercícios Adicionais ................................................................................. 13
Soluções dos Exercícios Adicionais ............................................................................. 14
Exercícios Adicionais: Soluções do Estudo de Caso.................................................... 20

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 2


Exercícios Adicionais
Os exercícios a seguir podem ser utilizados como prática adicional após a discussão
sobre instruções de DML (data manipulation language) e DDL (data definition
language) nas aulas intituladas “Gerenciando Objetos de Esquema” e “Manipulando
Conjuntos Grandes de Dados”.

Observação: Execute os scripts lab_ap_cre_special_sal.sql,


lab_ap_cre_sal_history.sql e lab_ap_cre_mgr_history.sql na
pasta labs para criar as tabelas SPECIAL_SAL, SAL_HISTORY e MGR_HISTORY.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 3


Exercícios Adicionais

1. O departamento de Recursos Humanos precisa de uma lista dos funcionários mal


pagos, o histórico salarial dos funcionários e o histórico salarial dos gerentes com
base em uma pesquisa salarial no setor. Para que isso seja feito, eles pedem que
você faça o seguinte:
Crie uma instrução para fazer o seguinte:
- Obter detalhes como o ID do funcionário, a data de contratação, o salário e o
ID do gerente de funcionários cujos IDs sejam iguais a ou maiores que 200
na tabela EMPLOYEES.
- Se o salário for inferior a US$ 5.000,00, informe detalhes como o ID e o
salário do funcionário na tabela SPECIAL_SAL.

Oracle Internal & Oracle Academy Use Only


- Insira detalhes como ID do funcionário, data de contratação e salário na
tabela SAL_HISTORY.
- Insira detalhes como ID do funcionário, ID do gerente e salário na tabela
MGR_HISTORY.
2. Consulte as tabelas SPECIAL_SAL, SAL_HISTORY e MGR_HISTORY para
verificar os registros inseridos.

SPECIAL_SAL

SAL_HISTORY

MGR_HISTORY

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 4


Exercícios Adicionais (continuação)

3. Nita, a DBA, precisa que você crie uma tabela que contenham uma restrição de
chave primária, mas ela solicita que você dê ao índice um nome diferente da
restrição. Crie a tabela LOCATIONS_NAMED_INDEX com base no seguinte
gráfico de instância de tabela. Nomeie o índice para a coluna PRIMARY KEY

Oracle Internal & Oracle Academy Use Only


Column Name Deptno Dname

Primary Key Yes


Data Type Number VARCHAR2
Length 4 30

como LOCATIONS_PK_IDX.
4. Consulte a tabela USER_INDEXES para exibir o USER_INDEXES da tabela
LOCATIONS_NAMED_INDEX.

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 5


Exercícios Adicionais (continuação)
Os exercícios a seguir podem ser utilizados como prática adicional após a discussão
sobre funções de data/horário:
Você trabalha para uma multinacional e o novo vice-presidente de operações precisa
saber os
diferentes fusos horários de todas as filiais da empresa. O novo vice-presidente
solicitou as seguintes informações:
5. Altere a sessão para definir o NLS_DATE_FORMAT como DD-MON-YYYY
HH24:MI:SS.

6.
a. Crie consultas para exibir os deslocamentos do fuso horário (TZ_OFFSET)
para os seguintes fusos horários:

Oracle Internal & Oracle Academy Use Only


- Austrália/Sydney

- Chile/Ilha da Páscoa

b. Altere a sessão para definir o valor do parâmetro TIME_ZONE no


deslocamento do fuso horário de Austrália/Sydney.
c. Exiba SYSDATE, CURRENT_DATE, CURRENT_TIMESTAMP e
LOCALTIMESTAMP para esta sessão.
Observação: O resultado poderá ser diferente com base na data em que o
comando foi executado.

d. Altere a sessão para definir o valor do parâmetro TIME_ZONE no


deslocamento do fuso horário do Chile/Ilha da Páscoa.
Observação:Os resultados da questão anterior se baseiam em outra data e, em
alguns casos, não corresponderão aos resultados reais obtidos pelos alunos.
Além disso, o deslocamento do fuso horário dos países poderá variar,
dependendo do horário de verão.

e. Exiba SYSDATE, CURRENT_DATE, CURRENT_TIMESTAMP e


LOCALTIMESTAMP para esta sessão.
Observação: Os resultados poderão variar com base na data em que o
comando for executado.

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 6


Exercícios Adicionais (continuação)

f. Altere a sessão para definir NLS_DATE_FORMAT como DD-MON-YYYY.


Observação
• Observe na questão anterior que CURRENT_DATE, CURRENT_TIMESTAMP
e LOCALTIMESTAMP diferenciam o fuso horário da sessão. Observe que
SYSDATE não diferencia o fuso horário da sessão.
• Os resultados da questão anterior se baseiam em uma data diferente e, em
alguns casos, podem não corresponder aos resultados reais obtidos pelos

Oracle Internal & Oracle Academy Use Only


alunos. Além disso, o deslocamento do fuso horário dos países poderá variar,
dependendo do horário de verão.

7. O departamento de Recursos Humanos precisa de uma lista dos funcionários que


precisam ser avaliados em janeiro. Para isso, você foi solicitado a fazer o
seguinte:
Criar uma consulta exibindo os sobrenomes, o mês da data de contratação e a data
de contratação de funcionários que foram contratados em janeiro,
independentemente do ano em que foram contratados.

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 7


Exercícios Adicionais (continuação)
Os exercícios a seguir podem ser utilizados como prática adicional após a discussão
sobre subconsultas avançadas:

8. O presidente da empresa precisa de um relatório com os três funcionários que


obtiveram mais lucro na empresa para o compartilhamento dos lucros. Você é
responsável por fornecer uma lista ao presidente da empresa. Crie uma consulta
para exibir os três funcionários que obtiveram o maior lucro na tabela
EMPLOYEES. Inclua os sobrenomes e os salários.

Oracle Internal & Oracle Academy Use Only


9. Os benefícios para o estado da Califórnia sofreram mudanças com base em uma
lei local. Portanto, o representante de benefícios solicitou que você compile uma
lista de pessoas que foram afetadas.
Crie uma consulta para exibir o ID e os sobrenomes dos funcionários que
trabalham no estado da Califórnia.
Dica: Use subconsultas escalares.

10. Nita, a DBA, quer remover informações antigas do banco de dados. Um dos itens
que ela considera desnecessários é o registro de antigos funcionários. Ela pede
que você faça o seguinte:
Crie uma consulta para deletar a linha JOB_HISTORY mais antiga de um
funcionário procurando na tabela JOB_HISTORY o item MIN(START_DATE) do
funcionário. Delete somente os registros desses funcionários que alteraram pelo
menos dois cargos.
Dica: Utilize um comando DELETE correlacionado.

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 8


Exercícios Adicionais (continuação)

11. O vice-presidente de Recursos Humanos precisa dos registros completos dos


funcionários para o seu discurso no banquete anual de reconhecimento aos
funcionários. Em uma rápida ligação, o vice-presidente pede que você pare de
seguir as ordens da DBA.

Faça o rollback da transação.

12. A crise econômica está forçando a gerência a tomar medidas para reduzir os
custos. O presidente da empresa quer analisar os salários mais altos da empresa.
Você é responsável por fornecer uma lista ao presidente da empresa com base nas
seguintes especificações:

Oracle Internal & Oracle Academy Use Only


Crie uma consulta para exibir os IDs de cargos cujo salário máximo está acima da
metade do salário máximo da empresa. Use a cláusula WITH para criar essa
consulta. A consulta deve ter o nome MAX_SAL_CALC.

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 9


Exercícios Adicionais: Estudo de Caso
Neste estudo de caso do curso Fundamentos de SQL I, você criou um conjunto de tabelas
de banco de dados para uma aplicação de vídeo. Além disso, você inseriu, atualizou e
deletou registros em um banco de dados de uma videolocadora e gerou um relatório.

Veja, a seguir, um diagrama das tabelas e colunas que você criou para a aplicação de
vídeo:

Oracle Internal & Oracle Academy Use Only


Observação: Primeiro, execute o script dropvid.sql na pasta labs para remover
tabelas que já existem. Em seguida, execute o script buildvid.sql na pasta labs
para criar e preencher as tabelas.

1. Verifique se a tabela foi criada corretamente executando um relatório para


mostrar a lista de tabelas e suas definições de colunas.

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 10


Exercícios Adicionais: Estudo de Caso (continuação)

Oracle Internal & Oracle Academy Use Only


2. Verifique a existência das sequências MEMBER_ID_SEQ e TITLE_ID_SEQ no
dicionário de dados.

3. Você deseja criar alguns usuários que tenham acesso somente aos seus próprios
aluguéis. Crie uma usuária chamada Carmen e conceda a ela o privilégio de
selecionar opções da tabela RENTAL.
Observação: Certifique-se de adicionar o prefixo da sua conta do banco de dados
ao nome do usuário. Por exemplo, se você for o usuário oraxx, crie um usuário
chamado oraxx_Carmen.

4. Adicione uma coluna de preço (número 4,2) à tabela TITLE para armazenar o
valor do aluguel do título.

5. Adicione uma tabela CATEGORY para armazenar CATEGORY_ID e


CATEGORY_DESCRIPTION. A tabela tem uma chave estrangeira com a coluna
CATEGORY na tabela TITLE.

6. Selecione todas as tabelas no dicionário de dados.

7. Não será mais necessário armazenar reservas. Você pode remover a tabela.

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 11


Exercícios Adicionais: Estudo de Caso (continuação)
8. Crie uma tabela RENTAL_HISTORY para armazenar os detalhes de aluguel por
sócio nos últimos seis meses. (Dica:Você pode copiar a tabela RENTAL.)

9. Mostre uma lista dos 10 títulos mais alugados nos últimos meses agrupados por
categoria.

Oracle Internal & Oracle Academy Use Only


10. Você pode calcular a multa por atraso (preço da diária do título) se o sócio
devolver o vídeo com seis dias de atraso.

11. Mostre uma lista dos sócios que já alugaram duas ou mais vezes.

12. Mostre uma lista dos títulos com status de alugado.

13. Mostre uma lista dos sócios que têm “99” no número do telefone.

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 12


Soluções dos Exercícios Adicionais

Os exercícios a seguir podem ser utilizados como prática adicional após a discussão
sobre instruções de DML (data manipulation language) e DDL (data definition
language) nas aulas intituladas “Gerenciando Gerenciando... e Manipulando... Please
check the Styke Guide: 4.2 Títulos de tópicos do sistema de ajuda e da documentação
Observação: Execute os scripts lab_ap_cre_special_sal.sql,
lab_ap_cre_sal_history.sql e lab_ap_cre_mgr_history.sql na
pasta labs para criar as tabelas SPECIAL_SAL, SAL_HISTORY e MGR_HISTORY
.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 13


Soluções dos Exercícios Adicionais
1. O departamento de Recursos Humanos precisa de uma lista dos funcionários mal
pagos, o histórico salarial dos funcionários e o histórico salarial dos gerentes com
base em uma pesquisa salarial no setor. Para que isso seja feito, eles pedem que
você faça o seguinte:
Crie uma instrução para fazer o seguinte:
- Obter detalhes como o ID do funcionário, a data de contratação, o salário e o
ID do gerente de funcionários cujos IDs sejam iguais a ou maiores que 200
na tabela EMPLOYEES.
- Se o salário for inferior a US$ 5.000,00, informe detalhes como o ID e o
salário do funcionário na tabela SPECIAL_SAL.
- Insira detalhes como ID do funcionário, data de contratação e salário na

Oracle Internal & Oracle Academy Use Only


tabela SAL_HISTORY.
- Insira detalhes como ID do funcionário, ID do gerente e salário na tabela
MGR_HISTORY.

INSERT ALL
WHEN SAL < 5000 THEN
INTO special_sal VALUES (EMPID, SAL)
ELSE
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID, hire_date HIREDATE,
salary SAL, manager_id MGR
FROM employees
WHERE employee_id >=200;

2. Consulte as tabelas SPECIAL_SAL, SAL_HISTORY e MGR_HISTORY para


verificar os registros inseridos.

SELECT * FROM special_sal;


SELECT * FROM sal_history;
SELECT * FROM mgr_history;
3. Nita, a DBA, precisa que você crie uma tabela que contenham uma restrição de
chave primária, mas ela solicita que você dê ao índice um nome diferente da
restrição. Crie a tabela LOCATIONS_NAMED_INDEX com base no seguinte
gráfico de instância de tabela. Nomeie o índice para a coluna PRIMARY KEY
como LOCATIONS_PK_IDX.

Column Name Deptno Dname

Chave primária Sim


Tipo de Dados Número VARCHAR2
Length 4 30

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 14


Exercícios Adicionais (continuação)

CREATE TABLE LOCATIONS_NAMED_INDEX


(location_id NUMBER(4) PRIMARY KEY USING INDEX
(CREATE INDEX locations_pk_idx ON
LOCATIONS_NAMED_INDEX(location_id)),
location_name VARCHAR2(20));

4. Consulte a tabela USER_INDEXES para exibir o USER_INDEXES da tabela


LOCATIONS_NAMED_INDEX.

SELECT INDEX_NAME, TABLE_NAME


FROM USER_INDEXES

Oracle Internal & Oracle Academy Use Only


WHERE TABLE_NAME = ‘LOCATIONS_NAMED_INDEX’;

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 15


Exercícios Adicionais (continuação)
Os exercícios a seguir podem ser utilizados como prática adicional após a discussão
sobre funções de data/horário:
Você trabalha para uma multinacional e o novo vice-presidente de operações precisa
saber os diferentes fusos horários de todas as filiais da empresa. O novo vice-presidente
solicitou as seguintes informações:
5. Altere a sessão para definir o NLS_DATE_FORMAT como DD-MON-YYYY
HH24:MI:SS.

ALTER SESSION
SET NLS_DATE_FORMAT = ‘DD-MON-YYYY HH24:MI:SS’;

6.

Oracle Internal & Oracle Academy Use Only


a. Crie consultas para exibir os deslocamentos do fuso horário (TZ_OFFSET)
para os seguintes fusos horários:
- Austrália/Sydney

SELECT TZ_OFFSET (‘Australia/Sydney’) from dual;


- Chile/Ilha da Páscoa

SELECT TZ_OFFSET (‘Chile/EasterIsland’) from dual;

b. Altere a sessão para definir o valor do parâmetro TIME_ZONE no


deslocamento do fuso horário de Austrália/Sydney.

ALTER SESSION SET TIME_ZONE = ‘+10:00’;


c. Exiba SYSDATE, CURRENT_DATE, CURRENT_TIMESTAMP e
LOCALTIMESTAMP para esta sessão.
Observação: Os resultados poderão variar com base na data em que o
comando for executado.
SELECT SYSDATE, CURRENT_DATE, CURRENT_TIMESTAMP,
LOCALTIMESTAMP FROM DUAL;

d. Altere a sessão para definir o valor do parâmetro TIME_ZONE no


deslocamento do fuso horário do Chile/Ilha da Páscoa.
Observação:Os resultados da questão anterior se baseiam em outra data e,
em alguns casos, não corresponderão aos resultados reais obtidos pelos
alunos. Além disso, o deslocamento do fuso horário dos países poderá variar,
dependendo do horário de verão.

ALTER SESSION SET TIME_ZONE = ‘-06:00’;

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 16


Exercícios Adicionais (continuação)
e. Exiba SYSDATE, CURRENT_DATE, CURRENT_TIMESTAMP e
LOCALTIMESTAMP para esta sessão.
Observação: Os resultados poderão variar com base na data em que o
comando for executado.

SELECT SYSDATE, CURRENT_DATE, CURRENT_TIMESTAMP,


LOCALTIMESTAMP FROM DUAL;

f. Altere a sessão para definir NLS_DATE_FORMAT como DD-MON-YYYY.

ALTER SESSION SET NLS_DATE_FORMAT = ‘DD-MON-YYYY’;

Oracle Internal & Oracle Academy Use Only


Observação
• Observe na questão anterior que CURRENT_DATE, CURRENT_TIMESTAMP e
LOCALTIMESTAMP diferenciam o fuso horário da sessão. Observe que
SYSDATE não diferencia o fuso horário da sessão.
• Os resultados da questão anterior se baseiam em uma data diferente e, em alguns
casos, podem não corresponder aos resultados reais obtidos pelos alunos. Além
disso, o deslocamento do fuso horário dos países poderá variar, dependendo do
horário de verão.

7. O departamento de Recursos Humanos precisa de uma lista dos funcionários que


precisam ser avaliados em janeiro. Para isso, você foi solicitado a fazer o
seguinte:
Criar uma consulta exibindo os sobrenomes, o mês da data de contratação e a data
de contratação de funcionários que foram contratados em janeiro,
independentemente do ano em que foram contratados.

SELECT last_name, EXTRACT (MONTH FROM HIRE_DATE), HIRE_DATE


FROM employees
WHERE EXTRACT (MONTH FROM HIRE_DATE) = 1;

Os exercícios a seguir podem ser utilizados como prática adicional após a discussão
sobre subconsultas avançadas:
Observação: Se você tiver convertido a coluna HIRE_DATE a TIMESTAMP usando
code_05_12_sb.sql, a exibição da coluna HIRE_DATE seria como 13-JAN-00
12.00.00.000000000 AM

8. O presidente da empresa precisa de um relatório com os três funcionários que


obtiveram mais lucro na empresa para o compartilhamento dos lucros. Você é
responsável por fornecer uma lista ao presidente da empresa.
Crie uma consulta para exibir os três funcionários que obtiveram o maior lucro na
tabela EMPLOYEES. Inclua os sobrenomes e os salários.

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 17


Exercícios Adicionais (continuação)
SELECT last_name, salary
FROM employees e
WHERE 3 > (SELECT COUNT (*)
FROM employees
WHERE e.salary < salary);
9. Os benefícios para o estado da Califórnia sofreram mudanças com base em uma
lei local. Por isso, o representante de benefícios solicitou que você crie uma lista
dos funcionários que serão afetados. Crie uma consulta para exibir o ID e os
sobrenomes dos funcionários que trabalham no estado da Califórnia.
Dica: Use subconsultas escalares.

SELECT employee_id, last_name


FROM employees e

Oracle Internal & Oracle Academy Use Only


WHERE ((SELECT location_id
FROM departments d
WHERE e.department_id = department_id )
IN (SELECT location_id
FROM locations l
WHERE state_province = ‘California’));

10. Nita, a DBA, quer remover informações antigas do banco de dados. Um dos itens
que ela considera desnecessários é o registro de antigos funcionários. Ela pede
que você faça o seguinte:
Crie uma consulta para deletar a linha JOB_HISTORY mais antiga de um
funcionário procurando na tabela JOB_HISTORY o item MIN(START_DATE)
do funcionário. Delete somente os registros desses funcionários que alteraram
pelo menos dois cargos.
Dica: Utilize um comando DELETE correlacionado.

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 18


Exercícios Adicionais (continuação)

DELETE FROM job_history JH


WHERE employee_id =
(SELECT employee_id
FROM employees E
WHERE JH.employee_id = E.employee_id
AND START_DATE = (SELECT MIN(start_date)
FROM job_history JH
WHERE JH.employee_id =
E.employee_id)
AND 3 > (SELECT COUNT(*)
FROM job_history JH
WHERE JH.employee_id =

Oracle Internal & Oracle Academy Use Only


E.employee_id
GROUP BY EMPLOYEE_ID
HAVING COUNT(*) >= 2));

11. O vice-presidente de Recursos Humanos precisa dos registros completos dos


funcionários para o seu discurso no banquete anual de reconhecimento aos
funcionários. Em uma rápida ligação, o vice-presidente pede que você pare de
seguir as ordens da DBA.
Faça o rollback da transação.

ROLLBACK;

12. A crise econômica está forçando a gerência a tomar medidas para reduzir os
custos. O presidente da empresa quer analisar os salários mais altos da empresa.
Você é responsável por fornecer uma lista ao presidente da empresa com base nas
seguintes especificações:
Crie uma consulta para exibir os IDs de cargos cujo salário máximo está acima da
metade do salário máximo da empresa. Use a cláusula WITH para criar essa
consulta. A consulta deve ter o nome MAX_SAL_CALC.

WITH
MAX_SAL_CALC AS (SELECT job_title, MAX(salary) AS
job_total
FROM employees, jobs
WHERE employees.job_id = jobs.job_id
GROUP BY job_title)
SELECT job_title, job_total
FROM MAX_SAL_CALC
WHERE job_total > (SELECT MAX(job_total) * 1/2
FROM MAX_SAL_CALC)
ORDER BY job_total DESC;

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 19


Exercícios Adicionais: Soluções do Estudo de Caso

Primeiro, execute o script dropvid.sql na pasta labs para remover tabelas que já
existem. Em seguida, execute o script buildvid.sql na pasta labs para criar e
preencher as tabelas.

1. Verifique se a tabela foi criada corretamente executando um relatório para


mostrar a lista de tabelas e suas definições de colunas.
SELECT table_name,column_name,data_type,nullable
FROM user_tab_columns
WHERE table_name
IN('MEMBER','TITLE','TITLE_COPY','RENTAL','RESERVATION');

Oracle Internal & Oracle Academy Use Only


2. Verifique a existência das sequências MEMBER_ID_SEQ e TITLE_ID_SEQ no
dicionário de dados.
SELECT sequence_name FROM user_sequences;

3. Você deseja criar alguns usuários que tenham acesso somente aos seus próprios
aluguéis. Crie uma usuária chamada Carmen e conceda a ela o privilégio de
selecionar opções da tabela RENTAL.
Observação: Certifique-se de adicionar o prefixo da sua conta do banco de dados
ao nome do usuário. Por exemplo, se você for o usuário oraxx, crie um usuário
chamado oraxx_Carmen.
CREATE USER oraxx_carmen IDENTIFIED BY oracle ;
GRANT select ON rental TO oraxx_carmen;

4. Adicione uma coluna de preço (número 4,2) à tabela TITLE para armazenar o
valor do aluguel do título.
ALTER TABLE title ADD(price NUMBER(6))

5. Adicione uma tabela CATEGORY para armazenar CATEGORY_ID e


CATEGORY_DESCRIPTION. A tabela tem uma chave estrangeira com a coluna
CATEGORY na tabela TITLE.
CREATE TABLE CATEGORY
( "CATEGORY_ID" NUMBER(6,0) NOT NULL ENABLE,
"CATEGORY_DESCRIPTION" VARCHAR2(4000 BYTE),
CONSTRAINT "CATEGORY_PK" PRIMARY KEY ("CATEGORY_ID"))

6. Selecione todas as tabelas no dicionário de dados.


SELECT table_name FROM user_tables order by table_name;

7. Não será mais necessário armazenar reservas. Você pode remover a tabela.
DROP TABLE reservation cascade constraints;

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 20


Exercícios Adicionais: Soluções do Estudo de Caso
(continuação)
8. Crie uma tabela RENTAL_HISTORY para armazenar os detalhes de aluguel por
sócio nos últimos seis meses. (Dica:Você pode copiar a tabela RENTAL.)
CREATE TABLE rental_history as select * from rental where '1'
= '1'

9. Mostre uma lista dos 10 títulos mais alugados nos últimos meses agrupados por
categoria.
SELECT t.CATEGORY, t.TITLE
FROM TITLE t, RENTAL r
WHERE t.TITLE_ID = r.TITLE_ID AND
r. BOOK_DATE > (SYSDATE - 30) AND

Oracle Internal & Oracle Academy Use Only


rownum < 10
order by category;

10. Você pode calcular a multa por atraso (preço da diária do título) se o sócio
devolver o vídeo com seis dias de atraso.
SELECT t.title, m.member_id, t.price, (t.price*6) latefee
FROM title t, member m, rental r
WHERE t.TITLE_ID = r.TITLE_ID AND
m.member_id = r.member_id AND
r.act_ret_date is null;

11. Mostre uma lista dos sócios que já alugaram duas ou mais vezes.
SELECT member_id, last_name, first_name FROM member m
where 2 <= (select count(*) from rental_history where
member_id = m.member_id);

12. Mostre uma lista dos títulos com status de alugado.


SELECT t.title
FROM title t
JOIN (select title_id, status from title_copy) b
ON t.title_id = b.title_id AND b.status = 'RENTED';

13. Mostre uma lista dos sócios que têm “99” no número do telefone.
SELECT REGEXP_COUNT(phone,'99',1,'i') position, member_id,
last_name, first_name
FROM member
WHERE REGEXP_COUNT(phone,'99',1,'i') > 0;

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 21


Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II Exercícios Adicionais - 22

Você também pode gostar