Você está na página 1de 290

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos


de SQL II

Guia do Aluno • Volume I

D64260BP10
Edição 1.0
Outubro de 2011
D74864
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
Introdução

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.
Objetivos da Lição

Ao concluir esta lição, você será capaz de:


• Abordar as metas do curso
• Descrever o esquema e as tabelas de banco de dados
usados no curso
• Identificar os ambientes disponíveis que podem ser
usados no curso

Oracle Internal & Oracle Academy Use Only


• Verificar alguns dos conceitos básicos de SQL

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II I - 2


Agenda de Lições

• Objetivos e agenda do curso


• Esquema do banco de dados, apêndices usados e ambiente
de desenvolvimento disponível neste curso
• Verificação de alguns conceitos básicos de SQL
• Documentação e recursos adicionais do Oracle Database 11g

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II I - 3


Objetivos do Curso
Após concluir este curso, você será capaz de:
• Controlar o acesso do banco de dados a objetos
específicos
• Adicionar novos usuários com diferentes níveis de
privilégios de acesso
• Gerenciar objetos de esquema
• Gerenciar objetos com views do dicionário de dados

Oracle Internal & Oracle Academy Use Only


• Manipular grandes conjuntos de dados no banco de dados
Oracle usando subconsultas
• Gerenciar dados em diferentes fusos horários
• Criar subconsultas de várias colunas
• Usar subconsultas escalares e correlacionadas
• Usar o suporte a expressões comuns em SQL

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II I - 4


Pré-Requisitos do Curso

O curso Oracle Database: Fundamentos de SQL I é um pré-


requisito para este curso.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Pré-Requisitos do Curso
A preparação exigida para este curso é o Oracle Database: Fundamentos de SQL I.
Este curso apresenta uma introdução à tecnologia de Oracle Database. Você aprenderá os
conceitos básicos de bancos de dados relacionais e a avançada linguagem de programação SQL.
São apresentadas as habilidades essenciais em SQL que permitem criar consultas para uma única
tabela ou várias, manipular dados nas tabelas, criar objetos de bancos de dados e consultar
metadados.

Oracle Database: Fundamentos de SQL II I - 5


Agenda do Curso

• Dia 1:
– Introdução
– Controlando o Acesso do Usuário
– Gerenciando Objetos de Esquema
– Gerenciando Objetos com Views do Dicionário de Dados
• Dia 2:

Oracle Internal & Oracle Academy Use Only


– Manipulando Grandes Conjuntos de Dados
– Gerenciando Dados em Diferentes Fusos Horários
– Recuperando Dados Usando Subconsultas
– Suporte a Expressões Comuns

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II I - 6


Agenda de Lições

• Objetivos e agenda do curso


• Esquema do banco de dados, apêndices usados e ambiente
de desenvolvimento disponível neste curso
• Análise de alguns conceitos básicos de SQL
• Documentação e recursos adicionais do Oracle Database 11g

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II I - 7


Tabelas Usadas no Curso

DEPARTAMENT LOCATION
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 EMPLOYEE
employee_id
end_date
first_name
job_id

Oracle Internal & Oracle Academy Use Only


last_name COUNTRY
department_id email country_id
phone_number country_name
hire_date region_id
job_id
salário
commission_pct
JOBS manager_id
job_id department_id
job_title
min_salary REGION
max_salary region_id
region_name
JOB_GRADES
grade_level
lowest_sal
highest_sal

Copyright © 2011, Oracle. Todos os direitos reservados.

Descrição das Tabelas


Este curso usa dados das seguintes tabelas:
Descrição das Tabelas
• A tabela EMPLOYEES contém informações sobre todos os funcionários, como nome e
sobrenome, IDs do cargo, salários, datas de contratação, IDs de departamento e IDs de
gerente. Essa tabela é filha da tabela DEPARTMENTS.
• A tabela DEPARTMENTS contém informações como ID de departamento, nome do
departamento, ID de gerente e de localização. Ela é a tabela de chave primária da tabela
EMPLOYEES.
• A tabela LOCATIONS contém informações sobre a localização do departamento. Ela
contém informações sobre o ID do local, endereço, cidade, estado, código postal e ID do
país. Ela é a tabela de chave primária para a tabela DEPARTMENTS e é filha da tabela
COUNTRIES.
• A tabela COUNTRIES contém os nomes de países, IDs de país e de região. Ela é filha da
tabela REGIONS. Ela é a tabela de chave primária para a tabela LOCATIONS.
• A tabela REGIONS contém IDs e nomes de região de vários países. Ela é uma tabela de
chave primária para a tabela COUNTRIES.
• A tabela JOB_GRADES identifica uma faixa salarial por grau de cargo. As faixas salariais
não se sobrepõem.
• A tabela JOB_HISTORY armazena o histórico de cargo dos funcionários.
• A tabela JOBS contém cargos e faixas salariais.

Oracle Database: Fundamentos de SQL II I - 8


Apêndices Usados Neste Curso

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


• Apêndice B: Descrições das Tabelas
• Apêndice C: Usando o SQL Developer
• Apêndice D: Usando o SQL*Plus
• Apêndice E: Usando o JDeveloper
• Apêndice F: Gerando Relatórios Agrupando Dados

Oracle Internal & Oracle Academy Use Only


Relacionados
• Apêndice G: Recuperação Hierárquica
• Apêndice H: Criando Scripts Avançados
• Apêndice I: Componentes Arquitetônicos do Banco
de Dados Oracle

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II I - 9


Ambientes de Desenvolvimento

Há dois ambientes de desenvolvimento neste curso:


• A principal ferramenta é o Oracle SQL Developer.
• Você também pode usar a interface da linha de comando
SQL*PLus.

Oracle Internal & Oracle Academy Use Only


SQL Developer SQL *Plus

Copyright © 2011, Oracle. Todos os direitos reservados.

Ambientes de Desenvolvimento
SQL Developer
Este curso foi desenvolvido usando o Oracle SQL Developer como a ferramenta para a execução
das instruções SQL abordadas nos exemplos no slide e nos exercícios.
• O SQL Developer versão 1.5.4 acompanha o Oracle Database 11g Release 2 e é a
ferramenta default desta aula.
• Além disso, o SQL Developer versão 1.5.4 também está disponível na máquina da sala de
aula e poderá ser instalado para uso. No momento da publicação deste curso, a versão 1.5.3
era a versão mais recente do SQL Developer.
SQL*Plus
O ambiente SQL*Plus também poderá ser usado para executar todos os comandos SQL
abordados neste curso.
Observação
• Consulte o Apêndice C, "Usando o SQL Developer", para obter informações sobre o uso do
SQL Developer, incluindo instruções simples sobre a instalação da versão 1.5.4.
• Consulte o Apêndice D, "Usando o SQL*Plus", para obter informações sobre como usar o
SQL*Plus.

Oracle Database: Fundamentos de SQL II I - 10


Agenda de Lições

• Objetivos e agenda do curso


• Esquema do banco de dados, apêndices usados e ambiente
de desenvolvimento disponível neste curso
• Análise de alguns conceitos básicos de SQL
• Documentação e recursos adicionais do Oracle Database 11g

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Agenda de Lições
Os próximos slides apresentam uma breve visão geral de alguns dos conceitos básicos que você
aprendeu no curso Oracle Database: Fundamentos de SQL I.

Oracle Database: Fundamentos de SQL II I - 11


Verificação de Restringindo Dados

• Restrinja as linhas retornadas usando a cláusula WHERE.


• Use as condições para comparação para comparar uma
expressão a outro valor ou expressão.
Operator Significado
BETWEEN Entre dois valores (inclusive)
...AND...

Oracle Internal & Oracle Academy Use Only


IN(set) Corresponde a qualquer lista de valores
LIKE Corresponde a um padrão de caracteres

• Use as condições lógicas para combinar o resultado


de duas condições do componente e obter um único
resultado com base nessas condições.

Copyright © 2011, Oracle. Todos os direitos reservados.

Verificação de Restringindo Dados


Você pode restringir as linhas retornadas da consulta usando a cláusula WHERE. Uma cláusula
WHERE contém uma condição que deve ser atendida, e ela segue diretamente a cláusula FROM.
A cláusula WHERE pode comparar valores nas colunas, valores literais, expressões aritméticas ou
funções. Ela consiste em três elementos:
• Nome da coluna
• Condição de comparação
• Nome da coluna, constante ou lista de valores
Você usa as condições de comparação na cláusula WHERE no seguinte formato:
... WHERE expr operator value
Sem considerar as citadas no slide, use outras condições de comparação como =, <, >, <>, <= e
>=.
Três operadores lógicos estão disponíveis em SQL:
• AND
• OR
• NOT

Oracle Database: Fundamentos de SQL II I - 12


Verificação de Classificando Dados

• Classificar linhas recuperadas com a cláusula ORDER BY:


– ASC: ordem ascendente, padrão
– DESC: ordem descendente
• A cláusula ORDER BY vem por último na instrução SELECT:

SELECT last_name, job_id, department_id, hire_date

Oracle Internal & Oracle Academy Use Only


FROM employees
ORDER BY hire_date ;


Copyright © 2011, Oracle. Todos os direitos reservados.

Verificação de Classificando Dados


A ordem das linhas que são retornadas em um resultado de consulta é indefinida. A cláusula
ORDER BY pode ser usada para classificar as linhas. Se você usar a cláusula ORDER BY, ela
deverá ser a última cláusula da instrução SQL. Você pode especificar uma expressão, um
apelido ou uma posição de coluna como condição de classificação.
Sintaxe
SELECT expr
FROM table
[WHERE condition(s)]
[ORDER BY {column, expr, numeric_position} [ASC|DESC]];
Na sintaxe:
ORDER BY Especifica a ordem em que as linhas recuperadas são exibidas
ASC Ordena as linhas na ordem crescente (Essa é a ordem default.)
DESC Ordena as linhas na ordem decrescente
Se a cláusula ORDER BY não for usada, a ordem de classificação será indefinida e o Oracle
Server não poderá extrair as linhas na mesma ordem para a mesma consulta duas vezes. Use a
cláusula ORDER BY para exibir as linhas em uma ordem específica.

Oracle Database: Fundamentos de SQL II I - 13


Verificação de Funções SQL

Funções

Oracle Internal & Oracle Academy Use Only


Funções de Funções de
funções funções

Retornam um resultado Retornam um resultado


por linha por um conjunto de linhas

Copyright © 2011, Oracle. Todos os direitos reservados.

Verificação de Funções SQL


Há dois tipos de funções:
• Funções de uma única linha
• Funções de várias linhas
Funções de uma única linha
Essas funções operam somente em uma única linha e retornam um resultado por linha. Há
diferentes tipos de funções de linha única, como funções de caractere, numéricas, de data, de
conversão e gerais.
Funções de Várias Linhas
As funções podem manipular os grupos de linhas para fornecer um resultado por grupo de
linhas. Essas funções também são conhecidas como funções de agrupamento.

Oracle Database: Fundamentos de SQL II I - 14


Verificação de Funções de Linha Única

Caracteres

Geral Funções Número

Oracle Internal & Oracle Academy Use Only


Conversão Data

Copyright © 2011, Oracle. Todos os direitos reservados.

Verificação de Funções de Linha Única


A seguir são exibidos diferentes tipos de funções de linha única:
• Funções de caractere: aceitam a entrada de caracteres e podem retornar valores de
caracteres e de números
• Funções de números: aceitam a entrada numérica e retornam valores numéricos
• Funções de datas: operam em valores do tipo de dados DATE (todas as funções de datas
retornam um valor do tipo de dados DATE exceto a função MONTHS_BETWEEN, que
retorna um número).
• Funções de conversão: convertem um valor de um tipo de dados para outro
• Funções gerais:
- NVL
- NVL2
- NULLIF
- COALESCE
- CASE
- DECODE

Oracle Database: Fundamentos de SQL II I - 15


Verificação de Tipos de Funções de Agrupamento

• AVG
• COUNT
• MAX
• MIN
Group
• STDDEV funções
• SUM

Oracle Internal & Oracle Academy Use Only


• VARIANCE

Copyright © 2011, Oracle. Todos os direitos reservados.

Verificação de Tipos de Funções de Agrupamento


Cada uma das funções aceita um argumento. A seguinte tabela identifica as opções que você
pode usar na sintaxe:
Função Descrição
AVG([DISTINCT|ALL]n) Valor médio de n, ignorando valores nulos
COUNT({*|[DISTINCT|ALL]expr}) Número de linhas, em que expr avalia outras,
além de nulo (conte todas as linhas selecionadas
usando *, incluindo duplicadas e linhas com
nulos)
MAX([DISTINCT|ALL]expr) Valor máximo de expr, ignorando valores nulos
MIN([DISTINCT|ALL]expr) Valor mínimo de expr, ignorando valores nulos
STDDEV([DISTINCT|ALL]n) Desvio padrão de n, ignorando valores nulos
SUM([DISTINCT|ALL]n) Valores da soma de n, ignorando valores nulos
VARIANCE([DISTINCT|ALL]n) Variação de n, ignorando valores nulos

Oracle Database: Fundamentos de SQL II I - 16


Verificação de Usando Subconsultas

• Uma subconsulta é uma instrução SELECT aninhada em


uma cláusula de outra instrução SELECT.
• Sintaxe:
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list

Oracle Internal & Oracle Academy Use Only


FROM table );
• Tipos de subconsultas:
Subconsulta de uma única Subconsulta de várias
linha linhas
Retorna somente uma linha Retorna mais de uma linha
Usa operadores de comparação Usa operadores de comparação
de linha única de várias linhas

Copyright © 2011, Oracle. Todos os direitos reservados.

Verificação de Usando Subconsultas


Você pode criar instruções avançadas com base em instruções simples, usando as subconsultas.
As subconsultas são úteis quando uma consulta tem como base um critério de pesquisa com
valores intermediários desconhecidos.
Você pode colocar a subconsulta em uma série de cláusulas SQL, incluindo as seguintes:
• Cláusula WHERE
• Cláusula HAVING
• Cláusula FROM

A subconsulta (consulta interna) é executada uma vez antes da consulta principal (consulta
externa). O resultado da subconsulta é usado pela consulta principal.
Uma subconsulta de linha única usa um operador de linha única, como =, >, <, >=, <=, e <>.
Com uma subconsulta de várias linhas, você usa um operador de várias linhas como IN, ANY e
ALL.
Exemplo: Exibir detalhes de funcionários cujo salário seja igual ao salário mínimo.
SELECT last_name, salary, job_id
FROM employees
WHERE salary = (SELECT MIN(salary)
FROM employees );
No exemplo, a função de agrupamento MIN retorna um único valor para a consulta externa.
Observação: Neste curso, você aprenderá como usar subconsultas de várias colunas. As
subconsultas de várias colunas retornam mais de uma coluna da instrução SELECT interna.
Oracle Database: Fundamentos de SQL II I - 17
Verificação de Manipulando Dados

Uma instrução DML (Data Manipulation Language)


é executada quando você:
• Adiciona novas linhas a uma tabela
• Modifica linhas existentes em uma tabela
• Remove linhas existentes de uma tabela\

Função Descrição

Oracle Internal & Oracle Academy Use Only


INSERT Adiciona uma nova linha à tabela

UPDATE Modifica linhas existentes na tabela

DELETE Remove as linhas existentes da tabela

MERGE Atualiza, insere ou deleta uma linha


condicionalmente em/de uma tabela

Copyright © 2011, Oracle. Todos os direitos reservados.

Verificação de Manipulando Dados


Para adicionar, atualizar ou deletar dados do banco de dados, execute uma instrução DML. Um
conjunto de instruções DML que formam uma unidade lógica de trabalho é chamado transação.
Você pode adicionar novas linhas a uma tabela usando a instrução INSERT. Com a seguinte
sintaxe, somente uma linha é inserida por vez.
INSERT INTO table [(column [, column…])]
VALUES (value[, value...]);

É possível usar a instrução INSERT para adicionar linhas a uma tabela em que os valores sejam
derivados de tabelas existentes. Em substituição da cláusula VALUES, use uma subconsulta. O
número de colunas e os tipos de dados na lista de coluna da cláusula INSERT devem
corresponder ao número de valores e seus tipos de dados na subconsulta.
A instrução UPDATE modificará linhas específicas se você especificar a cláusula WHERE.
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];
Você pode remover as linhas existentes usando a instrução DELETE. É possível deletar
determinadas linhas especificando a cláusula WHERE na instrução DELETE.
DELETE [FROM] table
[WHERE condition];
Mais informações sobre a instrução MERGE podem ser obtidas na lição “Manipulando Grandes
Conjuntos de Dados”.
Oracle Database: Fundamentos de SQL II I - 18
Agenda de Lições

• Objetivos e agenda do curso


• Esquema do banco de dados, apêndices usados e ambiente
de desenvolvimento disponível neste curso
• Verificação de alguns conceitos básicos de SQL
• Documentação e recursos adicionais do Oracle Database 11g

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II I - 19


Documentação SQL do Oracle Database

• Oracle Database New Features Guide


• Oracle Database Reference
• Oracle Database SQL Language Reference
• Oracle Database Concepts
• Oracle Database SQL Developer User’s Guide Release 1,2

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Documentação SQL do Oracle Database


Navegue até http://www.oracle.com/pls/db102/homepage para acessar a biblioteca da
documentação do Oracle Database 10g.
Navegue até http://www.oracle.com/pls/db112/homepage para acessar a biblioteca da
documentação do Oracle Database 11g Release 2.

Oracle Database: Fundamentos de SQL II I - 20


Recursos Adicionais

Para obter informações adicionais sobre o novo Oracle 11g


SQL, consulte:
• Oracle Database 11g: New Features eStudies
• Oracle by Example series (OBE): Oracle Database 11g

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II I - 21


Sumário

Nesta lição, você deve ter aprendido:


• Os objetivos do curso
• As tabelas de amostra usadas no curso

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II I - 22


Exercício I: Visão Geral

Este exercício aborda os seguintes tópicos:


• Executando o tutorial on-line SQL Developer
• Iniciando o SQL Developer e criando uma nova conexão
do banco de dados e navegando nas tabelas
• Executando instruções SQL usando a Planilha SQL
• Verificando os conceitos básicos de SQL

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Exercício I: Visão Geral


Neste exercício, você usará o SQL Developer para executar instruções SQL.
Observação: Todos os exercícios criados usam o SQL Developer como ambiente de
desenvolvimento. Embora seja recomendado o uso do SQL Developer, você também pode usar o
ambiente do SQL*Plus, que está disponível neste curso.

Oracle Database: Fundamentos de SQL II I - 23


Oracle Internal & Oracle Academy Use Only
Controlando o Acesso do Usuário

Oracle Internal & Oracle Academy Use Only


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

Ao concluir esta lição, você será capaz de:


• Diferenciar privilégios de sistema de privilégios de objeto
• Conceder privilégios em tabelas
• Conceder funções
• Distinguir entre privilégios e funções

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Nesta lição, você aprenderá a controlar o acesso a objetos específicos no banco de dados e
adicionar usuários com diferentes níveis de privilégios de acesso.

Oracle Database: Fundamentos de SQL II 1 - 2


Agenda de Lições

• Privilégios de sistema
• Criando uma função
• Privilégios de objeto
• Revogando privilégios de objeto

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 1 - 3


Controlando o Acesso do Usuário

Banco de dados

Nome de usuário e senha

Oracle Internal & Oracle Academy Use Only


Privilégios
Usuários

Copyright © 2011, Oracle. Todos os direitos reservados.

Controlando o Acesso do Usuário


Em um ambiente com vários usuários, você pode manter a segurança do acesso e uso do banco
de dados. Com a segurança de banco de dados do Oracle Server, você pode fazer o seguinte:
• Controlar o acesso ao banco de dados.
• Conceder acesso a objetos específicos no banco de dados.
• Confirmar privilégios concedidos e recebidos com o dicionário de dados Oracle.
A segurança do banco de dados pode ser classificada em duas categorias: segurança do sistema e
segurança de dados. A segurança do sistema envolve o acesso e o uso do banco de dados no
nível do sistema, como nome de usuário e senha, o espaço em disco alocado para usuários e as
operações do sistema que os usuários podem executar. A segurança do banco de dados envolve o
acesso e o uso de objetos do banco de dados e as ações que esses usuários podem executar nos
objetos.

Oracle Database: Fundamentos de SQL II 1 - 4


Privilégios

• Segurança do banco de dados:


– Segurança do sistema
– Segurança de dados
• Privilégios de sistema: Execução de uma determinada
ação no banco de dados
• Privilégios de objeto: Manipulação do conteúdo dos

Oracle Internal & Oracle Academy Use Only


objetos de banco de dados
• Esquemas: Conjunto de objetos, como tabelas, views
e sequências

Copyright © 2011, Oracle. Todos os direitos reservados.

Privilégios
Um privilégio é o direito de executar instruções SQL específicas. O administrador do banco de
dados (DBA) é um usuário de alto nível com a capacidade de criar usuários e conceder a eles
acesso ao banco de dados e seus objetos. Os usuários requerem privilégios de sistema para
acessar o banco de dados e privilégios de objeto para manipular o conteúdo dos objetos no banco
de dados. Os usuários também podem receber o privilégio para conceder privilégios adicionais a
outros usuários ou a funções, que são grupos nomeados de privilégios relacionados.
Esquemas
Um esquema é um conjunto de objetos como tabelas, views e sequências. O esquema pertence a
um usuário do banco de dados e o nome é igual ao do usuário.
Um privilégio do sistema é o direito de executar uma determinada ação ou executar uma ação
em qualquer objeto de esquema de um tipo específico. Um privilégio de objeto fornece ao
usuário a capacidade de executar uma determinada ação em um objeto de esquema específico.
Para obter mais informações, consulte o manual de referência do Oracle Database 2 Day DBA
for 10g or 11g database.

Oracle Database: Fundamentos de SQL II 1 - 5


Privilégios de Sistema

• Estão disponíveis mais de 100 privilégios.


• O administrador do banco de dados possui privilégios
de sistema de alto nível para tarefas como:
– Criação de novos usuários
– Remoção de usuários
– Remoção de tabelas

Oracle Internal & Oracle Academy Use Only


– Backup de tabelas

Copyright © 2011, Oracle. Todos os direitos reservados.

Privilégios de Sistema
Mais de 100 privilégios de sistema distintos estão disponíveis para usuários e funções.
Geralmente, os privilégios de sistema são fornecidos pelo DBA (Administrador do Banco de
Dados).
Privilégios Típicos para DBA

Privilégio de Sistema Operações Autorizadas


CREATE USER O favorecido pode criar outros usuários Oracle.
DROP USER O favorecido pode eliminar outro usuário.
DROP ANY TABLE O favorecido pode eliminar uma tabela em qualquer
esquema.
BACKUP ANY TABLE O favorecido pode fazer o backup de qualquer tabela
em qualquer esquema com o utilitário de exportação.
SELECT ANY TABLE Os favorecidos podem consultar tabelas, views ou
views materializadas em qualquer esquema.
CREATE ANY TABLE O favorecido pode criar tabelas em qualquer esquema.

Oracle Database: Fundamentos de SQL II 1 - 6


Criando Usuários

O DBA cria usuários com a instrução CREATE USER.

CREATE USER user


IDENTIFIED BY password;

CREATE USER demo

Oracle Internal & Oracle Academy Use Only


IDENTIFIED BY demo;

Copyright © 2011, Oracle. Todos os direitos reservados.

Criando Usuários
O DBA cria o usuário executando a instrução CREATE USER. O usuário não tem nenhum
privilégio nesse ponto. O DBA pode conceder privilégios a esse usuário. Esses privilégios
determinam o que o usuário pode fazer no nível do banco de dados.
O slide fornece a sintaxe resumida para criação de um usuário.
Na sintaxe:
user É o nome do usuário a ser criado
Password Especifica que o usuário deve efetuar login com essa senha
Para obter mais informações, consulte Oracle Database SQL Reference for 10g or 11g
database.
Observação: A partir do Oracle Database 11g, as senhas apresentam distinção entre maiúsculas
e minúsculas.

Oracle Database: Fundamentos de SQL II 1 - 7


Privilégios de Sistema do Usuário

• Depois de criar um usuário, o DBA pode conceder


privilégios de sistema específicos a ele.
GRANT privilege [, privilege...]
TO user [, user| role, PUBLIC...];
• Um desenvolvedor de aplicação, por exemplo, pode ter os
seguintes privilégios de sistema:

Oracle Internal & Oracle Academy Use Only


– CREATE SESSION
– CREATE TABLE
– CREATE SEQUENCE
– CREATE VIEW
– CREATE PROCEDURE

Copyright © 2011, Oracle. Todos os direitos reservados.

Privilégios Típicos do Usuário


Depois de criar um usuário, o DBA pode atribuir privilégios a esse usuário.
Privilégio de Sistema Operações Autorizadas
CREATE SESSION Estabelecer conexão com o banco de dados.
CREATE TABLE Criar tabelas no esquema do usuário.
CREATE SEQUENCE Criar uma sequência no esquema do usuário.
CREATE VIEW Criar uma view no esquema do usuário.
CREATE PROCEDURE Criar um procedure, function ou package armazenado no
esquema do usuário.
Na sintaxe:
privilege É o privilégio do sistema a ser concedido
user |role|PUBLIC É o nome do usuário, o nome da função ou PUBLIC
(que indica que cada usuário recebeu o privilégio)
Observação: Os privilégios de sistema atuais podem ser localizados na view de dicionário
SESSION_PRIVS. O dicionário de dados é um conjunto de tabelas e views, criado e mantido
pelo Oracle Server. Eles contêm informações sobre o banco de dados.

Oracle Database: Fundamentos de SQL II 1 - 8


Concedendo Privilégios de Sistema

O DBA pode conceder privilégios de sistema específicos a um


usuário.

GRANT create session, create table,


create sequence, create view
TO demo;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Concedendo Privilégios de Sistema


O DBA usa a instrução GRANT para alocar privilégios do sistema ao usuário. Depois de o
usuário receber os privilégios, ele poderá usá-los imediatamente.
No exemplo deste slide, o usuário demo recebeu os privilégios para criar sessões, tabelas,
sequências e views.

Oracle Database: Fundamentos de SQL II 1 - 9


Agenda de Lições

• Privilégios de sistema
• Criando uma função
• Privilégios de objeto
• Revogando privilégios de objeto

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 1 - 10


O Que é uma Função?

Usuários

Oracle Internal & Oracle Academy Use Only


Gerente

Privilégios

Alocando privilégios Alocando privilégios


sem uma função com uma função

Copyright © 2011, Oracle. Todos os direitos reservados.

O Que é uma Função?


Uma função é um grupo nomeado de privilégios relacionados que podem ser concedidos ao
usuário. Esse método facilita a revogação e a manutenção de privilégios.
Um usuário pode ter acesso a várias funções, e uma mesma função pode ser atribuída a vários
usuários. As funções geralmente são criadas para uma aplicação de banco de dados.
Criando e Atribuindo uma Função
Primeiro, o DBA deve criar a função. Em seguida, o DB pode atribuir privilégios à função e
atribuir a função aos usuários.
Sintaxe
CREATE ROLE role;
Na sintaxe:
role É o nome da função a ser criada
Depois de criar a função, o DBA pode usar a instrução GRANT para atribuir a função a usuários,
bem como atribuir privilégios à função. Uma função não é um objeto do esquema, portanto
qualquer usuário poderá adicionar privilégios a uma função.

Oracle Database: Fundamentos de SQL II 1 - 11


Criando e Concedendo Privilégios a uma Função

• Criar uma função:

CREATE ROLE manager;

• Conceder privilégios a uma função:

GRANT create table, create view

Oracle Internal & Oracle Academy Use Only


TO manager;

• Conceder uma função aos usuários:


GRANT manager TO alice;

Copyright © 2011, Oracle. Todos os direitos reservados.

Criando uma Função


O exemplo do slide cria uma função manager e, em seguida, permite que o gerente crie tabelas
e views. Em seguida, ele concede ao usuário alice a função de gerente. Agora, alice pode
criar tabelas e views.
Se várias funções forem concedidas aos usuários, eles receberão todos os privilégios associados
a todas as funções.

Oracle Database: Fundamentos de SQL II 1 - 12


Alterando a Senha

• O DBA cria sua conta de usuário e inicializa sua senha.


• Você pode alterar sua senha com a instrução ALTER USER.

ALTER USER demo

Oracle Internal & Oracle Academy Use Only


IDENTIFIED BY employ;

Copyright © 2011, Oracle. Todos os direitos reservados.

Alterando a Senha
O DBA cria uma conta e inicializa uma senha para cada usuário. Você pode alterar sua senha
usando a instrução ALTER USER.
O exemplo do slide mostra que o usuário demo altera a senha usando a instrução ALTER USER.
Sintaxe
ALTER USER user IDENTIFIED BY password;
Na sintaxe:
user É o nome do usuário
password Especifica a nova senha
Embora essa instrução possa ser usada para alterar sua senha, há muitas outras opções. Você
deve ter o privilégio ALTER USER para alterar qualquer outra opção.
Para obter mais informações, consulte Oracle Database SQL Reference for 10g or 11g database.
Observação: A SQL*Plus possui um comando PASSWORD (PASSW) que pode ser usado para
alterar a senha de um usuário quando ele tiver efetuado login. Esse comando não está disponível
no SQL Developer.

Oracle Database: Fundamentos de SQL II 1 - 13


Agenda de Lições

• Privilégios de sistema
• Criando uma função
• Privilégios de objeto
• Revogando privilégios de objeto

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 1 - 14


Privilégios de Objeto

Privilégio
de objeto Tabela View Sequência
ALTER

DELETE

INDEX

Oracle Internal & Oracle Academy Use Only


INSERT

REFERENCES

SELECT

UPDATE

Copyright © 2011, Oracle. Todos os direitos reservados.

Privilégios de Objeto
Um privilégio de objeto é um privilégio ou direito de executar uma determinada ação em uma
tabela, view, sequência ou procedimento específico. Cada objeto possui um determinado
conjunto de privilégios concessíveis. A tabela no slide lista os privilégios de vários objetos.
Observe que os únicos privilégios que se aplicam a uma sequência são SELECT e ALTER.
UPDATE, REFERENCES e INSERT podem ser restringidos com a especificação de um
subconjunto de colunas atualizáveis.
Um privilégio SELECT pode ser restringido com a criação de uma view com um subconjunto de
colunas e concessão do privilégio SELECT apenas na view. Um privilégio concedido sobre um
sinônimo é convertido em um privilégio na tabela de base referenciada pelo sinônimo.
Observação: Com o privilégio REFERENCES, você pode garantir que os outros usuários
possam criar constraints FOREIGN KEY que façam referência à sua tabela.

Oracle Database: Fundamentos de SQL II 1 - 15


Privilégios de Objeto

• Os privilégios de objeto variam de objeto para objeto.


• Um proprietário possui todos os privilégios no objeto.
• Um proprietário pode conceder privilégios específicos
sobre o objeto desse proprietário.

GRANT object_priv [(columns)]


LIGADO object

Oracle Internal & Oracle Academy Use Only


TO {user|role|PUBLIC}
[WITH GRANT OPTION];

Copyright © 2011, Oracle. Todos os direitos reservados.

Concedendo Privilégios de Objeto


Diferentes privilégios de objeto estão disponíveis para diferentes tipos de objetos de esquema.
Um usuário tem automaticamente todos os privilégios para os objetos de esquema contidos no
seu próprio esquema. Um usuário pode conceder qualquer privilégio de objeto sobre qualquer
objeto de esquema pertencente a ele a qualquer outro usuário ou função. Se a concessão incluir
WITH GRANT OPTION, o favorecido poderá conceder o privilégio de objeto a outros usuários;
caso contrário, o favorecido poderá usar o privilégio, mas não poderá concedê-lo a outros
usuários.
Na sintaxe:
object_priv É um privilégio de objeto a ser concedido
ALL Especifica todos os privilégios de objeto
columns Especifica a coluna de uma tabela ou view na qual
os privilégios são concedidos
ON object É o objeto no qual os privilégios são concedidos
TO Identifica para quem o privilégio é concedido
PUBLIC Concede privilégios de objeto a todos os usuários
WITH GRANT OPTION Permite que o favorecido conceda os privilégios do objeto a
outros usuários e funções
Observação: Na sintaxe, o esquema é igual ao nome do proprietário.

Oracle Database: Fundamentos de SQL II 1 - 16


Concedendo Privilégios de Objeto

• Conceder privilégios de consulta na tabela EMPLOYEES:


GRANT select
ON employees
TO demo;

• Conceder privilégios para atualizar colunas específicas


a usuários e funções:

Oracle Internal & Oracle Academy Use Only


GRANT update (department_name, location_id)
ON departments
TO demo, manager;

Copyright © 2011, Oracle. Todos os direitos reservados.

Diretrizes
• Para conceder privilégios sobre um objeto, o objeto deve estar em seu próprio esquema ou
você deve possuir privilégios de objeto WITH GRANT OPTION.
• Um proprietário do objeto pode conceder qualquer privilégio de objeto sobre o objeto a
qualquer outro usuário ou função do banco de dados.
• O proprietário de um objeto adquire automaticamente todos os privilégios de objeto sobre
esse objeto.
O primeiro exemplo no slide concede ao usuário demo o privilégio para consultar sua tabela
EMPLOYEES. O segundo exemplo concede privilégios UPDATE sobre colunas específicas na
tabela DEPARTMENTS ao usuário demo e à função manager .
Por exemplo, se o seu esquema for oraxx, e o usuário demo quiser usar uma instrução
SELECT para obter dados de sua tabela EMPLOYEES, a sintaxe a ser usada será:
SELECT * FROM oraxx.employees;
Como alternativa, o usuário demo pode criar um sinônimo para a tabela e emitir uma instrução
SELECT com base no sinônimo:
CREATE SYNONYM emp FOR oraxx.employees;
SELECT * FROM emp;
Observação: Os DBAs geralmente alocam privilégios do sistema; qualquer usuário proprietário
de um objeto pode conceder privilégios de objeto.
Oracle Database: Fundamentos de SQL II 1 - 17
Repassando seus Privilégios

• Dar autoridade a um usuário para repassar privilégios:


GRANT select, insert
ON departments
TO demo
WITH GRANT OPTION;

• Permitir que todos os usuários no sistema consultem

Oracle Internal & Oracle Academy Use Only


dados da tabela DEPARTMENTS de Alice:

GRANT select
LIGADO alice.departments
TO PUBLIC;

Copyright © 2011, Oracle. Todos os direitos reservados.

Repassando seus Privilégios


Palavra-chave WITH GRANT OPTION
Um privilégio concedido com a cláusula WITH GRANT OPTION pode ser repassado a outros
usuários e funções pelo favorecido. Os privilégios de objeto concedidos com a cláusula WITH
GRANT OPTION são revogados quando o privilégio do concessor é revogado.
O exemplo do slide fornece ao usuário demo acesso à sua tabela DEPARTMENTS com os
privilégios para consultar a tabela e adicionar linhas a ela. O exemplo também mostra que o
user1 pode fornecer a outros esses privilégios.
Palavra-chave PUBLIC
Um proprietário de uma tabela pode conceder acesso a todos os usuários usando a palavra-chave
PUBLIC.
O segundo exemplo permite que todos os usuários no sistema consultem dados da tabela
DEPARTMENTS de Alice.

Oracle Database: Fundamentos de SQL II 1 - 18


Confirmando Privilégios Concedidos

View do Dicionário Descrição


de Dados
ROLE_SYS_PRIVS Privilégios de sistema concedidos a funções

ROLE_TAB_PRIVS Privilégios de tabela concedidos a funções

USER_ROLE_PRIVS Funções acessíveis pelo usuário

USER_SYS_PRIVS Privilégios de sistema concedidos ao usuário

Oracle Internal & Oracle Academy Use Only


USER_TAB_PRIVS_MADE Privilégios de objeto concedidos sobre objetos do usuário

USER_TAB_PRIVS_RECD Privilégios de objeto concedidos ao usuário

USER_COL_PRIVS_MADE Privilégios de objeto concedidos sobre as colunas dos


objetos do usuário
USER_COL_PRIVS_RECD Privilégios de objeto concedidos ao usuário sobre colunas
específicas

Copyright © 2011, Oracle. Todos os direitos reservados.

Confirmando Privilégios Concedidos


Se você tentar executar uma operação não autorizada, como deleção de uma linha de uma tabela
sem possuir o privilégio DELETE, o servidor Oracle não permitirá que a operação ocorra.
Se você receber do Oracle Server a mensagem de erro “Table or view does not exist”, significa
que você executou uma destas operações:
• Nomeado uma tabela ou view não existente
• Tentado executar uma operação em uma tabela ou view para a qual não possui o privilégio
apropriado
O dicionário de dados está organizado em tabelas e views e contém informações sobre o banco
de dados. Você pode acessar o dicionário de dados para exibir seus privilégios. A tabela no slide
descreve várias views de dicionário de dados.
Você pode aprender mais sobre as views do dicionário de dados na lição “Gerenciando Objetos
com Views do Dicionário de Dados”.
Observação: A view do dicionário ALL_TAB_PRIVS_MADE descreve todas as concessões de
objeto feitas pelo usuário ou feitas em objetos pertencentes ao usuário.

Oracle Database: Fundamentos de SQL II 1 - 19


Agenda de Lições

• Privilégios de sistema
• Criando uma função
• Privilégios de objeto
• Revogando privilégios de objeto

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 1 - 20


Revogando Privilégios de Objeto

• Você pode usar a instrução REVOKE para revogar


privilégios concedidos a outros usuários.
• Os privilégios concedidos a outros por meio da cláusula
WITH GRANT OPTION também são revogados.

REVOKE {privilege [, privilege...]|ALL}


LIGADO object

Oracle Internal & Oracle Academy Use Only


FROM {user[, user...]|role|PUBLIC}
[CASCADE CONSTRAINTS];

Copyright © 2011, Oracle. Todos os direitos reservados.

Revogando Privilégios de Objeto


Você pode remover privilégios concedidos a outros usuários usando a instrução REVOKE. Ao
usar a instrução REVOKE, os privilégios que você especifica são revogados para usuários
nomeados e qualquer outro a quem esses privilégios foram concedidos pelo usuário revogado.
Na sintaxe:
CASCADE É exigido para remover qualquer constraint de integridade referencial feita ao
objeto CONSTRAINTS por meio do privilégio REFERENCES
Para obter mais informações, consulte Oracle Database SQL Reference for 10g or 11g database.
Observação: Se um usuário deixar a empresa e você revogar seus privilégios, será necessário
conceder novamente os privilégios que esse usuário concedeu a outros usuários. Se você
eliminar a conta do usuário sem revogar os privilégios dela, os privilégios do sistema concedidos
por esse usuário a outros não serão afetados por essa ação.

Oracle Database: Fundamentos de SQL II 1 - 21


Revogando Privilégios de Objeto

Revogue os privilégios SELECT e INSERT concedidos ao


usuário demo na tabela DEPARTMENTS.

REVOKE select, insert


ON departments
FROM demo;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Revogando Privilégios de Objeto (continuação)


O exemplo no slide revoga os privilégios SELECT e INSERT concedidos ao usuário demo na
tabela DEPARTMENTS.
Observação: Se for concedido a um usuário um privilégio com a cláusula WITH GRANT
OPTION, esse usuário também poderá conceder o privilégio com a cláusula WITH GRANT
OPTION, de modo que seja possível uma longa cadeia de favorecidos, mas nenhuma concessão
circular (concessão para quem já concedeu) é permitida. Se o proprietário revogar um privilégio
de um usuário que tiver concedido o privilégio a outros, ocorrerá uma revogação em cascata
para todos os privilégios concedidos.
Por exemplo, se o usuário A conceder um privilégio SELECT sobre uma tabela para o usuário B,
incluindo a cláusula WITH GRANT OPTION, o usuário B poderá conceder ao usuário C o
privilégio SELECT também com a cláusula WITH GRANT OPTION, e o usuário C poderá
conceder ao usuário D o privilégio SELECT. Se o usuário A revogar privilégios do usuário B, os
privilégios concedidos aos usuários C e D também serão revogados.

Oracle Database: Fundamentos de SQL II 1 - 22


Questionário

Quais das seguintes afirmações são verdadeiras?


1. Depois que um usuário cria um objeto, ele pode repassar
qualquer um dos privilégios de objeto disponíveis a outros
usuários usando a instrução GRANT.
2. Um usuário pode criar funções usando a instrução
CREATE ROLE para repassar um conjunto de privilégios
de sistema ou objeto a outros usuários.

Oracle Internal & Oracle Academy Use Only


3. Os usuários podem alterar suas próprias senhas.
4. Os usuários podem exibir os privilégios concedidos a eles
e os concedidos sobre seus objetos.

Copyright © 2011, Oracle. Todos os direitos reservados.

Respostas: 1, 3, 4

Oracle Database: Fundamentos de SQL II 1 - 23


Sumário

Nesta lição, você aprendeu a:


• Diferenciar privilégios de sistema de privilégios de objeto
• Conceder privilégios em tabelas
• Conceder funções
• Distinguir entre privilégios e funções

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
Os DBAs estabelecem a segurança inicial de banco de dados para usuários atribuindo privilégios
a eles.
• O DBA cria usuários que devem ter uma senha. O DBA também é responsável por
estabelecer privilégios iniciais do sistema para um usuário.
• Depois que o usuário tiver criado um objeto, ele poderá repassar qualquer um dos
privilégios de objeto disponíveis a outros usuários ou a todos eles usando a instrução
GRANT.
• Um DBA pode criar funções usando a instrução CREATE ROLE para repassar um conjunto
de privilégios de sistema ou objeto a vários usuários. As funções facilitam a manutenção de
privilégios de concessão e revogação.
• Os usuários podem alterar suas senhas usando a instrução ALTER USER.
• Você pode remover privilégios de usuários usando a instrução REVOKE.
• Com as views do dicionário de dados, os usuários podem exibir os privilégios concedidos a
eles e aqueles concedidos sobre seus objetos.

Oracle Database: Fundamentos de SQL II 1 - 24


Exercício 1: Visão Geral

Este exercício aborda os seguintes tópicos:


• Concessão de privilégios a outros usuários sobre sua
tabela
• Modificação da tabela de outro usuário por meio dos
privilégios concedidos a você

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Exercício 1: Visão Geral


Reúna-se com outros alunos para este exercício sobre controle de acesso a objetos de banco de
dados.

Oracle Database: Fundamentos de SQL II 1 - 25


Oracle Internal & Oracle Academy Use Only
Gerenciar Objetos de Esquema

Oracle Internal & Oracle Academy Use Only


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

Ao concluir esta lição, você será capaz de:


• Adicionar restrições
• Criar índices
• Criar índices usando a instrução CREATE TABLE
• Criar índices baseados em function
• Eliminar e definir colunas como UNUSED

Oracle Internal & Oracle Academy Use Only


• Executar operações FLASHBACK
• Criar e usar tabelas externas

Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Esta lição contém informações sobre a criação de índices e restrições, além da alteração de
objetos existentes. Você também aprenderá sobre tabelas externas e a condição para nomear o
índice no momento da criação de uma restrição PRIMARY KEY.

Oracle Database: Fundamentos de SQL II 2 - 2


Agenda de Lições

• Usando a instrução ALTER TABLE para adicionar,


modificar e eliminar uma coluna
• Gerenciando restrições:
– Adicionando e eliminando uma restrição
– Adiando restrições
– Ativando e desativando uma restrição
• Criando índices:

Oracle Internal & Oracle Academy Use Only


– Usando a instrução CREATE TABLE
– Criando índices baseados em function
– Removendo um índice
• Executando operações de flashback
• Criando e usando tabelas temporárias
• Criando e usando tabelas externas

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 2 - 3


Instrução ALTER TABLE

Use a instrução ALTER TABLE para:


• Adicionar uma nova coluna
• Modificar uma coluna existente
• Definir um valor padrão para a nova coluna
• Eliminar uma coluna

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Instrução ALTER TABLE


Após a criação de uma tabela, talvez seja necessário alterar a estrutura da tabela porque você
omitiu uma coluna, sua definição de coluna precise ser alterada ou seja necessário remover as
colunas. Você pode fazer isso usando a instrução ALTER TABLE.

Oracle Database: Fundamentos de SQL II 2 - 4


Instrução ALTER TABLE

Use a instrução ALTER TABLE para adicionar, modificar ou


eliminar colunas:
ALTER TABLE table
ADD (column datatype [DEFAULT expr]
[, column datatype]...);

ALTER TABLE table

Oracle Internal & Oracle Academy Use Only


MODIFY (column datatype [DEFAULT expr]
[, column datatype]...);

ALTER TABLE table


DROP (column [, column] …);

Copyright © 2011, Oracle. Todos os direitos reservados.

Instrução ALTER TABLE (continuação)


Você pode adicionar, modificar e eliminar colunas de uma tabela usando a instrução ALTER
TABLE.
Na sintaxe:
table É o nome da tabela
ADD|MODIFY|DROP É o tipo de modificação
column É o nome da coluna
datatype É o tipo de dados e o comprimento da coluna
DEFAULT expr Especifica o valor padrão de uma coluna

Oracle Database: Fundamentos de SQL II 2 - 5


Adicionando uma Coluna

• Você pode usar a cláusula ADD para adicionar colunas:


ALTER TABLE dept80
ADD (job_id VARCHAR2(9));

• A nova coluna se torna a última:

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Diretrizes para Adicionar uma Coluna


• Você pode adicionar ou modificar colunas.
• Não é possível especificar onde a coluna aparecerá. A nova coluna se torna a última.
O exemplo no slide adiciona uma coluna chamada JOB_ID à tabela DEPT80. A coluna
JOB_ID se torna a última coluna na tabela.
Observação: Se uma tabela já contiver linhas quando uma coluna for adicionada, a nova coluna
será inicialmente nula ou usará o valor padrão para todas as linhas. Você só poderá adicionar
uma coluna NOT NULL obrigatória a uma tabela que contenha dados nas outras colunas se
especificar um valor padrão. É possível adicionar uma coluna NOT NULL a uma tabela vazia
sem o valor padrão.

Oracle Database: Fundamentos de SQL II 2 - 6


Modificando uma Coluna

• Você pode alterar o tipo de dados, o tamanho e o valor


default de uma coluna.
ALTER TABLE dept80
MODIFY (last_name VARCHAR2(30));

• Uma alteração no valor padrão afeta somente inserções

Oracle Internal & Oracle Academy Use Only


subsequentes na tabela.

Copyright © 2011, Oracle. Todos os direitos reservados.

Modificando uma Coluna


Você pode modificar uma definição de coluna usando a instrução ALTER TABLE com a
cláusula MODIFY. A modificação da coluna pode incluir alterações no tipo, tamanho e valor
padrão de uma coluna.
Diretrizes
• É possível aumentar a largura ou precisão de uma coluna numérica.
• A largura das colunas de caracteres pode ser aumentada.
• A largura de uma coluna poderá ser reduzida se:
- A coluna contiver somente valores nulos
- A tabela não tiver linhas
- A redução da largura da coluna não for inferior aos valores existentes
• Você poderá alterar o tipo de dados se a coluna contiver somente valores nulos. A exceção
são as conversões de CHAR para VARCHAR2, que podem ser feitas com dados nas colunas.
• Só será possível converter uma coluna CHAR no tipo de dados de VARCHAR2 ou converter
uma coluna VARCHAR2no tipo de dados de CHAR somente se a coluna contiver valores
nulos ou se você não alterar o tamanho.
• Uma alteração no valor padrão de uma coluna afeta somente as inserções subsequentes na
tabela.

Oracle Database: Fundamentos de SQL II 2 - 7


Eliminando uma Coluna

Use a cláusula DROP COLUMN para eliminar da tabela colunas


que não sejam mais necessárias:

ALTER TABLE dept80


DROP COLUMN job_id;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Eliminando uma Coluna


Você pode eliminar uma coluna de uma tabela usando a instrução ALTER TABLE com a
cláusula DROP COLUMN.
Diretrizes
• A coluna pode ou não conter dados.
• Usando a instrução ALTER TABLE DROP COLUMN, somente uma coluna pode ser
eliminada por vez.
• Deverá restar pelo menos uma coluna na tabela depois de ter sido alterada.
• Depois que uma coluna for eliminada, ela não poderá ser recuperada.
• Uma coluna não poderá ser eliminada se ela fizer parte de uma restrição ou parte de uma
chave de índice, exceto se a opção de cascata for adicionada.
• A eliminação de uma coluna poderá demorar um pouco se a coluna tiver um grande número
de valores. Nesse caso, talvez seja melhor defini-la para não ser usada e eliminá-la quando
houver poucos usuários no sistema a fim de evitar bloqueios longos.
Observação: Certas colunas não podem ser eliminadas, como as que fazem parte da chave de
particionamento de uma tabela particionada ou colunas que fazem parte da PRIMARY KEY de
uma tabela organizada por índice. Para obter mais informações sobre tabelas organizadas por
índice, consulte Oracle Database Concepts e Oracle Database Administrator’s Guide.

Oracle Database: Fundamentos de SQL II 2 - 8


Opção SET UNUSED

• A opção SET UNUSED pode ser usada para marcar uma ou


mais colunas como não usadas.
• A opção DROP UNUSED COLUMNS pode ser usada para
remover as colunas marcadas como não usadas.

ALTER TABLE <table_name>


SET UNUSED(<column_name> [ , <column_name>]);

Oracle Internal & Oracle Academy Use Only


OR
ALTER TABLE <table_name>
SET UNUSED COLUMN <column_name> [ , <column_name>];

ALTER TABLE <table_name>


DROP UNUSED COLUMNS;

Copyright © 2011, Oracle. Todos os direitos reservados.

Opção SET UNUSED


A opção SET UNUSED marca uma ou mais colunas como não usadas para que possam ser
eliminadas quando a demanda sobre recursos de sistema for menor. A especificação dessa
cláusula não remove de fato as colunas de destino de cada linha na tabela (ou seja, não restaura o
espaço em disco usado por essas colunas). Portanto, o tempo de resposta será mais rápido se
você executar a cláusula DROP. As colunas não utilizadas são tratadas como se tivessem sido
eliminadas, embora os respectivos dados permaneçam nas linhas da tabela. Depois que uma
coluna tiver sido marcada como não usada, você não terá acesso a ela. Uma consulta SELECT
* não recuperará dados de colunas não usadas. Além disso, os nomes e os tipos de colunas
marcadas como não usadas não serão exibidos durante uma instrução DESCRIBE, e você poderá
adicionar à tabela uma nova coluna com o nome igual ao da coluna não usada. As informações
de SET UNUSED são armazenadas na view de dicionário de USER_UNUSED_COL_TABS.
Observação: As diretrizes para definir uma coluna como UNUSED são semelhantes às de
eliminação de uma coluna.

Oracle Database: Fundamentos de SQL II 2 - 9


Opção SET UNUSED (continuação)
Opção DROP UNUSED COLUMNS
DROP UNUSED COLUMNS remove da tabela todas as colunas atualmente marcadas como não
usadas. Você pode usar essa instrução quando quiser recuperar espaço em disco extra de colunas
não usadas na tabela. Se a tabela não contiver colunas não usadas, a instrução retornará sem
erros.
ALTER TABLE dept80
SET UNUSED (last_name);

ALTER TABLE succeeded

ALTER TABLE dept80

Oracle Internal & Oracle Academy Use Only


DROP UNUSED COLUMNS;

ALTER TABLE succeeded

Oracle Database: Fundamentos de SQL II 2 - 10


Agenda de Lições

• Usando a instrução ALTER TABLE para adicionar,


modificar e eliminar uma coluna
• Gerenciando restrições:
– Adicionando e eliminando uma restrição
– Adiando restrições
– Ativando e desativando uma restrição
• Criando índices:

Oracle Internal & Oracle Academy Use Only


– Usando a instrução CREATE TABLE
– Criando índices baseados em function
– Removendo um índice
• Executando operações de flashback
• Criando e usando tabelas temporárias
• Criando e usando tabelas externas

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 2 - 11


Adicionando uma Sintaxe de Restrição

Use a instrução ALTER TABLE para:


• Adicionar ou eliminar uma restrição, mas não modificar
sua estrutura
• Ativar ou desativar restrições
• Adicionar uma restrição NOT NULL usando a cláusula
MODIFY

Oracle Internal & Oracle Academy Use Only


ALTER TABLE <table_name>
ADD [CONSTRAINT <constraint_name>]
type (<column_name>);

Copyright © 2011, Oracle. Todos os direitos reservados.

Adicionando uma Restrição


Você pode adicionar uma restrição para tabelas existentes usando a instrução ALTER TABLE
com a cláusula ADD.
Na sintaxe:
table É o nome da tabela
constraint É o nome da restrição
type É o tipo de restrição
column É o nome da coluna afetada pela restrição
A sintaxe do nome da restrição é opcional, embora recomendada. Se você não nomear suas
restrições, o sistema gerará nomes de restrição.
Diretrizes
• Você pode adicionar, eliminar, ativar ou desativar uma restrição, mas não pode modificar
sua estrutura.
• Uma restrição NOT NULL pode ser adicionada a uma coluna com o uso da cláusula
MODIFY da instrução ALTER TABLE.
Observação: Uma coluna NOT NULL só poderá ser definida se a tabela estiver vazia ou se a
coluna tiver um valor para cada linha.

Oracle Database: Fundamentos de SQL II 2 - 12


Adicionando uma Restrição

Adicione uma restrição FOREIGN KEY à tabela EMP2 indicando


que um gerente já deve existir como funcionário válido na
tabela EMP2.

ALTER TABLE emp2


MODIFY employee_id PRIMARY KEY;

Oracle Internal & Oracle Academy Use Only


ALTER TABLE emp2
ADD CONSTRAINT emp_mgr_fk
FOREIGN KEY(manager_id)
REFERENCES emp2(employee_id);

Copyright © 2011, Oracle. Todos os direitos reservados.

Adicionando uma Restrição (continuação)


O primeiro exemplo no slide modifica a tabela EMP2 para adicionar uma restrição PRIMARY
KEY na coluna EMPLOYEE_ID. Observe que como nenhum nome de restrição é fornecido, ela é
nomeada automaticamente pelo Oracle Server. O segundo exemplo do slide cria uma restrição
FOREIGN KEY na tabela EMP2. A restrição assegura que exista um gerente como um
funcionário válido na tabela EMP2.

Oracle Database: Fundamentos de SQL II 2 - 13


Cláusula ON DELETE

• Use a cláusula ON DELETE CASCADE para deletar linhas


filhas quando uma chave pai for deletada:

ALTER TABLE emp2 ADD CONSTRAINT emp_dt_fk


FOREIGN KEY (Department_id)
REFERENCES departments(department_id) ON DELETE CASCADE;

Oracle Internal & Oracle Academy Use Only


• Use a cláusula ON DELETE SET NULL para definir o
valor das linhas filhas quando uma chave pai for deletada:

ALTER TABLE emp2 ADD CONSTRAINT emp_dt_fk


FOREIGN KEY (Department_id)
REFERENCES departments(department_id) ON DELETE SET NULL;

Copyright © 2011, Oracle. Todos os direitos reservados.

ON DELETE
Usando a cláusula ON DELETE, você pode determinar como o Oracle Database manipula a
integridade referencial, se você remover um valor de chave primário ou referenciado.
ON DELETE CASCADE:
A ação ON DELETE CASCADE permite a deleção, mas não a atualização, de dados da
chave mãe referenciados pela tabela filha. Quando os dados na chave pai são deletados,
todas as linhas na tabela filha, que dependem dos valores deletados da chave pai, também
são deletadas. Para especificar essa ação referencial, inclua a opção ON DELETE
CASCADE na definição da restrição FOREIGN KEY .
ON DELETE SET NULL
Quando os dados da chave pai forem deletados, a ação ON DELETE SET NULL fará com
que todas as linhas da tabela filha que dependam do valor da chave pai deletada sejam
convertidos a nulos.
Se você omitir essa cláusula, a Oracle não permitirá que você delete valores chaves
referenciados na tabela pai que tenham linhas dependentes na tabela filha.

Oracle Database: Fundamentos de SQL II 2 - 14


Adiando Restrições

As restrições podem ter os seguintes atributos:


• DEFERRABLE ou NOT DEFERRABLE
• INITIALLY DEFERRED ou INITIALLY IMMEDIATE
Adiando restrição sobre a
ALTER TABLE dept2 criação
ADD CONSTRAINT dept2_id_pk
PRIMARY KEY (department_id)

Oracle Internal & Oracle Academy Use Only


DEFERRABLE INITIALLY DEFERRED

Alterando um atributo
SET CONSTRAINTS dept2_id_pk IMMEDIATE de restrição específico

ALTER SESSION Alterando todas as restrições


de uma sessão
SET CONSTRAINTS= IMMEDIATE

Copyright © 2011, Oracle. Todos os direitos reservados.

Adiando Restrições
Você pode adiar as restrições de verificação de validade até o final da transação. Uma restrição é
adiada se o sistema não verificar se ela foi satisfeita, até que uma instrução COMMIT seja
enviada. Se uma restrição adiada for violada, o banco de dados retornará um erro, a transação
não será confirmada e será submetida a rollback. Se uma restrição for imediata (não adiada), ela
será verificada no final de cada instrução. Se ela for violada, será feito o rollback da instrução
imediatamente. Se uma restrição provocar uma ação (por exemplo, DELETE CASCADE), essa
ação será sempre tomada como parte da instrução que a provocou, seja ela adiada ou imediata.
Use a instrução SET CONSTRAINTS a fim de especificar, para uma determinada transação, se
uma restrição adiável é verificada seguindo cada instrução DML (data manipulation language)
ou quando a transação é submetida a commit. Para criar restrições adiáveis, você deve criar um
índice não-exclusivo para essa restrição.
Você pode definir restrições como adiáveis ou não adiáveis e inicialmente adiadas ou
inicialmente imediatas. Esses atributos podem ser diferentes para cada restrição.
Cenário de uso: A política da empresa determina que o número de departamento 40 deve ser
alterado para 45. A alteração da coluna DEPARTMENT_ID afeta funcionários designados a esse
departamento. Portanto, você torna as PRIMARY KEY e FOREIGN KEYsadiáveis e
inicialmente adiadas. As informações do departamento e do funcionário são atualizadas e, no
momento do commit, todas as linhas são validadas.

Oracle Database: Fundamentos de SQL II 2 - 15


Diferença Entre INITIALLY DEFERRED
e INITIALLY IMMEDIATE
INITIALLY DEFERRED Aguarda para verificar a restrição
até que a transação termine
INITIALLY IMMEDIATE Verifica a restrição no final da
execução da instrução

CREATE TABLE emp_new_sal (salary NUMBER

Oracle Internal & Oracle Academy Use Only


CONSTRAINT sal_ck
CHECK (salary > 100)
DEFERRABLE INITIALLY IMMEDIATE,
bonus NUMBER
CONSTRAINT bonus_ck
CHECK (bonus > 0 )
DEFERRABLE INITIALLY DEFERRED );

Copyright © 2011, Oracle. Todos os direitos reservados.

Diferença Entre INITIALLY DEFERRED e INITIALLY IMMEDIATE


Uma restrição definida como adiável pode ser especificada como INITIALLY DEFERRED ou
INITIALLY IMMEDIATE. A cláusula INITIALLY IMMEDIATE é a padrão.
No exemplo do slide:
• A restrição sal_ck é criada como DEFERRABLE INITIALLY IMMEDIATE
• A restrição bonus_ck é criada como DEFERRABLE INITIALLY DEFERRED
Depois de criar a tabela emp_new_sal conforme mostrado no slide, tente inserir valores na
tabela e observe os resultados. Quando as restrições sal_ck e bonus_ck são efetivadas, as
linhas são inseridas sem erro.
Exemplo 1: Insira uma linha que viole sal_ck. Na instrução CREATE TABLE, sal_ck é
especificada como uma restrição inicialmente imediata. Isso significa que a restrição é
verificada imediatamente depois da instrução INSERT, e um erro é observado.
INSERT INTO emp_new_sal VALUES(90,5);

Exemplo 2: Insira uma linha que viole bonus_ck. Na instrução CREATE TABLE,
bonus_ck é especificada como uma restrição adiável e inicialmente adiada. Portanto, a
restrição não é verificada até que você use COMMIT ou defina o estado da restrição novamente
para imediato.
Oracle Database: Fundamentos de SQL II 2 - 16
Diferença Entre INITIALLY DEFERRED e INITIALLY IMMEDIATE (continuação)
INSERT INTO emp_new_sal VALUES(110, -1);

A inserção da linha foi executada com êxito. Mas observe que há um erro durante o commit da
transação.
COMMIT;

O commit falhou em razão de uma violação de restrição. Portanto, nesse momento, o banco de
dados faz o rollback da transação.
Exemplo 3: Defina o status DEFERRED para todas as restrições que possam ser adiadas.
Observe que você também pode definir o status DEFERRED para uma única restrição se
necessário.

Oracle Internal & Oracle Academy Use Only


SET CONSTRAINTS ALL DEFERRED;

Agora, se você tentar inserir uma linha que viole a restrição sal_ck, a instrução será executada
com êxito.
INSERT INTO emp_new_sal VALUES(90,5);

Mas observe que há um erro durante o commit da transação. A transação falha e é feito seu
rollback. Isso ocorre porque as duas restrições são verificadas depois de COMMIT.
COMMIT;

Exemplo 4: Defina o status IMMEDIATE para as duas restrições definidas como DEFERRED no
exemplo anterior.
SET CONSTRAINTS ALL IMMEDIATE;

Ocorrerá um erro se você tentar inserir uma linha que viole sal_ck ou bonus_ck.
INSERT INTO emp_new_sal VALUES(110, -1);

Observação: se você criar uma tabela sem especificar a capacidade de adiamento da restrição, a
restrição será marcada imediatamente no final de cada instrução. Por exemplo, com a instrução
CREATE TABLE da tabela newemp_details, se você não especificar a capacidade de
adiamento da restrição newemp_det_pk, a restrição será verificada imediatamente.
CREATE TABLE newemp_details(emp_id NUMBER, emp_name
VARCHAR2(20),
CONSTRAINT newemp_det_pk PRIMARY KEY(emp_id));
Durante a tentativa de adiar a restrição newemp_det_pk que não é adiável, ocorre o seguinte
erro:
SET CONSTRAINT newemp_det_pk DEFERRED;

Oracle Database: Fundamentos de SQL II 2 - 17


Eliminando uma Restrição

• Remova a restrição do gerente da tabela EMP2:


ALTER TABLE emp2
DROP CONSTRAINT emp_mgr_fk;

• Remova a restrição PRIMARY KEY da tabela DEPT2 e


elimine a restrição associada FOREIGN KEY da coluna

Oracle Internal & Oracle Academy Use Only


EMP2.DEPARTMENT_ID:

ALTER TABLE dept2


DROP PRIMARY KEY CASCADE;

Copyright © 2011, Oracle. Todos os direitos reservados.

Eliminando uma Restrição


Para eliminar uma restrição, você pode identificar o nome dela nas views do dicionário de dados
USER_CONSTRAINTS e USER_CONS_COLUMNS. Em seguida, use a instrução ALTER
TABLE com a cláusula DROP. A opção CASCADE da cláusula DROP faz com que qualquer
restrição dependente também seja eliminada.
Sintaxe
ALTER TABLE table
DROP PRIMARY KEY | UNIQUE (column) |
CONSTRAINT constraint [CASCADE];
Na sintaxe:
table É o nome da tabela
column É o nome da coluna afetada pela restrição
constraint É o nome da restrição
Quando você elimina uma restrição de integridade, ela não é mais imposta pelo Oracle Server e
não fica mais disponível no dicionário de dados.

Oracle Database: Fundamentos de SQL II 2 - 18


Desativando Restrições

• Execute a cláusula DISABLE da instrução ALTER TABLE


para desativar uma constraint de integridade.
• Aplique a opção CASCADE para desativar constraints de
integridade dependentes.

ALTER TABLE emp2


DISABLE CONSTRAINT emp_dt_fk;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Desativando uma Constraint


Você pode desativar uma constraint sem eliminá-la ou recriá-la usando a instrução ALTER
TABLE com a cláusula DISABLE.
Sintaxe
ALTER TABLE table
DISABLE CONSTRAINT constraint [CASCADE];
Na sintaxe:
table É o nome da tabela
constraint É o nome da restrição
Diretrizes
• Você pode usar a cláusula DISABLE nas instruções CREATE TABLE e ALTER TABLE.
• A cláusula CASCADE desativa restrições de integridade dependentes.
• A desativação de uma restrição UNIQUE ou PRIMARY KEY remove o índice exclusivo.

Oracle Database: Fundamentos de SQL II 2 - 19


Ativando Restrições

• Ative uma restrição de integridade atualmente desativada


na definição de tabela usando a cláusula ENABLE.
ALTER TABLE emp2
ENABLE CONSTRAINT emp_dt_fk;

• Um índice UNIQUE será criado automaticamente se você

Oracle Internal & Oracle Academy Use Only


ativar uma chave UNIQUE ou uma restrição PRIMARY KEY.

Copyright © 2011, Oracle. Todos os direitos reservados.

Ativando uma Restrição


Você pode ativar uma restrição sem eliminá-la ou recriá-la usando a instrução ALTER TABLE
com a cláusula ENABLE.
Sintaxe
ALTER TABLE table
ENABLE CONSTRAINT constraint;
Na sintaxe:
table É o nome da tabela
constraint É o nome da restrição
Diretrizes
• Se você ativar uma restrição, ela se aplicará a todos os dados na tabela. Todos os dados na
tabela devem estar de acordo com a restrição.
• Se você ativar uma chave UNIQUE ou uma restrição PRIMARY KEY, um índice UNIQUE
ou PRIMARY KEY será criado automaticamente. Se já existir um índice, ele poderá ser
usado por essas chaves.
• Você pode usar a cláusula ENABLE nas instruções CREATE TABLE e ALTER TABLE.

Oracle Database: Fundamentos de SQL II 2 - 20


Ativando uma Restrição (continuação)
• A ativação de uma restrição PRIMARY KEY que tenha sido desativada com a opção
CASCADE não ativa nenhuma FOREIGN KEY dependente da PRIMARY KEY.
• Para ativar uma restrição UNIQUE ou PRIMARY KEY, você deve ter os privilégios
necessários para criar um índice na tabela.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II 2 - 21


Restrições em Cascata

• A cláusula CASCADE CONSTRAINTS é usada juntamente


com a cláusula DROP COLUMN.
• A cláusula CASCADE CONSTRAINTS elimina todas as
restrições de integridade referenciais relacionadas às
PRIMARY e UNIQUE definidas nas colunas eliminadas.
• A cláusula CASCADE CONSTRAINTS também elimina todas
as restrições de várias colunas definidas nas colunas

Oracle Internal & Oracle Academy Use Only


eliminadas.

Copyright © 2011, Oracle. Todos os direitos reservados.

Restrições em Cascata
Esta instrução ilustra o uso da cláusula CASCADE CONSTRAINTS. Suponha que a tabela
TEST1 seja criada como se segue:
CREATE TABLE test1 (
col1_pk NUMBER PRIMARY KEY,
col2_fk NUMBER,
col1 NUMBER,
col2 NUMBER,
CONSTRAINT fk_constraint FOREIGN KEY (col2_fk) REFERENCES
test1,
CONSTRAINT ck1 CHECK (col1_pk > 0 and col1 > 0),
CONSTRAINT ck2 CHECK (col2_fk > 0));
Um erro é retornado para as seguintes instruções:
ALTER TABLE test1 DROP (col1_pk); —col1_pk é uma chave pai.
ALTER TABLE test1 DROP (col1); —col1 é indicada pela restrição de
várias colunas, ck1.

Oracle Database: Fundamentos de SQL II 2 - 22


Restrições em Cascata

Exemplo:

ALTER TABLE emp2


DROP COLUMN employee_id CASCADE CONSTRAINTS;

Oracle Internal & Oracle Academy Use Only


ALTER TABLE test1
DROP (col1_pk, col2_fk, col1) CASCADE CONSTRAINTS;

Copyright © 2011, Oracle. Todos os direitos reservados.

Restrições em Cascata (continuação)


A submissão da instrução a seguir elimina a coluna EMPLOYEE_ID, a restrição PRIMARY KEY
e todas as restrições FOREIGN KEY que referenciam a restrição PRIMARY KEY para a tabela
EMP2:
ALTER TABLE emp2 DROP COLUMN employee_id CASCADE CONSTRAINTS;
Se todas as colunas indicadas pelas restrições definidas nas colunas eliminadas também forem
eliminadas, CASCADE CONSTRAINTS não será necessária. Por exemplo, supondo que
nenhuma outra restrição referencial de outras tabelas se refira à coluna COL1_PK, é possível
submeter a instrução a seguir sem a cláusula CASCADE CONSTRAINTS da tabela TEST1
criada na página anterior:
ALTER TABLE test1 DROP (col1_pk, col2_fk, col1);

Oracle Database: Fundamentos de SQL II 2 - 23


Renomeando Colunas de Tabela e Restrições

Use a cláusula RENAME COLUMN da instrução ALTER TABLE


para renomear colunas da tabela.
a
ALTER TABLE marketing RENAME COLUMN team_id
TO id;

Oracle Internal & Oracle Academy Use Only


Use a cláusula RENAME CONSTRAINT da instrução ALTER
TABLE para renomear qualquer restrição existente para uma
tabela. b
ALTER TABLE marketing RENAME CONSTRAINT mktg_pk
TO new_mktg_pk;

Copyright © 2011, Oracle. Todos os direitos reservados.

Renomeando Colunas de Tabela e Restrições


Quando você renomeia uma coluna de tabela, o novo nome não deve entrar em conflito com o
nome de qualquer coluna da tabela. Não é possível usar qualquer outra cláusula juntamente com
a cláusula RENAME COLUMN.
Os exemplos do slide usam a tabela marketing com a PRIMARY KEY mktg_pk definida
na coluna id.
CREATE TABLE marketing (team_id NUMBER(10),
target VARCHAR2(50),
CONSTRAINT mktg_pk PRIMARY KEY(team_id));

O exemplo a mostra que a coluna id da tabela marketing é renomeada para mktg_id. O


exemplo b mostra que mktg_pk é renomeado para new_mktg_pk.
Quando você renomeia qualquer restrição existente para uma tabela, o novo nome não deve
entrar em conflito com nenhum nome de restrição. É possível usar a cláusula RENAME
CONSTRAINT para renomear nomes de restrição gerados pelo sistema.

Oracle Database: Fundamentos de SQL II 2 - 24


Agenda de Lições

• Usando a instrução ALTER TABLE para adicionar,


modificar e eliminar uma coluna
• Gerenciando restrições:
– Adicionando e eliminando uma restrição
– Adiando restrições
– Ativando e desativando uma restrição
• Criando índices:

Oracle Internal & Oracle Academy Use Only


– Usando a instrução CREATE TABLE
– Criando índices baseados em function
– Removendo um índice
• Executando operações de flashback
• Criando e usando tabelas temporárias
• Criando e usando tabelas externas

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 2 - 25


Visão Geral de Índices

Os índices são criados:


• Automaticamente
– Criação de PRIMARY KEY
– Criação de UNIQUE KEY
• Manualmente
– A instrução CREATE INDEX

Oracle Internal & Oracle Academy Use Only


– A instrução CREATE TABLE

Copyright © 2011, Oracle. Todos os direitos reservados.

Visão Geral de Índices


Podem ser criados dois tipos de índices. Um tipo é um índice exclusivo. O Oracle Server cria
automaticamente um índice exclusivo quando você define uma coluna ou grupo de colunas em
uma tabela para que haja uma restrição de PRIMARY KEY ou chaveUNIQUE. O nome do índice
é o dado à restrição.
O outro tipo de índice é um não-exclusivo, que um usuário pode criar. Por exemplo, você pode
criar um índice para uma coluna FOREIGN KEY a ser usado em joins para melhorar a
velocidade de recuperação.
Você pode criar um índice em uma ou mais colunas emitindo a instrução CREATE INDEX.
Para obter mais informações, consulte Oracle Database SQL Reference for 10g or 11g database.
Observação: é possível criar manualmente um índice exclusivo, mas é recomendado que você
crie uma restrição UNIQUE que crie implicitamente um índice exclusivo.

Oracle Database: Fundamentos de SQL II 2 - 26


CREATE INDEX com a instrução CREATE TABLE

CREATE TABLE NEW_EMP


(employee_id NUMBER(6)
PRIMARY KEY USING INDEX
(CREATE INDEX emp_id_idx ON
NEW_EMP(employee_id)),
first_name VARCHAR2(20),
last_name VARCHAR2(25));

Oracle Internal & Oracle Academy Use Only


SELECT INDEX_NAME, TABLE_NAME
FROM USER_INDEXES
WHERE TABLE_NAME = 'NEW_EMP';

Copyright © 2011, Oracle. Todos os direitos reservados.

CREATE INDEX com a instrução CREATE TABLE


No exemplo do slide, a cláusula CREATE INDEX é usada com a instrução CREATE TABLE para
criar um índice de PRIMARY KEY explicitamente. Você pode nomear os índices no momento da
criação da PRIMARY KEY para diferenciá-lo do nome da restrição PRIMARY KEY.
Você pode consultar a view do dicionário de dados USER_INDEXES para obter informações
sobre seus índices.
Observação: Aprenda mais sobre USER_INDEXES na lição “Gerenciando Objetos com Views
do Dicionário de Dados”.
O exemplo a seguir ilustrará o comportamento do banco de dados se o índice não for nomeado
explicitamente:
CREATE TABLE EMP_UNNAMED_INDEX
(employee_id NUMBER(6) PRIMARY KEY ,
first_name VARCHAR2(20),
last_name VARCHAR2(25));

SELECT INDEX_NAME, TABLE_NAME


FROM USER_INDEXES
WHERE TABLE_NAME = 'EMP_UNNAMED_INDEX';

Oracle Database: Fundamentos de SQL II 2 - 27


CREATE INDEX com a Instrução CREATE TABLE (continuação)
Observe que o Oracle Server fornece um nome genérico ao índice criado para a coluna
PRIMARY KEY.
É possível também usar um índice existente para a coluna PRIMARY KEY —por exemplo,
quando houver uma grande carga de dados e você quiser acelerar a operação. Você pode
desativar as restrições durante a execução da carga e, em seguida, ativá-las, caso em que um
índice exclusivo na PRIMARY KEY ainda fará com que os dados sejam verificados durante a
carga. Portanto, um índice não-exclusivo pode ser criado na coluna designada como PRIMARY
KEY e, em seguida, ser criada uma coluna PRIMARY KEY e especificado que ela deve usar o
índice existente. Os exemplos a seguir ilustram esse processo:
Etapa 1: Crie a tabela:

CREATE TABLE NEW_EMP2

Oracle Internal & Oracle Academy Use Only


(employee_id NUMBER(6),
first_name VARCHAR2(20),
last_name VARCHAR2(25)
);

Etapa 2: Crie o índice:


CREATE INDEX emp_id_idx2 ON
new_emp2(employee_id);

Etapa 3: Crie a PRIMARY KEY:


ALTER TABLE new_emp2 ADD PRIMARY KEY (employee_id) USING INDEX
emp_id_idx2;

Oracle Database: Fundamentos de SQL II 2 - 28


Índices Baseados em Function

• Um índice com base em function é baseado em expressões.


• A expressão do índice é criada com base em colunas de
tabelas, constantes, functions SQL e functions definidas pelo
usuário.
CREATE INDEX upper_dept_name_idx
ON dept2(UPPER(department_name));

Oracle Internal & Oracle Academy Use Only


SELECT *
FROM dept2
WHERE UPPER(department_name) = 'SALES';

Copyright © 2011, Oracle. Todos os direitos reservados.

Índices Baseados em Function


Os índices com base em function definidos com as palavras-chave UPPER(column_name)ou
LOWER(column_name) permitem pesquisas sem distinção entre maiúsculas e minúsculas.
Por exemplo, considere o seguinte índice:
CREATE INDEX upper_last_name_idx ON emp2 (UPPER(last_name));
Isso facilita o processamento de consultas, como:
SELECT * FROM emp2 WHERE UPPER(last_name) = 'KING';
O Oracle Server usa o índice somente quando essa função em particular é usada em uma
consulta. Por exemplo, a seguinte instrução pode usar o índice, mas sem a cláusula WHERE, o
Oracle Server pode executar uma varredura completa da tabela:
SELECT *
FROM employees
WHERE UPPER (last_name) IS NOT NULL
ORDER BY UPPER (last_name);
Observação: O parâmetro de inicialização QUERY_REWRITE_ENABLED deve ser definido
como TRUE para que um índice com base em function seja usado.
O Oracle Server trata índices com colunas marcadas como DESC como índices com base em
função. As colunas marcadas como DESC são classificadas em ordem decrescente.

Oracle Database: Fundamentos de SQL II 2 - 29


Removendo um índice

• Remova um índice do dicionário de dados usando


o comando DROP INDEX:
DROP INDEX index;

• Remova o índice UPPER_DEPT_NAME_IDX do dicionário


de dados:

Oracle Internal & Oracle Academy Use Only


DROP INDEX upper_dept_name_idx;

• Para eliminar um índice, você deve ser o proprietário


do índice ou ter o privilégio DROP ANY INDEX.

Copyright © 2011, Oracle. Todos os direitos reservados.

Removendo um índice
Não é possível modificar índices. Para alterar um índice, primeiro elimine, depois recrie.
Remova uma definição de índice do dicionário de dados emitindo a instrução DROP INDEX.
Para eliminar um índice, você deve ser o proprietário do índice ou ter o privilégio DROP ANY
INDEX.
Na sintaxe:
index É o nome do índice
Observação: Se você eliminar uma tabela, os índices, as restrições e os triggers serão
automaticamente eliminados, mas as views e as sequências permanecerão.

Oracle Database: Fundamentos de SQL II 2 - 30


DROP TABLE … PURGE

DROP TABLE dept80 PURGE;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

DROP TABLE … PURGE


O Oracle Database fornece um recurso para eliminar tabelas. Quando você elimina uma tabela,o
banco de dados não libera imediatamente o espaço associado a ela. Em vez disso, ele renomeia a
tabela e a coloca em uma lixeira, de onde é possível recuperá-la mais tarde com a instrução
FLASHBACK TABLE, se você perceber que eliminou a tabela por engano. Se você quiser liberar
imediatamente o espaço associado à tabela no momento da emissão da instrução DROP TABLE,
inclua a cláusula PURGE conforme mostrado no slide.
Especifique PURGE somente se você quiser eliminar a tabela e liberar o espaço associado a ela
em uma única etapa. Se você especificar PURGE, o banco de dados não colocará a tabela e seus
objetos dependentes na lixeira.
O uso dessa cláusula é equivalente a eliminar a tabela e, em seguida, expurgá-la da lixeira. Essa
cláusula elimina uma etapa no processo. Ela também oferecerá segurança aprimorada se você
quiser evitar que material confidencial apareça na lixeira.

Oracle Database: Fundamentos de SQL II 2 - 31


Agenda de Lições

• Usando a instrução ALTER TABLE para adicionar,


modificar e eliminar uma coluna
• Gerenciando restrições:
– Adicionando e eliminando uma restrição
– Adiando constraints
– Ativando e desativando uma restrição
• Criando índices:

Oracle Internal & Oracle Academy Use Only


– Usando a instrução CREATE TABLE
– Criando índices baseados em function
– Removendo um índice
• Executando operações de flashback
• Criando e usando tabelas temporárias
• Criando e usando tabelas externas

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 2 - 32


Instrução FLASHBACK TABLE

• Permite recuperar tabelas em um determinado momento


com uma única instrução
• Restaura dados da tabela juntamente com índices
associados e restrições
• Permite reverter a tabela e seu conteúdo em um
determinado momento ou SCN

Oracle Internal & Oracle Academy Use Only


SCN

Copyright © 2011, Oracle. Todos os direitos reservados.

Instrução FLASHBACK TABLE


O Oracle Flashback Table permite recuperar tabelas em um determinado momento com uma
única instrução. É possível restaurar dados de tabela com índices associados e restrições
enquanto o banco de dados estiver on-line, desfazendo alterações somente para as tabelas
especificadas.
O recurso Flashback Table é semelhante a uma ferramenta de reparo personalizado. Por
exemplo, se um usuário deletar acidentalmente linhas importantes de uma tabela e quiser
recuperá-las, você poderá usar a instrução FLASHBACK TABLE para restaurar a tabela para o
momento antes da deleção e ver as linhas ausentes na tabela.
Ao utilizar a instrução FLASHBACK TABLE, você pode reverter a tabela e seu conteúdo para um
determinado momento ou um SCN.
Observação: O SCN é um valor inteiro associado a cada alteração no banco de dados. É um
número incremental exclusivo no banco de dados. Sempre que você submeter uma transação a
commit, um novo SCN é registrado.

Oracle Database: Fundamentos de SQL II 2 - 33


Instrução FLASHBACK TABLE
• Ferramenta de reparo para modificações acidentais na
tabela
– Restaura uma tabela para um momento anterior
– Vantagens: Fácil de usar, disponibilidade e execução rápida
– É executada no local
• Sintaxe:

FLASHBACK TABLE[schema.]table[,

Oracle Internal & Oracle Academy Use Only


[ schema.]table ]...
TO { TIMESTAMP | SCN } expr
[ { ENABLE | DISABLE } TRIGGERS ];

Copyright © 2011, Oracle. Todos os direitos reservados.

Instrução FLASHBACK TABLE (continuação)


Recurso de Reparo Personalizado
O Oracle Database fornece um comando SQL DDL (Data Definition Language) , FLASHBACK
TABLE, para restaurar o estado de uma tabela para um momento anterior no caso de deleção ou
modificação involuntária. O comando FLASHBACK TABLE é uma ferramenta de reparo
personalizado para restaurar dados em uma tabela, juntamente com atributos associados, como
índices ou views. Isso é feito enquanto o banco de dados está on-line, fazendo o rollback
somente das alterações subsequentes à tabela fornecida. Comparado a mecanismos de
recuperação tradicionais, esse recurso oferece vantagens significativas, como facilidade de uso,
disponibilidade e restauração rápida. Ele também tira a responsabilidade do DBA de localizar e
restaurar propriedades específicas da aplicação. O recurso de tabela flashback não trata de danos
físicos causados por um disco inválido.
Sintaxe
Você pode chamar uma operação FLASHBACK TABLE em uma ou mais tabelas, mesmo que em
esquemas diferentes. Especifique o momento para o qual você deseja reverter, fornecendo um
timestamp válido. Por padrão, os triggers do banco de dados são desativados durante a operação
de flashback para todas as tabelas envolvidas. Você pode substituir esse comportamento padrão
especificando a cláusula ENABLE TRIGGERS.
Observação: Para obter mais informações sobre a semântica da lixeira e de flashback, consulte
o Oracle Database Administrator’s Guide for 10g or 11g database.
Oracle Database: Fundamentos de SQL II 2 - 34
Usando a Instrução FLASHBACK TABLET

DROP TABLE emp2;

SELECT original_name, operation, droptime FROM


recyclebin;

Oracle Internal & Oracle Academy Use Only


FLASHBACK TABLE emp2 TO BEFORE DROP;

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando a Instrução FLASHBACK TABLET


Sintaxes e Exemplos
O exemplo restaura a tabela EMP2 para um estado antes da instrução DROP.
A lixeira é na verdade uma tabela de dicionário de dados que contém informações sobre objetos
eliminados. As tabelas eliminadas e todos os objetos associados—como índices, restrições,
tabelas aninhadas etc.—não são removidos e ainda ocupam espaço. Eles continuam a contar
cotas de espaço do usuário até que sejam especificamente expurgados da lixeira ou até serem
expurgados pelo banco de dados em razão de restrições de espaço do tablespace.
Cada usuário pode se considerar proprietário de uma lixeira porque, a menos que ele tenha o
privilégio SYSDBA, os únicos objetos aos quais o usuário terá acesso na lixeira serão os
pertencentes a ele. Um usuário pode exibir seus objetos na lixeira usando a seguintes instrução:
SELECT * FROM RECYCLEBIN;
Quando você elimina um usuário, nenhum dos objetos pertencentes a ele é colocado na lixeira e
nenhum dos objetos da lixeira é expurgado.
Você pode expurgar a lixeira com a seguinte instrução:
PURGE RECYCLEBIN;

Oracle Database: Fundamentos de SQL II 2 - 35


Agenda de Lições

• Usando a instrução ALTER TABLE para adicionar,


modificar e eliminar uma coluna
• Gerenciando restrições:
– Adicionando e eliminando uma restrição
– Adiando restrições
– Ativando e desativando uma restrição
• Criando índices:

Oracle Internal & Oracle Academy Use Only


– Usando a instrução CREATE TABLE
– Criando índices baseados em function
– Removendo um índice
• Executando operações de flashback
• Criando e usando tabelas temporárias
• Criando e usando tabelas externas

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 2 - 36


Tabelas Temporárias

Quando a
sessão/transação
for concluída

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Tabelas Temporárias
Uma tabela temporária é aquela que retém os dados existentes somente pela duração de uma
transação ou sessão. Os dados de uma tabela temporária são privados para a sessão, o que
significa que cada sessão só pode ver e modificar os próprios dados.
As tabelas temporárias são úteis em aplicações onde é necessário colocar um conjunto de
resultados em buffer. Por exemplo, um carrinho de compras em uma aplicação on-line pode ser
uma tabela temporária. Cada item é representado por uma linha na tabela temporária. Enquanto
você está comprando em uma loja on-line, pode continuar adicionando ou removendo itens do
carrinho. Durante a sessão, os dados desse carrinho são privados. Quando você finaliza a compra
e faz os pagamentos, a aplicação move a linha do carrinho escolhido para uma tabela
permanente. No fim da sessão, os dados da tabela temporária são automaticamente eliminados.
Como as tabelas temporárias são definidas estaticamente, você pode criar índices para elas. Os
índices criados em tabelas temporárias também são temporárias. Os dados do índice têm o
mesmo escopo da sessão ou transação que os dados da tabela temporária. Você também pode
criar uma view ou acionar uma tabela temporária.

Oracle Database: Fundamentos de SQL II 2 - 37


Criando uma Tabela Temporária

CREATE GLOBAL TEMPORARY TABLE cart


ON COMMIT DELETE ROWS; 1

CREATE GLOBAL TEMPORARY TABLE today_sales

Oracle Internal & Oracle Academy Use Only


ON COMMIT PRESERVE ROWS AS
SELECT * FROM orders
WHERE order_date = SYSDATE; 2

Copyright © 2011, Oracle. Todos os direitos reservados.

Criando uma Tabela Temporária


Para criar uma tabela temporária, você pode usar o seguinte comando:
CREATE GLOBAL TEMPORARY TABLE tablename
ON COMMIT [PRESERVE | DELETE] ROWS
Associando uma das configurações a seguir com a cláusula ON COMMIT, você pode decidir se
os dados da tabela temporária são específicos da transação (default) ou da sessão.
• DELETE ROWS: Como mostrado no exemplo 1 do slide, a configuração DELETE ROWS
cria uma tabela temporária que é específica da transação. Uma sessão se associa à tabela
temporária com a primeira inserção da transação na tabela. O binding é desfeito no fim da
transação. O banco de dados trunca a tabela (deleta todas as linhas) depois da cada commit.
• PRESERVE ROWS: Como mostrado no exemplo 2 do slide, a configuração PRESERVE
ROWS cria uma tabela temporária que é específica da sessão. Cada sessão do representante
de vendas pode armazenar seus próprios dados de venda para o dia na tabela. Quando um
vendedor executa a primeira inserção na tabela today_sales, sua sessão se associa à
tabela today_sales. Esse binding é desfeito ao fim da sessão ou com a emissão de um
TRUNCATE da tabela na sessão. O banco de dados trunca a tabela quando você encerra a
sessão.
Quando você cria uma tabela temporária em um banco de dados Oracle, cria uma definição de
tabela estática. Como ocorre com tabelas permanentes, as temporárias são definidas no
dicionários de dados. No entanto, as tabelas temporárias e seus índices não alocam
automaticamente um segmento quando criadas. Em vez disso, os segmentos temporários são
alocados quando os dados são inseridos. Até os dados serem carregados em uma sessão, a tabela
aparece vazia.
Oracle Database: Fundamentos de SQL II 2 - 38
Agenda de Lições

• Usando a instrução ALTER TABLE para adicionar,


modificar e eliminar uma coluna
• Gerenciando restrições:
– Adicionando e eliminando uma restrição
– Adiando restrições
– Ativando e desativando uma restrição
• Criando índices:

Oracle Internal & Oracle Academy Use Only


– Usando a instrução CREATE TABLE
– Criando índices baseados em function
– Removendo um índice
• Executando operações de flashback
• Criando e usando tabelas temporárias
• Criando e usando tabelas externas

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 2 - 39


Tabelas Externas

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Tabelas Externas
Uma tabela externa é uma tabela somente para leitura cujos metadados são armazenados no
banco de dados, mas cujos dados são armazenados fora do banco de dados. Essa definição de
tabela externa pode ser considerada como uma view usada para executar qualquer consulta SQL
de dados externos sem precisar que os dados externos sejam carregados primeiro no banco de
dados. Os dados da tabela externa podem ser consultados e associados diretamente e em paralelo
sem requerer que os dados externos sejam carregados primeiro no banco de dados. Você pode
usar SQL, PL/SQL e Java para consultar os dados de uma tabela externa.
A diferença principal entre as tabelas externas e as comuns é que as tabelas organizadas
externamente são somente para leitura. Não é possível executar nenhuma operação DML (Data
Manipulation Language) e nenhum índice pode ser criado. Entretanto, você pode criar uma
tabela externa e descarregar dados usando o comando CREATE TABLE AS SELECT.
O Oracle Server oferece dois drivers de acesso principais para tabelas externas. Um, o driver de
acesso do carregador (ou ORACLE_LOADER), é usado para ler dados de arquivos externos cujo
formato possa ser interpretado pelo utilitário SQL*Loader. Observe que nem toda
funcionalidade do SQL*Loader é compatível com tabelas externas. O driver de acesso
ORACLE_DATAPUMP pode ser usado para importar e exportar dados usando um formato
independente da plataforma. O driver de acesso ORACLE_DATAPUMP grava linhas de uma
instrução SELECT para serem carregadas em uma tabela externa como parte de uma instrução
CREATE TABLE ...ORGANIZATION EXTERNAL...AS SELECT. Em seguida, você pode
usar SELECT para ler dados desse arquivo de dados. Também é possível criar uma definição de
tabela externa em outro sistema e usar esse arquivo de dados. Isso permite que os dados sejam
movidos entre os bancos de dados Oracle.
Oracle Database: Fundamentos de SQL II 2 - 40
Criando um Diretório para a Tabela Externa

Crie um objeto DIRECTORY que corresponda ao diretório no


sistema de arquivos em que reside a origem de dados
externos.

CREATE OR REPLACE DIRECTORY emp_dir


AS '/…/emp_dir';

Oracle Internal & Oracle Academy Use Only


GRANT READ ON DIRECTORY emp_dir TO ora_21;

Copyright © 2011, Oracle. Todos os direitos reservados.

Exemplo de Criação de uma Tabela Externa


Use a instrução CREATE DIRECTORY para criar um objeto de diretório. Um objeto de diretório
especifica um apelido para um diretório no sistema de arquivos do servidor em que reside uma
origem de dados externos. Você pode usar os nomes do diretório ao se referir a uma origem de
dados externos, em vez de codificar o nome do caminho do sistema operacional, para obter mais
flexibilidade no gerenciamento do arquivo.
Para criar diretórios, é necessário ter privilégios de sistema CREATE ANY DIRECTORY. Ao
criar um diretório, você recebe automaticamente os privilégios de objeto READ and WRITE e
pode conceder esses mesmos privilégios a outros usuários e funções. O DBA também pode
conceder esses privilégios a outros usuários e funções.
Um usuário precisa de privilégios READ para todos os diretórios usados nas tabelas externas a
serem acessadas e privilégios WRITE para os diretórios em que estão sendo usados arquivos de
log, de registros incorretos e de descarte.
Além disso, um privilégio WRITE é necessário quando a estrutura da tabela externa é usada para
descarregar dados.
A Oracle também fornece o tipo ORACLE_DATAPUMP, com o qual é possível descarregar dados
(ou seja, ler dados de uma tabela no banco de dados e inseri-los em uma tabela externa) e, em
seguida, recarregá-los no banco de dados Oracle. Essa é uma operação de uma única vez que
pode ser executada quando a tabela for criada. Depois da criação e preenchimento inicial, você
pode atualizar, inserir ou deletar qualquer linha.
Oracle Database: Fundamentos de SQL II 2 - 41
Exemplo de Criação de uma Tabela Externa (continuação)
Sintaxe
CREATE [OR REPLACE] DIRECTORY AS 'path_name';
Na sintaxe:
OR REPLACE Especifique OR REPLACE ou recrie o objeto de banco de dados de diretório
se ele já existir. Essa cláusula pode ser usada para alterar
a definição de um diretório sem eliminar, recriar
e conceder novamente privilégios de objeto de banco de dados
sobre o diretório. Os usuários que receberam privilégios anteriormente
sobre um diretório redefinido podem continuar a acessar o diretório
sem a necessidade de nova concessão.
directory Especifique o nome do objeto de diretório a ser criado. O
tamanho máximo do nome do diretório é de 30 bytes. Você

Oracle Internal & Oracle Academy Use Only


não pode qualificar um objeto de diretório com um nome de esquema.
'path_name' Especifique o nome do caminho completo do diretório do sistema
operacional a ser acessado. O nome do caminho faz distinção entre
maiúsculas e minúsculas.

Oracle Database: Fundamentos de SQL II 2 - 42


Criando uma Tabela Externa

CREATE TABLE <table_name>


( <col_name> <datatype>, … )
ORGANIZATION EXTERNAL
(TYPE <access_driver_type>
DEFAULT DIRECTORY <directory_name>

Oracle Internal & Oracle Academy Use Only


ACCESS PARAMETERS
(… ) )
LOCATION ('<location_specifier>')
REJECT LIMIT [0 | <number> | UNLIMITED];

Copyright © 2011, Oracle. Todos os direitos reservados.

Criando uma Tabela Externa


Você pode criar tabelas externas usando a cláusula ORGANIZATION EXTERNAL da instrução
CREATE TABLE. Na verdade, uma tabela não está sendo criada. Estão sendo criados metadados
no dicionário de dados que você pode usar para acessar dados externos. Use a cláusula
ORGANIZATION para especificar a ordem na qual são armazenadas as linhas de dados da
tabela. Ao especificar EXTERNAL na cláusula ORGANIZATION, você indica que a tabela é
somente para leitura, localizada fora do banco de dados. Observe que os arquivos externos já
deverão existir fora do banco de dados.
TYPE <access_driver_type> indica o driver de acesso da tabela externa. O driver de
acesso é a API (application programming interface) que interpreta os dados externos para o
banco de dados. Se você não especificar TYPE, o Oracle usará o driver de acesso padrão,
ORACLE_LOADER. A outra opção é ORACLE_DATAPUMP.
Use a cláusula DEFAULT DIRECTORY para especificar um ou mais objetos de diretório do
banco de dados Oracle que correspondam aos diretórios no sistema de arquivos em que podem
residir as origens de dados externos.
A cláusula ACCESS PARAMETERS opcional permite atribuir valores aos parâmetros do driver
de acesso específico para essa tabela externa.

Oracle Database: Fundamentos de SQL II 2 - 43


Criando uma Tabela Externa (continuação)
Use a cláusula LOCATION para especificar um localizador externo para cada origem de dados
externos. Geralmente, <location_specifier> é um arquivo, mas não precisa ser.
A cláusula REJECT LIMIT permite especificar quantos erros de conversão podem ocorrer
durante uma consulta dos dados externos antes de um erro Oracle ser retornado e a consulta ser
interrompida. O valor padrão é 0.
A sintaxe para uso do driver de acesso ORACLE_DATAPUMP é como se segue:
CREATE TABLE extract_emps
ORGANIZATION EXTERNAL (TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY …
ACCESS PARAMETERS (… )
LOCATION (…)

Oracle Internal & Oracle Academy Use Only


PARALLEL 4
REJECT LIMIT UNLIMITED
AS
SELECT * FROM …;

Oracle Database: Fundamentos de SQL II 2 - 44


Criando uma Tabela Externa Usando
o ORACLE_LOADER

CREATE TABLE oldemp (


fname char(25), lname CHAR(25))
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY emp_dir
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE

Oracle Internal & Oracle Academy Use Only


NOBADFILE
NOLOGFILE
FIELDS TERMINATED BY ','
(fname POSITION ( 1:20) CHAR,
lname POSITION (22:41) CHAR))
LOCATION ('emp.dat'))
PARALLEL 5
REJECT LIMIT 200;

Copyright © 2011, Oracle. Todos os direitos reservados.

Exemplo de Criação de uma Tabela Externa Usando o Driver de Acesso


ORACLE_LOADER
Suponha que exista um flat file com registros no seguinte formato:
10,jones,11-Dec-1934
20,smith,12-Jun-1972
Os registros são delimitados por novas linhas, e os campos terminam com uma vírgula ( , ). O
nome do arquivo é /emp_dir/emp.dat.
Para converter esse arquivo como origem de dados para uma tabela externa, cujos metadados
residirão no banco de dados, execute as seguintes etapas:
1. Crie um objeto de diretório, emp_dir, como se segue:
CREATE DIRECTORY emp_dir AS '/emp_dir' ;
2. Execute o comando CREATE TABLE mostrado no slide.
O exemplo no slide ilustra a especificação de tabela para criar uma tabela externa para o
arquivo:
/emp_dir/emp.dat

Oracle Database: Fundamentos de SQL II 2 - 45


Exemplo de Criação de uma Tabela Externa Usando o Driver de Acesso
ORACLE_LOADER (continuação)
No exemplo, a especificação TYPE é fornecida somente para ilustrar seu uso.
ORACLE_LOADER será o driver de acesso padrão se não estiver especificado. A opção ACCESS
PARAMETERS fornece valores aos parâmetros do driver de acesso específico, que são
interpretados pelo driver, não pelo Oracle Server.
A cláusula PARALLEL permite que cinco servidores de execução paralela façam varredura
simultânea nas origens (arquivos) de dados externos durante a execução da instrução INSERT
INTO TABLE. Por exemplo, se foi especificado PARALLEL=5, mais de um servidor de
execução paralela poderá ser executado em uma origem de dados. Como as tabelas externas
podem ser muito grandes, por motivos de desempenho, é aconselhável especificar a cláusula
PARALLEL ou uma dica paralela para a consulta.
A cláusula REJECT LIMIT especifica que se ocorrerem mais de 200 erros de conversão durante

Oracle Internal & Oracle Academy Use Only


uma consulta dos dados externos, a consulta será interrompida e retornará um erro. Esses erros
de conversão podem ocorrer quando o driver de acesso tenta transformar os dados no arquivo de
dados para corresponder à definição de tabela externa.
Depois de o comando CREATE TABLE ser executado com êxito, a tabela externa OLDEMP
poderá ser descrita e consultada como uma tabela relacional.

Oracle Database: Fundamentos de SQL II 2 - 46


Consultando Tabelas Externas

SELECT *
FROM oldemp

Oracle Internal & Oracle Academy Use Only


OLDEMP
emp.dat

Copyright © 2011, Oracle. Todos os direitos reservados.

Consultando Tabelas Externas


Uma tabela externa não descreve dados armazenados no banco de dados. Ela não descreve como
os dados são armazenados na origem externa. Em vez disso, ela descreve como a camada da
tabela externa deve apresentar os dados ao servidor. É responsabilidade do driver de acesso e da
camada de tabela externa fazer as transformações necessárias nos dados no arquivo de dados
para que corresponda à definição da tabela externa.
Quando o servidor de banco de dados acessa dados em uma origem externa, ele chama o driver
de acesso apropriado para obter os dados de uma origem externa em um formato esperado pelo
servidor de banco de dados.
É importante lembrar que a descrição dos dados na origem de dados é separada da definição da
tabela externa. O arquivo de origem pode conter mais ou menos campos do que as colunas
existentes na tabela. Além disso, os tipos de dados dos campos na origem de dados podem ser
diferentes das colunas na tabela. O driver de acesso se encarrega de assegurar que os dados da
origem sejam processados a fim de corresponderem à definição da tabela externa.

Oracle Database: Fundamentos de SQL II 2 - 47


Criando uma Tabela Externa Usando
o ORACLE_DATAPUMP: Exemplo

CREATE TABLE emp_ext


(employee_id, first_name, last_name)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY emp_dir
LOCATION

Oracle Internal & Oracle Academy Use Only


('emp1.exp','emp2.exp')
)
PARALLEL
AS
SELECT employee_id, first_name, last_name
FROM employees;

Copyright © 2011, Oracle. Todos os direitos reservados.

Criando uma Tabela Externa Usando o ORACLE_DATAPUMP: Exemplo


Você pode executar operações de descarregamento e recarregamento com tabelas externas
usando o driver de acesso ORACLE_DATAPUMP.
Observação: No contexto de tabelas externas, o carregamento de dados é a leitura dos dados de
uma tabela externa e carregamento em uma tabela no banco de dados. O descarregamento de
dados é a leitura de dados de uma tabela e inserção em uma tabela externa.
O exemplo no slide ilustra a especificação da tabela para criar uma tabela externa usando o
driver de acesso ORACLE_DATAPUMP. Os dados são preenchidos em dois arquivos:
emp1.exp e emp2.exp.
Para preencher dados lidos a partir da tabela EMPLOYEES em uma tabela externa, é necessário
executar as seguintes etapas:
1. Crie um objeto de diretório, emp_dir, como se segue:
CREATE DIRECTORY emp_dir AS '/emp_dir' ;
2. Execute o comando CREATE TABLE mostrado no slide.
Observação: O diretório emp_dir é o mesmo criado no exemplo anterior para
ORACLE_LOADER.
Você pode consultar a tabela externa executando o seguinte código:
SELECT * FROM emp_ext;

Oracle Database: Fundamentos de SQL II 2 - 48


Questionário

Uma restrição FOREIGN KEY impõe a seguinte ação: Quando


os dados na chave pai são deletados, todas as linhas na tabela
filha, que dependem dos valores deletados da chave pai,
também são deletadas.
1. Verdadeiro
2. Falso

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Resposta: 2

Oracle Database: Fundamentos de SQL II 2 - 49


Questionário

Em todos os casos, quando você executa um comando DROP


TABLE, o banco de dados renomeia a tabela e a coloca em
uma lixeira, de onde ela pode ser recuperada mais tarde por
meio da instrução FLASHBACK TABLE.
1. Verdadeiro
2. Falso

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Resposta: 2

Oracle Database: Fundamentos de SQL II 2 - 50


Sumário

Nesta lição, você aprendeu a:


• Adicionar restrições
• Criar índices
• Criar índices usando a instrução CREATE TABLE
• Criar índices baseados em function
• Eliminar e definir colunas como UNUSED

Oracle Internal & Oracle Academy Use Only


• Executar operações FLASHBACK
• Criar e usar tabelas externas

Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
Nesta lição, você aprendeu a executar as seguintes tarefas para gerenciamento de objeto de
esquema:
• Alterar tabelas para adicionar ou modificar colunas ou restrições.
• Criar índices baseados ou não em function usando a instrução CREATE INDEX.
• Eliminar colunas não usadas.
• Usar mecanismos de FLASHBACK para restaurar tabelas.
• Usar a cláusula ORGANIZATION EXTERNAL da instrução CREATE TABLE para
criar uma tabela externa. Uma tabela externa é uma tabela somente para leitura cujos
metadados são armazenados no banco de dados, mas cujos dados são armazenados fora do
banco de dados.
• Usar tabelas externas para consultar dados sem carregá-los primeiro no banco de dados.
• Nomear índices da coluna PRIMARY KEY durante a criação da tabela com a instrução
CREATE TABLE.

Oracle Database: Fundamentos de SQL II 2 - 51


Exercício 2: Visão Geral

Este exercício aborda os seguintes tópicos:


• Alteração de tabelas
• Adição de colunas
• Eliminação de colunas
• Criação de índices
• Criação de tabelas externas

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Exercício 2: Visão Geral


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.

Oracle Database: Fundamentos de SQL II 2 - 52


Gerenciando Objetos
com Views do Dicionário de Dados

Oracle Internal & Oracle Academy Use Only


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

Ao concluir esta lição, você será capaz de:


• Usar views do dicionário de dados para pesquisar dados
sobre seus objetos
• Consultar várias views do dicionário de dados

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Nesta lição, você conhecerá as views do dicionário de dados. Aprenderá que as views do
dicionário de dados podem ser usadas para recuperar metadados e criar relatórios sobre seus
objetos de esquema.

Oracle Database: Fundamentos de SQL II 3 - 2


Agenda de Lições

• Introdução ao dicionário de dados


• Consultando views do dicionário de dados sobre:
– Informações da tabela
– Informações da coluna
– Informações de constraint
• Consultando views do dicionário de dados sobre:

Oracle Internal & Oracle Academy Use Only


– Informações da view
– Informações de sequência
– Informações de sinônimo
– Informações do índice
• Adicionando um comentário a uma tabela e consultando
views de dicionário sobre informações de comentário

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 3 - 3


Dicionário de Dados

Oracle Server

Tabelas que Views de dicionário


contêm dados de dados:

Oracle Internal & Oracle Academy Use Only


comerciais: DICTIONARY
FUNCIONÁRIOS USER_OBJECTS
DEPARTMENTS USER_TABLES
LOCATIONS USER_TAB_COLUMNS
JOB_HISTORY ...
...

Copyright © 2011, Oracle. Todos os direitos reservados.

Dicionário de Dados
As tabelas do usuário são criadas pelo usuário e contêm dados comerciais, como EMPLOYEES.
Há outro conjunto de tabelas e views no banco de dados Oracle conhecido como dicionário de
dados Esse conjunto é criado e mantido pelo Oracle Server e contém informações sobre o banco
de dados. O dicionário de dados é estruturado em tabelas e views, da mesma forma que outros
dados do banco de dados. Não é apenas a central do dicionário de dados de cada banco de dados
Oracle, mas é uma ferramenta importante para todos os usuários, desde os usuários finais até
designers de aplicação e administradores de banco de dados.
O dicionário de dados é acessado por meio de instruções SQL. Como o dicionário de dados é
somente para leitura, você só pode consultar suas tabelas e views.
Podem ser consultadas views do dicionário baseadas nas tabelas do dicionário para localizar
informações como:
• Definições de todos os objetos de esquema no banco de dados (tabelas, views, índices,
sinônimos, sequências, procedures, functions, packages, triggers etc.)
• Valores padrão para colunas
• Informações de constraint de integridade
• Nomes de usuários Oracle
• Privilégios e funções que cada usuário recebeu
• Outras informações gerais do banco de dados

Oracle Database: Fundamentos de SQL II 3 - 4


Estrutura do Dicionário de Dados

Oracle Server

Consiste em:

Oracle Internal & Oracle Academy Use Only


– Tabelas-base
– Views acessíveis ao usuário

Copyright © 2011, Oracle. Todos os direitos reservados.

Estrutura do Dicionário de Dados


As tabelas-base subjacentes armazenam informações sobre o banco de dados associado.
Somente o Oracle Server deve gravar e ler essas tabelas. Você raramente as acessa diretamente.
Há várias views que resumem e exibem informações armazenadas nas tabelas-base do dicionário
de dados. Essas views decodificam os dados da tabela-base em informações úteis (como nomes
de usuário ou de tabela) usando joins e cláusulas WHERE para simplificar as informações. A
maioria dos usuários recebe acesso às views, e não às tabelas-base.
O usuário Oracle SYS é proprietário de todas as views do dicionário de dados de tabelas-base e
acessíveis ao usuário. Um usuário Oraclenunca deve alterar (ATUALIZAR, DELETAR nem
INSERIR) linhas ou objetos de esquema contidos no esquema SYS, pois essa atividade pode
comprometer a integridade de dados.

Oracle Database: Fundamentos de SQL II 3 - 5


Estrutura do Dicionário de Dados

Convenção de nomeação de view:

Prefixo da View Objetivo


USER View do usuário (o conteúdo do seu esquema e
pertencente a você)
ALL View expandida do usuário (o que você pode
acessar)
DBA View do administrador do banco de dados (o

Oracle Internal & Oracle Academy Use Only


conteúdo dos esquemas de todos os usuários)
V$ Dados relacionados ao desempenho

Copyright © 2011, Oracle. Todos os direitos reservados.

Estrutura do Dicionário de Dados (continuação)


O dicionário de dados é constituído de conjuntos de views. Em muitos casos, um conjunto
consiste em três views contendo informações semelhantes e distintas entre si por seus prefixos.
Por exemplo, há uma view nomeada USER_OBJECTS, outra, ALL_OBJECTS e uma terceira,
DBA_OBJECTS.
Essas três views contêm informações semelhantes sobre os objetos no banco de dados, exceto
pelo escopo, que é diferente. USER_OBJECTS contém informações sobre objetos pertencentes
ou criados por você. ALL_OBJECTS contém informações sobre todos os objetos aos quais você
possui acesso. DBA_OBJECTS contém informações sobre todos os objetos pertencentes a todos
os usuários. Para views prefixadas com ALL ou DBA, geralmente há uma coluna adicional na
view nomeada OWNER para identificar o proprietário do objeto.
Há também um conjunto de views prefixado com v$. Essas views são dinâmicas e contém
informações sobre desempenho. As tabelas dinâmicas de desempenho não são tabelas reais e
elas não devem ser acessadas pela maioria dos usuários. Entretanto, os administradores do banco
de dados podem consultar e criar views nas tabelas e conceder acesso a essas views a outros
usuários. Este curso não aborda detalhes sobre essas views.

Oracle Database: Fundamentos de SQL II 3 - 6


Como Usar Views de Dicionário

Comece com DICTIONARY. Ela contém nomes e descrições


das tabelas e views de dicionário.
DESCRIBE DICTIONARY

Oracle Internal & Oracle Academy Use Only


SELECT *
FROM dictionary
WHERE table_name = 'USER_OBJECTS';

Copyright © 2011, Oracle. Todos os direitos reservados.

Como Usar Views de Dicionário


Para se familiarizar com as views de dicionário, você pode usar a view DICTIONARY. Ela
contém o nome e a descrição curta de cada view de dicionário à qual você possui acesso.
É possível criar consultas para pesquisar informações sobre um nome de view específico ou
pesquisar uma palavra ou frase na coluna COMMENTS. No exemplo mostrado abaixo, é descrita
a view DICTIONARY. Ela possui duas colunas. A instrução SELECT recupera informações
sobre a view de dicionário USER_OBJECTS. A view USER_OBJECTS contém informações
sobre todos os objetos que pertencem a você.
Você pode criar consultas para pesquisar uma palavra ou frase na coluna COMMENTS. Por
exemplo, a consulta a seguir retorna os nomes de todas as views que você pode acessar em que a
coluna COMMENTS contém a palavra colunas:
SELECT table_name
FROM dictionary
WHERE LOWER(comments) LIKE '%columns%';
Observação: Os nomes no dicionário de dados estão em maiúsculas.

Oracle Database: Fundamentos de SQL II 3 - 7


USER_OBJECTS e ALL_OBJECTS Views

USER_OBJECTS:
• Consulte USER_OBJECTS para ver todos os objetos que
pertencem a você
• Usando USER_OBJECTS, você pode obter uma lista de
todos os nomes e tipos de objeto em seu esquema, além
das seguintes informações adicionais:

Oracle Internal & Oracle Academy Use Only


– Data de criação
– Data da última modificação
– Status (válido ou inválido)
ALL_OBJECTS:
• Consulte ALL_OBJECTS para ver todos os objetos aos
quais você possui acesso.

Copyright © 2011, Oracle. Todos os direitos reservados.

USER_OBJECTS e ALL_OBJECTS Views


Você pode consultar a view USER_OBJECTS para ver nomes e tipos de todos os objetos em seu
esquema. Existem várias colunas nesta view:
• OBJECT_NAME: Nome do objeto
• OBJECT_ID: Número do objeto do dicionário
• OBJECT_TYPE: Tipo de objeto (como TABLE, VIEW, INDEX, SEQUENCE)
• CREATED: Timestamp da criação do objeto
• LAST_DDL_TIME: Timestamp da última modificação do objeto resultante de um comando
DDL (Data Definition Language)
• STATUS: Status do objeto (VALID, INVALID ou N/A)
• GENERATED: O nome deste sistema de objeto foi gerado? (Y|N)

Observação: Esta não é uma lista completa de colunas. Para obter uma lista completa, consulte
"USER_OBJECTS” no Oracle Database Reference.
Você também pode consultar a view ALL_OBJECTS para obter uma lista de todos os objetos
aos quais tem acesso.

Oracle Database: Fundamentos de SQL II 3 - 8


USER_OBJECTS View

SELECT object_name, object_type, created, status


FROM user_objects
ORDER BY object_type;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

USER_OBJECTS View
O exemplo mostra nomes, tipos, datas de criação e status de todos os objetos pertencentes a este
usuário.
A coluna OBJECT_TYPE contém os valores de TABLE, VIEW, SEQUENCE, INDEX,
PROCEDURE, FUNCTION, PACKAGE ou TRIGGER.
A coluna STATUS contém o valor VALID, INVALID ou N/A. Embora as tabelas sejam sempre
válidas, as views, os procedures, as functions, os packages e os triggers podem ser inválidos.
A View CAT
Para obter uma consulta e resultado simplificados, você pode consultar a view CAT. Essa view
contém apenas duas colunas: TABLE_NAME e TABLE_TYPE. Ela fornece os nomes de todos os
objetos INDEX, TABLE, CLUSTER, VIEW, SYNONYM, SEQUENCE ou UNDEFINED.
Observação: CAT é um sinônimo para USER_CATALOG—uma view que lista tabelas, views,
sinônimos e sequências pertencentes ao usuário.

Oracle Database: Fundamentos de SQL II 3 - 9


Agenda de Lições

• Introdução ao dicionário de dados


• Consultando views do dicionário de dados sobre:
– Informações da tabela
– Informações da coluna
– Informações de constraint
• Consultando views do dicionário de dados sobre:

Oracle Internal & Oracle Academy Use Only


– Informações da view
– Informações de sequência
– Informações de sinônimo
– Informações do índice
• Adicionando um comentário a uma tabela e consultando
views de dicionário sobre informações de comentário

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 3 - 10


Informações da Tabela

USER_TABLES:
DESCRIBE user_tables

Oracle Internal & Oracle Academy Use Only


SELECT table_name
FROM user_tables;

Copyright © 2011, Oracle. Todos os direitos reservados.

Informações da Tabela
Você pode usar a view USER_TABLES para obter os nomes de todas as suas tabelas. A view
USER_TABLES contém informações sobre suas tabelas. Além de fornecer o nome da tabela, ela
contém informações detalhadas sobre o armazenamento.
A view TABS é um sinônimo da view USER_TABLES. Ela pode ser consultada para obter uma
lista de tabelas pertencentes a você:
SELECT table_name
FROM tabs;
Observação: Para obter uma lista completa de colunas na view USER_TABLES, consulte
“USER_TABLES” no Oracle Database Reference.
Você também pode consultar a view ALL_TABLES para obter uma lista de todas as tabelas às
quais tem acesso.

Oracle Database: Fundamentos de SQL II 3 - 11


Informações da Coluna

USER_TAB_COLUMNS:
DESCRIBE user_tab_columns

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Informações da Coluna
Consulte a view USER_TAB_COLUMNS para localizar informações detalhadas sobre as colunas
em suas tabelas. Embora a view USER_TABLES forneça informações sobre nomes de tabela e
armazenamento, informações detalhadas sobre a coluna estão localizadas na view
USER_TAB_COLUMNS.
Essa view contém informações como:
• Nomes de colunas
• Tipos de dados de coluna
• Comprimento dos tipos de dados
• Precisão e escala para colunas NUMBER
• Se os nulos são permitidos (Há uma constraint NOT NULL na coluna?)
• Valor padrão
Observação: Para obter uma lista e descrição completas das colunas na view
USER_TAB_COLUMNS, consulte “USER_TAB_COLUMNS” no Oracle Database Reference.

Oracle Database: Fundamentos de SQL II 3 - 12


Informações da Coluna

SELECT column_name, data_type, data_length,


data_precision, data_scale, nullable
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES';

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Informações da Coluna (continuação)


Ao consultar a tabela USER_TAB_COLUMNS, você pode localizar detalhes sobre suas colunas,
como nomes, tipos de dados, comprimentos do tipo de dados, constraints nulas e valor padrão de
uma coluna.
O exemplo mostrado exibe colunas, tipos de dados, comprimentos de dados e constraints nulas
para a tabela EMPLOYEES. Observe que essas informações são semelhantes às obtidas com o
comando DESCRIBE.
Para exibir informações sobre colunas definidas como não usadas, utilize a view de dicionário
USER_UNUSED_COL_TABS.
Observação: Os nomes dos objetos do Dicionário de Dados estão em maiúscula.

Oracle Database: Fundamentos de SQL II 3 - 13


Informações de Constraint

• USER_CONSTRAINTS descreve as definições de constraint


sobre suas tabelas.
• USER_CONS_COLUMNS descreve colunas que pertencem
a você e que são especificadas nas constraints.
DESCRIBE user_constraints

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Informações de Constraint
Você pode descobrir os nomes e o tipo de constraints, o nome da tabela à qual a constraint se
aplica, a condição das constraints de verificação, as informações de constraint da chave
estrangeira, a regra de deleção de constraints de chave estrangeira, o status e muitos outros tipos
de informações.
Observação: Para obter uma lista e descrição completas das colunas na view
USER_CONSTRAINTS, consulte “USER_CONSTRAINTS” no Oracle Database Reference.

Oracle Database: Fundamentos de SQL II 3 - 14


USER_CONSTRAINTS: Exemplo

SELECT constraint_name, constraint_type,


search_condition, r_constraint_name,
delete_rule, status
FROM user_constraints
WHERE table_name = 'EMPLOYEES';

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

USER_CONSTRAINTS: Exemplo
No exemplo mostrado, a view USER_CONSTRAINTS é consultada para localizar nomes, tipos,
verificar condições, nome da constraint exclusiva a que a chave estrangeira faz referência, regra
de deleção de uma chave estrangeira e status da constraint na tabelaEMPLOYEES.
CONSTRAINT_TYPE pode ser:
• C (constraint de verificação em uma tabela ou NOT NULL)
• P (chave primária)
• U (chave exclusiva)
• R (integridade referencial)
• V (com a opção de verificação, em uma view)
• O (com a opção somente para leitura, em uma view)

A DELETE_RULE pode ser:


• CASCADE: Se o registro pai for deletado, os registros filhos também serão.
• SET NULL: Se o registro pai for deletado, altere os respectivos registros filhos para nulo.
• NO ACTION: Um registro pai pode só poderá ser deletado se não houver nenhum registro
filho.
O STATUS pode ser:
• ENABLED: A constraint está ativa.
• DISABLED: A constraint está desativada.

Oracle Database: Fundamentos de SQL II 3 - 15


Consultando USER_CONS_COLUMNS

DESCRIBE user_cons_columns

Oracle Internal & Oracle Academy Use Only


SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name = 'EMPLOYEES';


Copyright © 2011, Oracle. Todos os direitos reservados.

Consultando USER_CONS_COLUMNS
Para localizar os nomes das colunas às quais uma constraint se aplica, consulte a view de
dicionário USER_CONS_COLUMNS. Essa view informa o nome do proprietário de uma
constraint, o nome da constraint, a tabela e as colunas que contêm a constraint e a posição
original da coluna ou atributo na definição do objeto.
Observação: Uma constraint pode ser aplicada a mais de uma coluna.
Você também pode criar uma join entre USER_CONSTRAINTS e USER_CONS_COLUMNS a
fim de criar um resultado personalizado com base nas duas tabelas.

Oracle Database: Fundamentos de SQL II 3 - 16


Agenda de Lições

• Introdução ao dicionário de dados


• Consultando views do dicionário de dados sobre:
– Informações da tabela
– Informações da coluna
– Informações de constraint
• Consultando views do dicionário de dados sobre:

Oracle Internal & Oracle Academy Use Only


– Informações da view
– Informações de sequência
– Informações de sinônimo
– Informações do índice
• Adicionando um comentário a uma tabela e consultando
views de dicionário sobre informações de comentário

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 3 - 17


Informações da View

1 DESCRIBE user_views

2 SELECT view_name FROM user_views;

Oracle Internal & Oracle Academy Use Only


3 SELECT text FROM user_views
WHERE view_name = 'EMP_DETAILS_VIEW';

Copyright © 2011, Oracle. Todos os direitos reservados.

Informações da View
Depois de criar a view, você pode consultar a view de dicionário de dados USER_VIEWS para
obter o nome e a definição da view. O texto da instrução SELECT que constitui sua view é
armazenado na coluna LONG. A coluna LENGTH representa o número de caracteres na instrução
SELECT. Por padrão, quando você seleciona a coluna LONG, são exibidos somente os 80
primeiros caracteres do valor da coluna. Para ver mais de 80 caracteres no SQL*Plus, use o
comando SET LONG:
SET LONG 1000
Nos exemplos do slide:
1. As colunas USER_VIEWS são exibidas. Note que essa é uma lista parcial.
2. Os nomes de suas views são recuperados
3. A instrução SELECT para EMP_DETAILS_VIEW é exibida a partir do dicionário
Acesso a Dados Usando Views
Quando você acessa dados usando uma view, o Oracle Server executa as seguintes operações:
• Ele recupera a definição da view da tabela de dicionário de dados USER_VIEWS.
• Ele verifica os privilégios de acesso para a tabela-base da view.
• Ele converte a consulta da view em uma operação equivalente na tabela(s)-base
subjacente(s). Ou seja, os dados são recuperados das tabelas-base ou uma atualização é feita
nelas.

Oracle Database: Fundamentos de SQL II 3 - 18


Informações de Sequência

DESCRIBE user_sequences

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Informações de Sequência
A view USER_SEQUENCES descreve todas as sequências pertencentes a você. Ao criar a
sequência, você especifica critérios que são armazenados na view USER_SEQUENCES. As
colunas nesta view são:
• SEQUENCE_NAME: Nome da sequência
• MIN_VALUE: Valor mínimo da sequência
• MAX_VALUE: Valor máximo da sequência
• INCREMENT_BY: Valor pelo qual a sequência é incrementada
• CYCLE_FLAG: A sequência é quebrada em linhas ao atingir o limite?
• ORDER_FLAG: Os números da sequência são gerados na ordem?
• CACHE_SIZE: Números de sequência em cache
• LAST_NUMBER: Número da última sequência gravada em disco. Se uma sequência usar a
gravação em cache, o número gravado no disco será o último número colocado no cache de
sequência. É provável que esse número seja maior que o da última sequência usada.

Oracle Database: Fundamentos de SQL II 3 - 19


Confirmando Sequências

• Verifique os valores de sua sequência na tabela de


dicionário de dados USER_SEQUENCES.
SELECT sequence_name, min_value, max_value,
increment_by, last_number
FROM user_sequences;

Oracle Internal & Oracle Academy Use Only


• A coluna LAST_NUMBER exibirá o próximo número de
sequência disponível se NOCACHE for especificado.

Copyright © 2011, Oracle. Todos os direitos reservados.

Confirmando Sequências
Depois de criar sua sequência, ela é documentada no dicionário de dados. Como uma sequência
é um objeto de banco de dados, você pode identificá-la na tabela de dicionário de dados
USER_OBJECTS.
Também é possível confirmar as configurações da sequência por meio da seleção da view de
dicionário de dados USER_SEQUENCES .
Exibindo o Próximo Valor de Sequência Disponível Sem Incrementá-lo
Se a sequência tiver sido criada com NOCACHE, será possível exibir o próximo valor de
sequência disponível sem incrementá-lo consultando a tabela USER_SEQUENCES.

Oracle Database: Fundamentos de SQL II 3 - 20


Informações do Índice

• USER_INDEXES fornece informações sobre seus índices.


• USER_IND_COLUMNS descreve colunas que constituem
seus índices e colunas de índices nas tabelas.

DESCRIBE user_indexes

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Informações do Índice
Consulte a view USER_INDEXES para descobrir os nomes dos índices, da tabela em que o
índice foi criado e se o índice é exclusivo.
Observação: Para obter uma lista e descrição completas das colunas na view USER_INDEXES,
consulte “USER_INDEXES” no Oracle Database Reference for 10g or 11g database.

Oracle Database: Fundamentos de SQL II 3 - 21


USER_INDEXES: Exemplos

a SELECT index_name, table_name,uniqueness


FROM user_indexes
WHERE table_name = 'EMPLOYEES';

Oracle Internal & Oracle Academy Use Only


b SELECT index_name, table_name
FROM user_indexes
WHERE table_name = 'emp_lib';

Copyright © 2011, Oracle. Todos os direitos reservados.

USER_INDEXES: Exemplo
No exemplo do slide a, a view USER_INDEXES é consultada para localizar o nome do índice e
da tabela na qual o índice foi criado e se o índice é exclusivo.
No exemplo do slide b, observe que o Oracle Server fornece um nome genérico ao índice criado
para a coluna PRIMARY KEY. A tabela EMP_LIB é criada com o uso do seguinte código:
CREATE TABLE EMP_LIB
(book_id NUMBER(6)PRIMARY KEY ,
title VARCHAR2(25),
category VARCHAR2(20));

Oracle Database: Fundamentos de SQL II 3 - 22


Consultando USER_IND_COLUMNS

DESCRIBE user_ind_columns

Oracle Internal & Oracle Academy Use Only


SELECT index_name, column_name,table_name
FROM user_ind_columns
WHERE index_name = 'lname_idx';

Copyright © 2011, Oracle. Todos os direitos reservados.

Consultando USER_IND_COLUMNS
A view de dicionário USER_IND_COLUMNS fornece informações, como nome do índice e
nome da tabela indexada, nome de uma coluna no índice e posição da coluna no índice.
Para o exemplo do slide, a tabela emp_test e o índice LNAME_IDX são criados com o uso do
seguinte código:
CREATE TABLE emp_test AS SELECT * FROM employees;
CREATE INDEX LNAME_IDX ON emp_test(Last_Name);

Oracle Database: Fundamentos de SQL II 3 - 23


Informações de Sinônimo

DESCRIBE user_synonyms

Oracle Internal & Oracle Academy Use Only


SELECT *
FROM user_synonyms;

Copyright © 2011, Oracle. Todos os direitos reservados.

Informações de Sinônimo
A view de dicionário USER_SYNONYMS descreve sinônimos particulares (sinônimos
pertencentes a você).
Essa view pode ser consultada para localizar sinônimos. Você pode consultar ALL_SYNONYMS
para saber o nome de todos os sinônimos disponíveis e os objetos aos quais esses sinônimos se
aplicam.
As colunas nesta view são:
• SYNONYM_NAME: Nome do sinônimo
• TABLE_OWNER: Proprietário do objeto referenciado pelo sinônimo
• TABLE_NAME: Nome da tabela ou view referenciada pelo sinônimo
• DB_LINK: Nome da referência do link de banco de dados (se houver)

Oracle Database: Fundamentos de SQL II 3 - 24


Agenda de Lições

• Introdução ao dicionário de dados


• Consultando views do dicionário de dados sobre:
– Informações da tabela
– Informações da coluna
– Informações de constraint
• Consultando views do dicionário de dados sobre:

Oracle Internal & Oracle Academy Use Only


– Informações da view
– Informações de sequência
– Informações de sinônimo
– Informações do índice
• Adicionando um comentário a uma tabela e consultando
views de dicionário sobre informações de comentário

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 3 - 25


Adicionando Comentários a uma Tabela

• Você pode adicionar comentários a uma tabela ou coluna


usando a instrução COMMENT:

COMMENT ON TABLE employees


IS 'Employee Information';

COMMENT ON COLUMN employees.first_name


IS 'First name of the employee';

Oracle Internal & Oracle Academy Use Only


• É possível exibir os comentários nas views do dicionário
de dados:
– ALL_COL_COMMENTS
– USER_COL_COMMENTS
– ALL_TAB_COMMENTS
– USER_TAB_COMMENTS

Copyright © 2011, Oracle. Todos os direitos reservados.

Adicionando Comentários a uma Tabela


Você pode adicionar um comentário de até 4.000 bytes sobre uma coluna, tabela, view ou
snapshot usando a instrução COMMENT. O comentário é armazenado no dicionário de dados e
pode ser exibido em uma das seguintes views do dicionário de dados na coluna COMMENTS
column:
• ALL_COL_COMMENTS
• USER_COL_COMMENTS
• ALL_TAB_COMMENTS
• USER_TAB_COMMENTS

Sintaxe

COMMENT ON {TABLE table | COLUMN table.column}


IS 'text';

Na sintaxe:
table É o nome da tabela
column É o nome da coluna na tabela
text É o texto do comentário
Você pode eliminar um comentário do banco de dados configurando-o como string vazia (''):
COMMENT ON TABLE employees IS '';
Oracle Database: Fundamentos de SQL II 3 - 26
Questionário

As views de dicionário baseadas nas tabelas de dicionário


contêm informações como:
1. Definições de todos os objetos de esquema no banco
de dados
2. Valores padrão para as colunas
3. Informações de constraint de integridade

Oracle Internal & Oracle Academy Use Only


4. Privilégios e funções que cada usuário recebeu
5. Todas as alternativas acima

Copyright © 2011, Oracle. Todos os direitos reservados.

Resposta: 5

Oracle Database: Fundamentos de SQL II 3 - 27


Sumário

Nesta lição, você aprendeu a localizar informações sobre seus


objetos por meio das seguintes views de dicionário:
• DICTIONARY
• USER_OBJECTS
• USER_TABLES
• USER_TAB_COLUMNS

Oracle Internal & Oracle Academy Use Only


• USER_CONSTRAINTS
• USER_CONS_COLUMNS
• USER_VIEWS
• USER_SEQUENCES
• USER_INDEXES
• USER_SYNONYMS

Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
Nesta lição, você conheceu algumas views de dicionário disponíveis. Elas podem ser usadas para
localizar informações sobre suas tabelas, constraints, views, sequências e sinônimos.

Oracle Database: Fundamentos de SQL II 3 - 28


Exercício 3: Visão Geral
Este exercício aborda os seguintes tópicos:
• Consultando views do dicionário para obter informações
de tabela e coluna
• Consultando views do dicionário para obter informações
de constraint
• Consultando views do dicionário para obter informações
de view
• Consultando views do dicionário para obter informações

Oracle Internal & Oracle Academy Use Only


de sequência
• Consultando views do dicionário para obter informações
de sinônimo
• Consultando views do dicionário para obter informações
de índice
• Adicionando um comentário a uma tabela e consultando
views do dicionário para obter informações de comentário
Copyright © 2011, Oracle. Todos os direitos reservados.

Exercício 3: Visão Geral


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

Oracle Database: Fundamentos de SQL II 3 - 29


Oracle Internal & Oracle Academy Use Only
Manipulando Grandes Conjuntos de Dados

Oracle Internal & Oracle Academy Use Only


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

Ao concluir esta lição, você será capaz de:


• Manipular dados usando subconsultas
• Especificar valores default explícitos nas instruções
INSERT e UPDATE
• Descrever os recursos de instruções INSERT em várias
tabelas
• Usar os seguintes tipos de instruções INSERT em várias

Oracle Internal & Oracle Academy Use Only


tabelas:
– Incondicional INSERT
– Criar Pivôs com INSERT
– Condicional INSERT ALL
– Condicional INSERT FIRST
• Intercalar linhas em uma tabela
• Rastrear alterações de dados em um determinado período

Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Nesta lição, você aprenderá a manipular dados no banco de dados Oracle usando subconsultas.
Aprenderá a usar a palavra-chave DEFAULTnas instruções INSERT e UPDATE para identificar
um valor de coluna default. Você também aprenderá sobre instruções INSERT em várias
tabelas, a instrução MERGE e como controlar alterações no banco de dados.

Oracle Database: Fundamentos de SQL II 4 - 2


Agenda de Lições

• Manipulando dados usando subconsultas


• Especificando valores default explícitos nas instruções
INSERT e UPDATE
• Usando os seguintes tipos de instruções INSERT em
várias tabelas:
– Incondicional INSERT
– Criar Pivôs com INSERT

Oracle Internal & Oracle Academy Use Only


– Condicional INSERT ALL
– Condicional INSERT FIRST
• Intercalando linhas em uma tabela
• Rastreando as alterações de dados em um determinado
período

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 4 - 3


Usando Subconsultas para Manipular Dados

Você pode usar subconsultas em instruções DML (data


manipulation language) para:
• Recuperar dados usando uma view em linha
• Copiar dados de uma tabela para outra
• Atualizar dados em uma tabela com base nos valores de
outra

Oracle Internal & Oracle Academy Use Only


• Deletar linhas de uma tabela com base nas linhas de outra

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando Subconsultas para Manipular Dados


As subconsultas podem ser usadas para recuperar dados de uma tabela que você pode usar como
entrada da instrução INSERT em uma tabela diferente. Dessa maneira, é possível copiar
facilmente grandes volumes de dados de uma tabela para outra com uma única instrução
SELECT. Da mesma forma, as subconsultas podem ser usadas para atualizações e deleções em
massa usando-as na cláusula WHERE das instruções UPDATE e DELETE. Você também pode
usar subconsultas na cláusula FROM de uma instrução SELECT. Isso é chamado de view em
linha.
Observação: Você aprendeu a atualizar e deletar linhas com base em outra tabela no curso
Oracle Database: Fundamentos de SQL I.

Oracle Database: Fundamentos de SQL II 4 - 4


Recuperando Dados Usando uma Subconsulta
como Origem
SELECT department_name, city
FROM departments
NATURAL JOIN (SELECT l.location_id, l.city, l.country_id
FROM loc l
JOIN countries c
ON(l.country_id = c.country_id)
JOIN regions USING(region_id)
WHERE region_name = 'Europe');

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Recuperando Dados Usando uma Subconsulta como Origem


Você pode usar uma subconsulta na cláusula FROM de uma instrução SELECT, que é muito
similar ao modo de uso das views. Uma subconsulta na cláusula FROM de uma instrução
SELECT também é chamada de view em linha. Uma subconsulta na cláusula FROM de uma
instrução SELECT define uma origem de dados apenas para essa instrução SELECT em
particular. Como no caso de uma view do banco de dados, a instrução SELECT na subconsulta
pode ser simples ou complexa, dependendo de seu critério.
Quando uma view do banco de dados é criada, a instrução SELECT associada é armazenada no
dicionário de dados. Em situações em que você não possuir os privilégios necessários para criar
views do banco de dados, ou quando quiser verificar a possibilidade de uma instrução SELECT
se tornar uma view, é possível usar uma view em linha.
Com views em linha, você pode ter todo o código necessário para suporte à consulta em um só
local. Isso significa que você pode evitar a complexidade de criar uma view de banco de dados
separadamente. O exemplo no slide mostra como usar uma view em linha para exibir o nome do
departamento e a cidade da Europa. A subconsulta na cláusula FROM extrai o ID do local, nome
da cidade e país, unindo por join três tabelas diferentes. O resultado da consulta interna é
considerado uma tabela para a consulta externa. A consulta interna é semelhante à de uma view
do banco de dados, mas não possui nome físico.
Por exemplo, no slide, a tabela loc é criada com a execução da seguinte instrução:
CREATE TABLE loc AS SELECT * FROM locations;

Oracle Database: Fundamentos de SQL II 4 - 5


Recuperando Dados Usando uma Subconsulta como Origem (continuação)
Você pode exibir a mesma saída do exemplo do slide executando as duas etapas a seguir:
1. Crie uma view do banco de dados:
CREATE OR REPLACE VIEW european_cities
AS
SELECT l.location_id, l.city, l.country_id
FROM loc l
JOIN countries c
ON(l.country_id = c.country_id)
JOIN regions USING(region_id)
WHERE region_name = 'Europe';
2. Una por join a view EUROPEAN_CITIES à tabela DEPARTMENTS:
SELECT department_name, city
FROM departments

Oracle Internal & Oracle Academy Use Only


NATURAL JOIN european_cities;
Observação: Você aprendeu a criar views do banco de dados no curso Oracle Database:
Fundamentos de SQL I.

Oracle Database: Fundamentos de SQL II 4 - 6


Inserindo com o Uso de uma Subconsulta
como Destino

INSERT INTO (SELECT l.location_id, l.city, l.country_id


FROM locations l
JOIN countries c
ON(l.country_id = c.country_id)
JOIN regions USING(region_id)
WHERE region_name = 'Europe')

Oracle Internal & Oracle Academy Use Only


VALUES (3300, 'Cardiff', 'UK');

Copyright © 2011, Oracle. Todos os direitos reservados.

Inserindo com o Uso de uma Subconsulta como Destino


Você pode usar uma subconsulta no lugar do nome da tabela na cláusula INTO da instrução
INSERT. A lista SELECT dessa subconsulta deve ter o mesmo número de colunas que a lista de
colunas da cláusula VALUES. Qualquer regra sobre as colunas da tabela-base deve ser seguida
na ordem para que a instrução INSERT funcione corretamente. Por exemplo, você não pode
inserir um ID de local duplicado ou não inserir um valor para uma coluna NOT NULL
obrigatória.
Esse uso de subconsultas evita que você tenha que criar uma view apenas para a instrução
INSERT.
O exemplo do slide usa uma subconsulta no lugar de LOC para criar um registro de uma nova
cidade europeia.
Observação: Você também pode executar a operação INSERT na view EUROPEAN_CITIES
usando o seguinte código:
INSERT INTO european_cities
VALUES (3300, 'Cardiff', 'UK');

Oracle Database: Fundamentos de SQL II 4 - 7


Inserindo com o Uso de uma Subconsulta
como Destino
Verifique os resultados.

SELECT location_id, city, country_id


FROM loc

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Inserindo com o Uso de uma Subconsulta como Destino (continuação)


O exemplo do slide mostra que a inserção por meio da view em linha criou um novo registro na
tabela-base LOC.
O exemplo a seguir mostra os resultados da subconsulta usada para identificar a tabela para a
instrução INSERT.
SELECT l.location_id, l.city, l.country_id
FROM loc l
JOIN countries c
ON(l.country_id = c.country_id)
JOIN regions USING(region_id)
WHERE region_name = 'Europe'

Oracle Database: Fundamentos de SQL II 4 - 8


Usando a Palavra-Chave WITH CHECK OPTION
em Instruções DML
A palavra-chave WITH CHECK OPTION impede que você altere
linhas que não estejam na subconsulta.
INSERT INTO (SELECT location_id, city, country_id
FROM loc
WHERE country_id IN
(SELECT country_id
FROM countries
NATURAL JOIN regions

Oracle Internal & Oracle Academy Use Only


WHERE region_name = 'Europe')
WITH CHECK OPTION)
VALUES (3600, 'Washington', 'US');

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando a Palavra-Chave WITH CHECK OPTION em Instruções DML


Especifique a palavra-chave WITH CHECK OPTION para indicar que se a subconsulta for usada
no lugar de uma tabela em uma instrução INSERT, UPDATE ou DELETE, não será possível
fazer nenhuma alteração na tabela que produza as linhas não incluídas na subconsulta.
O exemplo do slide mostra como usar uma view em linha com WITH CHECK OPTION. A
instrução INSERT evita a criação de registros na tabela LOC de uma cidade não europeia.
O exemplo a seguir é executado com êxito em razão das alterações na lista VALUES.
INSERT INTO (SELECT location_id, city, country_id
FROM loc
WHERE country_id IN
(SELECT country_id
FROM countries
NATURAL JOIN regions
WHERE region_name = 'Europe')
WITH CHECK OPTION)
VALUES (3500, 'Berlin', 'DE');

Oracle Database: Fundamentos de SQL II 4 - 9


Usando a Palavra-Chave WITH CHECK OPTION em Instruções DML (continuação)
O uso de uma view em linha com WITH CHECK OPTION fornece um método fácil para evitar
alterações na tabela.
Para evitar a criação de uma cidade não europeia, também pode ser usada uma view de banco de
dados com a execução das seguintes etapas:
1. Crie uma view do banco de dados:
CREATE OR REPLACE VIEW european_cities
AS
SELECT location_id, city, country_id
FROM locations
WHERE country_id in
(SELECT country_id
FROM countries
NATURAL JOIN regions

Oracle Internal & Oracle Academy Use Only


WHERE region_name = 'Europe')
WITH CHECK OPTION;
2. Verifique os resultados inserindo os dados:
INSERT INTO european_cities
VALUES (3400,'New York','US');
A segunda etapa produz os mesmos erros mostrados no slide.

Oracle Database: Fundamentos de SQL II 4 - 10


Agenda de Lições

• Manipulando dados usando subconsultas


• Especificando valores default explícitos nas instruções
INSERT e UPDATE
• Usando os seguintes tipos de instruções INSERT em
várias tabelas:
– Incondicional INSERT
– Criar Pivôs com INSERT

Oracle Internal & Oracle Academy Use Only


– Condicional INSERT ALL
– Condicional INSERT FIRST
• Intercalando linhas em uma tabela
• Rastreando as alterações de dados em um determinado
período

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 4 - 11


Visão Geral do Recurso Default Explícito

• Use a palavra-chave DEFAULT como um valor de coluna


em que o valor default da coluna é desejado.
• Isso permite que o usuário controle onde e quando o valor
default deve ser aplicado aos dados.
• Os defaults explícitos podem ser usados nas instruções
INSERT e UPDATE.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Defaults Explícitos
A palavra-chave DEFAULT pode ser usada nas instruções INSERT e UPDATE para identificar
um valor de coluna default. Se não existir um valor default, será usado um valor nulo.
A opção DEFAULT o poupa de codificar o valor default nos seus programas ou de consulta ao
dicionário para localizá-lo, como era feito antes da introdução deste recurso. A codificação do
default é um problema no caso de alteração do default, porque o código consequentemente
precisa ser alterado. O acesso ao dicionário geralmente não é feito em uma aplicação, por isso
este é um recurso muito importante.

Oracle Database: Fundamentos de SQL II 4 - 12


Usando Valores Default Explícitos

• DEFAULT com INSERT:


INSERT INTO deptm3
(department_id, department_name, manager_id)
VALUES (300, 'Engineering', DEFAULT);

• DEFAULT com UPDATE:

Oracle Internal & Oracle Academy Use Only


UPDATE deptm3
SET manager_id = DEFAULT
WHERE department_id = 10;

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando Valores Default Explícitos


Especifique DEFAULT para definir a coluna com o valor previamente especificado como
default. Se nenhum valor default da coluna correspondente tiver sido especificado, o servidor
Oracle definirá a coluna como nula.
No primeiro exemplo do slide, a instrução INSERT usa um valor default para a coluna
MANAGER_ID. Se não houver um valor default definido para a coluna, um valor nulo será
inserido.
O segundo exemplo usa a instrução UPDATE para definir a coluna MANAGER_ID como um
valor default para o departamento 10. Se nenhum valor default for definido para a coluna, o
valor será alterado para nulo.
Observação: Ao criar uma tabela, você pode especificar um valor default para uma coluna. Isso
é descrito em Fundamentos de SQL I.

Oracle Database: Fundamentos de SQL II 4 - 13


Copiando linhas de outra tabela

• Grave sua instrução INSERT com uma subconsulta.

INSERT INTO sales_reps(id, name, salary, commission_pct)


SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE '%REP%';

Oracle Internal & Oracle Academy Use Only


• Não use a cláusula VALUES.
• Faça a correspondência do número de colunas na cláusula
INSERT com o da subconsulta.

Copyright © 2011, Oracle. Todos os direitos reservados.

Copiando linhas de outra tabela


É possível usar a instrução INSERT para adicionar linhas a uma tabela em que os valores sejam
derivados de tabelas existentes. Em substituição da cláusula VALUES, use uma subconsulta.
Sintaxe
INSERT INTO table [ column (, column) ] subquery;
Na sintaxe:
table É o nome da tabela
column É o nome da coluna na tabela a ser preenchida
subquery É a subconsulta que retorna linhas na tabela
O número de colunas e tipos de dados na lista de colunas da cláusula INSERT deve ser
correspondente em número de valores e tipos de dados na subconsulta. Para criar uma cópia das
linhas de uma tabela, use SELECT * na subconsulta.
INSERT INTO EMPL3
SELECT *
FROM employees;
Observação: Use a cláusula LOG ERRORS na instrução DML para permitir que a operação de
DML seja concluída independentemente de erros. O Oracle grava os detalhes da mensagem de
erro em uma tabela de registro de erro que você criou. Para obter mais informações, consulte
Oracle Database SQL Reference for 10g or 11g database.
Oracle Database: Fundamentos de SQL II 4 - 14
Agenda de Lições

• Manipulando dados usando subconsultas


• Especificando valores default explícitos nas instruções
INSERT e UPDATE
• Usando os seguintes tipos de instruções INSERT em
várias tabelas:
– Incondicional INSERT
– Criar Pivôs com INSERT

Oracle Internal & Oracle Academy Use Only


– Condicional INSERT ALL
– Condicional INSERT FIRST
• Intercalando linhas em uma tabela
• Rastreando as alterações de dados em um determinado
período

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 4 - 15


Visão Geral de Instruções INSERT em Várias
Tabelas

Target_a

Sourcetab

Oracle Internal & Oracle Academy Use Only


INSERT ALL
INTO target_a VALUES(…,…,…) Target_b
INTO target_b VALUES(…,…,…)
INTO target_c VALUES(…,…,…)
Subconsulta SELECT …
FROM sourcetab
WHERE …;
Target_c

Copyright © 2011, Oracle. Todos os direitos reservados.

Visão Geral de Instruções INSERT em Várias Tabelas


Em uma instrução INSERT em várias tabelas, insira linhas calculadas derivadas das linhas
retornadas da avaliação de uma subconsulta em uma ou mais tabelas.
As instruções INSERT em várias tabelas são úteis em um cenário de data warehouse. É
necessário carregar seu data warehouse regularmente a fim de facilitar a análise comercial. Para
fazer isso, os dados de um ou mais sistemas operacionais devem ser extraídos e copiados para o
warehouse. O processo de extração de dados do sistema de origem e inclusão no data warehouse
é comumente chamado de ETL, ou seja, extração, transformação e carregamento.
Durante a extração, os dados desejados devem ser definidos e extraídos de várias origens, como
sistemas e aplicações de banco de dados. Depois da extração, os dados devem ser fisicamente
transportados para o sistema de destino ou um sistema intermediário para processamento
posterior. Dependendo dos meios de transporte escolhidos, algumas transformações podem ser
feitas durante este processo. Por exemplo, uma instrução SQL que acesse diretamente um
destino remoto por meio de um gateway pode concatenar duas colunas como parte da instrução
SELECT.
Depois de os dados serem carregados no banco de dados Oracle, as transformações dos dados
poderão ser executadas com o uso de operações SQL. Uma instrução INSERT em várias tabelas
é uma das técnicas de implementação de transformações de dados SQL.

Oracle Database: Fundamentos de SQL II 4 - 16


Visão Geral de Instruções INSERT em Várias Tabelas

• Use a instrução INSERT…SELECT para inserir linhas em


várias tabelas como parte de uma única instrução DML.
• As instruções INSERT em várias tabelas são usadas nos
sistemas de data warehouse para transferir dados de uma
ou mais origens operacionais para um conjunto de tabelas
de destino.
• Elas oferecem melhora significativa no desempenho em:

Oracle Internal & Oracle Academy Use Only


– Única instrução DML versus várias instruções
INSERT…SELECT
– Única instrução DML versus um procedure para executar
várias inserções com o uso da sintaxe IF...THEN

Copyright © 2011, Oracle. Todos os direitos reservados.

Visão Geral de Instruções INSERT em Várias Tabelas (continuação)


As instruções INSERT em várias tabelas oferecem as vantagens da instrução INSERT ...
SELECT quando várias tabelas estão envolvidas como destinos. Sem a instrução INSERT em
várias tabelas, você deve lidar com n instruções INSERT ... SELECT independentes,
processando a mesma origem de dados n vezes e aumentando a carga de trabalho de
transformação n vezes.
Como na instrução INSERT ... SELECT, a nova instrução pode ser paralelizada e usada com
o mecanismo de carga direta para obter desempenho mais rápido.
Cada registro de qualquer fluxo de entrada, como uma tabela do banco de dados não relacional,
agora pode ser convertido em vários registros a fim de ser obtido um ambiente de tabela de
banco de dados mais relacional. Uma alternativa para implementar essa funcionalidade é
obrigatoriamente a criação de várias instruçõesINSERT.

Oracle Database: Fundamentos de SQL II 4 - 17


Tipos de Instruções INSERT em Várias Tabelas

Os diferentes tipos de instruções INSERT em várias tabelas são:


• Incondicional INSERT
• Condicional INSERT ALL
• Criar Pivôs com INSERT
• Condicional INSERT FIRST

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Tipos de Instruções INSERT em Várias Tabelas


Use diferentes cláusulas para indicar o tipo de instrução INSERT a ser executada. Os tipos de
instruções INSERT em várias tabelas são:
• Incondicional INSERT: Para cada linha retornada pela subconsulta, uma linha é inserida
em cada tabela de destino.
• Condicional INSERT ALL: Para cada linha retornada pela subconsulta, uma linha será
inserida em cada tabela de destino se a condição especificada por atendida.
• Criando Pivôs com INSERT: Este é um caso especial da incondicional INSERT ALL.
• Condicional INSERT FIRST: Para cada linha retornada pela subconsulta, uma linha é
inserida na primeira tabela de destino em que a condição é atendida.

Oracle Database: Fundamentos de SQL II 4 - 18


Instruções INSERT em Várias Tabelas

• Sintaxe para instrução INSERT em várias tabelas:


INSERT [conditional_insert_clause]
[insert_into_clause values_clause] (subquery)

• conditional_insert_clause:
[ALL|FIRST]

Oracle Internal & Oracle Academy Use Only


[WHEN condition THEN] [insert_into_clause values_clause]
[ELSE] [insert_into_clause values_clause]

Copyright © 2011, Oracle. Todos os direitos reservados.

Instruções INSERT em Várias Tabelas


O slide exibe o formato genérico para instruções INSERT em várias tabelas.
Incondicional INSERT: ALL into_clause
Especifique ALL seguido de várias instruções insert_into_clauses para executar uma
instrução INSERT em várias tabelas incondicional. O servidor Oracle executa cada
insert_into_clause uma vez para cada linha retornada pela subconsulta.
Cláusula Condicional INSERT: conditional_insert_clause
Especifique conditional_insert_clause para executar uma instrução INSERT em
várias tabelas condicional. O servidor Oracle filtra cada insert_into_clause por meio da
condição correspondente WHEN, que determina se insert_into_clause é executada. Uma
única instrução INSERT em várias tabelas pode conter até 127 cláusulas WHEN.
Condicional INSERT: ALL
Se você especificar ALL, o servidor Oracle avaliará cada cláusula WHEN independentemente dos
resultados da avaliação de qualquer outra cláusula WHEN. Para cada cláusula WHEN cuja
condição for avaliada como verdadeira, o servidor Oracle executa a lista de cláusulas INTO
correspondente.

Oracle Database: Fundamentos de SQL II 4 - 19


Instruções INSERT em Várias Tabelas (continuação)
Cláusula Condicional INSERT: FIRST
Se você especificar FIRST, o servidor Oracle avaliará cada cláusula WHEN na ordem em que ela
aparece na instrução. Se a primeira cláusula WHEN for avaliada como verdadeira, o servidor
Oracle executará a cláusula INTO correspondente e ignorará as cláusulas subsequentes WHEN
para a linha informada.
Cláusula Condicional INSERT: ELSE
Para uma determinada linha, se nenhuma cláusula WHEN for avaliada como verdadeira:
• Se você tiver especificado uma cláusula ELSE, o servidor Oracle executará a lista da
cláusula INTO associada à cláusula ELSE
• Se você não especificar uma cláusula ELSE, o servidor Oracle não executará nenhuma ação
para essa linha

Oracle Internal & Oracle Academy Use Only


Restrições em Instruções INSERT em Várias Tabelas
• Você pode executar instruções INSERT em várias tabelas somente em tabelas, e não em
views ou views materializadas.
• Não é possível executar uma instrução INSERT em várias tabelas em uma tabela remota.
• A expressão de um conjunto de tabelas não pode ser especificada durante a execução de
instrução INSERT em várias tabelas.
• Na instrução INSERT em várias tabelas, nenhuma instrução insert_into_clauses
pode ser combinada para especificar mais de 999 colunas de destino.

Oracle Database: Fundamentos de SQL II 4 - 20


Incondicional INSERT ALL

• Selecione os valores EMPLOYEE_ID, HIRE_DATE,


SALARY e MANAGER_ID da tabela EMPLOYEES para os
funcionários cujo EMPLOYEE_ID seja superior a 200.
• Insira esses valores nas tabelas SAL_HISTORY e
MGR_HISTORY usando uma instrução INSERT em várias
tabelas.

Oracle Internal & Oracle Academy Use Only


INSERT ALL
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;

Copyright © 2011, Oracle. Todos os direitos reservados.

Incondicional INSERT ALL


O exemplo no slide insere linhas nas tabelas SAL_HISTORY e MGR_HISTORY.
A instrução SELECT recupera os detalhes do ID do funcionário, data de contratação, salário e
ID do gerente dos funcionários cujo ID é superior a 200 na tabela EMPLOYEES. Os detalhes do
ID do funcionário, data de contratação e salário são inseridos na tabela SAL_HISTORY. Os
detalhes do ID do funcionário, ID do gerente e salário são inseridos na tabela MGR_HISTORY.
A instrução INSERT é considerada uma incondicional INSERT porque nenhuma restrição
adicional é aplicada às linhas recuperadas pela instrução SELECT. Todas as linhas recuperadas
pela instrução SELECT são inseridas nas duas tabelas: SAL_HISTORY e MGR_HISTORY. A
cláusula VALUES nas instruções INSERT especifica as colunas a partir da instrução SELECT,
que devem ser inseridas em cada uma das tabelas. Cada linha retornada pela instrução SELECT
resulta em duas inserções: uma para a tabela SAL_HISTORY e outra para a tabela
MGR_HISTORY.

Oracle Database: Fundamentos de SQL II 4 - 21


Incondicional INSERT ALL (continuação)
Doze linhas foram selecionadas no total:
SELECT COUNT(*) total_in_sal FROM sal_history;

SELECT COUNT(*) total_in_mgr FROM mgr_history;

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II 4 - 22


Condicional INSERT ALL: Exemplo

Contratado
antes de 1995

EMP_HISTORY

Oracle Internal & Oracle Academy Use Only


Funcionários
Com comissão
de vendas

EMP_SALES

Copyright © 2011, Oracle. Todos os direitos reservados.

Condicional INSERT ALL: Exemplo


Para todos os funcionários nas tabelas de funcionários, se o funcionário tiver sido contratado
antes de 1995, insira o registro dele no histórico. Se o funcionário ganhar uma comissão de
vendas, insira as informações do registro na tabela EMP_SALES. A instrução SQL é mostrada
na próxima página.

Oracle Database: Fundamentos de SQL II 4 - 23


Condicional INSERT ALL

INSERT ALL

WHEN HIREDATE < '01-JAN-95' THEN


INTO emp_history VALUES(EMPID,HIREDATE,SAL)
WHEN COMM IS NOT NULL THEN
INTO emp_sales VALUES(EMPID,COMM,SAL)

Oracle Internal & Oracle Academy Use Only


SELECT employee_id EMPID, hire_date HIREDATE,
salary SAL, commission_pct COMM
FROM employees

Copyright © 2011, Oracle. Todos os direitos reservados.

Condicional INSERT ALL


O exemplo deste slide é semelhante ao do exemplo no slide anterior, pois ele insere linhas nas
tabelas EMP_HISTORY e EMP_SALES. A instrução SELECT recupera detalhes, como ID do
funcionário, data de contratação, salário e porcentagem de comissão de todos os funcionários na
tabela EMPLOYEES. Detalhes como ID do funcionário, data de contratação e salário são
inseridos na tabela EMP_HISTORY. Detalhes como ID do funcionário, porcentagem de
comissão e salário são inseridos na tabela EMP_SALES.
Essa instrução INSERT é considerada uma condicional INSERT ALL porque uma restrição
adicional é aplicada às linhas recuperadas pela instrução SELECT. Das linhas recuperadas pela
instrução SELECT, somente as linhas nas quais a data de contratação for anterior a 1995 são
inseridas na tabela EMP_HISTORY. Da mesma maneira, somente as linhas em que o valor da
porcentagem da comissão não for nulo serão inseridas na tabela EMP_SALES.
SELECT count(*) FROM emp_history;

SELECT count(*) FROM emp_sales;

Oracle Database: Fundamentos de SQL II 4 - 24


Condicional INSERT ALL (continuação)
Você também pode usar a cláusula ELSE com a instrução INSERT ALL.
Exemplo:

INSERT ALL
WHEN job_id IN
(select job_id FROM jobs WHERE job_title LIKE '%Manager%')
THEN
INTO managers2(last_name,job_id,SALARY)
VALUES (last_name,job_id,SALARY)
WHEN SALARY>10000 THEN
INTO richpeople(last_name,job_id,SALARY)
VALUES (last_name,job_id,SALARY)

Oracle Internal & Oracle Academy Use Only


ELSE
INTO poorpeople VALUES (last_name,job_id,SALARY)
SELECT * FROM employees;

Resultado:
116 rows inserted

Oracle Database: Fundamentos de SQL II 4 - 25


Condicional INSERT FIRST: Exemplo

Cenário: Se o salário de
um funcionário for 2.000,
o registro será inserido
somente na tabela Salário < 5.000
SAL_LOW.
SAL_LOW

5000 <=
Salário <=

Oracle Internal & Oracle Academy Use Only


10.000
SAL_MID
FUNCIONÁRIOS

Caso
contrário,
SAL_HIGH

Copyright © 2011, Oracle. Todos os direitos reservados.

Condicional INSERT FIRST: Exemplo


Para todos os funcionários da tabela EMPLOYEES, insira as informações sobre o funcionário na
primeira tabela de destino que atender à condição. No exemplo, se um funcionário tiver um
salário de 2.000, o registro será inserido somente na tabela SAL_LOW. A instrução SQL é
mostrada na próxima página.

Oracle Database: Fundamentos de SQL II 4 - 26


Condicional INSERT FIRST

INSERT FIRST
WHEN salary < 5000 THEN
INTO sal_low VALUES (employee_id, last_name, salary)
WHEN salary between 5000 and 10000 THEN
INTO sal_mid VALUES (employee_id, last_name, salary)

Oracle Internal & Oracle Academy Use Only


ELSE
INTO sal_high VALUES (employee_id, last_name, salary)
SELECT employee_id, last_name, salary
FROM employees

Copyright © 2011, Oracle. Todos os direitos reservados.

Condicional INSERT FIRST


A instrução SELECT recupera detalhes, como ID do funcionário, sobrenome e salário para cada
funcionário da tabela EMPLOYEES. Para cada registro de funcionário, ela é inserida na primeira
tabela de destino que atender à condição.
A instrução INSERT é considerada uma condicional INSERT FIRST. A condição WHEN
salary < 5000 é avaliada primeiro. Se a primeira cláusula WHEN for avaliada como
verdadeira, o servidor Oracle executará a cláusula INTO correspondente e inserirá o registro na
tabela SAL_LOW. Ele ignora as cláusulas WHEN subsequentes para esta linha.
Se a linha não atender à primeira condição WHEN (WHEN salary < 5000), a próxima
condição (WHEN salary between 5000 and 10000) será avaliada. Se essa condição
for avaliada como verdadeira, o registro será inserido na tabela SAL_MID, e a última condição
será ignorada.
Se nem a primeira condição (WHEN salary < 5000) nem a segunda (WHEN salary
between 5000 and 10000) for avaliada como verdadeira, o servidor Oracle executará a
cláusula correspondente INTO para a cláusula ELSE.

Oracle Database: Fundamentos de SQL II 4 - 27


Condicional INSERT FIRST (continuação)
Vinte linhas foram inseridas no total:
SELECT count(*) low FROM sal_low;

SELECT count(*) mid FROM sal_mid;

SELECT count(*) high FROM sal_high;

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II 4 - 28


Criar Pivôs com INSERT

Converta o conjunto de registros de vendas com base na


tabela do banco de dados não-relacional no formato relacional.
Emp_ID Week_ID MON TUES WED THUR FRI

176 6 2000 3000 4000 5000 6000

Oracle Internal & Oracle Academy Use Only


Employee_ID WEEK VENDAS

176 6 2000

176 6 3000

176 6 4000

176 6 5000

176 6 6000

Copyright © 2011, Oracle. Todos os direitos reservados.

Criar Pivôs com INSERT


A criação de pivô é uma operação em que você deve criar uma transformação de modo que cada
registro de qualquer fluxo de entrada, como tabela de banco de dados não-relacional, seja
convertido em vários registros para um ambiente de tabela de banco de dados mais relacional.
Suponha que você receba um conjunto de registros de vendas de uma tabela de banco de dados
não-relacional:
SALES_SOURCE_DATA, no seguinte formato:
EMPLOYEE_ID, WEEK_ID, SALES_MON, SALES_TUE, SALES_WED,
SALES_THUR, SALES_FRI
Você deseja armazenar esses registros na tabela SALES_INFO em um formato relacional mais
comum:
EMPLOYEE_ID, WEEK, SALES
Para solucionar esse problema, é necessário criar uma transformação de modo que cada registro
da tabela do banco de dados não-relacional original, SALES_SOURCE_DATA, seja convertida
em cinco registros para a tabela SALES_INFO do data warehouse. Essa operação geralmente é
conhecida como criação de pivô.
A solução desse problema é mostrada na próxima página.

Oracle Database: Fundamentos de SQL II 4 - 29


Criar Pivôs com INSERT

INSERT ALL
INTO sales_info VALUES (employee_id,week_id,sales_MON)
INTO sales_info VALUES (employee_id,week_id,sales_TUE)
INTO sales_info VALUES (employee_id,week_id,sales_WED)
INTO sales_info VALUES (employee_id,week_id,sales_THUR)
INTO sales_info VALUES (employee_id,week_id, sales_FRI)
SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE,

Oracle Internal & Oracle Academy Use Only


sales_WED, sales_THUR,sales_FRI
FROM sales_source_data;

Copyright © 2011, Oracle. Todos os direitos reservados.

Criando Pivôs com INSERT (continuação)


No exemplo do slide, os dados de vendas são recebidos da tabela do banco de dados não-
relacional SALES_SOURCE_DATA, que são os detalhes das vendas executadas por um
representante de vendas em cada dia da semana, para uma semana com um ID específico.
DESC SALES_SOURCE_DATA

Oracle Database: Fundamentos de SQL II 4 - 30


Criando Pivôs com INSERT (continuação)
SELECT * FROM SALES_SOURCE_DATA;

DESC SALES_INFO

Oracle Internal & Oracle Academy Use Only


SELECT * FROM sales_info;

Observe no exemplo anterior que, durante a criação de um pivô com INSERT, uma linha da
tabela SALES_SOURCE_DATA é convertida em cinco registros para a tabela relacional,
SALES_INFO.

Oracle Database: Fundamentos de SQL II 4 - 31


Agenda de Lições

• Manipulando dados usando subconsultas


• Especificando valores default explícitos nas instruções
INSERT e UPDATE
• Usando os seguintes tipos de instruções INSERT em
várias tabelas:
– Incondicional INSERT
– Criar Pivôs com INSERT

Oracle Internal & Oracle Academy Use Only


– Condicional INSERT ALL
– Condicional INSERT FIRST
• Intercalando linhas em uma tabela
• Rastreando as alterações de dados em um determinado
período

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 4 - 32


Instrução MERGE

• Fornece a capacidade de atualizar, inserir ou deletar


dados de modo condicional em uma tabela de banco
de dados
• Executará uma instrução UPDATE se a linha existir e uma
instrução INSERT se for uma nova linha:
– Evita atualizações separadas

Oracle Internal & Oracle Academy Use Only


– Aumenta o desempenho e a facilidade de uso
– É útil em aplicativos de data warehouse

Copyright © 2011, Oracle. Todos os direitos reservados.

Instrução MERGE
O servidor Oracle suporta a instrução MERGE para operações com as instruções INSERT,
UPDATE e DELETE. Usando essa instrução, você pode atualizar, inserir ou deletar uma linha de
modo condicional em uma tabela, evitando várias instruções DML. A decisão de atualizar,
inserir ou deletar na tabela de destino é baseada em uma condição na cláusula ON.
Você deve ter os privilégios de objeto INSERT e UPDATE na tabela de destino e o privilégio de
objeto SELECT na tabela de origem. Para especificar a cláusula DELETE de
merge_update_clause, você também deve ter o privilégio de objeto DELETE na tabela de
destino.
A instrução MERGE é determinística. Você não pode atualizar a mesma linha da tabela de
destino várias vezes na mesma instrução MERGE.
Uma abordagem alternativa é o uso de loops PL/SQL e várias instruções DML. Entretanto, a
instrução MERGE é fácil de usar e expressada basicamente como uma única instrução SQL.
A instrução MERGE é adequada em várias aplicações de data warehouse. Por exemplo, em uma
aplicação de data warehousing, talvez você precise trabalhar com dados provenientes de várias
origens, algumas das quais podem ser duplicadas. Com a instrução MERGE, você pode adicionar
ou modificar linhas condicionalmente.

Oracle Database: Fundamentos de SQL II 4 - 33


Sintaxe da Instrução MERGE

Você pode inserir, atualizar ou deletar linhas


incondicionalmente em uma tabela usando a instrução MERGE.

MERGE INTO table_name table_alias


USING (table|view|sub_query) alias
ON (join condition)
WHEN MATCHED THEN

Oracle Internal & Oracle Academy Use Only


UPDATE SET
col1 = col1_val,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list)
VALUES (column_values);

Copyright © 2011, Oracle. Todos os direitos reservados.

Intercalando Linhas
Você pode atualizar linhas existentes e inserir novas condicionalmente usando a instrução
MERGE. Com a instrução MERGE, você pode atualizar linhas ao mesmo tempo em que deleta as
antigas de uma tabela. Para fazer isso, inclua uma cláusula DELETE com sua própria cláusula
WHERE na sintaxe da instrução MERGE.
Na sintaxe:
Cláusula INTO Especifique a tabela de destino em que estiver inserindo ou atualizando
Cláusula USING Identifica a origem dos dados a serem atualizados ou inseridos; pode ser
uma tabela, view ou subconsulta
Cláusula ON A condição na qual a operação MERGE atualiza ou insere
WHEN MATCHED | Instrui o servidor sobre como responder aos resultados da condição de
join
WHEN NOT MATCHED
Observação: Para obter mais informações, consulte Oracle Database SQL Reference for 10g or
11g database.

Oracle Database: Fundamentos de SQL II 4 - 34


Intercalando Linhas: Exemplo

Insira ou atualize as linhas na tabela COPY_EMP3 para que


corresponda à tabela EMPLOYEES.

MERGE INTO copy_emp3 c


USING (SELECT * FROM EMPLOYEES ) e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET

Oracle Internal & Oracle Academy Use Only


c.first_name = e.first_name,
c.last_name = e.last_name,
...
DELETE WHERE (E.COMMISSION_PCT IS NOT NULL)
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);

Copyright © 2011, Oracle. Todos os direitos reservados.

Intercalando Linhas: Exemplo


MERGE INTO copy_emp3 c
USING (SELECT * FROM EMPLOYEES ) e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
c.email = e.email,
c.phone_number = e.phone_number,
c.hire_date = e.hire_date,
c.job_id = e.job_id,
c.salary = e.salary*2,
c.commission_pct = e.commission_pct,
c.manager_id = e.manager_id,
c.department_id = e.department_id
DELETE WHERE (E.COMMISSION_PCT IS NOT NULL)
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);
Oracle Database: Fundamentos de SQL II 4 - 35
Intercalando Linhas: Exemplo (continuação)
A tabela COPY_EMP3 é criada usando o seguinte código:
CREATE TABLE COPY_EMP3 AS SELECT * FROM EMPLOYEES
WHERE SALARY<10000;
Em seguida, consulte a tabela COPY_EMP3.
SELECT employee_id, salary, commission_pct FROM COPY_EMP3;

Oracle Internal & Oracle Academy Use Only


...

...

Observe que há alguns funcionários com SALARY < 10000 e há dois com
COMMISSION_PCT.
O exemplo do slide corresponde a EMPLOYEE_ID na tabela COPY_EMP3 para o
EMPLOYEE_ID na tabela EMPLOYEES. Se houver uma correspondência, a linha na tabela
COPY_EMP3 é atualizada para corresponder à linha na tabela EMPLOYEES, e o salário do
funcionário será dobrado. Os registros dos dois funcionários com valores na coluna
COMMISSION_PCT são deletados. Se a correspondência não for localizada, as linhas serão
inseridas na tabela COPY_EMP3.

Oracle Database: Fundamentos de SQL II 4 - 36


Intercalando Linhas: Exemplo

TRUNCATE TABLE copy_emp3;


SELECT * FROM copy_emp3;
0 rows selected

MERGE INTO copy_emp3 c


USING (SELECT * FROM EMPLOYEES ) e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN

Oracle Internal & Oracle Academy Use Only


UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
...
DELETE WHERE (E.COMMISSION_PCT IS NOT NULL)
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, ...

SELECT * FROM copy_emp3;


107 rows selected.

Copyright © 2011, Oracle. Todos os direitos reservados.

Intercalando Linhas: Exemplo (continuação)


Os exemplos do slide mostram que a tabela COPY_EMP3 está vazia. A condição
c.employee_id = e.employee_id é avaliada. A condição retorna falso—não há
correspondências. A lógica está incluída na cláusula WHEN NOT MATCHED, e o comando
MERGE insere as linhas da tabela EMPLOYEES na tabela COPY_EMP3. Isso significa que a
tabela COPY_EMP3 agora contém dados exatamente iguais aos da tabela EMPLOYEES.
SELECT employee_id, salary, commission_pct from copy_emp3;

Oracle Database: Fundamentos de SQL II 4 - 37


Agenda de Lições

• Manipulando dados usando subconsultas


• Especificando valores default explícitos nas instruções
INSERT e UPDATE
• Usando os seguintes tipos de instruções INSERT em
várias tabelas:
– Incondicional INSERT
– Criar Pivôs com INSERT

Oracle Internal & Oracle Academy Use Only


– Condicional INSERT ALL
– Condicional INSERT FIRST
• Intercalando linhas em uma tabela
• Rastreando as alterações de dados em um determinado
período

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 4 - 38


Rastreando Alterações nos Dados

Consulta da
versão
SELECT

Oracle Internal & Oracle Academy Use Only


Versões de linhas
recuperadas

Copyright © 2011, Oracle. Todos os direitos reservados.

Rastreando Alterações nos Dados


Você pode descobrir que de alguma maneira os dados de uma tabela foram alterados
indevidamente. Para fazer a pesquisa, você pode usar várias consultas de flashback para exibir
dados de linha em determinados momentos. Uma maneira mais eficiente é usar o recurso de
Flashback de Consulta de Versão para exibir todas as alterações de uma linha em um
determinado período. Esse recurso permite anexar uma cláusula VERSIONS a uma instrução
SELECT, que especifica um SCN (número de alteração do sistema) no intervalo de timestamp
no qual você deseja exibir alterações nos valores de linha. A consulta também pode retornar
metadados associados, como a transação responsável pela alteração.
Além disso, depois de identificar uma transação incorreta, você poderá usar o recurso de
Flashback de Consulta de Transação para identificar outras alterações executadas pela transação.
Em seguida, você terá a opção de usar o recurso de Flashback de Tabela para restaurar a tabela a
um estado anterior ao das alterações.
Você pode usar uma consulta em uma tabela com uma cláusula VERSIONS para produzir todas
as versões de todas as linhas existentes ou que existiam entre o momento da consulta e os
segundos de undo_retention anteriores ao momento atual. undo_retention é um
parâmetro de inicialização, ou seja, um parâmetro ajustado automaticamente. Uma consulta que
inclui uma cláusula VERSIONS é conhecida como consulta de versão. Os resultados de uma
consulta de versão se comportam como se a cláusula WHERE fosse aplicada às versões das
linhas. A consulta da versão retorna versões de linhas somente entre transações.
SCN (número de alteração do sistema): O servidor Oracle atribui um SCN para identificar os
registros de redo para cada transação submetida a commit.

Oracle Database: Fundamentos de SQL II 4 - 39


Exemplo de Flashback de Consulta de Versão

SELECT salary FROM employees3


1
WHERE employee_id = 107;

UPDATE employees3 SET salary = salary * 1.30


WHERE employee_id = 107;
2
COMMIT;

Oracle Internal & Oracle Academy Use Only


SELECT salary FROM employees3
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE 3
WHERE employee_id = 107;

1 3

Copyright © 2011, Oracle. Todos os direitos reservados.

Exemplo de Flashback de Consulta de Versão


No exemplo do slide, o salário do funcionário 107 é recuperado (1). O salário do funcionário
107 é aumentado em 30 por cento e a alteração é submetida a commit (2). As diferentes versões
de salário são exibidas (3).
A cláusula VERSIONS não altera o plano da consulta. Por exemplo, se você executar uma
consulta em uma tabela que use o método de acesso a índices, essa consulta na mesma tabela
com a cláusula VERSIONS continuará a usar esse método. As versões das linhas retornadas pela
consulta da versão são as das linhas entre as transações. A cláusula VERSIONS não tem efeito
no comportamento transacional de uma consulta. Isso significa que uma consulta em uma tabela
com a cláusula VERSIONS ainda herda o ambiente de consulta da transação em andamento.
A cláusula VERSIONS default pode ser especificada como VERSIONS BETWEEN
{SCN|TIMESTAMP} MINVALUE AND MAXVALUE.
A cláusula VERSIONS é uma extensão SQL somente para consultas. Você pode ter operações
DML e DDL que usam uma cláusula VERSIONS em subconsultas. A consulta de versão da
linha recupera todas as versões submetidas a commit das linhas selecionadas. As alterações
feitas pela transação ativa atual não são retornadas. A consulta de versão recupera todas as
versões das linhas. Isso significa principalmente que as versões retornadas incluem versões
reinseridas deletadas e subsequentes das linhas.

Oracle Database: Fundamentos de SQL II 4 - 40


Exemplo de Flashback de Consulta de Versão (continuação)
O acesso à linha de uma consulta de versão pode ser definido em uma das duas categorias a
seguir:
• Acesso à linha com base em ROWID: No caso do acesso baseado em ROWID, todas as
versões de ROWID especificadas são retornadas sem relação com o conteúdo da linha. Isso
significa principalmente que todas as versões do slot no bloco indicado por ROWID são
retornadas.
• Todos os outros acessos à linha: Para todos os outros acessos à linha, todas as versões das
linhas são retornadas.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II 4 - 41


Cláusula VERSIONS BETWEEN

SELECT versions_starttime "START_DATE",


versions_endtime "END_DATE",
salary
FROM employees
VERSIONS BETWEEN SCN MINVALUE
AND MAXVALUE
WHERE last_name = 'Lorentz';

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Cláusula VERSIONS BETWEEN


Você pode usar a cláusula VERSIONS BETWEEN para recuperar todas as versões das linhas
existentes ou que existiram entre o momento da consulta e um determinado momento no
passado.
Se o horário de retenção de undo for menor que o limite inferior ou que o SCN da cláusula
BETWEEN, a consulta recuperará versões somente até o horário de retenção de undo. O intervalo
de tempo da cláusula BETWEEN pode ser especificado como um intervalo SCN ou como um
intervalo decorrido. Esse intervalo de tempo é fechado nos limites inferior e superior.
No exemplo, as alterações do salário de Lorentz são recuperadas. O valor NULL para
END_DATE da primeira versão indica que essa era a versão existente no momento da consulta.
O valor NULL para START_DATE da versão mais recente indica que ela foi criada antes do
horário de retenção de undo.

Oracle Database: Fundamentos de SQL II 4 - 42


Questionário

Quando você usa o comando INSERT ou UPDATE, a palavra-


chave DEFAULT economiza tempo de codificação do valor
default nos seus programas ou de consulta ao dicionário para
localizá-lo.
1. Verdadeiro
2. Falso

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Resposta: 1

Oracle Database: Fundamentos de SQL II 4 - 43


Sumário

Nesta lição, você aprendeu a:


• Usar instruções DML e controlar transações
• Descrever os recursos de instruções INSERT em várias
tabelas
• Usar os seguintes tipos de instruções INSERT em várias
tabelas:

Oracle Internal & Oracle Academy Use Only


– Incondicional INSERT
– Criar Pivôs com INSERT
– Condicional INSERT ALL
– Condicional INSERT FIRST
• Intercalar linhas em uma tabela
• Manipular dados usando subconsultas
• Rastrear alterações de dados em um determinado período

Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
Nesta lição, você aprendeu a manipular dados no banco de dados Oracle usando subconsultas.
Aprendeu também sobre instruções INSERT em várias tabelas, a instrução MERGE e
rastreamento de alterações no banco de dados.

Oracle Database: Fundamentos de SQL II 4 - 44


Exercício 4: Visão Geral

Este exercício aborda os seguintes tópicos:


• Executando Instruções INSERT em várias tabelas
• Executando operações MERGE
• Rastreando versões de linha

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 4 - 45


Oracle Internal & Oracle Academy Use Only
Gerenciando Dados em Diferentes Fusos Horários

Oracle Internal & Oracle Academy Use Only


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

Ao concluir esta lição, você será capaz de:


• Usar tipos de dados semelhantes a DATE que armazenem
frações de segundos e rastreiem fusos horários
• Usar tipos de dados que armazenem a diferença entre
dois valores de data/horário
• Usar as seguintes functions de data/horário:

Oracle Internal & Oracle Academy Use Only


– CURRENT_DATE
– CURRENT_TIMESTAMP – TZ_OFFSET
– LOCALTIMESTAMP – FROM_TZ
– DBTIMEZONE – TO_TIMESTAMP
– SESSIONTIMEZONE – TO_YMINTERVAL
– EXTRACT – TO_DSINTERVAL

Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Nesta lição, você aprenderá a usar tipos de dados semelhantes a DATE que armazenem frações
de segundos e rastreiem fusos horários. Esta lição trata de algumas das functions de data/horário
disponíveis no banco de dados Oracle.

Oracle Database: Fundamentos de SQL II 5 - 2


Agenda de Lições

• CURRENT_DATE, CURRENT_TIMESTAMP
e LOCALTIMESTAMP
• Tipos de dados INTERVAL
• Usando as seguintes functions:
– EXTRACT
– TZ_OFFSET

Oracle Internal & Oracle Academy Use Only


– FROM_TZ
– TO_TIMESTAMP
– TO_YMINTERVAL
– TO_DSINTERVAL

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 5 - 3


Fusos Horários

-08:00 +07:00

Oracle Internal & Oracle Academy Use Only


+02:00 +10:00
-05:00

A imagem representa o horário de


cada fuso quando a hora de
Greenwich é 12:00.

Copyright © 2011, Oracle. Todos os direitos reservados.

Fusos Horários
As horas do dia são medidas pela rotação da Terra. O horário do dia em um determinado
momento dependerá de sua localização. Quando for meio-dia em Greenwich, Inglaterra, será
meia-noite ao longo da Linha de Data Internacional. A Terra está dividida em 24 fusos horários,
um para cada hora do dia. O horário ao longo do principal meridiano em Greenwich, Inglaterra,
é conhecido como Tempo Médio de Greenwich, ou GMT. O GMT atualmente é conhecido
como Coordinated Universal Time - Hora Universal, ou UTC. O UTC é o horário padrão usado
como referência por todos os outros fusos horários do mundo. É igual durante todo o ano e não é
afetado pela estação de verão nem pelo horário de verão. A linha do meridiano é imaginária e se
estende do Polo Norte ao Polo Sul. É conhecida como de longitude zero e é a linha a partir da
qual todas as outras linhas de longitude são medidas. Todo o horário é medido em relação ao
UTC e todos os locais têm uma latitude (sua distância ao norte ou sul do Equador) e uma
longitude (sua distância a leste ou oeste do meridiano de Greenwich).

Oracle Database: Fundamentos de SQL II 5 - 4


Parâmetro de Sessão TIME_ZONE

TIME_ZONE pode ser definido como:


• Um deslocamento absoluto
• Fuso horário do banco de dados
• Fuso horário local do SO
• Uma região nomeada

Oracle Internal & Oracle Academy Use Only


ALTER SESSION SET TIME_ZONE = '-05:00';
ALTER SESSION SET TIME_ZONE = dbtimezone;
ALTER SESSION SET TIME_ZONE = local;
ALTER SESSION SET TIME_ZONE = 'America/New_York';

Copyright © 2011, Oracle. Todos os direitos reservados.

Parâmetro de Sessão TIME_ZONE


O banco de dados Oracle suporta armazenamento de fuso horário com seus dados de data e hora,
bem como frações de segundos. O comando ALTER SESSION pode ser usado para alterar os
valores de fuso horário na sessão do usuário. Os valores de fuso horário podem ser definidos
como um deslocamento absoluto, um fuso horário local, nomeado ou de banco de dados.

Oracle Database: Fundamentos de SQL II 5 - 5


CURRENT_DATE, CURRENT_TIMESTAMP
e LOCALTIMESTAMP
• CURRENT_DATE:
– Retorna a data atual da sessão do usuário
– Possui um tipo de dados de DATE
• CURRENT_TIMESTAMP:
– Retorna data/horário atuais da sessão do usuário
– Possui um tipo de dados de TIMESTAMP WITH TIME ZONE

Oracle Internal & Oracle Academy Use Only


• LOCALTIMESTAMP:
– Retorna data/horário atuais da sessão do usuário
– Possui um tipo de dados de TIMESTAMP

Copyright © 2011, Oracle. Todos os direitos reservados.

CURRENT_DATE, CURRENT_TIMESTAMP e LOCALTIMESTAMP


As functions CURRENT_DATE e CURRENT_TIMESTAMP retornam a data e o timestamp
atuais, respectivamente. Um tipo de dados de CURRENT_DATE é DATE. O tipo de dados de
CURRENT_TIMESTAMP é TIMESTAMP WITH TIME ZONE. Os valores retornados exibem o
deslocamento do fuso horário da sessão SQL que executa as functions. O deslocamento de fuso
horário representa a diferença (em horas e minutos) entre o horário local e o UTC. O tipo de
dados de TIMESTAMP WITH TIME ZONE possui o formato:
TIMESTAMP [ (fractional_seconds_precision) ] WITH TIME ZONE
em que fractional_seconds_precision especifica, como opção, o número de dígitos
na parte fracional do campo de data/horário SECOND e pode ser um número no intervalo de 0 a
9. O default é 6.
A function LOCALTIMESTAMP retorna a data e o horário atuais no fuso horário da sessão. A
diferença entre LOCALTIMESTAMP e CURRENT_TIMESTAMP é que LOCALTIMESTAMP
retorna um valor TIMESTAMP, enquanto CURRENT_TIMESTAMP retorna um valor
TIMESTAMP WITH TIME ZONE.
Essas funções são compatíveis com NLS (national language support)—isto é, os resultados
estarão nos formatos de calendário e data/horário de NLS atuais.
Observação: A function SYSDATE retorna a data e o horário atuais como um tipo de dados de
DATE. Você aprendeu a usar a funcção SYSDATE no curso Oracle Database: Fundamentos de
SQL I.
Oracle Database: Fundamentos de SQL II 5 - 6
Comparando Data/Horário no Fuso Horário
de uma Sessão
O parâmetro TIME_ZONE é definido como –5:00 e as
instruções SELECT para cada data/horário são executadas
para comparar as diferenças.

ALTER SESSION
SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
ALTER SESSION SET TIME_ZONE = '-5:00';

Oracle Internal & Oracle Academy Use Only


SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL; 1

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL; 2

SELECT SESSIONTIMEZONE, LOCALTIMESTAMP FROM DUAL; 3

Copyright © 2011, Oracle. Todos os direitos reservados.

Comparando Data/Horário no Fuso Horário de uma Sessão


O comando ALTER SESSION define o formato de data da sessão como
'DD-MON-YYYY HH24:MI:SS’—ou seja, dia do mês (1–31)-nome abreviado do mês-hora
do dia de 4 dígitos (0–23):minuto (0–59):segundo (0–59).
O exemplo no slide mostra que a sessão é alterada para definir o parâmetro TIME_ZONE como
–5:00. Em seguida, a instrução SELECT para CURRENT_DATE, CURRENT_TIMESTAMP e
LOCALTIMESTAMP é executada a fim de apontar as diferenças no formato.
Observação: O parâmetro TIME_ZONE especifica o deslocamento do fuso horário local default
para a sessão de SQL atual. TIME_ZONE é apenas um parâmetro de sessão, não de
inicialização. O parâmetro TIME_ZONE é definido como se segue:
TIME_ZONE = '[+ | -] hh:mm'
A máscara do formato ([+ | -] hh:mm) indica as horas e minutos antes ou depois de UTC.

Oracle Database: Fundamentos de SQL II 5 - 7


Comparando Data/Horário no Fuso Horário
de uma Sessão
Resultados de consultas:

Oracle Internal & Oracle Academy Use Only


3

Copyright © 2011, Oracle. Todos os direitos reservados.

Comparando Data/Horário no Fuso Horário de uma Sessão (continuação)


Neste caso, a function CURRENT_DATE retorna a data atual do fuso horário de uma sessão, a
function CURRENT_TIMESTAMP retorna a data e o horário do fuso horário de uma sessão
como valor de tipo de dados de TIMESTAMP WITH TIME ZONE e a function
LOCALTIMESTAMP retorna data/horário atuais no fuso horário de uma sessão.

Oracle Database: Fundamentos de SQL II 5 - 8


DBTIMEZONE e SESSIONTIMEZONE

• Exiba o valor do fuso horário do banco de dados:

SELECT DBTIMEZONE FROM DUAL;

• Exiba o valor do fuso horário da sessão:

Oracle Internal & Oracle Academy Use Only


SELECT SESSIONTIMEZONE FROM DUAL;

Copyright © 2011, Oracle. Todos os direitos reservados.

DBTIMEZONE e SESSIONTIMEZONE
O DBA define o fuso horário default do banco de dados ao especificar a cláusula SET
TIME_ZONE da instrução CREATE DATABASE . Se for omitido, o fuso horário default do
banco de dados será o fuso horário do sistema operacional. O fuso horário do banco de dados
não pode ser alterado em uma sessão com uma instrução ALTER SESSION.
A function DBTIMEZONE retorna o valor do fuso horário do banco de dados. O tipo de retorno é
um deslocamento de fuso horário (um tipo de caractere no formato: '[+|-]TZH:TZM') ou um
nome de região de fuso horário, dependendo de como o usuário especificou o valor do fuso
horário do banco de dados na instrução CREATE DATABASE ou ALTER DATABASE mais
recente. O exemplo do slide mostra que o fuso horário do banco de dados foi definido como “–
05:00,” pois o parâmetro TIME_ZONE está no formato:
TIME_ZONE = '[+ | -] hh:mm'
A function SESSIONTIMEZONE retorna o valor do fuso horário da sessão atual. O tipo de
retorno é um deslocamento de fuso horário (um tipo de caractere no formato '[+|-
]TZH:TZM') ou um nome de região de fuso horário, dependendo de como o usuário
especificou o valor do fuso horário da sessão na instrução ALTER SESSION mais recente. O
exemplo do slide mostra que o fuso horário da sessão é o deslocamento para UTC em –8 horas.
Observe que o fuso horário do banco de dados é diferente do da sessão atual.

Oracle Database: Fundamentos de SQL II 5 - 9


Tipos de dados TIMESTAMP

Tipo de Dados Campos

TIMESTAMP Ano, Mês, Dia, Hora, Minuto, Segundo


com frações de segundos

TIMESTAMP WITH TIME ZONE Igual ao tipo de dados de TIMESTAMP,

Oracle Internal & Oracle Academy Use Only


também inclui:
TIMEZONE_HOUR e TIMEZONE_MINUTE
ou TIMEZONE_REGION

Igual ao tipo de dados de TIMESTAMP;


TIMESTAMP WITH LOCAL
TIME ZONE também inclui um deslocamento de fuso
horário em seu valor

Copyright © 2011, Oracle. Todos os direitos reservados.

Tipos de dados TIMESTAMP


O tipo de dados de TIMESTAMP é uma extensão do tipo de dados de DATE.
TIMESTAMP (fractional_seconds_ precision)
Este tipo de dados contém os valores de data de ano, mês e dia, além dos valores de tempo de
hora, minuto e segundo, em que a precisão significativa de frações de segundos é o número de
dígitos na parte fracional do campo de data/horário SECOND. Os valores aceitos de
fractional_seconds_precision significativos estão entre 0 e 9. O default é 6.
TIMESTAMP (fractional_seconds_precision) WITH TIME ZONE
Esse tipo de dados contém todos os valores de TIMESTAMP, bem como o valor de deslocamento
do fuso horário.
TIMESTAMP (fractional_seconds_precision) WITH LOCAL TIME ZONE
Esse tipo de dados contém todos os valores de TIMESTAMP, com as seguintes exceções:
• Os dados são normalizados para o fuso horário do banco de dados quando são armazenados
no banco de dados.
• Quando os dados são recuperados, os usuários vêem os dados no fuso horário da sessão.

Oracle Database: Fundamentos de SQL II 5 - 10


Campos TIMESTAMP

Campo de Data e Hora Valores Válidos


YEAR –4712 a 9999 (excluindo o ano 0)
MONTH 01 a 12
DAY 01 a 31
HOUR 00 a 23

Oracle Internal & Oracle Academy Use Only


MINUTE 00 a 59
SECOND 00 a 59,9(N) em que 9(N) é a precisão
TIMEZONE_HOUR –12 a 14
TIMEZONE_MINUTE 00 a 59

Copyright © 2011, Oracle. Todos os direitos reservados.

Campos de TIMESTAMP
Cada tipo de dados de data/horário é composto de vários desses campos. Datas/horários só serão
mutuamente comparáveis e atribuíveis se tiverem os mesmos campos de data/horário.

Oracle Database: Fundamentos de SQL II 5 - 11


Diferença Entre DATE e TIMESTAMP

A B
-- when hire_date is ALTER TABLE employees
of type DATE MODIFY hire_date TIMESTAMP;

SELECT hire_date SELECT hire_date


FROM employees; FROM employees;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Tipo de Dados de TIMESTAMP: Exemplo


No slide, o exemplo A mostra os dados da coluna hire_date da tabela EMPLOYEES quando
o tipo de dados da coluna é DATE. No exemplo B, a tabela é alterada e o tipo de dados da coluna
hire_date é transformado em TIMESTAMP. A saída mostra as diferenças na exibição. Você
pode converter de DATE para TIMESTAMP quando a coluna tiver dados, mas não pode
converter de DATE ou TIMESTAMP para TIMESTAMP WITH TIME ZONE, a menos que a
coluna esteja vazia.
É possível especificar a precisão de fração de segundos do timestamp. Se nenhuma for
especificada, como neste exemplo, o valor definido como default será 6.
Por exemplo, a instrução a seguir define a precisão de fração de segundos como 7:
ALTER TABLE employees
MODIFY hire_date TIMESTAMP(7);
Observação: O tipo de dados de data do Oracle aparece por default como mostrado neste
exemplo. Entretanto, o tipo de dados de data também contém informações adicionais como
horas, minutos, segundos, AM e PM. Para obter a data nesse formato, você pode aplicar uma
máscara de formato ou uma function no valor de data.

Oracle Database: Fundamentos de SQL II 5 - 12


Comparando Tipos de Dados de TIMESTAMP

CREATE TABLE web_orders


(order_date TIMESTAMP WITH TIME ZONE,
delivery_time TIMESTAMP WITH LOCAL TIME ZONE);

INSERT INTO web_orders values


(current_date, current_timestamp + 2);

Oracle Internal & Oracle Academy Use Only


SELECT * FROM web_orders;

Copyright © 2011, Oracle. Todos os direitos reservados.

Comparando Tipos de Dados de TIMESTAMP


No exemplo do slide, uma nova tabela web_orders é criada com uma coluna de tipo de dados
TIMESTAMP WITH TIME ZONE e uma coluna de tipo de dados TIMESTAMP WITH LOCAL
TIME ZONE. Essa tabela é preenchida sempre que uma web_order é emitida. O timestamp e
o fuso horário do usuário que emite a ordem é inserido com base no CURRENT_DATE value.
O timestamp e o fuso horário locais são preenchidos inserindo-se dois dias a partir do valor de
CURRENT_TIMESTAMP para ambos sempre que uma ordem é emitida. Quando uma empresa
baseada na web garante a remessa, ela pode estimar o prazo de entrega com base no fuso horário
da pessoa que emite a ordem.

Oracle Database: Fundamentos de SQL II 5 - 13


Agenda de Lições

• CURRENT_DATE, CURRENT_TIMESTAMP
e LOCALTIMESTAMP
• Tipos de dados de INTERVAL
• Usando as seguintes functions:
– EXTRACT
– TZ_OFFSET

Oracle Internal & Oracle Academy Use Only


– FROM_TZ
– TO_TIMESTAMP
– TO_YMINTERVAL
– TO_DSINTERVAL

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 5 - 14


Tipos de Dados de INTERVAL

• Os tipos de dados de INTERVAL são usados para


armazenar a diferença entre dois valores de data/horário.
• Existem duas classes de intervalos:
– Ano-mês
– Dia-hora
• A precisão do intervalo é:
– O subconjunto real de campos que constitui um intervalo

Oracle Internal & Oracle Academy Use Only


– Especificado em um qualificador de intervalo

Tipo de Dados Campos


INTERVAL YEAR TO MONTH Ano, Mês

INTERVAL DAY TO SECOND Dias, Hora, Minuto, Segundo com fração


de segundos

Copyright © 2011, Oracle. Todos os direitos reservados.

Tipos de Dados de INTERVAL


Os tipos de dados de INTERVAL são usados para armazenar a diferença entre dois valores de
data/horário. Existem duas classes de intervalos: ano-mês e dia-hora. Um intervalo ano-mês é
constituído de um subconjunto contíguo de campos de YEAR e MONTH, enquanto um intervalo
dia-hora é composto de um subconjunto contíguo de campos que consiste em DAY, HOUR,
MINUTE e SECOND. O subconjunto real de campos que constitui um intervalo é chamado de
precisão do intervalo e é especificado no qualificador de intervalo. Como o número de dias em
um ano depende do calendário, o intervalo ano-mês depende do NLS, enquanto o intervalo dia-
hora, não.
O qualificador de intervalo também pode especificar a precisão do campo inicial (ou único), que
é o número de dígitos. Caso o campo final seja o valor SECOND, o qualificador de intervalo
também poderá especificar a precisão das frações de segundos, que é o número de dígitos na
parte fracional do valor SECOND. Se não for especificado, o valor default de precisão do campo
à inicial será de 2 dígitos, e o valor default de precisão de fração de segundos será de 6 dígitos.

Oracle Database: Fundamentos de SQL II 5 - 15


Tipos de Dados de INTERVAL (continuação)
INTERVAL YEAR (year_precision) TO MONTH
Este tipo de dados armazena um período em anos e meses, em que year_precision é o
número de dígitos no campo de data/horário YEAR. Os valores aceitos estão entre 0 e 9. O
default é 6.

INTERVAL DAY (day_precision) TO SECOND


(fractional_seconds_precision)
Este tipo de dados armazena um período em dias, horas, minutos e segundos, em que
day_precision é o número máximo de dígitos no campo de data/horário DAY (os valores
aceitos estão entre 0 e 9, o default é 2) e fractional_seconds_precision é o número
de dígitos da parte fracional do campo SECOND. Os valores aceitos estão entre 0 e 9. O default é
6.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II 5 - 16


Campos INTERVAL

Campo Valores Válidos de Intervalo


INTERVAL
ANO Qualquer número inteiro positivo ou negativo

MÊS 00 a 11

DIA Qualquer número inteiro positivo ou negativo

Oracle Internal & Oracle Academy Use Only


HOUR 00 a 23

MINUTE 00 a 59

SECOND 00 a 59,9(N) em que 9(N) é a precisão

Copyright © 2011, Oracle. Todos os direitos reservados.

Campos INTERVAL
INTERVAL YEAR TO MONTH pode ter campos para YEAR e MONTH.
INTERVAL DAY TO SECOND podem ter campos para DAY, HOUR, MINUTE e SECOND.
O subconjunto real de campos que constitui um item do tipo de intervalo é definido por um
qualificador de intervalo e esse subconjunto é conhecido como precisão do item.
Os intervalos de ano-mês são mutuamente comparáveis e atribuíveis apenas a outros intervalos
de ano-mês, e os de dia-hora são mutuamente comparáveis e atribuíveis somente a outros
intervalos de dia-hora.

Oracle Database: Fundamentos de SQL II 5 - 17


INTERVAL YEAR TO MONTH: Exemplo

CREATE TABLE warranty


(prod_id number, warranty_time INTERVAL YEAR(3) TO
MONTH);
INSERT INTO warranty VALUES (123, INTERVAL '8' MONTH);
INSERT INTO warranty VALUES (155, INTERVAL '200'
YEAR(3));

Oracle Internal & Oracle Academy Use Only


INSERT INTO warranty VALUES (678, '200-11');
SELECT * FROM warranty;

Copyright © 2011, Oracle. Todos os direitos reservados.

Tipo de Dados de INTERVAL YEAR TO MONTH


INTERVAL YEAR TO MONTH armazena um período usando os campos de data/horário YEAR e
MONTH. Especifique INTERVAL YEAR TO MONTH como se segue:
INTERVAL YEAR [(year_precision)] TO MONTH
em que year_precision é o número de dígitos no campo de data/horário YEAR. O valor
default de year_precision é 2.
Restrição: O campo inicial deve ser mais significativo do que o campo final. Por exemplo,
INTERVAL '0-1' MONTH TO YEAR não é válido.
Exemplos
• INTERVAL '123-2' YEAR(3) TO MONTH
Indica um intervalo de 123 anos, 2 meses
• INTERVAL '123' YEAR(3)
Indica um intervalo de 123 anos, 0 meses
• INTERVAL '300' MONTH(3)
Indica um intervalo de 300 meses
• INTERVAL '123' YEAR
Retorna um erro porque a precisão default é 2, e 123 possui 3 dígitos

Oracle Database: Fundamentos de SQL II 5 - 18


Tipo de Dados INTERVAL YEAR TO MONTH (continuação)
O banco de dados Oracle suporta dois tipos de dados de intervalo: INTERVAL YEAR TO MONTH
e INTERVAL DAY TO SECOND; o tipo de coluna, o argumento PL/SQL, a variável e o tipo de
retorno devem ser um dos dois. Mas para literais de intervalo, o sistema reconhece outros tipos
de intervalo ANSI (American National Standards Institute) como INTERVAL '2' YEAR ou
INTERVAL '10' HOUR. Nesses casos, cada intervalo é convertido em um dos dois tipos
suportados.
No exemplo do slide, é criada uma tabela WARRANTY, que contém uma coluna
warranty_time que aceita o tipo de dados INTERVAL YEAR(3) TO MONTH. Valores
diferentes são inseridos nela para indicar anos e meses de vários produtos. Quando essas linhas
são recuperadas da tabela, você vê o valor do ano separado do valor do mês por um (-).

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II 5 - 19


Tipo de Dados de INTERVAL DAY TO SECOND:
Exemplo

CREATE TABLE lab


( exp_id number, test_time INTERVAL DAY(2) TO SECOND);

INSERT INTO lab VALUES (100012, '90 00:00:00');


INSERT INTO lab VALUES (56098,

Oracle Internal & Oracle Academy Use Only


INTERVAL '6 03:30:16' DAY TO SECOND);

SELECT * FROM lab;

Copyright © 2011, Oracle. Todos os direitos reservados.

Tipo de Dados de INTERVAL DAY TO SECOND: Exemplo


No exemplo do slide, você está criando a tabela de laboratório com uma coluna test_time do
tipo de dados de INTERVAL DAY TO SECOND. Em seguida, insira nela o valor ‘90
00:00:00’ para indicar 90 dias e 0 horas, 0 minutos, 0 segundos e INTERVAL '6
03:30:16' DAY TO SECOND para indicar 6 dias, 3 horas, 30 minutos e 16 segundos. A
instrução SELECT mostra como esses dados são exibidos no banco de dados.

Oracle Database: Fundamentos de SQL II 5 - 20


Agenda de Lições

• CURRENT_DATE, CURRENT_TIMESTAMP
e LOCALTIMESTAMP
• Tipos de dados de INTERVAL
• Usando as seguintes functions:
– EXTRACT
– TZ_OFFSET

Oracle Internal & Oracle Academy Use Only


– FROM_TZ
– TO_TIMESTAMP
– TO_YMINTERVAL
– TO_DSINTERVAL

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 5 - 21


EXTRACT

• Exiba o componente YEAR de SYSDATE.


SELECT EXTRACT (YEAR FROM SYSDATE) FROM DUAL;

• Exiba o componente MONTH de HIRE_DATE para


funcionários cujo MANAGER_ID seja 100.

Oracle Internal & Oracle Academy Use Only


SELECT last_name, hire_date,
EXTRACT (MONTH FROM HIRE_DATE)
FROM employees
WHERE manager_id = 100;

Copyright © 2011, Oracle. Todos os direitos reservados.

EXTRACT
A expressão EXTRACT extrai e retorna o valor de um campo de data/horário especificado de
uma expressão de valor de data/horário ou intervalo. Você pode extrair qualquer componente
citado na sintaxe anterior usando a function EXTRACT. A sintaxe da function EXTRACT é:
SELECT EXTRACT ([YEAR] [MONTH][DAY] [HOUR] [MINUTE][SECOND]
[TIMEZONE_HOUR] [TIMEZONE_MINUTE]
[TIMEZONE_REGION] [TIMEZONE_ABBR]
FROM [datetime_value_expression] [interval_value_expression]);
Quando você extrai TIMEZONE_REGION ou TIMEZONE_ABBR (abreviação), o valor
retornado é uma string que contém o nome ou a abreviação do fuso horário apropriado. Quando
extrai qualquer um dos outros valores, o valor retornado é uma data do calendário gregoriano.
Durante a extração de data/horário com um valor de fuso horário, o valor retornado está em
UTC.
No primeiro exemplo do slide, a function EXTRACT é usada para extrair YEAR de SYSDATE.
No segundo exemplo do slide, a function EXTRACT é usada a fim de extrair MONTH da coluna
HIRE_DATE da tabela EMPLOYEES para os funcionários que reportam ao gerente cujo
EMPLOYEE_ID seja 100.

Oracle Database: Fundamentos de SQL II 5 - 22


TZ_OFFSET

Exiba o deslocamento de fuso horário para os fusos


'US/Eastern', 'Canada/Yukon' e 'Europe/London':

SELECT TZ_OFFSET('US/Eastern'),
TZ_OFFSET('Canada/Yukon'),
TZ_OFFSET('Europe/London')
FROM DUAL;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

TZ_OFFSET
A function TZ_OFFSET retorna o deslocamento de fuso horário correspondente ao valor
informado. O valor de retorno depende da data em que a instrução é executada. Por exemplo, se
a function TZ_OFFSET retornar um valor –08:00, esse valor indicará que o fuso horário em que
o comando foi executado está oito horas atrás do UTC. Você pode informar um nome de fuso
horário válido, um deslocamento de fuso horário do UTC (que retorna a si mesmo) ou a palavra-
chave SESSIONTIMEZONE ou DBTIMEZONE. A sintaxe da function TZ_OFFSET é:
TZ_OFFSET ( ['time_zone_name'] '[+ | -] hh:mm' ]
[ SESSIONTIMEZONE] [DBTIMEZONE]
A Ford Motor Company possui sede em Michigan, EUA, cujo fuso horário é o do leste dos
Estados Unidos. O presidente da empresa, sr. Ford, deseja conduzir uma conference call com os
vice-presidentes de operações do Canadá e da Europa, que estão nos fusos horários de
Canadá/Yukon e Europa/Londres, respectivamente. O sr. Ford deseja saber o horário em cada
um desses locais para confirmar a participação de sua gerência na reunião. Seu assistente, o sr.
Scott, ajuda emitindo as consultas mostradas no exemplo e obtém os seguintes resultados:
• O fuso horário 'US/Eastern' está atrasado quatro horas em relação ao UTC.
• O fuso horário 'Canada/Yukon' está atrasado sete horas em relação ao UTC.
• O fuso horário 'Europe/London' está uma hora adiantado em relação ao UTC.

Oracle Database: Fundamentos de SQL II 5 - 23


TZ_OFFSET (continuação)
Para obter uma lista de valores de nome de fuso horário válidos, você pode consultar a view
dinâmica de desempenho V$TIMEZONE_NAMES.
SELECT * FROM V$TIMEZONE_NAMES;

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II 5 - 24


FROM_TZ

Exiba o valor de TIMESTAMP '2000-03-28 08:00:00' como


valor de TIMESTAMP WITH TIME ZONE para a região de fuso
horário 'Australia/North'.

SELECT FROM_TZ(TIMESTAMP
'2000-07-12 08:00:00', 'Australia/North')
FROM DUAL;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

FROM_TZ
A function FROM_TZ converte um valor de TIMESTAMP em um valor de TIMESTAMP WITH
TIME ZONE .
A sintaxe da function FROM_TZ é:
FROM_TZ(TIMESTAMP timestamp_value, time_zone_value)
em que time_zone_value é uma string de caracteres no formato 'TZH:TZM' ou uma
expressão de caracteres que retorna uma string em TZR (região de fuso horário) com um formato
TZD opcional. TZD é uma string de fuso horário abreviada com informações sobre o horário de
verão. TZR representa a região do fuso horário nas strings de entrada de data/horário.
'Australia/North' e 'PST' são exemplos para o horário padrão EUA/Pacífico, 'PDT'
para horário de verão EUA/Pacífico etc.
O exemplo do slide converte um valor de TIMESTAMP em TIMESTAMP WITH TIME ZONE.
Observação: Para exibir uma lista de valores válidos para os elementos de formato TZR e TZD,
consulte a view dinâmica de desempenho V$TIMEZONE_NAMES .

Oracle Database: Fundamentos de SQL II 5 - 25


TO_TIMESTAMP

Exiba a string de caracteres '2007-03-06 11:00:00'


como um valor TIMESTAMP:

SELECT TO_TIMESTAMP ('2007-03-06 11:00:00',


'YYYY-MM-DD HH:MI:SS')
FROM DUAL;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

TO_TIMESTAMP
A function TO_TIMESTAMP converte uma string de CHAR, VARCHAR2, NCHAR ou o tipo de
dados de NVARCHAR2 em um valor do tipo de dados TIMESTAMP. A sintaxe da function
TO_TIMESTAMP é:
TO_TIMESTAMP (char,[fmt],['nlsparam'])
O fmt opcional especifica o formato de char. Se você omitir fmt, a string deverá estar no
formato default do tipo de dados TIMESTAMP. O nlsparam opcional especifica o idioma no
qual abreviações e nomes de mês e dia são retornados. Este argumento pode ter o seguinte
formato:
'NLS_DATE_LANGUAGE = language'
Se você omitir nlsparams, essa function usará o idioma de data default para sua sessão.
O exemplo do slide converte uma string de caracteres em um valor de TIMESTAMP.
Observação: Você pode usar a function TO_TIMESTAMP_TZ para converter uma string de
CHAR, VARCHAR2, NCHAR, ou de tipo de dados NVARCHAR2 em um valor do tipo de dados
TIMESTAMP WITH TIME ZONE . Para obter mais informações sobre essa função, consulte
Oracle Database SQL Language Reference for 10g or 11g database.

Oracle Database: Fundamentos de SQL II 5 - 26


TO_YMINTERVAL

Exiba uma data de um ano e dois meses após a data


de contratação dos funcionários do departamento com
o DEPARTMENT_ID 20.

SELECT hire_date,
hire_date + TO_YMINTERVAL('01-02') AS
HIRE_DATE_YMININTERVAL

Oracle Internal & Oracle Academy Use Only


FROM employees
WHERE department_id = 20;

Copyright © 2011, Oracle. Todos os direitos reservados.

TO_YMINTERVAL
A function TO_YMINTERVAL converte uma string de caracteres de CHAR, VARCHAR2,
NCHAR, ou tipo de dados de NVARCHAR2 em um tipo de dados de INTERVAL YEAR TO
MONTH. O tipo de dados de INTERVAL YEAR TO MONTH armazena um período usando os
campos de data/horário YEAR e MONTH. O formato de INTERVAL YEAR TO MONTH é:
INTERVAL YEAR [(year_precision)] TO MONTH
em que year_precision é o número de dígitos no campo de data/horário YEAR. O valor
default de year_precision é 2.
A sintaxe da function TO_YMINTERVAL é:
TO_YMINTERVAL (char)
em que char é a string de caracteres a ser convertida
O exemplo no slide calcula uma data de um ano e dois meses após a data de contratação dos
funcionários do departamento 20 da tabela EMPLOYEES.

Oracle Database: Fundamentos de SQL II 5 - 27


TO_DSINTERVAL

Exiba uma data 100 dias e 10 horas após a data de


contratação de todos os funcionários.

SELECT last_name,
TO_CHAR(hire_date, 'mm-dd-yy:hh:mi:ss') hire_date,
TO_CHAR(hire_date +
TO_DSINTERVAL('100 10:00:00'),
'mm-dd-yy:hh:mi:ss') hiredate2

Oracle Internal & Oracle Academy Use Only


FROM employees;

Copyright © 2011, Oracle. Todos os direitos reservados.

TO_DSINTERVAL
TO_DSINTERVAL converte uma string de caracteres de CHAR, VARCHAR2, NCHAR, ou de tipo
de dados de NVARCHAR2 em um tipo de dados de INTERVAL DAY TO SECOND.
No exemplo do slide, a data de 100 dias e 10 horas após a contratação é obtida.

Oracle Database: Fundamentos de SQL II 5 - 28


Horário de Verão

• Primeiro Domingo de Abril


– O horário salta de 01:59:59 para 03:00:00.
– Os valores entre 02:00:00 a 02:59:59 AM não são válidos.
• Último Domingo de Outubro
– O horário salta de 02:00:00 para 01:00:01.
– Os valores entre 01:00:01 a 02:00:00 são ambíguos porque

Oracle Internal & Oracle Academy Use Only


são acessados duas vezes.

Copyright © 2011, Oracle. Todos os direitos reservados.

DST (Horário de Verão)


A maioria dos países ocidentais avança o relógio uma hora durante os meses de verão. O período
é chamado de horário de verão. O horário de verão compreende o primeiro domingo de abril até
o último domingo de outubro na maioria dos Estados Unidos, México e Canadá. Os países da
União Europeia cumprem o horário de verão, mas eles o chamam de período de verão. O
período de verão da Europa começa uma semana antes de sua contrapartida norte-americana,
mas termina na mesma época.
O banco de dados Oracle verifica automaticamente, para qualquer região de fuso horário, se o
horário de verão está em vigor e retorna os valores respectivos ao horário local. O valor de
data/horário é suficiente para o banco de dados Oracle verificar se o horário de verão está em
vigor em uma determinada região em todos os casos, exceto casos de limite. Um caso de limite
ocorre durante o período de início ou término do horário de verão. Por exemplo, na região
EUA/Oriental, quando o horário de verão entra em vigor, o horário é alterado de 01:59:59 para
03:00:00. O intervalo de uma hora entre 02:00:00 e 02:59:59 não existe. Quando o horário de
verão termina, o horário é alterado de 02:00:00 para 01:00:01, e o intervalo de uma hora entre
01:00:01 e 02:00:00 é repetido.

Oracle Database: Fundamentos de SQL II 5 - 29


DST (Horário de Verão) (continuação)
ERROR_ON_OVERLAP_TIME
O ERROR_ON_OVERLAP_TIME é um parâmetro de sessão que faz com que o sistema emita
um erro ao encontrar uma data/horário que ocorra no período sobreposto e nenhuma abreviação
de fuso horário tiver sido especificada para distinguir o período.
Por exemplo, o horário de verão termina em 31 de outubro, às 02:00:01. Os períodos sobrepostos
são:
• 31/10/2004 01:00:01 a 31/10/2004 02:00:00 (EDT)
• 31/10/2004 01:00:01 a 31/10/2004 02:00:00 (EST)
Se você inserir uma string de data/horário que ocorra em um desses dois períodos, deverá
especificar a abreviação do fuso horário (por exemplo, EDT ou EST) na string de entrada para
que o sistema determine o período. Sem essa abreviação do fuso horário, o sistema faz o
seguinte:

Oracle Internal & Oracle Academy Use Only


Se o parâmetro ERROR_ON_OVERLAP_TIME for FALSE, ele considerará que o horário de
entrada é o padrão (por exemplo, EST). Caso contrário, um erro será indicado.

Oracle Database: Fundamentos de SQL II 5 - 30


Questionário

O parâmetro de sessão TIME_ZONE pode ser definido como:


1. Um deslocamento relativo
2. Fuso horário do banco de dados
3. Fuso horário local do SO
4. Uma região nomeada

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Respostas: 2, 3, 4

Oracle Database: Fundamentos de SQL II 5 - 31


Sumário

Nesta lição, você aprendeu a usar as functions:


• CURRENT_DATE
• CURRENT_TIMESTAMP
• LOCALTIMESTAMP
• DBTIMEZONE
• SESSIONTIMEZONE

Oracle Internal & Oracle Academy Use Only


• EXTRACT
• TZ_OFFSET
• FROM_TZ
• TO_TIMESTAMP
• TO_YMINTERVAL
• TO_DSINTERVAL

Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
Esta lição trata de algumas das functions de data/horário disponíveis no banco de dados Oracle.

Oracle Database: Fundamentos de SQL II 5 - 32


Exercício 5: Visão Geral

Este exercício aborda o uso das functions de data/horário.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Exercício 5: Visão Geral


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
function EXTRACT.

Oracle Database: Fundamentos de SQL II 5 - 33


Oracle Internal & Oracle Academy Use Only
Recuperando Dados Usando Subconsultas

Oracle Internal & Oracle Academy Use Only


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

Ao concluir esta lição, você será capaz de:


• Criar uma subconsulta de várias colunas
• Usar subconsultas escalares em SQL
• Solucionar problemas com subconsultas correlacionadas
• Atualizar e deletar linhas usando subconsultas
correlacionadas

Oracle Internal & Oracle Academy Use Only


• Usar os operadores EXISTS e NOT EXISTS
• Usar a cláusula WITH

Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Nesta lição, você aprenderá a criar subconsultas de várias colunas e subconsultas na cláusula
FROM de uma instrução SELECT. Aprenderá também a solucionar problemas usando
subconsultas escalares correlacionadas e a cláusula WITH.

Oracle Database: Fundamentos de SQL II 6 - 2


Agenda de Lições

• Criando uma subconsulta de várias colunas


• Usando subconsultas escalares em SQL
• Solucionando problemas com subconsultas
correlacionadas
• Usando os operadores EXISTS E NOT EXISTS
• Usando a cláusula WITH

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 6 - 3


Subconsultas de Várias Colunas

Consulta principal
WHERE (MANAGER_ID, DEPARTMENT_ID) IN

Subconsulta

Oracle Internal & Oracle Academy Use Only


100 90
102 60
124 50

Cada linha da consulta principal é comparada a


valores de uma subconsulta de várias linhas e várias
colunas.

Copyright © 2011, Oracle. Todos os direitos reservados.

Subconsultas de Várias Colunas


Até agora, você criou subconsultas de uma única linha e de várias linhas em que apenas uma
coluna é retornada pela instrução SELECT interna, e isso é usado para avaliar a expressão na
instrução SELECT pai. Se você quiser comparar duas ou mais colunas, deverá criar uma
cláusula WHERE composta usando operadores lógicos. Com as subconsultas de várias colunas, é
possível combinar condições WHERE duplicadas em uma única cláusula WHERE.
Sintaxe
SELECTcolumn, column, ...
FROM table
WHERE(column, column, ...) IN
(SELECT column, column, ...
FROM table
WHERE condition);
O gráfico do slide ilustra que os valores de MANAGER_ID e DEPARTMENT_ID da consulta
principal estão sendo comparados aos valores de MANAGER_ID e DEPARTMENT_ID
recuperados pela subconsulta. Como o número de colunas comparadas é maior do que um, o
exemplo é qualificado como uma subconsulta de várias colunas.
Observação: Antes de praticar os exemplos nos próximos slides, será necessário criar a tabela
empl_demo e preenchê-la com dados usando o arquivo lab_06_insert_empdata.sql .

Oracle Database: Fundamentos de SQL II 6 - 4


Comparações de Coluna

As comparações de várias colunas envolvendo subconsultas


podem ser:
• Comparações em não-pares
• Comparações em pares

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Comparações em Pares Versus Não-Pares


Comparações de várias colunas envolvendo subconsultas podem ser em pares e não-pares. Se
você considerar o exemplo “Exibir os detalhes dos funcionários que trabalham no mesmo
departamento, e que têm o mesmo gerente, como ‘Daniel’? ,” será obtido o resultado correto
com a seguinte instrução:
SELECT first_name, last_name, manager_id, department_id
FROM empl_demo
WHERE manager_id IN (SELECT manager_id
FROM empl_demo
WHERE first_name = 'Daniel')
AND department_id IN (SELECT department_id
FROM empl_demo
WHERE first_name = 'Daniel');
Há apenas um “Daniel” na tabela EMPL_DEMO (Daniel Faviet, que é gerenciado pelo
funcionário 108 e trabalha no departamento 100). Entretanto, se as subconsultas retornarem mais
de uma linha, o resultado poderá não estar correto. Por exemplo, se você executar a mesma
consulta, mas substituir “Daniel” por “John”, obterá um resultado incorreto. Isso ocorre porque a
combinação de department_id e manager_id é importante. Para obter o resultado correto
desta consulta, é necessária uma comparação em pares.

Oracle Database: Fundamentos de SQL II 6 - 5


Subconsulta de Comparação em Pares

Exiba os detalhes dos funcionários gerenciados pelo mesmo


gerente e que trabalham no mesmo departamento que os
funcionários de nome “John”.
SELECT employee_id, manager_id, department_id
FROM empl_demo
WHERE (manager_id, department_id) IN
(SELECT manager_id, department_id

Oracle Internal & Oracle Academy Use Only


FROM empl_demo
WHERE first_name = 'John')
AND first_name <> 'John';

Copyright © 2011, Oracle. Todos os direitos reservados.

Subconsulta de Comparação em Pares


O exemplo do slide compara a combinação de valores na coluna MANAGER_ID e a coluna
DEPARTMENT_ID de cada linha na tabela EMPL_DEMO com os valores na coluna
MANAGER_ID e a coluna DEPARTMENT_ID para funcionários com FIRST_NAME de “John.”
Primeiro, é executada a subconsulta para recuperar os valores MANAGER_ID e
DEPARTMENT_ID dos funcionários com FIRST_NAME de “John”. Essa subconsulta retorna o
seguinte:

Oracle Database: Fundamentos de SQL II 6 - 6


Subconsulta de Comparação em Pares (continuação)
Esses valores são comparados às colunas MANAGER_ID e DEPARTMENT_ID de cada linha na
tabela EMPL_DEMO. Se houver correspondência na combinação, a linha será exibida. Na saída,
os registros dos funcionários com FIRST_NAME de “John” não serão exibidos. A seguir é
exibido o resultado da consulta no slide:

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II 6 - 7


Subconsulta de Comparação em Não-pares

Exiba os detalhes dos funcionários gerenciados pelo mesmo


gerente que os funcionários com o nome “John” e que
trabalham no mesmo departamento que os funcionários de
nome “John.”

SELECT employee_id, manager_id, department_id


FROM empl_demo

Oracle Internal & Oracle Academy Use Only


WHERE manager_id IN
(SELECT manager_id
FROM empl_demo
WHERE first_name = 'John')
AND department_id IN
(SELECT department_id
FROM empl_demo
WHERE first_name = 'John')
AND first_name <> 'John';

Copyright © 2011, Oracle. Todos os direitos reservados.

Subconsulta de Comparação em Não-pares


O exemplo mostra uma comparação em não-pares das colunas. Primeiro, é executada a
subconsulta para recuperar os valores MANAGER_ID dos funcionários com FIRST_NAME de
“John”. Da mesma maneira, é executa a segunda subconsulta para recuperar os valores
DEPARTMENT_ID dos funcionários com FIRST_NAME de “John”. Os valores recuperados das
colunas MANAGER_ID e DEPARTMENT_ID são comparados às colunas MANAGER_ID e
DEPARTMENT_ID para cada linha na tabela EMPL_DEMO. Se a coluna MANAGER_ID da linha
na tabela EMPL_DEMO corresponder a qualquer um dos valores de MANAGER_ID recuperados
pela subconsulta interna e se a coluna DEPARTMENT_ID da linha na tabela EMPL_DEMO
corresponder a qualquer um dos valores de DEPARTMENT_ID recuperados pela segunda
subconsulta, o registro será exibido.

Oracle Database: Fundamentos de SQL II 6 - 8


Subconsulta de Comparação em Não-Pares (continuação)
A seguir é exibido o resultado da consulta do slide anterior:

Oracle Internal & Oracle Academy Use Only


Esta consulta recupera linhas adicionais além da comparação em pares (as com a combinação de
manager_id=100 and department_id=50 ou 80, embora nenhum funcionário de nome
“John” tenha tal combinação).

Oracle Database: Fundamentos de SQL II 6 - 9


Agenda de Lições

• Criando uma subconsulta de várias colunas


• Usando subconsultas escalares em SQL
• Solucionando problemas com subconsultas
correlacionadas
• Usando os operadores EXISTS e NOT EXISTS
• Usando a cláusula WITH

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 6 - 10


Expressões de Subconsulta Escalar

• Uma expressão de subconsulta escalar é uma


subconsulta que retorna exatamente um valor de coluna
para uma linha.
• As subconsultas escalares podem ser usadas:
– Na condição e parte da expressão de DECODE e CASE
– Em todas as cláusulas de SELECT, exceto GROUP BY

Oracle Internal & Oracle Academy Use Only


– Nas cláusulas SET e WHERE de uma instrução UPDATE

Copyright © 2011, Oracle. Todos os direitos reservados.

Subconsultas Escalares em SQL


Uma subconsulta que retorna exatamente um valor de coluna de uma linha também é
considerada subconsulta escalar. As subconsultas de várias colunas criadas para comparar duas
ou mais colunas, usando uma cláusula WHERE composta e operadores lógicos, não são
qualificadas como subconsultas escalares.
O valor da expressão de subconsulta escalar é o valor do item da lista de seleção da subconsulta.
Se a subconsulta não retornar nenhuma linha, o valor da expressão de subconsulta escalar será
NULL. Se a subconsulta retornar mais de uma linha, o servidor Oracle retornará um erro. O
servidor Oracle sempre suportou o uso de uma subconsulta escalar em uma instrução SELECT.
Você pode usar subconsultas escalares:
• Na condição e parte da expressão de DECODE e CASE
• Em todas as cláusulas SELECT, exceto GROUP BY
• Nas cláusulas SET e WHERE de uma instrução UPDATE
Entretanto, as subconsultas escalares não são expressões válidas nas seguintes condições:
• Como valores default para colunas e expressões de hash para clusters
• Na cláusula RETURNING das instruções DML (data manipulation language)
• Como base de um índice com base na function
• Nas cláusulas GROUP BY, constraints CHECK e condições WHEN
• Nas cláusulas CONNECT BY
• Nas instruções não relacionadas a consultas, como CREATE PROFILE
Oracle Database: Fundamentos de SQL II 6 - 11
Subconsultas Escalares: Exemplos

• Subconsultas escalares em expressões CASE:


SELECT employee_id, last_name,
(CASE
20
WHEN department_id =
(SELECT department_id
FROM departments
WHERE location_id = 1800)
THEN 'Canada' ELSE 'USA' END) location

Oracle Internal & Oracle Academy Use Only


FROM employees;

• Subconsultas escalares na cláusula ORDER BY:


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

Copyright © 2011, Oracle. Todos os direitos reservados.

Subconsultas Escalares: Exemplos


O primeiro exemplo do slide demonstra que subconsultas escalares podem ser usadas nas
expressões CASE. A consulta interna retorna o valor 20, que é o ID do departamento cujo ID do
local é 1800. A expressão CASE na consulta externa usa o resultado da consulta interna para
exibir o ID do funcionário, sobrenomes e um valor Canadá ou EUA, dependendo do ID do
departamento do registro recuperado pela consulta externa ser 20 ou não.
A seguir é exibido o resultado do primeiro exemplo do slide:

Oracle Database: Fundamentos de SQL II 6 - 12


Subconsultas Escalares: Exemplos (continuação)
O segundo exemplo do slide demonstra que as subconsultas escalares podem ser usadas na
cláusula ORDER BY. O exemplo ordena o resultado com base no DEPARTMENT_NAME
correspondendo o DEPARTMENT_ID da tabela EMPLOYEES com o DEPARTMENT_ID da
tabela DEPARTMENTS. Essa comparação é feita em uma subconsulta escalar na cláusula
ORDER BY. A seguir é exibido o resultado do segundo exemplo:

Oracle Internal & Oracle Academy Use Only



O segundo exemplo usa uma subconsulta correlacionada. Em uma subconsulta correlacionada,
ela se refere a uma coluna de uma tabela relacionada na instrução pai. As subconsultas
correlacionadas serão explicadas adiante nesta lição.

Oracle Database: Fundamentos de SQL II 6 - 13


Agenda de Lições

• Criando uma subconsulta de várias colunas


• Usando subconsultas escalares em SQL
• Solucionando problemas com subconsultas
correlacionadas
• Usando os operadores EXISTS e NOT EXISTS
• Usando a cláusula WITH

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 6 - 14


Subconsultas Correlacionadas

As subconsultas correlacionadas são usadas para


processamento linha por linha. Cada subconsulta é executada
uma vez para cada linha da consulta externa.

GET
a linha candidata da consulta externa

Oracle Internal & Oracle Academy Use Only


EXECUTE
a consulta interna usando o valor da linha candidata

USE
valores da consulta interna para qualificar
ou desqualificar a linha candidata

Copyright © 2011, Oracle. Todos os direitos reservados.

Subconsultas Correlacionadas
O servidor Oracle executa uma subconsulta correlacionada quando ela se refere a uma coluna de
uma tabela relacionada na instrução pai. Uma subconsulta correlacionada é avaliada uma vez
para cada linha processada pela instrução pai. Uma instrução pai pode ser uma instrução
SELECT, UPDATE ou DELETE.
Subconsultas Aninhadas Versus Subconsultas Correlacionadas
Com uma subconsulta aninhada normal, a consulta interna SELECT é executada primeiro e
apenas uma vez, retornando valores a serem usados pela consulta principal. Entretanto, uma
subconsulta correlacionada é executada uma vez para cada linha candidata considerada pela
consulta externa. Ou seja, a consulta interna é conduzida pela consulta externa.
Execução da Subconsulta Aninhada
• A consulta aninhada é executada primeiro e localiza um valor.
• A consulta externa é executada uma vez, usando o valor da consulta interna.
Execução da Subconsulta Correlacionada
• Obtenha uma linha candidata (extraída pela consulta externa).
• Execute a consulta interna usando o valor da linha candidata.
• Use os valores resultantes da consulta interna para qualificar ou desqualificar o candidato.
• Repita até que não reste nenhuma linha candidata.

Oracle Database: Fundamentos de SQL II 6 - 15


Subconsultas Correlacionadas

A subconsulta se refere a uma coluna com base em uma


tabela na consulta pai.
SELECT column1, column2, ...
FROM table1 Outer_table
WHERE column1 operator
(SELECT column1, column2
FROM table2

Oracle Internal & Oracle Academy Use Only


WHERE expr1 =
Outer_table .expr2);

Copyright © 2011, Oracle. Todos os direitos reservados.

Subconsultas Correlacionadas (continuação)


Uma subconsulta correlacionada é uma maneira de ler cada linha de uma tabela e comparar seus
valores com os dados relacionados. Ela é usada sempre que uma subconsulta deve retornar um
resultado ou conjunto de resultados diferentes para cada linha candidata considerada na consulta
principal. Ou seja, você usa uma subconsulta correlacionada para responder a uma pergunta
multiparte cuja resposta depende do valor em cada linha processada pela instrução pai.
O servidor Oracle executa uma subconsulta correlacionada quando ela se refere a uma coluna de
uma tabela na consulta pai.
Observação: Você pode usar os operadores ANY e ALL em uma subconsulta correlacionada.

Oracle Database: Fundamentos de SQL II 6 - 16


Usando Subconsultas Correlacionadas

Localize todos os funcionários que ganham acima do salário


médio em seu departamento.

SELECT last_name, salary, department_id


FROM employees outer_table
WHERE salary >
(SELECT AVG(salary)

Oracle Internal & Oracle Academy Use Only


FROM employees inner_table
WHERE inner_table.department_id =
outer_table.department_id);

Cada vez que uma linha da


consulta externa é processada,
a consulta interna é avaliada.

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando Subconsultas Correlacionadas


O exemplo do slide determina quais funcionários ganham acima do salário médio de seu
departamento. Nesse caso, a subconsulta correlacionada calcula especificamente o salário médio
de cada departamento.
Como as consultas externa e interna usam a tabela EMPLOYEES na cláusula FROM, é dado um
apelido a EMPLOYEES na instrução SELECT externa para mais clareza. O apelido torna toda a
instrução SELECT mais legível. Sem o apelido, a consulta pode não funcionar corretamente
porque a instrução interna talvez não consiga distinguir a coluna de tabela interna da externa.

Oracle Database: Fundamentos de SQL II 6 - 17


Usando Subconsultas Correlacionadas

Exiba detalhes dos funcionários que tiverem mudado de cargo


pelo menos duas vezes.
SELECT e.employee_id, last_name,e.job_id
FROM employees e
WHERE 2 <= (SELECT COUNT(*)
FROM job_history
WHERE employee_id = e.employee_id);

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Usando Subconsultas Correlacionadas (continuação)


O exemplo do slide exibe os detalhes dos funcionários que mudaram de cargo pelo menos duas
vezes. O servidor Oracle avalia uma subconsulta correlacionada como se segue:
1. Selecione uma linha da tabela especificada na consulta externa. Ela será a linha candidata
atual.
2. Armazene o valor da coluna referida na subconsulta a partir dessa linha candidata. (No
exemplo do slide, a coluna referida na subconsulta é E.EMPLOYEE_ID.)
3. Executa a subconsulta cuja condição faz referência ao valor da linha candidata da consulta
externa. (No exemplo do slide, a function de grupo COUNT(*) é avaliada com base no
valor da coluna E.EMPLOYEE_ID obtida na etapa 2.)
4. Avalie a cláusula WHERE da consulta externa com base nos resultados da subconsulta
executada na etapa 3. Isso determina se a linha candidata é selecionada para a saída. (No
exemplo, o número de vezes que um funcionário mudou de cargo, avaliado pela
subconsulta, é comparado a 2 na cláusula WHERE da consulta externa. Se a condição for
atendida, o registro do funcionário será exibido.)
5. Repita o procedimento para a próxima linha candidata da tabela até que todas as linhas
sejam processadas.
A correlação é estabelecida com o uso de um elemento da consulta externa na subconsulta.
Neste exemplo, você compara EMPLOYEE_ID da tabela na subconsulta com EMPLOYEE_ID
da tabela na consulta externa.
Oracle Database: Fundamentos de SQL II 6 - 18
Agenda de Lições

• Criando uma subconsulta de várias colunas


• Usando subconsultas escalares em SQL
• Solucionando problemas com subconsultas
correlacionadas
• Usando os operadores EXISTS e NOT EXISTS
• Usando a cláusula WITH

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 6 - 19


Usando o Operador EXISTS

• O operador EXISTS verifica a existência de linhas no


conjunto de resultados da subconsulta.
• Se um valor de linha de subconsulta for localizado:
– A pesquisa não continuará na consulta interna
– A condição é marcada com flag como TRUE
• Se um valor de linha de subconsulta não for localizado:

Oracle Internal & Oracle Academy Use Only


– A condição será marcada com flag como FALSE
– A pesquisa continua na consulta interna

Copyright © 2011, Oracle. Todos os direitos reservados.

Operador EXISTS
Com instruções SELECT de aninhamento, todos os operadores lógicos são válidos. Além disso,
você pode usar o operador EXISTS. Esse operador é frequentemente usado com subconsultas
correlacionadas para verificar se o valor recuperado pela consulta externa existe no conjunto de
resultados dos valores recuperados pela consulta interna. Se a subconsulta retornar pelo menos
uma linha, o operador retornará como TRUE. Se o valor não existir, ele retornará como FALSE.
Dessa forma, NOT EXISTS verifica se um valor recuperado pela consulta externa não faz parte
do conjunto de resultados dos valores recuperados pela consulta interna.

Oracle Database: Fundamentos de SQL II 6 - 20


Usando o Operador EXISTS

SELECT employee_id, last_name, job_id, department_id


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

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Usando o Operador EXISTS


O operador EXISTS verifica se a pesquisa na consulta interna não continua quando pelo menos
uma correspondência é localizada para o número de gerente e funcionário pela condição:
WHERE manager_id = outer.employee_id.
Observe que a consulta interna SELECT não precisa retornar um valor específico, portanto, uma
constante pode ser selecionada.

Oracle Database: Fundamentos de SQL II 6 - 21


Localize Todos os Departamentos que Não
Possuem Funcionários

SELECT department_id, department_name


FROM departments d
WHERE NOT EXISTS (SELECT 'X'
FROM employees
WHERE department_id = d.department_id);

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Usando o Operador NOT EXISTS


Solução Alternativa
Uma estrutura NOT IN pode ser usada como uma alternativa para um operador NOT EXISTS,
conforme mostrado no exemplo a seguir:
SELECT department_id, department_name
FROM departments
WHERE department_id NOT IN (SELECT department_id
FROM employees);

No entanto, NOT IN será avaliado como FALSE se um membro do conjunto for um valor NULL.
Portanto, sua consulta não retornará nenhuma linha mesmo que exista alguma linha na tabela
departments que atenda à condição WHERE.

Oracle Database: Fundamentos de SQL II 6 - 22


UPDATE Correlacionada

Use uma subconsulta correlacionada para atualizar linhas de


uma tabela com base nas linhas de outra.
UPDATE table1 alias1
SET column = (SELECT expression
FROM table2 alias2
WHERE alias1.column =
alias2.column);

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

UPDATE Correlacionada
No caso da instrução UPDATE, você pode usar uma subconsulta correlacionada para atualizar
linhas de uma tabela com base nas linhas de outra.

Oracle Database: Fundamentos de SQL II 6 - 23


Usando uma Instrução UPDATE Correlacionada

• Desnormalize a tabela EMPL6 adicionando uma coluna para


armazenar o nome do departamento.
• Preencha a tabela usando uma atualização correlacionada.
ALTER TABLE empl6
ADD(department_name VARCHAR2(25));

UPDATE empl6 e

Oracle Internal & Oracle Academy Use Only


SET department_name =
(SELECT department_name
FROM departments d
WHERE e.department_id = d.department_id);

Copyright © 2011, Oracle. Todos os direitos reservados.

Instrução UPDATE Correlacionada (continuação)


O exemplo do slide desnormaliza a tabela EMPL6 ao adicionar uma coluna para armazenar o
nome do departamento e, em seguida, preenche a tabela usando uma atualização correlacionada.
A seguir, é apresentado outro exemplo de uma atualização correlacionada.
Instrução de Problema
A tabela REWARDS possui uma lista de funcionários que excederam as expectativas em seu
desempenho. Use uma subconsulta correlacionada para atualizar linhas na tabela EMPL6 com
base nas linhas da tabela REWARDS:
UPDATE empl6
SET salary = (SELECT empl6.salary + rewards.pay_raise
FROM rewards
WHERE employee_id =
empl6.employee_id
AND payraise_date =
(SELECT MAX(payraise_date)
FROM rewards
WHERE employee_id = empl6.employee_id))
WHERE empl6.employee_id
IN (SELECT employee_id FROM rewards);

Oracle Database: Fundamentos de SQL II 6 - 24


Instrução UPDATE Correlacionada (continuação)
Este exemplo usa a tabela REWARDS. A tabela REWARDS possui as seguintes colunas:
EMPLOYEE_ID, PAY_RAISE e PAYRAISE_DATE. Sempre que um funcionário obtém um
aumento de salário, um registro contendo detalhes como ID do funcionário, valor do aumento e
data de recebimento do aumento é inserido na tabela REWARDS. A tabela REWARDS pode conter
mais de um registro para um funcionário. A coluna PAYRAISE _DATE é usada para identificar
o aumento de salário mais recente recebido por um funcionário.
No exemplo, a coluna SALARY da tabela EMPL6 é atualizada para refletir o aumento de
salário mais recente recebido pelo funcionário. Isso é obtido com a soma do salário atual do
funcionário com o aumento correspondente de salário da tabela REWARDS.

Oracle Internal & Oracle Academy Use Only

Oracle Database: Fundamentos de SQL II 6 - 25


DELETE Correlacionada

Use uma subconsulta correlacionada para deletar linhas de


uma tabela com base nas linhas de outra.
DELETE FROM table1 alias1
WHERE column operator
(SELECT expression
FROM table2 alias2
WHERE alias1.column = alias2.column);

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

DELETE Correlacionada
No caso de uma instrução DELETE, você pode usar uma subconsulta correlacionada para deletar
somente as linhas existentes também em outra tabela. Se você decidir que manterá apenas
os quatro últimos registros do histórico de cargos na tabela JOB_HISTORY, quando um
funcionário for transferido para um quinto cargo, você deletará a linha JOB_HISTORY
mais antiga pesquisando na tabela JOB_HISTORY a MIN(START_DATE) do
funcionário. O código a seguir ilustra a maneira como a operação anterior pode ser
executada usando uma instrução DELETE correlacionada:
DELETE FROM emp_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 5 > (SELECT COUNT(*)
FROM job_history JH
WHERE JH.employee_id = E.employee_id
GROUP BY EMPLOYEE_ID
HAVING COUNT(*) >= 4));
Oracle Database: Fundamentos de SQL II 6 - 26
Usando a Instrução DELETE Correlacionada

Use uma subconsulta correlacionada para deletar somente


as linhas da tabela EMPL6 existentes também na tabela
EMP_HISTORY.

DELETE FROM empl6 E


WHERE employee_id =
(SELECT employee_id

Oracle Internal & Oracle Academy Use Only


FROM emp_history
WHERE employee_id = E.employee_id);

Copyright © 2011, Oracle. Todos os direitos reservados.

Instrução DELETE Correlacionada (continuação)


Exemplo
Duas tabelas são usadas neste exemplo. São eles:
• A tabela EMPL6, que fornece detalhes de todos os funcionários atuais
• A tabela EMP_HISTORY, que fornece detalhes dos funcionários anteriores
EMP_HISTORY contém dados relacionados aos funcionários anteriores, portanto seria um erro
se o registro do mesmo funcionário existisse nas tabelas EMPL6 e EMP_HISTORY. Você pode
deletar os registros errados usando a subconsulta correlacionada mostrada no slide.

Oracle Database: Fundamentos de SQL II 6 - 27


Agenda de Lições

• Criando uma subconsulta de várias colunas


• Usando subconsultas escalares em SQL
• Solucionando problemas com subconsultas
correlacionadas
• Usando os operadores EXISTS e NOT EXISTS
• Usando a cláusula WITH

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 6 - 28


Cláusula WITH

• Com a cláusula WITH, você pode usar o mesmo bloco de


consulta em uma instrução SELECT quando ele ocorre
mais de uma vez em uma consulta complexa.
• A cláusula WITH recupera os resultados de um bloco de
consulta e o armazena no tablespace temporário do
usuário.
• A cláusula WITH pode melhorar o desempenho.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Cláusula WITH
Com a cláusula WITH, é possível definir um bloco de consulta antes de usá-lo em uma consulta.
A cláusula WITH (formalmente conhecida como subquery_factoring_clause) permite
a reutilização do mesmo bloco de consulta em uma instrução SELECT quando ele ocorre mais
de uma vez em uma consulta complexa. Isso é particularmente útil quando uma consulta possui
muitas referências ao mesmo bloco de consulta e há joins e agregações.
Usando a cláusula WITH, você pode reutilizar a mesma consulta quando for dispendioso avaliar
o bloco de consulta e ele ocorrer mais de uma vez em uma consulta complexa. Com a cláusula
WITH, o servidor Oracle recupera os resultados de um bloco de consulta e os armazena no
tablespace temporário do usuário. Isso pode melhorar o desempenho.
Vantagens da Cláusula WITH
• Facilita a leitura da consulta
• Avalia uma cláusula apenas uma vez, mesmo que ela apareça várias vezes na consulta
• Na maioria dos casos, pode melhorar o desempenho de grandes consultas

Oracle Database: Fundamentos de SQL II 6 - 29


Cláusula WITH: Exemplo

Com a cláusula WITH, crie uma consulta para exibir o nome do


departamento e o total de salários dos departamentos cujo
salário total seja maior que o salário médio de todos os
departamentos.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Cláusula WITH: Exemplo


O problema do slide requer os seguintes cálculos intermediários:
1. Calcule o salário total de cada departamento e armazene o resultado usando uma cláusula
WITH.
2. Calcule o salário médio de todos os departamentos e armazene o resultado usando uma
cláusula WITH.
3. Compare o salário total calculado na primeira etapa com o salário médio calculado na
segunda etapa. Se o salário total de um departamento for maior que o salário médio de todos
os departamentos, exiba o nome do departamento e seu salário total.
A solução desse problema é apresentada na página seguinte.

Oracle Database: Fundamentos de SQL II 6 - 30


Cláusula WITH: Exemplo

WITH
dept_costs AS (
SELECT d.department_name, SUM(e.salary) AS dept_total
FROM employees e JOIN departments d
ON e.department_id = d.department_id
GROUP BY d.department_name),
avg_cost AS (
SELECT SUM(dept_total)/COUNT(*) AS dept_avg

Oracle Internal & Oracle Academy Use Only


FROM dept_costs)
SELECT *
FROM dept_costs
WHERE dept_total >
(SELECT dept_avg
FROM avg_cost)
ORDER BY department_name;

Copyright © 2011, Oracle. Todos os direitos reservados.

Cláusula WITH: Exemplo (continuação)


O código SQL no slide é um exemplo de uma situação em que você pode melhorar o
desempenho e criar SQL de forma mais simples com a cláusula WITH. A consulta cria os nomes
de consulta DEPT_COSTS e AVG_COST e os utiliza no corpo da consulta principal.
Internamente, a cláusula WITH é resolvida como uma view em linha ou tabela temporária. O
otimizador escolhe a resolução apropriada, dependendo do custo ou benefício do
armazenamento temporário dos resultados da cláusula WITH.
A saída gerada pelo código SQL no slide é como se segue:

Observações sobre o Uso da Cláusula WITH


• Ela é usada somente com as instruções SELECT.
• Um nome de consulta é visível a todos os blocos de consulta do elemento WITH (incluindo
seus blocos de subconsulta) definidos depois dele e do próprio bloco de consulta principal
(incluindo seus blocos de subconsulta).
• Quando o nome da consulta for igual a um nome de tabela, o parser pesquisará
internamente, e o nome do bloco de consulta terá precedência sobre o nome da tabela.
• A cláusula WITH pode manter mais de uma consulta. Cada consulta é separada por uma
vírgula.
Oracle Database: Fundamentos de SQL II 6 - 31
Cláusula Recursiva WITH

Cláusula Recursiva WITH


• Ativa a formulação de consultas recursivas.
• Cria uma consulta com um nome, chamado de nome do
elemento WITH recursivo
• Contém dois tipos de membro de blocos de consulta:
âncora e recursivo

Oracle Internal & Oracle Academy Use Only


• É compatível com ANSI

Copyright © 2011, Oracle. Todos os direitos reservados.

Cláusula Recursive WITH


No Oracle Database 11g Release 2, as cláusulas WITH foram estendidas para ativar a
formulação de consultas recursivas.
Recursiva WITH define uma consulta recursiva com um nome, o nome de elemento WITH
recursivo. A definição de elemento WITH recursivo deve conter pelo menos dois blocos de
consulta: um membro âncora e um membro recursivo. Pode haver vários membros âncora, mas
somente um único membro recursivo.
A cláusula WITH, o Oracle Database 11g Release 2 é parcialmente compatível com ANSI
(American National Standards Institute). A WITH recursiva pode ser usada para consultar dados
hierárquicos como gráficos da organização.

Oracle Database: Fundamentos de SQL II 6 - 32


Cláusula WITH Recursiva: Exemplo

FLIGHTS Table 1

WITH Reachable_From (Source, Destin, TotalFlightTime) AS


(
SELECT Source, Destin, Flight_time
FROM Flights
UNION ALL
SELECT incoming.Source, outgoing.Destin,

Oracle Internal & Oracle Academy Use Only


incoming.TotalFlightTime+outgoing.Flight_time
FROM Reachable_From incoming, Flights outgoing 2
WHERE incoming.Destin = outgoing.Source
)
SELECT Source, Destin, TotalFlightTime
FROM Reachable_From;

Copyright © 2011, Oracle. Todos os direitos reservados.

Cláusula WITH Recursiva: Exemplo


O exemplo 1 do slide exibe registros de uma tabela FLIGHTS descrevendo voos entre duas
cidades. Este exemplo é específico para a versão 11g do Oracle Database.
Usando a consulta do exemplo 2, você consultará a tabela FLIGHTS para exibir o tempo total
de voo entre a origem e o destino. A cláusula WITH da consulta, chamada de Reachable
From, tem uma consulta UNION ALL com duas ramificações. A primeira ramificação é a
anchor, que seleciona todas as linhas da tabela Flights. A segunda ramificação é a recursiva.
Ela une o conteúdo da tabela Reachable From para a Flights para encontrar outras
cidades que podem ser atingidas e as adiciona ao conteúdo de Reachable From. A operação
será encerrada quando nenhuma linha for encontrada pela ramificação recursiva.
O exemplo 3 exibe o resultado da consulta que seleciona tudo do elemento da cláusula WITH
Reachable From.
Para obter detalhes, consulte:
• Oracle Database SQL Language Reference 11g Release 2.0
• Oracle Database Data Warehousing Guide 11g Release 2.0

Oracle Database: Fundamentos de SQL II 6 - 33


Questionário

Com uma subconsulta correlacionada, a instrução interna


SELECT inicia a instrução externa SELECT.
1. Verdadeiro
2. Falso

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Resposta: 2

Oracle Database: Fundamentos de SQL II 6 - 34


Sumário

Nesta lição, você aprendeu que:


• Uma subconsulta de várias colunas retorna mais de uma
coluna
• As comparações de várias colunas podem ser em pares
ou não-pares
• Uma subconsulta de várias colunas também pode ser

Oracle Internal & Oracle Academy Use Only


usada na cláusula FROM de uma instrução SELECT

Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
Você pode usar subconsultas de várias colunas para combinar várias condições WHERE em uma
única cláusula WHERE. As comparações de coluna em uma subconsulta de várias colunas podem
ser em pares ou não-pares.
Você pode usar uma subconsulta para definir uma tabela a ser operada por uma consulta que a
contém.
As subconsultas escalares podem ser usadas:
• Na condição e parte da expressão de DECODE e CASE
• Em todas as cláusulas SELECT, exceto GROUP BY
• Nas cláusulas SET e WHERE da instrução UPDATE

Oracle Database: Fundamentos de SQL II 6 - 35


Sumário

• As subconsultas correlacionadas são úteis sempre que


uma subconsulta tem que retornar um resultado diferente
para cada linha candidata
• O operador EXISTS é um Booleano que verifica a
presença de um valor
• As subconsultas correlacionadas podem ser usadas com
as instruções SELECT, UPDATE e DELETE

Oracle Internal & Oracle Academy Use Only


• Você pode usar a cláusula WITH para usar o mesmo bloco
de consulta em uma instrução SELECT quando ele ocorrer
mais de uma vez

Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário (continuação)
O servidor Oracle executa uma subconsulta correlacionada quando ela se refere a uma coluna de
uma tabela relacionada na instrução pai. Uma subconsulta correlacionada é avaliada uma vez
para cada linha processada pela instrução pai. Uma instrução pai pode ser SELECT, UPDATE ou
DELETE. Usando a cláusula WITH, você pode reutilizar a mesma consulta quando for
dispendioso reavaliar o bloco de consulta e ele ocorrer mais de uma vez em uma consulta
complexa.

Oracle Database: Fundamentos de SQL II 6 - 36


Exercício 6: Visão Geral

Este exercício aborda os seguintes tópicos:


• Criando subconsultas de várias colunas
• Criando subconsultas correlacionadas
• Usando o operador EXISTS
• Usando subconsultas escalares
• Usando a cláusula WITH

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Exercício 6: Visão Geral


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

Oracle Database: Fundamentos de SQL II 6 - 37


Oracle Internal & Oracle Academy Use Only
Suporte a Expressões Comuns

Oracle Internal & Oracle Academy Use Only


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

Ao concluir esta lição, você será capaz de:


• Listar as vantagens do uso de expressões comuns
• Usar expressões comuns para pesquisar, estabelecer
correspondência e substituir strings

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Objetivos
Nesta lição, você aprenderá a usar o recurso de suporte a expressões comuns. O suporte à
expressão comum está disponível em SQL e PL/SQL.

Oracle Database: Fundamentos de SQL II 7 - 2


Agenda de Lições

• Introdução a expressões comuns


• Usando metacaracteres com expressões comuns
• Usando as functions de expressões comuns:
– REGEXP_LIKE
– REGEXP_REPLACE
– REGEXP_INSTR

Oracle Internal & Oracle Academy Use Only


– REGEXP_SUBSTR
• Acessando subexpressões
• Usando a function REGEXP_COUNT
• Expressões comuns e constraints de verificação

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 7 - 3


O que São Expressões Comuns?

• As expressões comuns são usadas para pesquisar (e


manipular) padrões simples e complexos nos dados de
string usando convenções de sintaxe padrão.
• Você pode usar um conjunto de functions e condições
SQL para pesquisar e manipular strings em SQL e
PL/SQL.
• É possível especificar uma expressão comum usando:

Oracle Internal & Oracle Academy Use Only


– Metacaracteres, que são operadores que especificam os
algoritmos de pesquisa
– Literais, que são os caracteres para os quais você pesquisa

Copyright © 2011, Oracle. Todos os direitos reservados.

O que São Expressões Comuns?


O Oracle Database fornece suporte para expressões comuns. A implementação é compatível
com o padrão POSIX (Portable Operating System for UNIX), controlado pelo IEEE (Institute of
Electrical and Electronics Engineers), para semântica e sintaxe de correspondência de dados
ASCII. Os recursos multilíngües do Oracle ampliam os recursos de correspondência dos
operadores, superando o padrão do POSIX. As expressões comuns são um método de descrever
padrões simples e complexos para pesquisa e manipulação.
A manipulação e a pesquisa de strings contribuem com uma grande porcentagem da lógica em
uma aplicação baseada na Web. O uso engloba tarefas simples, como localização da palavra
“San Francisco” em um texto especificado, complexas, na extração de todas as URLs do texto, e
até mais complexas, como localização de todas as palavras cujo segundo caractere seja uma
vogal.
Quando associado a SQL nativo, o uso de expressões comuns permite operações de pesquisa e
manipulação muito avançadas em todos os dados armazenados em um banco de dados Oracle.
Você pode usar esse recurso para solucionar facilmente problemas que, de outra forma,
envolveriam programação complexa.

Oracle Database: Fundamentos de SQL II 7 - 4


Vantagens do Uso de Expressões Comuns

As expressões comuns permitem implementar lógica de


correspondência complexa no banco de dados com as
seguintes vantagens:
• Ao centralizar a lógica de correspondência no Oracle
Database, você evita processamento intenso de string de
conjuntos de resultados de SQL por aplicações de middle-
tier.

Oracle Internal & Oracle Academy Use Only


• Com o uso de expressões comuns no servidor para impor
constraints, você elimina a necessidade de codificar a
lógica de validação de dados no cliente.
• As functions e condições de expressão comum de SQL e
PL/SQL incorporadas tornam as manipulações de string
mais eficientes e fáceis do que nas releases anteriores do
Oracle Database 11g.

Copyright © 2011, Oracle. Todos os direitos reservados.

Vantagens do Uso de Expressões Comuns


As expressões comuns são um componente de processamento de texto muito eficiente de
linguagens de programação como PERL e Java. Por exemplo, um script PERL pode processar
cada arquivo HTML em um diretório, ler seu conteúdo em uma variável escalar como uma única
string e usar as expressões comuns para pesquisar URLs na string. Um motivo para muitos
desenvolvedores criarem em PERL é que ele tem uma funcionalidade de correspondência de
padrão avançada. O suporte a expressões comuns do Oracle permite que os desenvolvedores
implementem a lógica de correspondência complexa no banco de dados. Expressões regulares
foram introduzidas no Oracle Database 10g.

Oracle Database: Fundamentos de SQL II 7 - 5


Usando Functions e Condições de Expressões
Comuns em SQL e PL/SQL
Nome de Function ou Descrição
Condição
REGEXP_LIKE É semelhante ao operador LIKE, mas executa
correspondência de expressão comum em vez de
correspondência de padrão simples (condição)

REGEXP_REPLACE Pesquisa um padrão de expressão comum e o


substitui por uma string de substituição

Oracle Internal & Oracle Academy Use Only


REGEXP_INSTR Pesquisa uma string de um padrão de expressão
comum e retorna a posição em que a correspondência
foi localizada

REGEXP_SUBSTR Pesquisa um padrão de expressão comum em uma


determinada string e extrai a substring correspondente

REGEXP_COUNT Retorna o número de vezes que uma correspondência


de padrão é localizada em uma string de entrada

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando Functions e Condições de Expressões Comuns em SQL e PL/SQL


O Oracle Database fornece um conjunto de functions SQL que você usa para pesquisar e
manipular strings usando expressões comuns. Essas functions podem ser usadas em um literal de
texto, variável de bind ou qualquer coluna que mantenha os dados de caractere como CHAR,
NCHAR, CLOB, NCLOB, NVARCHAR2 e VARCHAR2 (mas não LONG). Uma expressão comum
deve estar entre aspas simples. Isso assegura que a expressão inteira seja interpretada pela
function SQL e melhore a legibilidade de seu código.
• REGEXP_LIKE: Essa condição pesquisa um padrão em uma coluna de caracteres. Use essa
condição na cláusula WHERE de uma consulta para retornar linhas que correspondam à
expressão comum que você especificar.
• REGEXP_REPLACE: Esta função pesquisa um padrão em uma coluna de caracteres e
substitui cada ocorrência desse padrão pelo padrão que você especificar.
• REGEXP_INSTR: Esta function pesquisa uma string em busca de uma ocorrência de um
padrão de expressão comum. Você especifica a ocorrência que deseja localizar e a posição
inicial da pesquisa. Esta function retorna um valor inteiro que indica a posição na string em
que a correspondência foi localizada.
• REGEXP_SUBSTR: Esta função retorna a substring que corresponde ao padrão da
expressão comum que você especificar.
• REGEXP_COUNT: 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 Database: Fundamentos de SQL II 7 - 6
Agenda de Lições

• Introdução a expressões comuns


• Usando metacaracteres com expressões comuns
• Usando as funções de expressões comuns:
– REGEXP_LIKE
– REGEXP_REPLACE
– REGEXP_INSTR

Oracle Internal & Oracle Academy Use Only


– REGEXP_SUBSTR
• Acessando subexpressões
• Usando a function REGEXP_COUNT

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 7 - 7


O que São Metacaracteres?

• Metacaracteres são caracteres especiais que possuem um


significado especial, como um curinga, um caractere de
repetição, um caractere sem correspondência ou um
intervalo de caracteres.
• Você pode usar vários símbolos de metacaracteres
predefinidos na correspondência de padrão.
• Por exemplo, a expressão comum ^(f|ht)tps?:$

Oracle Internal & Oracle Academy Use Only


pesquisa o seguinte no início da string:
– Os literais f ou ht
– O literal t
– O literal p, que também pode ser seguido pelo literal s
– O literal dois-pontos “:” no final da string

Copyright © 2011, Oracle. Todos os direitos reservados.

O que São Metacaracteres?


A expressão comum no slide corresponde às strings http:, https:, ftp:, and ftps: .
Observação: Para obter uma lista completa de metacaracteres de expressões comuns, consulte o
Oracle Database Advanced Application Developer’s Guide for 10g or 11g .

Oracle Database: Fundamentos de SQL II 7 - 8


Usando Metacaracteres com Expressões Comuns

Sintaxe Descrição
. Corresponde a qualquer caractere no conjunto de caracteres suportados, exceto
NULL
+ Corresponde a uma ou mais ocorrências

? Corresponde a uma ou nenhuma ocorrência

* Corresponde a nenhuma ou mais ocorrências da subexpressão anterior

{m} Corresponde a exatamente m ocorrências da expressão anterior

Oracle Internal & Oracle Academy Use Only


{m, } Corresponde a pelo menos m ocorrências da subexpressão anterior

{m,n} Corresponde a pelo menos m, mas não mais do que n ocorrências da


subexpressão anterior

[…] Corresponde a qualquer caractere simples da lista entre colchetes

| Corresponde a uma das alternativas

( ... ) Trata a expressão entre parênteses como uma unidade. A subexpressão pode
ser uma string de literais ou uma expressão complexa contendo operadores.

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando Metacaracteres em Functions de Expressões Comuns


Qualquer caractere, “ . ” : a.b corresponde às strings abb, acb e adb, mas não acc.
Um ou mais, “ + ” : a+ corresponde às strings a, aa e aaa, mas não a bbb.
Nenhum ou um, “ ? ”: ab?c corresponde às strings abc e ac, mas não a abbc.
Nenhum ou mais, “ * ”: ab*c corresponde às strings ac, abc e abbc, mas não
corresponde a abb.
Contagem exata, “ {m} ”: a{3} corresponde às strings aaa, mas não a aa.
Contagem mínima, “ {m,} ”: a{3,} corresponde às strings aaa e aaaa, mas não aa.
Contagem entre, “ {m,n} ”: a{3,5} corresponde às strings aaa, aaaa e aaaaa, mas não
a aa.
Lista de caracteres correspondentes, “ […] ”: [abc] corresponde ao primeiro caractere nas
strings all, bill e cold, mas não a qualquer caractere em doll.
Ou, “ | ”: a|b corresponde ao caractere a ou caractere b.
Subexpressão, “ (…) ”:(abc)?def corresponde à string opcional abc, seguida por def. A
expressão corresponde a abcdefghi e def, mas não a ghi. A subexpressão pode ser uma
string de literais ou uma expressão complexa contendo operadores.

Oracle Database: Fundamentos de SQL II 7 - 9


Usando Metacaracteres com Expressões Comuns

Sintaxe Descrição

^ Corresponde ao início de uma string

$ Corresponde ao final de uma string

\ Trata o metacaractere subsequente na expressão como um literal

\n Corresponde à enésima (1–9) subexpressão anterior a qualquer valor agrupado


entre parênteses. Os parênteses fazem com que uma expressão seja lembrada;

Oracle Internal & Oracle Academy Use Only


há uma backreference (referência anterior) para essa expressão.

\d Um caractere de dígito

[:class:] Corresponde a qualquer caractere pertencente à classe de caracteres POSIX


especificada

[^:class:] Corresponde a qualquer caractere simples que não estiver na lista entre os
colchetes

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando Metacaracteres em Functions de Expressões Comuns (continuação)


Início/fim de âncora da linha, “ ^ ” e “$”: ^def corresponde a def na string defghi, mas
não a def em abcdef. def$ corresponde a def na string abcdef , mas não a def na
string defghi.
Caractere de Escape “ \ ”: \+ procura um +. Ele corresponde ao sinal de mais na string
abc+def, mas não a Abcdef.
Backreference (referência anterior), “ \n ”:(abc|def)xy\1 corresponde às strings
abcxyabc e defxydef, mas não a abcxydef ou abcxy. Uma backreference (referência
anterior) permite pesquisar uma string repetida sem que você saiba a string com antecedência.
Por exemplo, a expressão ^(.*)\1$ corresponde a uma linha que consiste em duas instâncias
adjacentes da mesma string.
Caractere de dígito, “\d”: A expressão ^\[\d{3}\] \d{3}-\d{4}$ corresponde a [650] 555-1212,
mas não a 650-555-1212.
Classe de caractere, “ [:class:] ” : [[:upper:]]+ procura um ou mais caracteres
maiúsculos consecutivos. Corresponde a DEF na string abcDEFghi, mas não à string
abcdefghi.
Lista de caracteres sem correspondência (ou classe), “ [^...] ” : [^abc] corresponde ao
caractere d na string abcdef, mas não a a, b, or c.

Oracle Database: Fundamentos de SQL II 7 - 10


Agenda de Lições

• Introdução a expressões comuns


• Usando metacaracteres com expressões comuns
• Usando as funções de expressões comuns:
– REGEXP_LIKE
– REGEXP_REPLACE
– REGEXP_INSTR

Oracle Internal & Oracle Academy Use Only


– REGEXP_SUBSTR
• Acessando subexpressões
• Usando a function REGEXP_COUNT

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 7 - 11


Functions e Condições de Expressões
Comuns: Sintaxe

REGEXP_LIKE (source_char, pattern [,match_option]

REGEXP_INSTR (source_char, pattern [, position


[, occurrence [, return_option
[, match_option [, subexpr]]]]])

REGEXP_SUBSTR (source_char, pattern [, position

Oracle Internal & Oracle Academy Use Only


[, occurrence [, match_option
[, subexpr]]]])

REGEXP_REPLACE(source_char, pattern [,replacestr


[, position [, occurrence
[, match_option]]]])

REGEXP_COUNT (source_char, pattern [, position


[, occurrence [, match_option]]])

Copyright © 2011, Oracle. Todos os direitos reservados.

Functions e Condições de Expressões Comuns: Sintaxe


A sintaxe das functions e condições das expressões comuns é a seguinte:
• source_char: Uma expressão de caractere que funciona como valor de pesquisa
• pattern: Uma expressão comum, uma literal de texto
• occurrence: Um valor inteiro positivo que indica qual ocorrência de padrão no
source_char o Oracle Server deve pesquisar. O default é 1.
• position: Um valor inteiro positivo que indica o caractere de source_char no qual o
Oracle Server deve começar a pesquisar. O default é 1.
• return_option:
- 0: Retorna a posição do primeiro caractere da ocorrência (default)
- 1: Retorna a posição do caractere após a ocorrência
• Replacestr: Padrão de substituição de caracteres em uma string

• match_parameter:
- “ c ”: Usa correspondência que faz distinção entre maiúsculas e minúsculas (default)
- “ i ”: Usa correspondência sem distinção entre maiúsculas e minúsculas
- “ n ”: Permite o operador de correspondência de qualquer caractere
- “ m ”: Trata a string de origem como várias linhas
• subexpr: Fragmento de padrão incluído entre parênteses. Você aprenderá mais sobre as
subexpressões posteriormente nesta lição.

Oracle Database: Fundamentos de SQL II 7 - 12


Executando uma Pesquisa Básica
com a Condição REGEXP_LIKE

REGEXP_LIKE(source_char, pattern [, match_parameter ])

SELECT first_name, last_name


FROM employees
WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$');

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Executando uma Pesquisa Básica com a Condição REGEXP_LIKE


REGEXP_LIKE é semelhante à condição LIKE, exceto pelo fato de REGEXP_LIKE executar a
correspondência da expressão comum, e não a correspondência padrão simples executada por
LIKE. A condição avalia strings usando caracteres conforme definido pelo conjunto de
caracteres de entrada.
Exemplo de REGEXP_LIKE
Nesta consulta, na tabela EMPLOYEES, todos os funcionários de nome Steven ou Stephen são
exibidos. Na expressão usada '^Ste(v|ph)en$ ':
• ^ indica o início da expressão
• $ indica o fim da expressão
• | indica ou

Oracle Database: Fundamentos de SQL II 7 - 13


Substituindo Padrões com
a Função REGEXP_REPLACE
REGEXP_REPLACE(source_char, pattern [,replacestr
[, position [, occurrence [, match_option]]]])

SELECT REGEXP_REPLACE(phone_number, '\.','-') AS phone


FROM employees;

Oracle Internal & Oracle Academy Use Only


Original Resultados parciais

Copyright © 2011, Oracle. Todos os direitos reservados.

Substituindo Padrões com a Função REGEXP_REPLACE


Usando a function REGEXP_REPLACE, você pode reformatar o número de telefone para
substituir o ponto (.) delimitador com um traço (-) delimitador. A seguir é apresentada uma
explicação de cada um dos elementos usados no exemplo da expressão comum:
• phone_number é a coluna de origem.
• ‘\.’ é o padrão de pesquisa.
- Use aspas simples (‘ ’) para pesquisar o ponto de caractere literal (.).
- Use uma barra invertida (\) para pesquisar um caractere normalmente tratado como um
metacaractere.
• ‘-’ é a string de substituição.

Oracle Database: Fundamentos de SQL II 7 - 14


Localizando Padrões com
a Função REGEXP_INSTR

REGEXP_INSTR (source_char, pattern [, position [,


occurrence [, return_option [, match_option]]]])

SELECT street_address,
REGEXP_INSTR(street_address,'[[:alpha:]]') AS
First_Alpha_Position
FROM locations;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Localizando Padrões com a Função REGEXP_INSTR


Neste exemplo, a function REGEXP_INSTR é usada para pesquisar o endereço para localizar o
primeiro caractere alfabético, sem considerar se está em maiúscula ou minúscula. Observe que
[:<class>:] implica uma classe de caractere e corresponde a qualquer caractere dessa
classe; [:alpha:] corresponde a qualquer caractere alfabético. Os resultados parciais são
exibidos.
Na expressão usada na consulta '[[:alpha:]]':
• [ inicia a expressão.
• [:alpha:] indica a classe de caracteres alfabéticos
• ] finaliza a expressão
Observação: O operador de classe de caracteres POSIX permite pesquisar uma expressão em
uma lista de caracteres que seja membro de uma classe de caracteres POSIX específica. Você
pode usar esse operador para pesquisar formatação específica, como caracteres maiúsculos, ou
caracteres especiais como dígitos ou de pontuação. É suportado um conjunto completo de
classes de caracteres POSIX. Use a sintaxe [:class:], em que class é o nome da
classe de caracteres POSIX a ser pesquisada. A expressão comum a
seguir pesquisa um ou mais caracteres maiúsculos consecutivos:
[[:upper:]]+ .

Oracle Database: Fundamentos de SQL II 7 - 15


Extraindo Substrings
com a Função REGEXP_SUBSTR
REGEXP_SUBSTR (source_char, pattern [, position
[, occurrence [, match_option]]])

SELECT REGEXP_SUBSTR(street_address , ' [^ ]+ ') AS Road


FROM locations;

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Extraindo Substrings com a Função REGEXP_SUBSTR


Neste exemplo, os nomes de rodovias são extraídos da tabela LOCATIONS. Para fazer isso, o
conteúdo na coluna STREET_ADDRESS após o primeiro espaço são retornados com o uso da
função REGEXP_SUBSTR. Na expressão usada na consulta ' [^ ]+ ':
• [ inicia a expressão.
• ^ indica NÃO.
• indica espaço
• ] finaliza a expressão
• + indica 1 ou mais
• indica espaço

Oracle Database: Fundamentos de SQL II 7 - 16


Agenda de Lições

• Introdução a expressões comuns


• Usando metacaracteres com expressões comuns
• Usando as functions de expressões comuns:
– REGEXP_LIKE
– REGEXP_REPLACE
– REGEXP_INSTR

Oracle Internal & Oracle Academy Use Only


– REGEXP_SUBSTR
• Acessando subexpressões
• Usando a função REGEXP_COUNT

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 7 - 17


Subexpressões

Examine esta expressão:

(1 2 3)(4(5 6)(7 8))


As subexpressões são:

(1 2 3)(4(5 6)(7 8))

Oracle Internal & Oracle Academy Use Only


3 4
1
2

Copyright © 2011, Oracle. Todos os direitos reservados.

Subexpressões
O Oracle Database 11g fornece parâmetro de suporte a expressões comuns para acessar uma
subexpressão. No exemplo do slide, uma string de dígitos é mostrada. Os parênteses identificam
as subexpressões na string de dígitos. Quando são lidas da esquerda para a direita e dos
parênteses externos para os internos, as subexpressões na string de dígitos são:
1. 123
2. 45678
3. 56
4. 78
Você pode pesquisar qualquer uma dessas subexpressões com as functions REGEXP_INSTR e
REGEXP_SUBSTR.

Oracle Database: Fundamentos de SQL II 7 - 18


Usando Subexpressões com
Suporte a Expressões Comuns

SELECT
REGEXP_INSTR
1 ('0123456789', -- source char or search value
2 '(123)(4(56)(78))', -- regular expression patterns
3 1, -- position to start searching
4 1, -- occurrence

Oracle Internal & Oracle Academy Use Only


5 0, -- return option
6 'i', -- match option (case insensitive)
7 1) -- sub-expression on which to search
"Position"
FROM dual;

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando Subexpressões com Suporte a Expressões Comuns


REGEXP_INSTR e REGEXP_SUBSTR possuem um parâmetro SUBEXPR opcional que permite
enfocar uma substring específica da expressão comum que estiver sendo avaliada.
No exemplo do slide, você pode pesquisar o primeiro padrão da subexpressão na lista de
subexpressões. O exemplo identifica vários parâmetros para a function REGEXP_INSTR. Este
exemplo é específico para a versão 11g do Oracle Database.
1. A string que você pesquisa foi identificada.
2. As subexpressões foram identificadas. A primeira subexpressão é 123. A segunda
subexpressão é 45678, a terceira é 56 e a quarta é 78.
3. O terceiro parâmetro identifica a posição de início da pesquisa.
4. O quarto parâmetro identifica a ocorrência do padrão que você deseja localizar. 1 significa
a primeira ocorrência.
5. O quinto parâmetro é a opção de retorno. Esta é a posição do primeiro caractere da
ocorrência. (Se você indicar 1, a posição do caractere seguinte à ocorrência será retornada.)
6. O sexto parâmetro identifica se sua pesquisa deve fazer distinção entre maiúsculas e
minúsculas.
7. O último parâmetro é o adicionado no Oracle Database 11g. Esse parâmetro indica qual
subexpressão você deseja localizar. No exemplo mostrado, você está pesquisando a
subexpressão, que é 123.

Oracle Database: Fundamentos de SQL II 7 - 19


Por que Acessar a enésima Subexpressão?
• Um uso mais realista: Sequenciamento de DNA
• Talvez você precise localizar um subpadrão específico
que identifique uma proteína necessária para imunidade
no DNA do rato.
SELECT
REGEXP_INSTR('ccacctttccctccactcctcacgttctcacctgtaaagcgtccctc
cctcatccccatgcccccttaccctgcagggtagagtaggctagaaaccagagagctccaagc
tccatctgtggagaggtgccatccttgggctgcagagagaggagaatttgccccaaagctgcc

Oracle Internal & Oracle Academy Use Only


tgcagagcttcaccacccttagtctcacaaagccttgagttcatagcatttcttgagttttca
ccctgcccagcaggacactgcagcacccaaagggcttcccaggagtagggttgccctcaagag
gctcttgggtctgatggccacatcctggaattgttttcaagttgatggtcacagccctgaggc
atgtaggggcgtggggatgcgctctgctctgctctcctctcctgaacccctgaaccctctggc
taccccagagcacttagagccag',
'(gtc(tcac)(aaag))',
1, 1, 0, 'i',
1) "Position"
FROM dual;

Copyright © 2011, Oracle. Todos os direitos reservados.

Por que Acessar a enésima Subexpressão?


Em ciências da vida, talvez seja necessário extrair os deslocamentos de correspondências de
subexpressão de uma sequência de DNA para processamento adicional. Por exemplo, pode ser
necessário localizar uma sequência de proteína específica, como o deslocamento inicial da
sequência de DNA precedido por gtc e seguido por tcac seguido por aaag. Para alcançar
esse objetivo, você pode usar a function REGEXP_INSTR, que retorna a posição de localização
da correspondência.
No exemplo do slide, a posição da primeira subexpressão (gtc)é retornada. gtc aparece no
início da posição 195 da string de DNA. Este exemplo é específico para a versão 11g R2 do
Oracle Database.
Se você modificar o exemplo do slide para pesquisar a segunda subexpressão (tcac), a
consulta resultará na saída a seguir.tcac aparece no início da posição 198 da string de DNA.

Se você modificar o exemplo do slide para pesquisar a terceira subexpressão (aaag), a


consulta resultará na saída a seguir. aaag aparece no início da posição 202 da string de DNA.

Oracle Database: Fundamentos de SQL II 7 - 20


REGEXP_SUBSTR: Exemplo

SELECT
REGEXP_SUBSTR
1 ('acgctgcactgca', -- source char or search value
2 'acg(.*)gca', -- regular expression pattern
3 1, -- position to start searching
4 1, -- occurrence
5 'i', -- match option (case

Oracle Internal & Oracle Academy Use Only


6 insensitive)
1) -- sub-expression
"Value"
FROM dual;

Copyright © 2011, Oracle. Todos os direitos reservados.

REGEXP_SUBSTR: Exemplo
No exemplo do slide:
1. acgctgcactgca é a origem a ser pesquisada.
2. acg(.*)gca é o padrão a ser pesquisado. Localize acg seguido por gca com os
caracteres em potencial entre acg e gca.
3. Comece pesquisando no primeiro caractere da origem.
4. Pesquise a primeira ocorrência do padrão.
5. Use correspondência sem distinção entre maiúsculas e minúsculas na origem.
6. Use o valor inteiro não negativo que identifique a enésima subexpressão a ser enfocada.
Esse é o parâmetro de subexpressão. Nesse exemplo, 1 indica a primeira subexpressão.
Você pode usar um valor de 0–9. Um zero significa que nenhuma subexpressão foi
enfocada. O valor padrão para este parâmetro é 0.
Este exemplo é específico para a versão 11g do Oracle Database.

Oracle Database: Fundamentos de SQL II 7 - 21


Agenda de Lições

• Introdução a expressões comuns


• Usando metacaracteres com expressões comuns
• Usando as functions de expressões comuns:
– REGEXP_LIKE
– REGEXP_REPLACE
– REGEXP_INSTR

Oracle Internal & Oracle Academy Use Only


– REGEXP_SUBSTR
• Acessando subexpressões
• Usando a função REGEXP_COUNT

Copyright © 2011, Oracle. Todos os direitos reservados.

Oracle Database: Fundamentos de SQL II 7 - 22


Usando a Function REGEXP_COUNT

REGEXP_COUNT (source_char, pattern [, position


[, occurrence [, match_option]]])

SELECT REGEXP_COUNT(
'ccacctttccctccactcctcacgttctcacctgtaaagcgtccctccctcatccccatgcccccttaccctgcag
ggtagagtaggctagaaaccagagagctccaagctccatctgtggagaggtgccatccttgggctgcagagagaggag
aatttgccccaaagctgcctgcagagcttcaccacccttagtctcacaaagccttgagttcatagcatttcttgagtt
ttcaccctgcccagcaggacactgcagcacccaaagggcttcccaggagtagggttgccctcaagaggctcttgggtc

Oracle Internal & Oracle Academy Use Only


tgatggccacatcctggaattgttttcaagttgatggtcacagccctgaggcatgtaggggcgtggggatgcgctctg
ctctgctctcctctcctgaacccctgaaccctctggctaccccagagcacttagagccag',
'gtc') AS Count
FROM dual;

Copyright © 2011, Oracle. Todos os direitos reservados.

Usando a Function REGEXP_COUNT


A função REGEXP_COUNT avalia strings usando caracteres como definido pelo conjunto de
caracteres de entrada. Ela retorna um valor inteiro que indica o número de ocorrências do
padrão. Se nenhuma correspondência for localizada, a função retornará 0.
No exemplo do slide, o número de ocorrências de uma substring de DNA é determinado com a
função REGEXP_COUNT. Este exemplo é específico para a versão 11g do Oracle Database.
O exemplo a seguir mostra que o número de vezes que o padrão 123 ocorre na string
123123123123 é três. A pesquisa começa na segunda posição da string.
SELECT REGEXP_COUNT
('123123123123', -- source char or search value
'123', -- regular expression pattern
2, -- position where the search should start
'i') -- match option (case insensitive)
As Count
FROM dual;

Oracle Database: Fundamentos de SQL II 7 - 23


Expressões Comuns e Constraints
de Verificação: Exemplos

ALTER TABLE emp8


ADD CONSTRAINT email_addr
CHECK(REGEXP_LIKE(email,'@')) NOVALIDATE;

INSERT INTO emp8 VALUES


(500,'Christian','Patel','ChrisP2creme.com',
1234567890,'12-Jan-2004','HR_REP',2000,null,102,40);

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Expressões Comuns e Constraints de Verificação: Exemplos


As expressões comuns também podem ser usadas nas constraints CHECK. Neste exemplo, a
constraint CHECK é adicionada à coluna EMAIL da tabela EMPLOYEES. Isso assegura que
somente as strings contendo um símbolo “@” sejam aceitas. A constraint é testada. A constraint
CHECK é violada porque o endereço de e-mail não contém o símbolo necessário. A cláusula
NOVALIDATE assegura que os dados existentes não sejam verificados.
Para o exemplo do slide, a tabela emp8 é criada com o seguinte código:
CREATE TABLE emp8 AS SELECT * FROM employees;
Observação: O exemplo do slide é executado com a opção “Executar Instrução” no SQL
Developer. O formato de saída será diferente se você usar a opção “Executar Script”.

Oracle Database: Fundamentos de SQL II 7 - 24


Questionário

Com o uso de expressões comuns em SQL e PL/SQL,


é possível:
1. Evitar processamento intenso de string de conjuntos de
resultados de SQL por aplicações de middle-tier
2. Evitar a lógica de validação de dados no cliente
3. Impor constraints no servidor

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Respostas: 1, 2, 3

Oracle Database: Fundamentos de SQL II 7 - 25


Sumário

Nesta lição, você aprendeu a usar as expressões comuns para


pesquisar, estabelecer correspondência entre strings e substituí-las.

Oracle Internal & Oracle Academy Use Only


Copyright © 2011, Oracle. Todos os direitos reservados.

Sumário
Nesta lição, você aprendeu a usar os recursos de suporte a expressões comuns. O suporte à
expressão comum está disponível em SQL e PL/SQL.

Oracle Database: Fundamentos de SQL II 7 - 26


Exercício 7: Visão Geral

Este exercício aborda o uso de functions de expressões


comuns para:
• Pesquisar, substituir e manipular dados
• 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

Oracle Internal & Oracle Academy Use Only


• Testar a adição de alguns números de telefone à coluna
p_number com vários formatos

Copyright © 2011, Oracle. Todos os direitos reservados.

Exercício 7: Visão Geral


Neste exercício, você pode usar functions 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.

Oracle Database: Fundamentos de SQL II 7 - 27


Oracle Internal & Oracle Academy Use Only

Você também pode gostar