Você está na página 1de 456

Introduo ao Oracle: SQL

e PL/SQL
Guia do Estudante Volume 1

41010BP13
Produo 1.3
Fevereiro de 2000
M08944-BP

Autores
Neena Kochhar
Ellen Gravina
Priya Nathan

Colaboradores Tcnicos
e Revisores
Claire Bennet
Christa Miethaner
Tony Hickman
Sherin Nassa
Nancy Greenberg
Hazel Russell
Kenneth Goetz
Piet van Zon
Ulrike Dietrich
Helen Robertson
Thomas Nguyen
Lisa Jansson
Kuljit Jassar

Editor
Jerry Brosnan

Copyright Oracle Corporation, 1998, 1999. Todos os direitos reservados e de


titularidade da Oracle Corporation, inclusive aqueles referentes traduo para
o idioma portugus - Brasil.
Esta documentao contm informaes de propriedade da Oracle Corporation.
fornecida sob um contrato de licena que contm restries sobre seu uso e sua
divulgao, sendo tambm protegida pela legislao de direitos autorais. No
permitida a engenharia reversa dos programas de computador. Se esta
documentao for entregue/distribuda a uma Agncia do Departamento de Defesa
do Governo dos Estados Unidos da Amrica do Norte, ser ento entregue/distribuda
com Direitos Restritos e a seguinte legenda ser aplicvel:
Legenda de Direitos Restritos
O uso, duplicao ou divulgao por aquele Governo esto sujeitos s restries
aplicveis aos programas comerciais de computadores e sero considerados como
programas de computador com Direitos Restritos de acordo com a legislao federal
daquele Governo, conforme descrito no subpargrafo da legislao norte-americana
(c) (1) (ii) de DFARS 252.227-7013, Direitos sobre Dados Tcnicos e Programas de
Computador (outubro de 1988).
Proibida a reproduo total ou parcial desta documentao sem a expressa
autorizao prvia por escrito da Oracle Corporation ou da Oracle do Brasil Sistemas
Ltda. A cpia deste material, de qualquer forma ou por qualquer meio, eletrnico,
mecnico ou de outra natureza, inclusive atravs de processos xerogrficos, de
fotocpia e de gravao, constitui violao da legislao de direitos autorais e ser
punida civil e-ou criminalmente na forma da lei.
Se esta documentao for entregue / distribuda a uma Agncia do Governo dos
Estados Unidos da Amrica do Norte que no esteja subordinada ao Departamento
de Defesa, ser ento entregue / distribuda com "Direitos Restritos", conforme
definido no FAR 52.227-14, Direitos sobre Dados - Geral, inclusive a Alternativa III
(junho de 1987).
As informaes contidas neste documento esto sujeitas a alteraes sem aviso
prvio. Se voc encontrar algum problema na documentao, envie a Products
Education - Oracle Corporation ou a Education - Oracle do Brasil Sistemas Ltda. uma
descrio de tal problema por escrito.
Education Products, Oracle Corporation, 500 Oracle Parkway, Box SB-6, Redwood
Shores, CA 94065.
Distribuidor no Brasil: Oracle do Brasil Sistemas Ltda.
Rua Jos Guerra, 127, So Paulo, SP - 04719-030 Brasil
CGC: 59.456.277/0001-76.
A Oracle Corporation e a Oracle do Brasil Sistemas Ltda. no garantem que este
documento esteja isento de erros.
Oracle e todos os demais produtos Oracle citados nesta documentao so marcas
comerciais ou marcas comerciais registradas da Oracle Corporation.
Todos os outros nomes de produtos ou de empresas aqui mencionados o so apenas
para fins de identificao e podem ser marcas comerciais registradas de seus
respectivos proprietrios.

Sumrio

Prefcio
Mapa de Curso
Introduo
Objetivos I-2
Ciclo de Vida de Desenvolvimento do Sistema I-3
Armazenamento de Dados em Diferentes Mdias I-5
Conceito de Banco de Dados Relacional I-6
Definio de Banco de Dados Relacional I-7
Modelos de Dados I-8
Modelo de Relacionamento de Entidades I-9
Convenes de Modelo para Relacionamento de Entidades I-11
Terminologia de Banco de Dados Relacional I-13
Relacionando Vrias Tabelas I-15
Propriedades de Banco de Dados Relacional I-17
Comunicando-se com um RDBMS Usando o SQL I-18
Sistema de Gerenciamento de Banco de Dados Relacional I-19
Oracle8: Sistema de Gerenciamento de Banco de Dados Relacional
de Objeto I-20
Oracle8i: Banco de Dados de Plataforma Internet para Recursos de
Computao na Internet I-21
Plataforma Internet da Oracle I-23
Instrues SQL I-24
Sobre PL/SQL I-25
Ambiente PL/SQL I-26
Tabelas Usadas no Curso I-27
Sumrio I-28
1

Criando Instrues SQL Bsicas


Objetivos 1-2
Recursos das Instrues SELECT SQL 1-3
Instruo SELECT Bsica 1-4
Criando Instrues SQL 1-5
Selecionando Todas as Colunas 1-6
Selecionando Colunas Especficas 1-7
Defaults de Cabealho de Coluna 1-8
Expresses Aritmticas 1-9
Usando Operadores Aritmticos 1-10

iii

Precedncia do Operador 1-11


Usando Parnteses 1-13
Definindo um Valor Nulo 1-14
Valores Nulos nas Expresses Aritmticas 1-15
Definindo um Apelido de Coluna 1-16
Usando Apelidos de Coluna 1-17
Operador de Concatenao 1-18
Usando um Operador de Concatenao 1-19
Strings Literais de Caracteres 1-20
Usando Strings Literais de Caracteres 1-21
Linhas Duplicadas 1-22
Eliminando Linhas Duplicadas 1-23
Interao SQL e SQL*Plus 1-24
Instrues SQL Versus Comandos SQL*Plus 1-25
Viso Geral do SQL*Plus 1-26
Estabelecendo Login no SQL*Plus 1-27
Exibindo a Estrutura de Tabela 1-28
Comandos de Edio do SQL*Plus 1-30
Comandos de Arquivo do SQL*Plus 1-32
Sumrio 1-33
Viso Geral do Exerccio 1-34
2

Restringindo e Classificando Dados


Objetivos 2-2
Limitando Linhas Usando uma Seleo 2-3
Limitando Linhas Selecionadas 2-4
Usando a Clusula WHERE 2-5
Strings de Caractere e Datas 2-6
Operadores de Comparao 2-7
Usando Operadores de Comparao 2-8
Outros Operadores de Comparao 2-9
Usando o Operador BETWEEN 2-10
Usando o Operador IN 2-11
Usando o Operador LIKE 2-12
Usando o Operador IS NULL 2-14
Operadores Lgicos 2-15
Usando o Operador AND 2-16
Usando o Operador OR 2-17
Usando o Operador NOT 2-18
Regras de Precedncia 2-19
Clusula ORDER BY 2-22
iv

Classificando em Ordem Decrescente 2-23


Classificando por Apelido de Coluna 2-24
Classificando por Vrias Colunas 2-25
Sumrio 2-26
Viso Geral do Exerccio 2-27
3

Funes de Uma nica Linha


Objetivos 3-2
Funes SQL 3-3
Dois Tipos de Funes SQL 3-4
Funes de Uma nica Linha 3-5
Funes de Caractere 3-7
Funes de Converso de Maisculas e Minsculas 3-9
Usando Funes de Converso de Maisculas e Minsculas 3-10
Funes de Manipulao de Caractere 3-11
Usando as Funes de Manipulao de Caractere 3-12
Funes Numricas 3-13
Usando a Funo ROUND 3-14
Usando a Funo TRUNC 3-15
Usando a Funo MOD 3-16
Trabalhando com Datas 3-17
Aritmtica com Datas 3-18
Usando Operadores Aritmticos com Datas 3-19
Funes de Data 3-20
Usando Funes de Data 3-21
Funes de Converso 3-23
Converso Implcita de Tipo de Dados 3-24
Converso Explcita de Tipo de Dados 3-26
Funo TO_CHAR com Datas 3-29
Elementos de Modelo de Formato de Data 3-30
Usando a Funo TO_CHAR com Datas 3-32
Funo TO_CHAR com Nmeros 3-33
Usando a Funo TO_CHAR com Nmeros 3-34
Funes TO_NUMBER e TO_DATE 3-35
Formato de Data RR 3-36
Funo NVL 3-37
Usando a Funo NVL 3-38
Funo DECODE 3-39
Usando a Funo DECODE 3-40
Aninhando Funes 3-42
Sumrio 3-44
Viso Geral do Exerccio 3-45
v

Exibindo Dados de Vrias Tabelas


Objetivos 4-2
Obtendo Dados de Vrias Tabelas 4-3
O Que uma Juno? 4-4
Produto Cartesiano 4-5
Gerando um Produto Cartesiano 4-6
Tipos de Junes 4-7
O Que uma Juno Idntica? 4-8
Recuperando Registros com Junes Idnticas 4-9
Qualificando Nomes de Coluna Ambguos 4-10
Condies de Pesquisa Adicional Usando o Operador AND
Usando Apelidos de Tabela 4-12
Unindo Mais de Duas Tabelas 4-13
Junes No-idnticas 4-14
Recuperando Registros com Junes No-idnticas 4-15
Junes Externas 4-16
Usando Junes Externas 4-18
Autojunes 4-19
Unindo uma Tabela a Ela Mesma 4-20
Sumrio 4-21
Viso Geral do Exerccio 4-22
Agregando Dados Usando Funes de Grupo
Objetivos 5-2
O Que So Funes de Grupo? 5-3
Tipos de Funes de Grupo 5-4
Usando Funes de Grupo 5-5
Usando Funes AVG e SUM 5-6
Usando Funes MIN e MAX 5-7
Usando a Funo COUNT 5-8
Funes de Grupo e Valores Nulos 5-10
Usando a Funo NVL com Funes de Grupo 5-11
Criando Grupos de Dados 5-12
Criando Grupos de Dados: Clusula GROUP BY 5-13
Usando a Clusula GROUP BY 5-14
Agrupando por Mais de Uma Coluna 5-16
Usando a Clusula GROUP BY em Vrias Colunas 5-17
Consultas Ilegais Usando Funes de Grupo 5-18
Excluindo Resultados do Grupo 5-20
Excluindo Resultados do Grupo: Clusula HAVING 5-21
Usando a Clusula HAVING 5-22
vi

4-11

Aninhando Funes de Grupo 5-24


Sumrio 5-25
Viso Geral do Exerccio 5-26
6

Subconsultas
Objetivos 6-2
Usando uma Subconsulta para Resolver um Problema 6-3
Subconsultas 6-4
Usando uma Subconsulta 6-5
Diretrizes para o Uso de Subconsultas 6-6
Tipos de Subconsultas 6-7
Subconsultas de uma nica Linha 6-8
Executando Subconsultas de uma nica Linha 6-9
Usando Funes de Grupo em uma Subconsulta 6-10
Clusula HAVING com Subconsultas 6-11
O Que H de Errado com esta Instruo? 6-12
Esta Instruo Ir Funcionar? 6-13
Subconsultas de Vrias Linhas 6-14
Usando o Operador ANY em Subconsultas de Vrias Linhas 6-15
Usando o Operador ALL em Subconsultas de Vrias Linhas 6-16
Sumrio 6-17
Viso Geral do Exerccio 6-18

Subconsultas de Vrias Colunas


Objetivos 7-2
Subconsultas de Vrias Colunas 7-3
Usando Subconsultas de Vrias Colunas 7-4
Comparaes de Coluna 7-6
Subconsulta de Comparao que No Seja aos Pares 7-7
Subconsulta que No Seja aos Pares 7-8
Valores Nulos em uma Subconsulta 7-9
Usando uma Subconsulta na Clusula FROM 7-10
Sumrio 7-11
Viso Geral do Exerccio 7-12

Produzindo uma Sada Legvel com o SQL*Plus


Objetivos 8-2
Relatrios Interativos 8-3
Variveis de Substituio 8-4
Usando a Varivel de Substituio & 8-5
Usando o Comando SET VERIFY 8-6
Valores de Caractere e Data com Variveis de Substituio 8-7
vii

Especificando Nomes de Coluna, Expresses e Texto no Tempo de Execuo 8-8


Usando a Varivel de Substituio && 8-10
Definindo as Variveis de Usurio 8-11
O Comando ACCEPT 8-12
Usando o Comando ACCEPT 8-13
Comandos DEFINE e UNDEFINE 8-14
Usando o Comando DEFINE 8-15
Personalizando o Ambiente SQL*Plus 8-16
Variveis do Comando SET 8-17
Salvando as Personalizaes no Arquivo login.sql 8-18
Comandos de Formato do SQL*Plus 8-19
O Comando COLUMN 8-20
Usando o Comando COLUMN 8-21
Modelos de Formato COLUMN 8-22
Usando o Comando BREAK 8-23
Usando os Comandos TTITLE e BTITLE 8-24
Criando um Arquivo de Script para Executar um Relatrio 8-25
Exemplo de Relatrio 8-27
Sumrio 8-28
Viso Geral do Exerccio 8-29
9

Manipulao de Dados
Objetivos 9-2
DML (Data Manipulation Language) 9-3
Adicionando uma Nova Linha em uma Tabela 9-4
A Instruo INSERT 9-5
Inserindo Novas Linhas 9-6
Inserindo Linhas com Valores Nulos 9-7
Inserindo Valores Especiais 9-8
Inserindo Valores Espec'ificos de Data 9-9
Inserindo Valores Usando Variveis de Substituio 9-10
Criando um Script com Prompts Personalizados 9-11
Copiando Linhas a partir de Outra Tabela 9-12
Alterando os Dados em uma Tabela 9-13
A Instruo UPDATE 9-14
Atualizando Linhas em uma Tabela 9-15
Atualizando com Subconsulta de Vrias Colunas 9-16
Atualizando Linhas Baseadas em Outra Tabela 9-17
Atualizando Linhas: Erro de Restrio de Integridade 9-18
Removendo uma Linha de uma Tabela 9-19
A Instruo DELETE 9-20
viii

Deletando Linhas de uma Tabela 9-21


Deletando Linhas Baseadas em Outra Tabela 9-22
Deletando Linhas: Erro de Restrio de Integridade 9-23
Transaes de Banco de Dados 9-24
Vantagens das Instrues COMMIT e ROLLBACK 9-26
Controlando Transaes 9-27
Processando Transaes Implcitas 9-28
Estado dos Dados Antes do COMMIT ou ROLLBACK 9-29
Estado dos Dados Aps COMMIT 9-30
Submetendo Dados a Commit 9-31
Estado dos Dados Aps ROLLBACK 9-32
Fazendo Roll Back de Alteraes para um Marcador 9-33
Rollback no Nvel da Instruo 9-34
Consistncia na Leitura 9-35
Implementao da Consistncia na Leitura 9-36
Bloqueando 9-37
Sumrio 9-38
Viso Geral do Exerccio 9-39
10 Criando e Gerenciando Tabelas
Objetivos 10-2
Objetos do Banco de Dados 10-3
Convenes para Nomeao 10-4
A Instruo CREATE TABLE 10-5
Fazendo Referncia a Tabelas de Outro Usurio 10-6
A Opo DEFAULT 10-7
Criando Tabelas 10-8
Tabelas no Banco de Dados Oracle 10-9
Consultando o Dicionrio de Dados 10-10
Tipos de Dados 10-11
Criando uma Tabela Usando uma Subconsulta 10-13
A Instruo ALTER TABLE 10-15
Adicionando uma Coluna 10-16
Modificando uma Coluna 10-18
Eliminando uma Coluna 10-19
Opo SET UNUSED 10-20
Eliminando uma Tabela 10-22
Alterando o Nome de um Objeto 10-23
Truncando uma Tabela 10-24
Adicionando Comentrios a uma Tabela 10-25
Sumrio 10-26
Viso Geral do Exerccio 10-27
ix

11 Incluindo Restries
Objetivos 11-2
O Que So Restries? 11-3
Diretrizes sobre Restries 11-4
Definindo Restries 11-5
A Restrio NOT NULL 11-7
A Restrio UNIQUE KEY 11-9
A Restrio PRIMARY KEY 11-11
A Restrio FOREIGN KEY 11-13
Palavras-chave da Restrio FOREIGN KEY 11-15
A Restrio CHECK 11-16
Adicionando uma Restrio 11-17
Eliminando uma Restrio 11-19
Desativando Restries 11-20
Ativando Restries 11-21
Restries em Cascata 11-22
Verificando Restries 11-24
Verificando Colunas Associadas com Restries 11-25
Sumrio 11-26
Viso Geral do Exerccio 11-27
12 Criando Views
Objetivos 12-2
Objetos de Banco de Dados 12-4
O Que uma View? 12-5
Por Que Usar Views? 12-6
Views Simples e Views Complexas 12-7
Criando uma View 12-8
Recuperando Dados de uma View 12-11
Consultando uma View 12-12
Modificando uma View 12-13
Criando uma View Complexa 12-14
Regras para Executar Operaes DML em uma View 12-15
Usando a Clusula WITH CHECK OPTION 12-17
Negando Operaes DML 12-18
Removendo uma View 12-19
Views Em Linha 12-20
Anlise "Top-N 12-21
Executando a Anlise Top-N 12-22
Exemplo de Anlise Top-N 12-23
Sumrio 12-24
Viso Geral do Exerccio 12-26
x

13 Outros Objetos do Banco de Dados


Objetivos 13-2
Objetos do Banco de Dados 13-3
O Que uma Seqncia? 13-4
A Instruo CREATE SEQUENCE 13-5
Criando uma Seqncia 13-7
Confirmando Seqncias 13-8
Pseudocolunas NEXTVAL e CURRVAL 13-9
Usando uma Seqncia 13-11
Modificando uma Seqncia 13-13
Diretrizes para Modificar uma Seqncia 13-14
Removendo uma Seqncia 13-15
O Que um ndice? 13-16
Como os ndices so Criados? 13-17
Criando um ndice 13-18
Quando Criar um ndice 13-19
Quando No Criar um ndice 13-20
Confirmando ndices 13-21
ndices Baseados em Funo 13-22
Removendo um ndice 13-23
Sinnimos 13-24
Criando e Removendo Sinnimos 13-25
Sumrio 13-26
Viso Geral do Exerccio 13-27
14 Controlando o Acesso do Usurio
Objetivos 14-2
Controlando o Acesso do Usurio 14-3
Privilgios 14-4
Privilgios de Sistema 14-5
Criando Usurios 14-6
Privilgios de Sistema de Usurio 14-7
Concedendo Privilgios de Sistema 14-8
O Que uma Funo? 14-9
Criando e Concedendo Privilgios a uma Funo 14-10
Alterando Sua Senha 14-11
Privilgios de Objeto 14-12
Concedendo Privilgios de Objeto 14-14
Usando as Palavras-chave WITH GRANT OPTION e PUBLIC 14-15
Confirmando Privilgios Concedidos 14-16
Como Revogar Privilgios de Objeto 14-17

xi

Revogando Privilgios de Objeto 14-18


Sumrio 14-19
Viso Geral do Exerccio 14-20
15 SQL Workshop
Viso Geral do Workshop 15-2
16 Declarando Variveis
Objetivos 16-2
Sobre PL/SQL 16-3
Benefcios da Linguagem PL/SQL 16-4
Estrutura de Bloco PL/SQL 16-6
Tipos de Bloco 16-8
Construes de Programa 16-9
Uso de Variveis 16-11
Tratando Variveis em PL/SQL 16-12
Tipos de Variveis 16-13
Declarando Variveis PL/SQL 16-16
Regras para Nomeao 16-18
Atribuindo Valores s Variveis 16-19
Palavras-chave e Inicializao de Variveis 16-20
Tipos de Dados Escalares 16-22
Tipos de Dados Escalares Bsicos 16-23
Declarando Variveis Escalares 16-25
O Atributo %TYPE 16-26
Declarando Variveis com o Atributo %TYPE 16-27
Declarando Variveis Booleanas 16-28
Estrutura de Registro PL/SQL 16-29
Variveis de Tipo de Dados LOB 16-30
Variveis de Ligao 16-31
Referenciando Variveis No-PL/SQL 16-33
DBMS_OUTPUT.PUT_LINE 16-34
Sumrio 16-35
Viso Geral do Exerccio 16-37
17 Criando Instrues Executveis
Objetivos 17-2
Diretrizes e Sintaxe de Bloco PL/SQL 17-3
Comentando Cdigo 17-6
Funes SQL em PL/SQL 17-7
Funes PL/SQL 17-8
Converso de Tipo de Dados 17-9
xii

Blocos Aninhados e Escopo de Varivel 17-11


Operadores em PL/SQL 17-14
Usando Variveis de Ligao 17-16
Diretrizes de Programao 17-17
Convenes para Nomeao de Cdigo 17-18
Endentando o Cdigo 17-19
Determinando o Escopo da Varivel 17-20
Sumrio 17-21
Viso Geral do Exerccio 17-22
18 Interagindo com o Oracle Server
Objetivos 18-2
Instrues SQL em PL/SQL 18-3
Instrues SELECT em PL/SQL 18-4
Recuperando Dados em PL/SQL 18-6
Manipulando Dados Usando o PL/SQL 18-8
Inserindo Dados 18-9
Atualizando Dados 18-10
Deletando Dados 18-11
Convenes para Nomeao 18-12
Instrues COMMIT e ROLLBACK 18-14
Cursor SQL 18-15
Atributos do Cursor SQL 18-16
Sumrio 18-18
Viso Geral do Exerccio 18-20
19 Criando Estruturas para Controle
Objetivos 19-2
Controlando o Fluxo de Execuo PL/SQL 19-3
Instrues IF 19-4
Instrues IF Simples 19-5
Fluxo de Execuo da Instruo IF-THEN-ELSE 19-6
Instrues IF-THEN-ELSE 19-7
Fluxo de Execuo da Instruo IF-THEN-ELSIF 19-8
Instrues IF-THEN-ELSIF 19-9
Elaborando Condies Lgicas 19-10
Tabelas Lgicas 19-11
Condies Booleanas 19-12
Controle Iterativo: Instrues LOOP 19-13
Loop Bsico 19-14
Loop FOR 19-16

xiii

Loop WHILE 19-19


Loops e Labels Alinhados 19-21
Sumrio 19-23
Viso Geral do Exerccio 19-24
20 Trabalhando com Tipos de Dados Compostos
Objetivos 20-2
Tipos de Dados Compostos 20-3
Registros PL/SQL 20-4
Criando um Registro PL/SQL 20-5
Estrutura de Registro PL/SQL 20-7
O Atributo %ROWTYPE 20-8
Vantagens de Usar %ROWTYPE 20-9
O Atributo %ROWTYPE 20-10
Tabelas PL/SQL 20-11
Criando uma Tabela PL/SQL 20-12
Estrutura de Tabela PL/SQL 20-13
Criando uma Tabela PL/SQL 20-14
Usando Mtodos de Tabela PL/SQL 20-15
Tabela de Registros PL/SQL 20-16
Exemplo de Tabela de Registros PL/SQL 20-17
Sumrio 20-18
Viso Geral do Exerccio 20-19
21 Criando Cursores Explcitos
Objetivos 21-2
Sobre os Cursores 21-3
Funes do Cursor Explcito 21-4
Controlando Cursores Explcitos 21-5
Declarando o Cursor 21-7
Abrindo o Cursor 21-9
Extraindo Dados do Cursor 21-11
Fechando o Cursor 21-13
Atributos do Cursor Explcito 21-14
Controlando Vrias Extraes 21-15
O Atributo %ISOPEN 21-16
Os Atributos %NOTFOUND e %ROWCOUNT 21-17
Cursores e Registros 21-19
Loops FOR de Cursor 21-20
Loops FOR do Cursor Usando Subconsultas 21-22
Sumrio 21-23
Viso Geral do Exerccio 21-25
xiv

22 Conceitos de Cursor Explcito Avanados


Objetivos 22-2
Cursores com Parmetros 22-3
A Clusula FOR UPDATE 22-5
A Clusula WHERE CURRENT OF 22-7
Cursores com Subconsultas 22-9
Sumrio 22-10
Viso Geral do Exerccio 22-11
23 Tratando Excees
Objetivos 23-2
Tratando Excees com Cdigo PL/SQL 23-3
Tratando Excees 23-4
Tipos de Exceo 23-5
Capturando Excees 23-6
Diretrizes para a Captura de Excees 23-7
Capturando Erros Predefinidos do Oracle Server 23-8
Exceo Predefinida 23-10
Capturando Erros No Predefinidos do Oracle Server 23-11
Erro No Predefinido 23-12
Funes para Captura de Excees 23-13
Capturando Excees Definidas pelo Usurio 23-15
Exceo Definida pelo Usurio 23-16
Ambientes de Chamada 23-17
Propagando Excees 23-18
Procedimento RAISE_APPLICATION_ERROR 23-19
Sumrio 23-21
Viso Geral do Exerccio 23-22
A Solues Prticas
B Descries da Tabela e Dados
ndice

xv

xvi

Prefcio

Prefcio - 2

Perfil
Antes de Iniciar Este Curso
Antes de iniciar este curso, voc deve ser capaz de usar uma GUI (Graphical User Interface,
interface grfica com o usurio). O pr-requisito necessrio estar familiarizado com
conceitos e tcnicas de processamento de dados.
Como Este Curso Est Organizado
Introduo ao Oracle: SQL and PL/SQL um curso orientado por instrutor contendo
palestras e exerccios prticos. Sesses de demonstrao on-line e de exerccio escrito
reforam os conceitos e tcnicas apresentadas.

Prefcio - 3

Publicaes Relacionadas
Publicaes da Oracle
Ttulo

Nmero do Componente

Oracle8i Server, Release 8.1.5

A68826-01

Oracle8i Concepts, Release 8.1.5

A67781-01

Oracle8i SQL Reference Manual, Release 8.1.5

A67779-01

Oracle8i Server Application Developers Guide

A68003-01

SQL*Plus Users Guide and Reference, Release 8.1.5

A66736-01

SQL*Plus Quick Reference, Release 8.1.5

A66735-01

PL/SQL Users Guide and Reference, Release 8.1.5

A67842-01

Publicaes Adicionais

Boletins sobre verso do sistema

Guias de instalao e do usurio

arquivos README

artigos do International Oracle User's Group (IOUG)

Oracle Magazine

Prefcio - 4

Convenes Tipogrficas
A seguir esto duas listas de convenes tipogrficas usadas especificamente dentro de texto ou
de cdigo.
Convenes Tipogrficas Dentro de Texto
Conveno

Objeto ou Condio

Exemplo

Letras maisculas

Comandos,
funes,
nomes de coluna,
nomes de tabelas,
objetos PL/SQL,
esquemas

Use o comando SELECT para visualizar


informaes armazenadas na coluna
LAST_NAME
coluna da tabela EMP.

Letras minsculas,
itlico

Nomes de arquivo,
variveis de sintaxe,
nomes de usurio,
senhas

onde:

Inicial maiscula

Nomes de gatilho
nomes de boto

Atribua um gatilho a When-Validate-Item


ao bloco ORD.

funo o nome da funo


a ser criada.

Escolha Cancelar.
Itlico

Livros, nomes de
cursos e
manuais e
palavras ou frases
enfatizadas

Para obter mais informaes sobre o


assunto, consulte o
Oracle Server SQL Language Reference
Manual
No salve alteraes para o banco de dados.

Aspas

Ttulos de mdulo
de lio a que feito
referncia dentro de
um curso

Este assunto abordado na Lio 3,


"Trabalhando com Objetos".

Prefcio - 5

Convenes Tipogrficas (continuao)


Convenes Tipogrficas Dentro de Cdigo
Conveno

Objeto ou Termo

Exemplo

Letras maisculas

Comandos,
funes

SQL> SELECT userid


2 FROM emp;

Letras minsculas,
itlico

Variveis de sintaxe

SQL> CREATE ROLE role;

Inicial maiscula

Gatilhos de forms

Form module: ORD


Trigger level: S_ITEM.QUANTITY
item
Trigger name: When-Validate-Item
. . .

Letra minscula

Nomes de colunas,
nomes de tabelas,
nomes de arquivos,
objetos do PL/SQL

. . .
OG_ACTIVATE_LAYER
(OG_GET_LAYER ('prod_pie_layer'))
. . .
SQL> SELECT last_name
2 FROM emp;

Negrito

Texto que deve


ser includo por
um usurio

SQLDBA>
2>

Prefcio - 6

DROP USER scott


IDENTIFIED BY tiger;

Mapa de
Curso

Curso de Linguagens Integradas:


Linhas de Certificao
Introduo ao Oracle:
SQL e PL/SQL
PL/SQL
SQL1
Fundamentals

ou

Introduo ao Oracle
para Usurios Experientes em SQL
Oracle SQL
PL/SQL
Specifics
Fundamentals

Linha
do DBA
Desenvolvimento de
Unidades de Programa
em PL/SQL

Linha do
Application
Developer

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Curso de Linguagens Integradas: Linhas de Certificao


Introduo ao Oracle: SQL e PL/SQL consiste em dois mdulos, SQL1 e PL/SQL Fundamentals. Esse
curso pr-requisito para a linha do DBA ou Application Developer. O SQL1 abrange a criao de
estruturas de bancos de dados e o armazenamento, recuperao e manipulao de dados em um banco de
dados relacional. O curso PL/SQL Fundamentals abrange a criao de blocos PL/SQL de cdigo de
aplicao.
Para aqueles que trabalharam com outros bancos de dados relacionais e tm conhecimentos de SQL,
oferecido outro mdulo chamado Oracle SQL Specifics. Ele abrange as instrues SQL que no fazem
parte do ANSI SQL mas so especficas do Oracle. Esse mdulo combinado com o PL/SQL
Fundamentals forma o Introduo ao Oracle para Usurios Experientes em SQL.
Introduo ao Oracle: O SQL e PL/SQL e a Introduo ao Oracle para Usurios Experientes em SQL
so considerados equivalentes e, aps terminar um deles, voc poder passar para a linha de DBA. Para a
linha do Application Developer, voc deve fazer o curso Desenvolvimento de Unidades de Programa em
PL/SQL. Esse curso ensina como criar funes, pacotes, acionadores e procedimentos PL/SQL.

Mapa de Curso - 2

Curso de Linguagens Integradas


SQL1

Oracle SQL Specifics

Basic SELECT Statements

Retrieving & Formatting Data

Data Retrieval Techniques

Creating & Managing


Database Objects

DML and DDL

Extended Data Retrieval


with SQL
Advanced SELECT Statements
SQL*Plus and Reporting

SQL Statement Tuning


Diagnostics

PL/SQL Fundamentals
Basics

Develop PL/SQL
Program Units
Procedures, Functions,
and Packages
Database Programming

Rules and Guidelines

Advanced PL/SQL

SQL for End Users


Oracle8
Oracle8 3GL
3GL
Precompiler
Precompiler
Workshop
Workshop
Oracle8
Oracle8 Call
Call Interface
Interface
Workshop
Workshop
Advanced Techniques
for PL/SQL Developers
PL/SQL
Best Practices
Oracle8: New Features
in PL/SQL
Oracle Built-in
Packages

ILT
CBT
Seminar

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Curso de Linguagens Integradas


O slide lista vrios mdulos e cursos disponveis no curso de linguagens. Para a maioria desses
mdulos e cursos, h CBTs equivalentes.
Curso ou Mdulo
CBT Equivalente
SQL1
Oracle SQL: Basic SELECT Statements
Oracle SQL: Data Retrieval Techniques
Oracle SQL: DML and DDL
Oracle SQL Specifics
Oracle SQL Specifics: Retrieving and Formatting Data
Oracle SQL Specifics: Creating and Managing Database
Objects
PL/SQL Fundamentals
PL/SQL: Basics
Extended Data Retrieval with
Oracle SQL and SQL*Plus: Advanced SELECT Statements
SQL
Oracle SQL and SQL*Plus: SQL*Plus and Reporting
Develop PL/SQL Program Units PL/SQL: Procedures, Functions, and Packages
PL/SQL: Database Programming
SQL Statement Tuning
SQL and PL/SQL Tuning: Diagnostics
SQL and PL/SQL Tuning: Rules and Guidelines
So oferecidos quatro seminrios sobre PL/SQL: Advanced Techniques for PL/SQL Developers,
PL/SQL Best Practices, Oracle8: New Features in PL/SQL e Oracle Built-in Packages.

Mapa de Curso - 3

Mapa de Curso - 4

I
Introduo

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder fazer
o seguinte:
Discutir os aspectos tericos e fsicos de um
banco de dados relacional
Descrever a implementao Oracle do RDBMS e
ORDBMS
Descrever os novos recursos do Oracle8i
Descrever como o SQL e o PL/SQL so usados
no conjunto de produtos Oracle
Descrever o uso e os benefcios do PL/SQL
I-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc entender o RDBMS (relational database management system) e o ORDBMS
(object relational database management system). Voc tambm ser apresentado aos seguintes
tpicos:

Instrues SQL especficas do Oracle

SQL*Plus, usado para executar o SQL e para fins de formatao e elaborao de relatrios

O PL/SQL, que a linguagem procedural do Oracle

Introduo ao Oracle: SQL e PL/SQL I-2

Ciclo de Vida de
Desenvolvimento do Sistema
Estratgia
e Anlise
Design
Elaborao e
Documentao
Transio
Produo

I-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Ciclo de Vida de Desenvolvimento do Sistema


Do conceito produo, voc pode desenvolver um banco de dados usando o ciclo de vida de
desenvolvimento do sistema, que contm vrios estgios de desenvolvimento. Essa abordagem
completa e sistemtica para o desenvolvimento de bancos de dados transforma necessidades de
informaes comerciais em um banco de dados operacional.
Estratgia e Anlise

Estude e analise as necessidades comerciais. Entreviste usurios e gerentes para identificar as


necessidades de informaes. Incorpore as declaraes de objetivos da aplicao e da empresa,
alm de qualquer especificao futura do sistema.

Elabore modelos do sistema. Transfira a narrativa comercial para uma representao grfica das
regras e necessidades de informaes comerciais. Confirme e refine o modelo com os analistas
e especialistas.

Design
Projete o banco de dados de acordo com o modelo desenvolvido na fase de estratgia e anlise.
Elaborao e Documentao

Elabore o sistema prottipo. Crie e execute os comandos para elaborar tabelas e objetos de
suporte para o banco de dados.

Desenvolva uma documentao para o usurio, textos de ajuda e manuais de operao para
suporte ao uso e operao do sistema.
Introduo ao Oracle: SQL e PL/SQL I-3

Ciclo de Vida de
Desenvolvimento do Sistema
Estratgia
e Anlise
Design
Elaborao e
Documentao
Transio
Produo

I-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Ciclo de Vida de Desenvolvimento do Sistema (continuao)


Transio
Refine o prottipo. Mova uma aplicao para a produo com teste de aceitao do usurio,
converso de dados existentes e operaes paralelas. Faa as modificaes necessrias.
Produo
Fornea o sistema aos usurios. Opere o sistema de produo. Monitore o desempenho, aperfeioe
e refine o sistema.
Observao: possvel executar as vrias fases do ciclo de vida de desenvolvimento do sistema
repetidamente. Este curso se concentra na fase de elaborao do ciclo de vida de desenvolvimento
do sistema.

Introduo ao Oracle: SQL e PL/SQL I-4

Armazenamento de Dados
em Diferentes Mdias
SALGRADE
GRADE
LOSAL
HISAL
--------- --------- --------DEPT
1
700
1200
DEPTNO DNAME
LOC
2
1201
1400
--------- -------------- ---------3
1401
2000
10 ACCOUNTING
NEW YORK
4
2001
3000
20 RESEARCH
DALLAS
5
3001
9999
30 SALES
CHICAGO
40 OPERATIONS
BOSTON

Arquivo
fsico

Planilha
eletrnica
I-5

Banco de
Dados

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Armazenando Informaes
Toda organizao necessita de informaes. Uma biblioteca mantm uma lista de membros, livros,
datas de entrega e multas. Uma empresa precisa gravar informaes sobre funcionrios,
departamentos e salrios. Essas informaes so chamadas de dados.
As organizaes podem armazenar dados em vrias mdias e em formatos diferentes, por exemplo,
um documento impresso em um arquivo fsico ou dados em planilhas eletrnicas ou bancos de dados.
Um banco de dados um conjunto organizado de informaes.
Para gerenciar bancos de dados, voc precisa de DBMSs (database management systems). Um
DBMS um programa que armazena, recupera e modifica dados do banco de dados a pedido. H
quatro tipos principais de bancos de dados: hierrquico, de rede, relacional e relacional de objeto,
o mais recente.
Observao: O Oracle7 um RDBMS (relational database management system) e o Oracle8 um
ORDBMS (object relational database management system).

Introduo ao Oracle: SQL e PL/SQL I-5

Conceito de Banco de Dados


Relacional
O Dr. E.F. Codd props o modelo relacional de
sistemas de bancos de dados em 1970.
Ele a base para o RDBMS (relational database
management system).
O modelo relacional consiste nos seguintes itens:
Conjunto de objetos ou relaes
Conjunto de operadores para agir sobre as relaes
Integridade de dados para preciso e consistncia

I-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Modelo Relacional
Os princpios do modelo relacional foram definidos primeiramente pelo Dr. E.F. Codd em junho de
1970 em um estudo chamado "A Relational Model of Data for Large Shared Data Banks". Nesse
estudo, o Dr. Codd props o modelo relacional de sistemas de bancos de dados.
Os modelos mais populares usados naquele tempo eram hierrquicos, de rede ou mesmo estruturas de
dados de arquivos simples. Os RDBMSs (relational database management systems) em breve se
tornaram muito populares, especialmente pela facilidade de uso e flexibilidade na estrutura. Alm
disso, vrios fornecedores inovadores, como a Oracle, ofereciam o RDBMS com um conjunto
eficiente de desenvolvimento de aplicaes e produtos para usurios, formando uma soluo
completa.
Componentes do Modelo Relacional

Conjuntos de objetos ou relaes que armazenam os dados

Conjunto de operadores que podem agir sobre as relaes para produzir outras relaes

Integridade de dados para preciso e consistncia

Para obter mais informaes, consulte E.F. Codd, The Relational Model for Database Management
Version 2 (Reading, Mass.: Addison-Wesley, 1990).

Introduo ao Oracle: SQL e PL/SQL I-6

Definio de Banco de Dados


Relacional
Um banco de dados relacional um conjunto de relaes
ou tabelas bidimensionais.
Banco
de Dados

Nome da Tabela: EMP


EMPNO
7839

ENAME
KING

JOB
PRESIDENT

7698
7782
7566

BLAKE
CLARK
JONES

MANAGER
MANAGER
MANAGER

I-7

Nome da Tabela: DEPT

DEPTNO
10

DEPTNO
10

DNAME
ACCOUNTING

LOC
NEW YORK

30
10
20

20
30
40

RESEARCH
SALES
OPERATIONS

DALLAS
CHICAGO
BOSTON

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Definio de Banco de Dados Relacional


Um banco de dados relacional usa relaes ou tabelas bidimensionais para armazenar informaes.
Por exemplo, voc pode armazenar informaes sobre todos os funcionrios de uma empresa. Em
um banco de dados relacional, voc cria vrias tabelas para armazenar informaes diferentes sobre
funcionrios, como tabelas de funcionrios, departamentos e salrios.

Introduo ao Oracle: SQL e PL/SQL I-7

Modelos de Dados

Modelo de
sistema
imaginado
pelo cliente

Modelo de
entidade do
modelo
do cliente

Modelo de
tabela do modelo
de entidade

Servidor

Tabelas em
discos
I-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Modelos de Dados
Os modelos so a base do design. Os engenheiros criam um modelo de carro para estudar os detalhes
antes de coloc-lo em produo. Da mesma forma, projetistas de sistemas desenvolvem modelos para
explorar idias e compreender melhor o design de um banco de dados.
Objetivo dos Modelos
Os modelos ajudam a comunicar conceitos imaginados pelas pessoas. possvel us-los com os
seguintes objetivos:

Comunicar

Categorizar

Descrever

Especificar

Investigar

Desenvolver

Analisar

Imitar

O objetivo produzir um modelo que se adapte a vrios usos, possa ser compreendido por um
usurio final e contenha detalhes suficientes para que um desenvolvedor crie um sistema de banco de
dados.
Introduo ao Oracle: SQL e PL/SQL I-8

Modelo de Relacionamento
de Entidades
Crie um diagrama de relacionamento de entidades a
partir de narrativas ou especificaes comerciais
EMPLOYEE
#*
nmero
*
nome
o
cargo

atribudo a
composto de

DEPARTMENT
#*
nmero
*
nome
o
localizao

Cenrio
"...Atribua um ou mais funcionrios a um
departamento..."
"...Alguns departamentos ainda no tm
funcionrios atribudos a eles..."
I-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Modelo de Relacionamento de Entidades


Em um sistema eficiente, os dados so divididos em categorias ou entidades distintas. Um modelo de
relacionamento de entidades (ER) uma ilustrao de vrias entidades em uma empresa e dos
relacionamentos entre elas. Um modelo de relacionamento de entidades derivado de narrativas ou
especificaes comerciais e criado durante a fase de anlise do ciclo de vida de desenvolvimento do
sistema. Os modelos para relacionamento de entidades separam as informaes necessrias para uma
empresa das atividades desempenhadas dentro dela. Embora as empresas possam alterar suas
atividades, o tipo de informaes tende a permanecer constante. Portanto, as estruturas de dados
tambm tendem a ser constantes.
Benefcios do Modelo de Relacionamento de Entidades

Documenta as informaes da organizao em formato claro e preciso

Fornece uma imagem clara do escopo das necessidades de informaes

Fornece um mapa ilustrado facilmente compreendido para o design do banco de dados

Oferece uma estrutura eficiente para a integrao de vrias aplicaes

Introduo ao Oracle: SQL e PL/SQL I-9

Componentes-chave

Entidade: Um item importante sobre o qual necessrio obter informaes. Os exemplos so


departamentos, funcionrios e pedidos.

Atributo: Um item que descreve ou qualifica uma entidade. Por exemplo, para a entidade de
funcionrios, os atributos so o nmero, o nome e o cargo do funcionrio, alm do nmero do
departamento e assim por diante. Cada um desses atributos necessrio ou opcional. Esse
estado chamado opcionalidade.

Relacionamento: Uma associao nomeada entre entidades que demonstra opcionalidade e


grau. Os exemplos so funcionrios e departamentos, alm de pedidos e itens.

Introduo ao Oracle: SQL e PL/SQL I-10

Convenes de Modelo para


Relacionamento de Entidades
Entidade
Soft box
Nome exclusivo, individual
Letra maiscula
Sinnimo entre parnteses

EMPLOYEE
#*
nmero
*
nome
o
cargo

Atributo
Nome individual
Letra minscula
Obrigatrio marcado com "*"
Opcional marcado com "o"

atribudo a
composto de

DEPARTMENT
#*
nmero
*
nome
o
localizao

UID (Identificador nico)


Primrio marcado com "#"
Secundrio marcado com "(#)"
I-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Entidades
Para representar uma entidade em um modelo, use as seguintes convenes:

Soft box com qualquer dimenso

Nome de entidade exclusivo, individual

Nome de entidade em letras maisculas

Sinnimos opcionais em letras maisculas entre parnteses: ( )

Atributos
Para representar um atributo em um modelo, use as seguintes convenes:

Use nomes singulares em letras minsculas

Marque os atributos obrigatrios ou os valores que devem ser conhecidos com um asterisco: *

Marque os atributos opcionais ou valores que podem ser conhecidos com a letra o

Relacionamentos
Smbolo

Descrio

Linha tracejada

Elemento opcional que indica algo que pode ser

Linha contnua

Elemento obrigatrio que indica algo que deve ser

P-de-galinha

Elemento de classificao que indica um ou mais

Linha simples

Elemento de classificao que indica um nico

Introduo ao Oracle: SQL e PL/SQL I-11

Convenes de Modelo para


Relacionamento de Entidades
Atributo
Nome individual
Letra minscula
Obrigatrio marcado com "*"
Opcional marcado com "o"

Entidade
Soft box
Nome exclusivo, individual
Letra maiscula
Sinnimo entre parnteses

EMPLOYEE
#*
nmero
*
nome
o
cargo

atribudo a
composto de

DEPARTMENT
#*
nmero
*
nome
o
localizao

UID (Identificador nico)


Primrio marcado com "#"
Secundrio marcado com "(#)"
I-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Relacionamentos
Cada direo do relacionamento contm:

Um nome, por exemplo, atribudo

Uma opcionalidade, que indica algo que deve ser ou pode ser

Um grau, que indica um nico ou um ou mais

Observao: O termo cardinalidade um sinnimo para o termo grau.


Cada entidade de origem {pode ser | deve ser} um nome de relacionamento {um nico | um ou mais}
entidade de destino.
Observao: A conveno deve ser lida em sentido horrio.
Identificadores nicos
Um UID (identificador nico) corresponde a qualquer combinao de atributos ou relacionamentos
(ou os dois) que serve para diferenciar ocorrncias em uma entidade. Cada ocorrncia de entidade
deve ser identificada com exclusividade.

Marque cada atributo que faz parte do UID com uma tralha: #

Marque os UIDs secundrios com uma tralha entre parnteses: (#)

Introduo ao Oracle: SQL e PL/SQL I-12

Terminologia de Banco de Dados


Relacional
2

EMPNO ENAME

JOB

MGR

HIREDATE

SAL

COMM DEPTNO

------------- ------------ --------------------- -------- ---------------- ----------- --------------

1
I-13

7839 KING

PRESIDENT

7698 BLAKE

MANAGER

7839

-----------

17-NOV-81

5000

10

01-MAY-81

2850

30

7782 CLARK

MANAGER

7839

09-JUN-81

2450

10

7566 JONES

MANAGER

7839

02-APR-81

2975

20

7654 MARTIN

SALESMAN

7698

28-SEP-81

1250

1400

30

7499 ALLEN

SALESMAN

7698

20-FEB-81

1600

300

30

7844 TURNER SALESMAN

7698

08-SEP-81

1500

30

7900 JAMES

CLERK

7698

03-DEC-81

950

7521 WARD

SALESMAN

7698

22-FEB-81

1250

7902 FORD

ANALYST

7566

03-DEC-81

3000

20

7369

SMITH

CLERK

7902

17-DEC-80

800

20

7788

SCOTT

ANALYST

7566

09-DEC-82

3000

20

7876

ADAMS

CLERK

7788

12-JAN-83

1100

20

7934

MILLER

CLERK

7782

23-JAN-82

1300

10

30
500

30

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Terminologia de Banco de Dados Relacional


Um banco de dados relacional pode conter uma ou vrias tabelas. Uma tabela a estrutura de
armazenamento bsica de um RDBMS. Ela armazena todos os dados necessrios sobre algo do mundo
real, por exemplo, funcionrios, NFFs ou clientes.
O slide mostra o contedo da relao ou tabela EMP. Os nmeros indicam o seguinte:
1. Uma linha simples ou tupla que representa todos os dados necessrios para um funcionrio
especfico. Cada linha de uma tabela deve ser identificada por uma chave primria, que no
permite linhas duplicadas. A ordem das linhas no importante; especifique essa ordem quando
os dados forem recuperados.
2. Uma coluna ou atributo que contm o nmero do funcionrio, que tambm a chave primria.
O nmero do funcionrio identifica um nico funcionrio na tabela EMP. Uma chave primria
deve conter um valor.
3. Uma coluna que no um valor de chave. Uma coluna representa um tipo de dados em uma
tabela; no exemplo, o cargo de todos os funcionrios. A ordem das colunas no importante
durante o armazenamento de dados; especifique essa ordem quando os dados forem
recuperados.
4. Uma coluna que contm o nmero do departamento, que tambm uma chave estrangeira. Uma
chave estrangeira uma coluna que define como as tabelas se relacionam umas com as outras.
Uma chave estrangeira se refere a uma chave primria ou a uma chave exclusiva em outra
tabela. No exemplo, DEPTNO identifica com exclusividade um departamento da tabela DEPT.
Introduo ao Oracle: SQL e PL/SQL I-13

Terminologia de Banco de Dados Relacional (continuao)


5. possvel encontrar um campo na interseo entre uma linha e uma coluna. S pode haver um
valor nesse campo.
6. Um campo pode no conter nenhum valor. Nesse caso, o valor nulo. Na tabela EMP, apenas
funcionrios com cargo de vendedor tm um valor no campo COMM (comisso).
Observao: Os valores nulos so abordados com mais detalhes nas lies posteriores.

Introduo ao Oracle: SQL e PL/SQL I-14

Relacionando Vrias Tabelas


Cada linha de dados de uma tabela
identificada com exclusividade por uma
chave primria (PK).
Voc pode relacionar logicamente dados de
vrias tabelas usando as chaves
estrangeiras (FK).
Nome da Tabela: EMP
EMPNO
7839

ENAME
KING

JOB
PRESIDENT

7698
7782
7566

BLAKE
CLARK
JONES

MANAGER
MANAGER
MANAGER

Chave primria
I-15

Nome da Tabela: DEPT


DEPTNO
10

DEPTNO
10

DNAME
ACCOUNTING

LOC
NEW YORK

30
10
20

20
30
40

RESEARCH
SALES
OPERATIONS

DALLAS
CHICAGO
BOSTON

Chave estrangeira

Chave primria

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Relacionando Vrias Tabelas


Cada tabela contm dados que descrevem exatamente uma entidade. Por exemplo, a tabela EMP
contm informaes sobre funcionrios. As categorias de dados so listadas ao longo da parte superior
de cada tabela e os casos individuais so listados abaixo da tabela. Usando o formato de tabela, voc
pode visualizar, entender e usar informaes imediatamente.
Como os dados sobre entidades diferentes so armazenados em tabelas diferentes, talvez voc precise
combinar duas ou mais tabelas para responder a uma pergunta especfica. Por exemplo, talvez voc
queira saber a localizao do departamento no qual um funcionrio trabalha. Nesse cenrio, voc
precisa de informaes da tabela EMP (que contm dados sobre funcionrios) e da tabela DEPT (que
contm informaes sobre departamentos). Um RDBMS permite relacionar os dados de uma tabela
aos dados de outra usando as chaves estrangeiras. Uma chave estrangeira uma coluna ou um
conjunto de colunas que se refere a uma chave primria na mesma tabela ou em outra tabela.
O recurso de relacionar dados de uma tabela a dados de outra permite organizar informaes em
unidades gerenciveis separadas. possvel manter logicamente os dados dos funcionrios separados
dos dados dos departamentos armazenando-os em uma tabela separada.

Introduo ao Oracle: SQL e PL/SQL I-15

Diretrizes para Chaves Primrias e Estrangeiras


No so permitidos valores duplicados em uma chave primria.
Geralmente, no possvel alterar chaves primrias.
As chaves estrangeiras so baseadas nos valores dos dados e so ponteiros unicamente lgicos
e no fsicos.
Uma chave estrangeira deve corresponder a um valor de chave primria existente, a um valor
de chave exclusiva ou ser nula.
No possvel definir chaves estrangeiras sem chaves primrias (exclusivas) existentes.

Introduo ao Oracle: SQL e PL/SQL I-16

Propriedades de Banco de Dados


Relacional
Um banco de dados relacional
Pode ser acessado e modificado executando
instrues SQL (Structured Query Language)
Contm um conjunto de tabelas sem
ponteiros fsicos
Usa um conjunto de operadores

I-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Propriedades de Banco de Dados Relacional


Em um banco de dados relacional, voc no especifica a rota de acesso s tabelas e no precisa saber
como os dados so organizados fisicamente.
Para acessar o banco de dados, execute uma instruo SQL (Structured Query Language), que a
linguagem padro ANSI (American National Standards Institute) para a operao em bancos de
dados relacionais. A linguagem contm um grande conjunto de operadores para dividir e combinar
relaes.
possvel modificar o banco de dados usando as instrues SQL.

Introduo ao Oracle: SQL e PL/SQL I-17

Comunicando-se com um RDBMS


Usando o SQL
A instruo SQL
informada
SQL> SELECT loc
2 FROM
dept;

A instruo enviada
para o banco de dados

Banco de
Dados
Os dados so
exibidos
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON

I-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

SQL (Structured Query Language)


O SQL permite comunicar-se com o servidor e tem as seguintes vantagens:

Eficincia

Facilidade de aprendizagem e uso

Funcionalidade completa (O SQL permite definir, recuperar e manipular dados das tabelas.)

Introduo ao Oracle: SQL e PL/SQL I-18

Sistema de Gerenciamento de
Banco de Dados Relacional
Servidor

Tabelas de
usurios
I-19

Dicionrio
de dados

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sistema de Gerenciamento de Banco de Dados Relacional


A Oracle fornece um RDBMS flexvel chamado Oracle7. Usando os recursos desse RDBMS, voc
pode armazenar e gerenciar dados com todas as vantagens de uma estrutura relacional alm do
PL/SQL, um mecanismo com recurso para armazenar e executar unidades de programas. O servidor
oferece as opes de recuperao de dados com base em tcnicas de otimizao. Ele inclui recursos
de segurana que controlam como um banco de dados acessado e usado. Outros recursos incluem a
consistncia e a proteo de dados atravs de mecanismos de bloqueio.
As aplicaes Oracle podem ser executadas no mesmo computador que o Oracle Server. Como
opo, voc pode executar aplicaes em um sistema local de usurio e executar o Oracle Server em
outro sistema (arquitetura cliente-servidor). Nesse ambiente cliente-servidor, possvel usar uma
grande variedade de recursos de computao. Por exemplo, uma aplicao de reservas de uma linha
area baseada em forms pode ser executada no PC de um cliente, enquanto o acesso a dados de vo
gerenciado convenientemente por um Oracle Server em um computador central.
Para obter mais informaes, consulte o Oracle Server Concepts Manual, Release 8.

Introduo ao Oracle: SQL e PL/SQL I-19

Oracle8: Sistema de
Gerenciamento de Banco de
Dados Relacional de Objeto
Objetos e tipos de dados definidos pelo
usurio
Compatibilidade total com o banco de
dados relacional
Suporte de objetos grandes e multimdia
Recursos de servidor de banco de dados
de alta qualidade

I-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sobre o Oracle8
O Oracle8 o primeiro banco de dados com recurso de objeto desenvolvido pela Oracle. Ele estende
os recursos de modelo de dados do Oracle7 para suportar um novo modelo de banco de dados
relacional de objeto. O Oracle8 fornece um novo mecanismo que oferece programao orientada a
objeto, tipos de dados complexos, objetos comerciais complexos e compatibilidade total com o
universo relacional.
O Oracle8 estende o Oracle7 de vrias formas. Ele inclui vrios recursos para desempenho e
funcionalidade aperfeioados de aplicaes OLTP (Online Transaction Processing), como um
melhor compartilhamento de estruturas de dados no tempo de execuo, caches de buffer maiores e
restries diferenciveis. As aplicaes de armazenamento de dados se beneficiaro de
aperfeioamentos como a execuo paralela de operaes para inserir, atualizar e deletar, a diviso e
a otimizao de consultas paralelas. Operando na estrutura NCA (Network Computing Architecture),
o Oracle8 suporta aplicaes cliente-servidor e baseadas da Web distribudas e com vrias camadas.
O Oracle8 pode escalonar dezenas de milhares de usurios simultneos, suportar 512 petabytes e
tratar qualquer tipo de dados, incluindo dados espaciais, de textos, imagens, som, vdeo e sries de
tempos, alm de dados estruturados tradicionais.
Para obter mais informaes, consulte o Oracle Server Concepts Manual, Release 8.

Introduo ao Oracle: SQL e PL/SQL I-20

Oracle8i: Banco de Dados de


Plataforma Internet para Recursos
de Computao na Internet
Ferramentas avanadas para gerenciar todos
os tipos de dados em sites da Web
Mais que um simples armazenamento de dados
relacional: iFS
Java VM integrado no servidor: JServer
Melhor desempenho, segurana mais firme,
aperfeioamento de linguagem
Maior integrao com o ambiente Windows NT:
AppWizard
I-21

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sobre o Oracle8i
O Oracle8i, o banco de dados de computao na Internet, fornece ferramentas avanadas para
gerenciar todos os tipos de dados em sites da Web.
Ele muito mais que um simples armazenamento de dados relacionais. O iFS (Internet File System)
combina a potncia do Oracle8i com a facilidade de uso de um sistema de arquivos. Ele permite que
os usurios movam todos os dados para o banco de dados do Oracle8i, no qual eles podem ser
armazenados e gerenciados com mais eficincia. Os usurios finais podem acessar facilmente arquivos
e pastas no Oracle iFS atravs de vrios protocolos, como HTML, FTP e IMAP4, que fornecem
acesso universal aos dados.
O Oracle8i interMedia permite que os usurios tornem seus dados multimdia acessveis Web,
incluindo dados de imagens, textos, udio e vdeo. O Oracle8i inclui um Java Virtual Machine
robusto, integrado e escalonvel no servidor (Jserver), que suporta Java em todas as camadas de
aplicaes. Esse recurso elimina a necessidade de recompilar ou modificar um cdigo Java quando for
preciso depur-lo em uma camada diferente.
Como o gerenciamento de recursos recentemente introduzido, o DBA pode escolher o melhor mtodo
para adequar ao perfil e carga de trabalho de uma aplicao. Os recursos estendidos de servidor
paralelo e rede melhoram a facilidade de administrao do sistema. A funcionalidade estendida da
duplicao avanada resulta em um melhor desempenho e segurana aperfeioada. Foram adicionados
recursos novos e importantes a linguagens.

Introduo ao Oracle: SQL e PL/SQL I-21

Sobre o Oracle8i (continuao)


O Oracle8i fornece integrao nativa total com o Microsoft Transaction Server (MTS) no ambiente
Windows NT. O desenvolvimento de aplicaes simplificado pelo Oracle Application Wizard
(AppWizard) para Visual Studio, que fornece aos desenvolvedores uma ferramenta de GUI para criar
uma aplicao Visual C++, Visual Interdev ou Visual Basic acessando dados em um banco de dados
do Oracle.
Para obter mais informaes, consulte o Oracle Server Concepts Manual, Release 8i.

Introduo ao Oracle: SQL e PL/SQL I-22

Plataforma Internet da Oracle


Clientes

I-23

Qualquer
cliente
de correio

Qualquer
cliente FTP

Aplicaes para Internet

Lgica comercial
e dados

Bancos
de dados

Apresentao e
lgica comercial

Servidores de
aplicaes

Ferramentas de
desenvolvimento

Gerenciamento de sistema

Qualquer
navegador

SQL

PL/SQL

Java

Servios de rede
Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Plataforma Internet da Oracle


A Oracle oferece uma plataforma Internet abrangente e de alto desempenho para comrcio eletrnico e
armazenamento de dados. Essa plataforma integrada inclui tudo o que necessrio para desenvolver,
depurar e gerenciar aplicaes para Internet. A Plataforma Internet da Oracle criada em trs partes
principais:

Clientes baseados em navegadores para processar apresentaes

Servidores de aplicaes para executar a lgica comercial e a lgica de apresentao de servidor


aos clientes baseados em navegadores

Bancos de dados para executar a lgica comercial com uso intensivo do banco de dados e dos
dados do servidor

A Oracle oferece vrias ferramentas de desenvolvimento orientadas a GUI (Graphical User Interface)
mais avanadas para criar aplicaes comerciais, alm de um grande conjunto de aplicaes de
software para vrias reas de comrcio e indstria. possvel criar procedimentos de armazenamento,
funes e pacotes usando SQL, PL/SQL ou Java.

Introduo ao Oracle: SQL e PL/SQL I-23

Instrues SQL

I-24

SELECT

Recuperao de dados

INSERT
UPDATE
DELETE

DML (Data Manipulation Language)

CREATE
ALTER
DROP
RENAME
TRUNCATE

DDL (Data Definition Language)

COMMIT
ROLLBACK
SAVEPOINT

Controle de transao

GRANT
REVOKE

DCL (Data Control Language)

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Instrues SQL
O Oracle SQL compatvel com os padres aceitos pela indstria. A Oracle Corporation garante a
compatibilidade futura com padres em desenvolvimento envolvendo ativamente uma equipe-chave
nos comits de padres SQL. Os comits aceitos pela indstria so o ANSI (American National
Standards Institute) e o ISO (International Standards Organization). O ANSI e o ISO aceitaram o
SQL como a linguagem padro para os bancos de dados relacionais.
Instruo

Descrio

SELECT

Recupera dados do banco de dados

INSERT
UPDATE
DELETE

Informa novas linhas, altera linhas existentes e remove linhas indesejveis de


tabelas do banco de dados, respectivamente. O conjunto dessas instrues
conhecido como DML (Data Manipulation Language).

CREATE
ALTER
DROP
RENAME
TRUNCATE
COMMIT
ROLLBACK
SAVEPOINT

Configura, altera e remove estruturas de dados de tabelas. O conjunto dessas


instrues conhecido como DDL (Data Definition Language).

GRANT
REVOKE

Gerencia as alteraes feitas pelas instrues DML. possvel agrupar as


alteraes dos dados em transaes lgicas.
Fornece ou remove direitos de acesso ao banco de dados Oracle e s
estruturas contidas nele. O conjunto dessas instrues conhecido como
DCL (Data Control Language).

Introduo ao Oracle: SQL e PL/SQL I-24

Sobre PL/SQL
O PL/SQL uma extenso do SQL com
recursos de design de linguagens de
programao.
As instrues de consulta e a manipulao
de dados do SQL esto includas nas
unidades procedurais de cdigo.

I-25

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sobre PL/SQL
O PL/SQL (Procedural Language/SQL) uma extenso de linguagem procedural da Oracle
Corporation para SQL, a linguagem de acesso a dados padro para bancos de dados relacionais. O
PL/SQL oferece recursos de engenharia de software modernos, como, por exemplo, a encapsulao
de dados, o tratamento de excees, a ocultao de informaes, a orientao de objeto e assim por
diante, trazendo os recursos de programao mais modernos para o Oracle Server e o Toolset.
O PL/SQL incorpora muitos recursos avanados feitos em linguagens de programao projetadas
durante as dcadas de 70 e 80. Alm de aceitar a manipulao de dados, ele tambm permite que
instrues de consulta do SQL sejam includas em unidades procedurais de cdigo e estruturadas
em blocos, tornando o PL/SQL uma linguagem de processamento de transaes poderosa. Com o
PL/SQL, voc pode usar as instrues SQL para refinar os dados da Oracle e as instrues de
controle do PL/SQL para processar os dados.

Introduo ao Oracle: SQL e PL/SQL I-25

Ambiente PL/SQL
Mecanismo PL/SQL
bloco
PL/SQL

bloco
PL/SQL

PL/SQL
SQL

Executor da
Instruo
Procedural

Executor da Instruo SQL


Oracle Server

I-26

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Mecanismo PL/SQL e Oracle Server


O PL/SQL no um produto Oracle em si; ele uma tecnologia empregada pelo Oracle Server e por
algumas ferramentas Oracle. Os blocos PL/SQL so passados e processados por um mecanismo PL/SQL,
que pode residir na ferramenta ou no Oracle Server. O mecanismo usado depende do local no qual o
PL/SQL chamado.
O mecanismo PL/SQL no Oracle Server processa os blocos PL/SQL submetidos de um programa de sada
de usurio, Pro*, SQL*Plus ou Server Manager. Ele separa as instrues SQL e as envia individualmente
para o executor da instruo SQL.
Uma nica transferncia necessria para enviar o bloco da aplicao para o Oracle Server, melhorando
o desempenho, especialmente em uma rede cliente-servidor. Tambm possvel armazenar o PL/SQL
no Oracle Server sob a forma de subprogramas que podem ser consultados pelas aplicaes conectadas
ao banco de dados.

Introduo ao Oracle: SQL e PL/SQL I-26

Tabelas Usadas no Curso


EMP
EMPNO
--------7839
7698
7782
7566
7654
7499
7844
7900

ENAME
---------KING
BLAKE

JOB
MGR HIREDATE
SAL
COMM
DEPTNO
--------- --------- --------- --------- --------- --------PRESIDENT
17-NOV-81
5000
10
MANAGER
7839 01-MAY-81
2850
30

CLARK
JONES
MARTIN
ALLEN
TURNER
JAMES

MANAGER
MANAGER
SALESMAN
SALESMAN
SALESMAN
CLERK

7839
7839
7698
7698
7698
7698

09-JUN-81
02-APR-81
28-SEP-81
20-FEB-81
08-SEP-81
03-DEC-81

SALESMAN
LOC
ANALYST
---------CLERK
NEW
YORK
ANALYST
DALLAS
CLERK
CHICAGO
CLERK
BOSTON

7698
7566
7902
7566
7788
7782

22-FEB-81
03-DEC-81
17-DEC-80
09-DEC-82
12-JAN-83
23-JAN-82

7521
DNAMEWARD
7902
FORD
-------------7369
SMITH
ACCOUNTING
7788
SCOTT
20 RESEARCH
7876
30 SALESADAMS
MILLER
40 7934
OPERATIONS

DEPTNO
--------10

2450
2975
1250
1600
1500
950

1400
300
0

1250
500
30
3000
20
800
20
GRADE
LOSAL
HISAL
3000
20
--------- --------- --------1100 1
20
700
1200
1300 2
10
1201
1400
3
1401
2000
4
5

DEPT

2001
3001

SALGRADE
I-27

10
20
30
30
30
30

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tabelas Usadas no Curso


As trs tabelas a seguir sero usadas neste curso:

Tabela EMP, que fornece detalhes sobre todos os funcionrios

Tabela DEPT, que fornece detalhes sobre todos os departamentos

Tabela SALGRADE, que fornece detalhes sobre salrios de vrias classes

A estrutura e os dados de todas as tabelas so fornecidos no Apndice B.

Introduo ao Oracle: SQL e PL/SQL I-27

3000
9999

Sumrio
Os bancos de dados relacionais so compostos
por relaes, gerenciados por operaes
relacionais e regidos por restries de integridade
de dados.
O Oracle Server permite armazenar e gerenciar
informaes usando a linguagem SQL e o
mecanismo PL/SQL.
O Oracle8 baseado no ORDBMS (object relational
database management system).
O Oracle8i Server o banco de dados de
computao na Internet.
O PL/SQL uma extenso do SQL com recursos
de design de linguagens de programao.
I-28

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Os RDBMSs (relational database management systems) so compostos por objetos ou relaes. Eles
so gerenciados por operaes e regidos por restries de integridade de dados.
A Oracle Corporation cria produtos e servios para atender suas necessidades de RDBMS. O produto
principal o Oracle Server, que permite armazenar e gerenciar informaes usando o SQL e o
mecanismo PL/SQL para construes procedurais.
SQL
O Oracle Server suporta o SQL do padro ANSI e contm extenses. O SQL uma linguagem usada
para comunicar-se com o servidor e acessar, manipular e controlar dados.
PL/SQL
A linguagem PL/SQL estende a linguagem SQL oferecendo construes procedurais estruturados em
blocos combinados com recursos no procedurais do SQL.

Introduo ao Oracle: SQL e PL/SQL I-28

1
Criando Instrues
SQL Bsicas

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Listar os recursos das instrues SELECT
SQL
Executar uma instruo SELECT bsica
Diferenciar instrues SQL e comandos
SQL*Plus

1-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Para extrair dados do banco de dados, preciso usar a instruo SELECT SQL (Structured Query
Language). Talvez voc necessite restringir as colunas exibidas. Esta lio descreve todas as
instrues SQL necessrias para executar essas aes.
Talvez voc deseje criar instrues SELECT que possam ser usadas continuamente. Esta lio
tambm aborda o uso dos comandos SQL*Plus para executar instrues SQL.

Introduo ao Oracle: SQL e PL/SQL 1-2

Recursos das Instrues


SELECT SQL
Seleo

Projeo

Tabela 1

Tabela 1

Juno

Tabela 1
1-3

Tabela 2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Recursos das Instrues SELECT SQL


A instruo SELECT recupera informaes do banco de dados. Usando uma instruo SELECT,
voc pode fazer o seguinte:

Seleo: Voc pode usar o recurso de seleo no cdigo SQL para escolher as linhas de uma
tabela que deseja ver retornadas por uma consulta. Pode usar vrios critrios para restringir
seletivamente as linhas que voc v.

Projeo: Voc pode usar o recurso de projeo no cdigo SQL para escolher as colunas de
uma tabela que deseja ver retornadas por uma consulta. possvel escolher mais ou menos
colunas da tabela conforme sua necessidade.

Juno: Voc pode usar o recurso de juno no cdigo SQL para reunir dados armazenados em
tabelas diferentes, criando um vnculo entre eles. Voc aprender mais sobre junes em uma
lio posterior.

Introduo ao Oracle: SQL e PL/SQL 1-3

Instruo SELECT Bsica

SELECT
FROM

[DISTINCT] {*, coluna [apelido],...}


tabela;

SELECT identifica que colunas.


FROM identifica qual tabela.

1-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Instruo SELECT Bsica


Da forma mais simples, uma instruo SELECT deve incluir o seguinte:

Uma clusula SELECT, que especifica as colunas a serem exibidas

Uma clusula FROM, que especifica a tabela que contm as colunas listadas na clusula SELECT

Na sintaxe:
SELECT

uma lista de uma ou mais colunas

DISTINCT

suprime os itens duplicados

seleciona todas as colunas

coluna

seleciona a coluna nomeada

apelido

fornece cabealhos diferentes s colunas selecionadas

FROM tabela

especifica a tabela contendo as colunas

Observao: Em todo o curso so usados os termos palavra-chave, clusula e instruo.

Uma palavra-chave refere-se a um elemento SQL individual.


Por exemplo, SELECT e FROM so palavras-chave.

Uma clusula parte de uma instruo SQL.


Por exemplo, SELECT empno, ename, ... uma clusula.

Uma instruo uma combinao de duas ou mais clusulas.


Por exemplo, SELECT * FROM emp uma instruo SQL.
Introduo ao Oracle: SQL e PL/SQL 1-4

Criando Instrues SQL


Instrues SQL sem distino entre
maisculas e minsculas.
Instrues SQL podem estar em uma ou
mais linhas.
Palavras-chave no podem ser abreviadas
ou dividas entre as linhas.
Normalmente, as clusulas so colocadas
em linhas separadas.
Guias e endentaes so usadas para
aperfeioar a legibilidade.
1-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando Instrues SQL


Usando as seguintes diretrizes e regras simples, voc pode construir instrues vlidas fceis de ler e
editar:

As instrues SQL no fazem distino entre maisculas de minsculas, a menos que indicado.

As instrues SQL podem ser digitadas em uma ou mais linhas.

As palavras-chave no podem ser divididas entre as linhas nem abreviadas.

As clusulas so em geral colocadas em linhas separadas para melhor legibilidade e facilidade


de edio.

As guias e endentaes podem ser usadas para tornar o cdigo mais legvel.

Em geral, as palavras-chave so digitadas em letras maisculas, todas as outras palavras, como


nomes de tabela e colunas so digitadas em minsculas.

Dentro do SQL*Plus, uma instruo SQL digitada no prompt SQL e as linhas subseqentes
so numeradas. Isso chama-se buffer de SQL. Somente uma instruo pode ser a atual a
qualquer momento dentro do buffer.

Executando Instrues SQL

Coloque um ponto-e-vrgula (;) no final da ltima clusula.

Coloque uma barra na ltima linha do buffer.

Coloque uma barra no prompt SQL.

Emita um comando RUN do SQL*Plus no prompt SQL.


Introduo ao Oracle: SQL e PL/SQL 1-5

Selecionando Todas as Colunas


SQL> SELECT *
2 FROM
dept;
DEPTNO
--------10
20
30
40

1-6

DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Selecting All Columns, All Rows


Exiba todas as colunas de dados em uma tabela seguindo a palavra-chave SELECT com um asterisco
(*). No exemplo do slide, a tabela do departamento contm trs colunas: DEPTNO, DNAME e LOC.
A tabela contm quatro linhas, uma para cada departamento.
possvel, tambm, exibir todas as colunas na tabela, listando todas elas aps a palavra-chave
SELECT. Por exemplo, a instruo SQL a seguir, como no exemplo do slide, exibe todas as colunas e
linhas da tabela DEPT:
SQL> SELECT deptno, dname, loc
2 FROM
dept;

Introduo ao Oracle: SQL e PL/SQL 1-6

Selecionando
Colunas Especficas
SQL> SELECT deptno, loc
2 FROM
dept;

DEPTNO
--------10
20
30
40

1-7

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Selecionando Colunas Especficas, Todas as Linhas


Voc pode usar a instruo SELECT para exibir colunas especficas da tabela, ao especificar os
nomes da coluna, separado por vrgulas. O exemplo do slide exibe todos os nmeros dos
departamentos e locais na tabela DEPT.
Na clusula SELECT, especifique as colunas a serem vistas, na ordem que deseja que apaream na
sada. Por exemplo, para exibir o local antes do nmero do departamento, use a seguinte instruo:
SQL> SELECT loc, deptno
2 FROM
dept;
LOC
DEPTNO
------------- --------NEW YORK
10
DALLAS
20
CHICAGO
30
BOSTON
40

Introduo ao Oracle: SQL e PL/SQL 1-7

Defaults de Cabealho de Coluna

Justificativa default
Esquerda: Dados de caractere e data
Direita: Dados numricos

Exibio default: Letra maiscula

1-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Defaults de Cabealho de Coluna


Os dados e o cabealho da coluna de caracteres bem como os dados e o cabealho da coluna de data
so justificados esquerda na largura da coluna. Os cabealhos de nmero e dados so justificados
direita.
SQL> SELECT ename, hiredate, sal
2 FROM emp;
ENAME
HIREDATE
SAL
---------- --------- --------KING
17-NOV-81
5000
BLAKE
01-MAY-81
2850
CLARK
09-JUN-81
2450
JONES
02-APR-81
2975
MARTIN
28-SEP-81
1250
ALLEN
20-FEB-81
1600
...
14 rows selected.

Os cabealhos da coluna de caracteres e datas podem ser truncados, mas os cabealhos de nmeros,
no. Os cabealhos de coluna aparecem por default em letra minscula. Voc pode sobrepor a
exibio do cabealho de coluna com um apelido. Os apelidos de coluna so abordados
posteriormente nesta lio.
Introduo ao Oracle: SQL e PL/SQL 1-8

Expresses Aritmticas
Criar expresses com dados NUMBER e DATE
usando operadores aritmticos.
Operador

1-9

Descrio

Adicionar

Subtrair

Multiplicar
Dividir

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Expresses Aritmticas
Talvez voc necessite modificar a forma de exibio dos dados, efetuar clculos ou consultar cenrios
what-if. Isso possvel usando expresses aritmticas. Uma expresso aritmtica possui nomes de
coluna, valores numricos constantes e operadores aritmticos.
Operadores Aritmticos
O slide lista os operadores aritmticos disponveis no cdigo SQL. Voc pode usar operadores
aritmticos em qualquer clusula de uma instruo SQL exceto na clusula FROM.

Introduo ao Oracle: SQL e PL/SQL 1-9

Usando Operadores Aritmticos


SQL> SELECT ename, sal, sal+300
2 FROM
emp;
ENAME
SAL
SAL+300
---------- --------- --------KING
5000
5300
BLAKE
2850
3150
CLARK
2450
2750
JONES
2975
3275
MARTIN
1250
1550
ALLEN
1600
1900
...
14 rows selected.

1-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando Operadores Aritmticos


O exemplo no slide usa o operador de adio para calcular um aumento de salrio de US$300 para
todos os funcionrios e exibe uma nova coluna SAL+300 na sada.
Observe que a coluna SAL+300 resultante do clculo no uma nova coluna na tabela EMP; ela
somente para exibio. Por default, o nome de uma coluna surge do clculo que a criou nesse
caso, sal+300.
Observao: O SQL*Plus ignora espaos em branco antes e depois do operador aritmtico.

Introduo ao Oracle: SQL e PL/SQL 1-10

Precedncia do Operador

A multiplicao e a diviso tm prioridade


sobre a adio e a subtrao.
Os operadores com a mesma prioridade
so avaliados da esquerda para a direita.
Os parnteses so usados para forar a
avaliao priorizada e para esclarecer as
instrues.

1-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Precedncia do Operador
Se uma expresso aritmtica tiver mais de um operador, a multiplicao e a diviso sero avaliadas
primeiro. Se os operadores dentro uma expresso tiverem a mesma prioridade, ento a avaliao ser
realizada da esquerda para a direita.
Voc pode usar os parnteses a fim de forar a avaliao da expresso entre parnteses primeiro.

Introduo ao Oracle: SQL e PL/SQL 1-11

Precedncia do Operador
SQL> SELECT ename, sal, 12*sal+100
2 FROM
emp;
ENAME
SAL 12*SAL+100
---------- --------- ---------KING
5000
60100
BLAKE
2850
34300
CLARK
2450
29500
JONES
2975
35800
MARTIN
1250
15100
ALLEN
1600
19300
...
14 rows selected.

1-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Precedncia do Operador (continuao)


O exemplo no slide exibe o nome, o salrio e a remunerao anual dos funcionrios. Ele calcula a
remunerao anual como 12 multiplicado pelo salrio mensal, mais um bnus de US$100. Observe
que a multiplicao realizada antes da adio.
Observao: Use os parnteses para reforar a ordem de procedncia padro e aumentar a
compreenso. Por exemplo, a expresso acima pode ser criada como (12*sal)+100 sem que haja
alterao no resultado.

Introduo ao Oracle: SQL e PL/SQL 1-12

Usando Parnteses
SQL> SELECT ename, sal, 12*(sal+100)
2 FROM
emp;
ENAME
SAL 12*(SAL+100)
---------- --------- ----------KING
5000
61200
BLAKE
2850
35400
CLARK
2450
30600
JONES
2975
36900
MARTIN
1250
16200
...
14 rows selected.

1-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando Parnteses
Voc pode sobrepor as normas de precedncia usando parnteses para especificar a ordem de
execuo dos operadores.
O exemplo no slide exibe o nome, o salrio e a remunerao anual dos funcionrios. Ele calcula a
remunerao anual como o salrio mensal mais um bnus mensal de US$100, multiplicado por 12.
Por causa dos parmetros, a adio tem prioridade sobre a multiplicao.

Introduo ao Oracle: SQL e PL/SQL 1-13

Definindo um Valor Nulo


Um valor nulo no est disponvel, no
atribudo, desconhecido ou no aplicvel.
Um valor nulo no o mesmo que um zero
ou um espao em branco.
SQL> SELECT ename, job, sal, comm
2 FROM
emp;
ENAME
JOB
SAL
COMM
---------- --------- --------- --------KING
PRESIDENT
5000
BLAKE
MANAGER
2850
...
TURNER
SALESMAN
1500
0
...
14 rows selected.
1-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Valores Nulos
Se faltar o valor de dados em uma linha de uma determinada coluna, diz-se que esse valor nulo ou
contm nulo.
Um valor nulo no est disponvel, no atribudo, desconhecido ou no aplicvel. Um valor nulo
no o mesmo que um zero ou um espao. O zero um nmero e o espao um caractere.
As colunas de qualquer tipo de dados podem conter valores nulos, a menos que tenham sido definidas
como NOT NULL ou como PRIMARY KEY ao serem criadas.
Na coluna COMM da tabela EMP, note que somente o SALESMAN pode ganhar comisso. Outros
funcionrios no esto autorizados a ganhar comisso. Um valor nulo representa esse fato. Turner,
que um vendedor, no ganha nenhuma comisso. Observe que sua comisso zero e no nula.

Introduo ao Oracle: SQL e PL/SQL 1-14

Valores Nulos nas


Expresses Aritmticas
Expresses aritmticas contendo um valor
nulo avaliado como nulo.
SQL> select ename, 12*sal+comm
2 from
emp
3 WHERE ename='KING';
ENAME
12*SAL+COMM
---------- ----------KING

1-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Valores Nulos (continuao)


Se qualquer valor da coluna em uma expresso aritmtica for nulo, o resultado ser nulo. Por
exemplo, se voc tentar executar uma diviso com zero, obter um erro. No entanto, se dividir um
nmero por nulo, o resultado ser nulo ou desconhecido.
No exemplo do slide, o funcionrio KING no est em SALESMAN e no receber nenhuma
comisso. Como a coluna COMM na expresso aritmtica nula, o resultado ser nulo.
Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "Elements
of SQL".

Introduo ao Oracle: SQL e PL/SQL 1-15

Definindo um Apelido de Coluna


Renomeia um cabealho de coluna
til para clculos
Segue imediatamente o nome da coluna;
palavra-chave AS opcional entre o nome da
coluna e o apelido
Necessita de aspas duplas caso contenha
espaos ou caracteres especiais ou faa
distino entre maisculas e minsculas

1-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Apelidos de Coluna
Ao exibir o resultado de uma consulta, o SQL*Plus normalmente usa o nome da coluna selecionada
como o cabealho da mesma. Em muitos casos, esse cabealho pode no ser descritivo e, desse modo,
de difcil compreenso. possvel alterar um cabealho de coluna usando um apelido da coluna.
Especifique o apelido aps a coluna na lista SELECT usando um espao como um separador. Por
default, os cabealhos de apelidos aparecem em letras maisculas. Se o apelido possuir espaos,
caracteres especiais (tais como # ou $) ou fizer distino entre maisculas e minsculas, coloque o
apelido entre aspas duplas (" ").

Introduo ao Oracle: SQL e PL/SQL 1-16

Usando Apelidos de Coluna


SQL> SELECT ename AS name, sal salary
2 FROM
emp;
NAME
SALARY
------------- --------...
SQL> SELECT ename "Name",
2
sal*12 "Annual Salary"
3 FROM
emp;
Name
Annual Salary
------------- ------------...
1-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Apelidos de Coluna (continuao)


O primeiro exemplo exibe o nome e o salrio mensal de todos os funcionrios. Note que a palavrachave AS opcional foi usada antes do nome do apelido de coluna. O resultado da consulta dever ser
o mesmo caso a palavra-chave AS seja usada ou no. Note tambm que a instruo SQL possui os
apelidos de coluna, nome e salrio, em letra minscula, enquanto o resultado da consulta exibe os
cabealhos da coluna em maiscula. Conforme mencionado no ltimo slide, os cabealhos de coluna
aparecem, por default, em maiscula.
O segundo exemplo exibe o nome e o salrio anual de todos os funcionrios. Como o Annual Salary
possui espaos, ele foi includo entre aspas duplas. Note que o cabealho da coluna na sada
exatamente o mesmo do apelido da coluna.

Introduo ao Oracle: SQL e PL/SQL 1-17

Operador de Concatenao
Concatena colunas ou strings de caractere
a outras colunas
representado por duas barras
verticais (||)
Cria uma coluna resultante que uma
expresso de caracteres

1-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Operador de Concatenao
Voc pode vincular colunas outras colunas, expresses aritmticas ou valores constantes usando o
operador de concatenao (||). As colunas em cada lado do operador so combinadas para formar uma
coluna de sada nica.

Introduo ao Oracle: SQL e PL/SQL 1-18

Usando um Operador de
Concatenao
SQL> SELECT
2 FROM

ename||job AS "Employees"
emp;

Employees
------------------KINGPRESIDENT
BLAKEMANAGER
CLARKMANAGER
JONESMANAGER
MARTINSALESMAN
ALLENSALESMAN
...
14 rows selected.

1-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Operador de Concatenao (continuao)


No exemplo, ENAME e JOB esto concatenados e recebem o apelido Employees. Note que o nmero
e cargo do funcionrio so combinados para formar uma coluna de sada nica.
A palavra-chave AS antes do nome do apelido torna a clusula SELECT mais fcil de ser lida.

Introduo ao Oracle: SQL e PL/SQL 1-19

Strings Literais de Caracteres


Uma literal um caractere, um nmero ou
uma data includa na lista SELECT.
Os valores literais de caractere e data
devem estar entre aspas simples.
Cada string de caractere gerada uma vez
para cada linha retornada.

1-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Strings Literais de Caracteres


Uma literal um caractere, um nmero ou uma data includa na lista SELECT que no seja um nome
ou apelido de coluna. Ela impressa para cada linha retornada. Strings literais de formato de texto
livre podem ser includas no resultado da consulta e so tratadas da mesma forma que uma coluna na
lista SELECT.
As literais de caractere e data precisam estar entre aspas simples (' '); as literais de nmero, no.

Introduo ao Oracle: SQL e PL/SQL 1-20

Usando Strings Literais


de Caracteres
SQL> SELECT ename ||' is a '||job
2
AS "Employee Details"
3 FROM
emp;
Employee Details
------------------------KING is a PRESIDENT
BLAKE is a MANAGER
CLARK is a MANAGER
JONES is a MANAGER
MARTIN is a SALESMAN
...
14 rows selected.

1-21

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Strings Literais de Caracteres (continuao)


O exemplo do slide exibe os nomes e cargos de todos os funcionrios. A coluna possui o cabealho
Employee Details. Note os espaos entre as aspas simples na instruo SELECT. Os espaos
melhoram a legibilidade da sada.
No exemplo a seguir, o nome e o salrio de cada funcionrio esto concatenados a uma literal para
dar mais sentido s linhas retornadas.
SQL> SELECT ename ||': '||'1'||' Month salary = '||sal Monthly
2 FROM
emp;
MONTHLY
--------------------------------------------------------------KING: 1 Month salary = 5000
BLAKE: 1 Month salary = 2850
CLARK: 1 Month salary = 2450
JONES: 1 Month salary = 2975
MARTIN: 1 Month salary = 1250
ALLEN: 1 Month salary = 1600
TURNER: 1 Month salary = 1500
...
14 rows selected.
Introduo ao Oracle: SQL e PL/SQL 1-21

Linhas Duplicadas
A exibio default das consultas de todas
as linhas, incluindo linhas duplicadas.
SQL> SELECT deptno
2 FROM
emp;

DEPTNO
--------10
30
10
20
...
14 rows selected.

1-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Linhas Duplicadas
Exceto se indicado o contrrio, o SQL*Plus exibe os resultados de uma consulta sem eliminar as
linhas duplicadas. O exemplo do slide exibe todos os nmeros de departamento a partir da tabela
EMP. Note que os nmeros de departamento esto repetidos.

Introduo ao Oracle: SQL e PL/SQL 1-22

Eliminando Linhas Duplicadas


Elimine linhas duplicadas usando a palavrachave DISTINCT na clusula SELECT.
SQL> SELECT DISTINCT deptno
2 FROM
emp;

DEPTNO
--------10
20
30

1-23

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Linhas Duplicadas (continuao)


Para eliminar linhas duplicadas de um resultado, inclua a palavra-chave DISTINCT na clusula
SELECT logo aps a palavra-chave SELECT. No exemplo do slide, a tabela EMP contm, na
verdade, quatorze linhas, mas h somente trs nmeros de departamento exclusivos na tabela.
Voc pode especificar vrias colunas aps o qualificador DISTINCT. O qualificador DISTINCT
afeta todas as colunas selecionadas e o resultado representa uma combinao distinta das colunas.
SQL> SELECT DISTINCT deptno, job
2 FROM
emp;
DEPTNO
-----10
10
10
20
...
9 rows

JOB
--------CLERK
MANAGER
PRESIDENT
ANALYST
selected.

Introduo ao Oracle: SQL e PL/SQL 1-23

Interao SQL e SQL*Plus


Instrues SQL

Buffer

Instrues SQL

Servidor

SQL*Plus

Comandos do
SQL*Plus

Resultados da Consulta

Relatrio Formatado

1-24

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

SQL e SQL*Plus
SQL uma linguagem de comando para comunicao com o Oracle Server a partir de qualquer
ferramenta ou aplicao. O Oracle SQL possui muitas extenses. Quando voc informa uma
instruo SQL, ela armazenada em uma parte da memria chamada buffer de SQL e permanece l
at que voc informe uma nova instruo.
O SQL*Plus uma ferramenta Oracle que reconhece e submete instrues SQL ao Oracle Server
para execuo e contm sua prpria linguagem de comando.
Recursos do Cdigo SQL
Podem ser utilizados por uma grande faixa de usurios, incluindo aqueles com pouca ou
nenhuma experincia em programao
uma linguagem no procedural
Reduz o perodo de tempo necessrio para a criao e manuteno de sistemas
uma linguagem similar ao ingls
Recursos do SQL*Plus
Aceita entrada ad hoc das instrues
Aceita entrada SQL a partir dos arquivos
Oferece um editor de linha para modificar instrues SQL
Controla as configuraes ambientais
Formata os resultados da consulta em um relatrio bsico
Acessa bancos de dados remotos e locais
Introduo ao Oracle: SQL e PL/SQL 1-24

Instrues SQL Versus


Comandos SQL*Plus
SQL
Uma linguagem
Padro ANSI
A palavra-chave no
pode ser abreviada
As instrues
manipulam definies de
dados e tabela no banco
de dados

SQL*Plus
Um ambiente
Patenteado pela Oracle
As palavras-chave podem
ser abreviadas
Os comandos no
permitem a manipulao
dos valores no banco
de dados

Instrues
SQL

Comandos
SQL*Plus

1-25

Buffer de
SQL

Buffer de
SQL*Plus

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

SQL e SQL*Plus (continuao)


A tabela a seguir compara os cdigos SQL e SQL*Plus:
SQL

SQL*Plus

uma linguagem de comunicao com o Oracle


Server para acesso aos dados.

Reconhece instrues SQL e as envia ao Servidor.

baseada no padro SQL da American National


Standards Institute (ANSI).

a interface patenteada da Oracle para execuo de


instrues SQL.

Manipula definies de dados e tabela no banco


de dados.

No permite a manipulao dos valores no banco de


dados.

Digita-se no buffer de SQL em uma ou mais


linhas.

Digita-se uma linha de cada vez; no armazenada no


buffer de SQL.

No possui caractere de continuao.

Possui um hfen (-) como caractere de continuao


caso os comandos ultrapassem uma linha.

possvel abreviar.

No possvel abreviar.

Usa um caracter de finalizao para executar o


comando imediatamente.

No necessita de caracteres de finalizao; os


comandos so executados imediatamente.

Usa funes para executar algumas formataes.

Usa comandos para formatar dados.

Introduo ao Oracle: SQL e PL/SQL 1-25

Viso Geral do SQL*Plus


Estabelecer login no SQL*Plus.
Descrever a estrutura de tabela.
Editar a instruo SQL.
Executar o cdigo SQL a partir do
SQL*Plus.
Salvar as instrues SQL em arquivos e
anexar as instrues SQL a arquivos.
Executar arquivos salvos.
Carregar comandos a partir de arquivo
para buffer e edit-los.
1-26

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

SQL*Plus
SQL*Plus um ambiente no qual voc pode realizar o seguinte:

Executar instrues SQL para recuperar, modificar, adicionar e remover dados do banco de
dados.

Formatar, calcular, armazenar e imprimir resultados de consulta em formulrios.

Criar arquivos de script para armazenar instrues SQL para uso repetitivo no futuro.

Os comandos SQL*Plus podem ser divididos nas seguintes categorias principais:


Categoria

Objetivo

Ambiente

Afeta o comportamento geral das instrues SQL para a seo.

Formato

Formata o resultado da consulta.

Manipulao de arquivo

Salva, carrega e executa arquivos de script.

Execuo

Envia instrues SQL do buffer de SQL para o Oracle8 Server.

Editar

Modifica as instrues SQL no buffer.

Interao

Permite criar e passar variveis para instrues SQL, imprimir


valores de variveis e imprimir mensagens na tela.

Diversos

Possui diversos comandos para conectar o banco de dados,


manipular o ambiente SQL*Plus e exibir definies de coluna.

Introduo ao Oracle: SQL e PL/SQL 1-26

Estabelecendo Login no SQL*Plus


No ambiente Windows:

Na linha de comando:
sqlplus [nome do usurio[/senha
[@banco de dados]]]
1-27

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Estabelecendo Login no SQL*Plus


A forma de chamar o SQL*Plus depende do tipo de sistema operacional ou ambiente Windows que
voc est executando.
Para estabelecer login atravs de um ambiente Windows:
1. Clique em Iniciar > Programas > Oracle for Windows NT > SQL*Plus 8.0.
2. Preencha o nome do usurio, a senha e o banco de dados.
Para estabelecer login atravs de um ambiente de linha de comando:
1. Estabelea login na mquina.
2. Digite o comando SQL*Plus conforme mostrado no slide.
No comando:
nome do usurio

o seu nome de usurio do banco de dados

senha

a sua senha do banco de dados (se digitar sua senha aqui, ela estar visvel)

@banco de dados a string de conexo do banco de dados


Observao: Para garantir a integridade da senha, no a digite no prompt do sistema operacional.
Em vez disso, digite somente o nome de usurio. Digite a senha no prompt Password.
Uma vez estabelecido o login corretamente no SQL*Plus, voc ver a seguinte mensagem:
SQL*Plus Release 8.0.3.0.0 - Produzido em Ter Jun 22 16:03:43 1999 (c)
Copyright 1999 Oracle Corporation. (Release 8.0.3.0.0 - Production on Tue
Jun 22 16:03:43 1999 (c) Copyright 1999 Oracle Corporation. Todos os
direitos reservados. (All rights reserved).
Introduo ao Oracle: SQL e PL/SQL 1-27

Exibindo a Estrutura de Tabela

Use o comando DESCRIBE do SQL*Plus para


exibir a estrutura de uma tabela.
DESC[RIBE] nome da tabela

1-28

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exibindo a Estrutura de Tabela


No SQL*Plus, possvel exibir a estrutura de uma tabela usando o comando DESCRIBE. O
resultado do comando para ver os nomes da coluna e tipos de dados, assim como se uma coluna
deve conter dados.
Na sintaxe:
nome da tabela

o nome de qualquer tabela, view ou sinnimo existente disponvel


para o usurio

Introduo ao Oracle: SQL e PL/SQL 1-28

Exibindo a Estrutura de Tabela

SQL> DESCRIBE dept


Name
Null?
----------------- -------DEPTNO
NOT NULL
DNAME
LOC

1-29

Type
-----------NUMBER(2)
VARCHAR2(14)
VARCHAR2(13)

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exibindo a Estrutura de Tabela (continuao)


O exemplo do slide exibe as informaes sobre a estrutura da tabela DEPT.
No resultado:
Null?

indica se uma coluna deve conter dados; NOT NULL indica que uma
coluna deve conter dados

Type

exibe o tipo de dados de uma coluna

Os tipos de dados so descritos na tabela a seguir:


Tipo de dado

Descrio

NUMBER(p,s)

Valor numrico que possui um nmero mximo de dgitos p, o nmero de


dgitos direita do ponto decimal s.

VARCHAR2(s)

Valor de caracteres com comprimento varivel do tamanho mximo s.

DATE

Valor de data e hora entre 1 de janeiro, 4712 A.C. e 31 de dezembro, 9999 D.C.

CHAR(s)

Valores de caracteres com comprimento fixo do tamanho s.

Introduo ao Oracle: SQL e PL/SQL 1-29

Comandos de Edio do
SQL*Plus
A[PPEND] texto
C[HANGE] / antigo / novo
C[HANGE] / texto /
CL[EAR] BUFF[ER]
DEL
DEL n
DEL m n

1-30

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Comandos de Edio do SQL*Plus


Os comandos SQL*Plus so digitados em uma linha de cada vez e no so armazenados no buffer
de SQL.
Comando

Descrio

A[PPEND] texto

Adiciona texto no final da linha atual.

C[HANGE] / antigo / novo

Altera o texto antigo para o novo na linha atual.

C[HANGE] / texto /

Deleta o texto da linha atual.

CL[EAR] BUFF[ER]

Deleta todas as linhas a partir do buffer de SQL.

DEL

Deleta a linha atual.

Diretrizes

Ao pressionar [Return] antes de completar o comando, o SQL*Plus informa o nmero da linha


incompleta.

Finalize o buffer de SQL digitando um dos caracteres finalizadores (ponto-e-vrgula ou barra)


ou pressionando duas vezes [Return]. Em seguida, aparecer o prompt SQL.

Introduo ao Oracle: SQL e PL/SQL 1-30

Comandos de Edio do SQL*Plus


I[NPUT]
I[NPUT] texto
L[IST]
L[IST] n
L[IST] m n
R[UN]

n
n texto
0 texto
1-31

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Comandos de Edio do SQL*Plus (continuao)


Comando

Descrio

I[NPUT]

Insere um nmero indefinido de linhas.

I[NPUT] texto

Insere uma linha consistindo em texto.

L[IST]

Lista todas as linhas no buffer de SQL.

L[IST] n

Lista uma linha (especificada pelo n).

L[IST] m n

Lista uma faixa de linhas (de m a n).

R[UN]

Exibe e executa a instruo SQL atual no buffer.

Especifica a linha que deve ser tornar a linha atual.

n texto

Substitui a linha n pelo texto.

0 texto

Insere uma linha antes da linha 1.

Voc pode digitar somente um comando SQL*Plus por prompt SQL. Os comandos SQL*Plus no
ficam armazenados no buffer. Para continuar um comando SQL*Plus na prxima linha, finalize a
linha atual com um hfen (-).

Introduo ao Oracle: SQL e PL/SQL 1-31

Comandos de Arquivo do
SQL*Plus
SAVE nome de arquivo
GET nome de arquivo
START nome de arquivo
@ nome de arquivo
EDIT nome de arquivo
SPOOL nome de arquivo
EXIT
1-32

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Comandos de Arquivo do SQL*Plus


As instrues SQL comunicam-se com o Oracle Server. Os comandos SQL*Plus controlam o
ambiente, formatam os resultados de consulta e gerenciam arquivos. Voc pode usar os comandos
identificados na tabela a seguir:
Comando

Descrio

SAV[E] nome de arquivo [.ext]


[REP[LACE]APP[END]]

Salva o contudo atual do buffer de SQL para um arquivo. Use


APPEND para adicionar um arquivo existente; use REPLACE
para substituir um arquivo existente. A extenso default
.sql.

GET nome de arquivo [.ext]

Salva o contedo de um arquivo salvo anteriormente para o


buffer de SQL. A extenso default para o nome de arquivo
.sql.

STA[RT] nome de arquivo [.ext]

Executa um arquivo de comando salvo anteriormente.

@ nome de arquivo

Executa um arquivo de comando salvo anteriormente


(o mesmo que START).

ED[IT]

Chama o editor e salva o contedo do buffer para um arquivo


chamado afiedt.buf.

ED[IT] [nome de arquivo [.ext]]

Chama o editor para editar o contedo de um arquivo salvo.

SPO[OL] [nome de arquivo ext]|


OFF|OUT]

Armazena os resultados da consulta em um arquivo. OFF fecha


o arquivo perifrico. OUT fecha o arquivo perifrico e envia o
os resultados do arquivo para a impressora do sistema.

EXIT

Sai do cdigo SQL*Plus.

Introduo ao Oracle: SQL e PL/SQL 1-32

Sumrio

SELECT
FROM

[DISTINCT] {*,coluna [apelido],...}


tabela;

Use o SQL*Plus como um ambiente para:


Executar instrues SQL
Editar instrues SQL

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

1-33

Instruo SELECT
Nesta lio, voc aprendeu sobre a recuperao de dados de uma tabela de banco de dados com a
instruo SELECT.
[DISTINCT] {*,coluna [apelido],...}
tabela;

SELECT
FROM
onde:

SELECT

uma lista de pelo menos uma coluna.

DISTINCT

suprime as duplicatas.

seleciona todas as colunas.

coluna

seleciona a coluna nomeada.

apelido

d um cabealho diferente coluna selecionada.

FROM tabela

especifica a tabela contendo as colunas.

SQL*Plus
SQL*Plus um ambiente de execuo que pode ser usado para enviar instrues SQL ao servidor do
banco de dados, editar e salvar as instrues SQL. As instrues podem ser executadas a partir do
prompt SQL ou de um arquivo de script.

Introduo ao Oracle: SQL e PL/SQL 1-33

Viso Geral do Exerccio


Selecionando todos os dados a partir de
tabelas diferentes
Descrevendo a estrutura de tabelas
Executando clculos aritmticos e
especificando nomes de coluna
Usando o editor do SQL*Plus

1-34

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Esse o primeiro de muitos exerccios. As solues (caso necessite delas) podem ser encontradas
no Anexo A. Os exerccios tm a inteno de apresentar todos os tpicos abordados nesta lio. As
questes 2 a 4 so impressas.
Em qualquer exerccio, pode haver questes do tipo "se voc tiver tempo" ou "se quiser mais
desafios". Faa-as somente se tiver concludo todas as outras questes dentro do tempo alocado e
desejar mais desafios s suas habilidades.
Realize o exerccio devagar e com exatido. possvel exercitar-se salvando e executando arquivos
de comando. Se tiver qualquer pergunta, chame o instrutor.
Questes Impressas
Para as questes de 2 a 4, marque Falso ou Verdadeiro.

Introduo ao Oracle: SQL e PL/SQL 1-34

Exerccio 1
1. Inicie uma sesso SQL*Plus usando um ID e uma senha de usurio fornecidos pelo instrutor.
2. Os comandos SQL*Plus acessam o banco de dados.
Verdadeiro/Falso
3. A instruo SELECT ser executada corretamente?
Verdadeiro/Falso
SQL> SELECT
2 FROM

ename, job, sal Salary


emp;

4. A instruo SELECT ser executada corretamente?


Verdadeiro/Falso
SQL> SELECT
2 FROM

*
salgrade;

5. H quatro erros de codificao nesta instruo. Voc pode identific-los?


SQL> SELECT
2
3 FROM

empno, ename
salary x 12 ANNUAL SALARY
emp;

6. Mostre a estrutura da tabela DEPT. Selecione todos os dados da tabela DEPT.


Name

Null?

Type

----------- --------

------------

DEPTNO
DNAME
LOC

NUMBER(2)
VARCHAR2(14)
VARCHAR2(13)

DEPTNO
-----10
20
30
40

NOT NULL

DNAME
---------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON

Introduo ao Oracle: SQL e PL/SQL 1-35

Exerccio 1 (continuao)
7. Mostre a estrutura da tabela EMP. Crie uma consulta para exibir o nome, o cargo, a data de
admisso
e o nmero do funcionrio para cada funcionrio, com o nmero do funcionrio aparecendo
primeiro. Salve a instruo SQL em um arquivo nomeado plq7.sql.
Name
Null?
--------- -------EMPNO
NOT NULL
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
NOT NULL

Type
------------NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)

8. Execute a consulta no arquivo p1q7.sql.


EMPNO ENAME
JOB
HIREDATE
----- ------- ----------- --------7839 KING
PRESIDENT
7698 BLAKE
MANAGER
7782 CLARK
MANAGER
7566 JONES
MANAGER
7654 MARTIN SALESMAN
7499 ALLEN
SALESMAN
7844 TURNER SALESMAN
7900 JAMES
CLERK
7521 WARD
SALESMAN
7902 FORD
ANALYST
7369 SMITH
CLERK
7788 SCOTT
ANALYST
7876 ADAMS
CLERK
7934 MILLER CLERK
14 rows selected.

17-NOV-81
01-MAY-81
09-JUN-81
02-APR-81
28-SEP-81
20-FEB-81
08-SEP-81
03-DEC-81
22-FEB-81
03-DEC-81
17-DEC-80
09-DEC-82
12-JAN-83
23-JAN-82

Introduo ao Oracle: SQL e PL/SQL 1-36

Exerccio 1 (continuao)
9. Crie uma consulta para exibir os cargos exclusivos a partir da tabela EMP.
JOB
----------ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN

Se voc tiver tempo, complete os exerccios abaixo:


10. Carregue o p1q7.sql no buffer de SQL. Nomeie os cabealhos das colunas como Emp #,
Employee, Job, e Hire Date, respectivamente. Execute novamente a consulta.
Emp # Employee

Job

----- --------- ---------7839 KING


PRESIDENT
7698 BLAKE
MANAGER
7782 CLARK
MANAGER
7566 JONES
MANAGER
7654 MARTIN
SALESMAN
7499 ALLEN
SALESMAN
7844 TURNER
SALESMAN
7900 JAMES
CLERK
7521 WARD
SALESMAN
7902 FORD
ANALYST
7369 SMITH
CLERK
7788 SCOTT
ANALYST
7876 ADAMS
CLERK
7934 MILLER
CLERK
14 rows selected.

Hire Date
--------------17-NOV-81
01-MAY-81
09-JUN-81
02-APR-81
28-SEP-81
20-FEB-81
08-SEP-81
03-DEC-81
22-FEB-81
03-DEC-81
17-DEC-80
09-DEC-82
12-JAN-83
23-JAN-82

Introduo ao Oracle: SQL e PL/SQL 1-37

Exerccio 1 (continuao)
11. Exiba o nome concatenado com o cargo (job), separado por uma vrgula e espao, e nomeie a
coluna Employee and Title.
Employee and Title
------------------KING, PRESIDENT
BLAKE, MANAGER
CLARK, MANAGER
JONES, MANAGER
MARTIN, SALESMAN
ALLEN, SALESMAN
TURNER, SALESMAN
JAMES, CLERK
WARD, SALESMAN
FORD, ANALYST
SMITH, CLERK
SCOTT, ANALYST
ADAMS, CLERK
MILLER, CLERK
14 rows selected.

Se voc quiser mais desafios, complete o exerccio abaixo:


12. Crie uma consulta para exibir todos os dados a partir da tabela EMP. Separe cada coluna por
uma vrgula. Nomeie a coluna como THE_OUTPUT.
THE_OUTPUT
------------------------------------------------7839,KING,PRESIDENT,,17-NOV-81,5000,,10
7698,BLAKE,MANAGER,7839,01-MAY-81,2850,,30
7782,CLARK,MANAGER,7839,09-JUN-81,2450,,10
7566,JONES,MANAGER,7839,02-APR-81,2975,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81,1250,1400,30
7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30
7844,TURNER,SALESMAN,7698,08-SEP-81,1500,0,30
7900,JAMES,CLERK,7698,03-DEC-81,950,,30
7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30
7902,FORD,ANALYST,7566,03-DEC-81,3000,,20
7369,SMITH,CLERK,7902,17-DEC-80,800,,20
7788,SCOTT,ANALYST,7566,09-DEC-82,3000,,20
7876,ADAMS,CLERK,7788,12-JAN-83,1100,,20
7934,MILLER,CLERK,7782,23-JAN-82,1300,,10
14 rows selected.

Introduo ao Oracle: SQL e PL/SQL 1-38

2
Restringindo e
Classificando Dados

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos

Depois de completar esta lio, voc poder


fazer o seguinte:
Limitar linhas recuperadas por uma
consulta
Classificar linhas recuperadas por uma
consulta

2-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Ao recuperar dados do banco de dados, pode ser preciso restringir as linhas de dados exibidas ou
especificar a ordem de exibio das mesmas. Essa lio explica as instrues SQL que voc utiliza
para executar essas aes.

Introduo ao Oracle: SQL e PL/SQL 2-2

Limitando Linhas Usando


uma Seleo
EMP
EMPNO ENAME
7839
7698
7782
7566
...

KING
BLAKE
CLARK
JONES

JOB

...

DEPTNO

PRESIDENT
MANAGER
MANAGER
MANAGER

10
30
10
20

"recuperar
todos os
funcionrios do
departamento 10"

EMP
EMPNO ENAME

JOB

7839 KING
PRESIDENT
7782 CLARK MANAGER
7934 MILLER CLERK

2-3

...

DEPTNO
10
10
10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Limitando Linhas Usando uma Seleo


No exemplo do slide, suponha que voc deseje exibir todos os funcionrios do departamento 10.
O conjunto de linhas realadas com um valor 10 na coluna DEPTNO so as nicas retornadas. Esse
mtodo de restrio a base da clusula WHERE na linguagem SQL.

Introduo ao Oracle: SQL e PL/SQL 2-3

Limitando Linhas Selecionadas


Restringe as linhas retornadas usando a
clusula WHERE.
SELECT
FROM
[WHERE

[DISTINCT] {*| coluna [apelido], ...}


tabela
condio(es)];

A clusula WHERE segue a clusula


FROM.

2-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Limitando Linhas Selecionadas


possvel restringir as linhas retornadas da consulta utilizando a clusula WHERE. Uma clusula
WHERE contm uma condio que deve coincidir e seguir diretamente a clusula FROM.
Na sintaxe:
WHERE

restringe a consulta s linhas que atendem uma condio.

condio

composta por nomes de colunas, expresses, constantes e um


operador de comparao.

A clusula WHERE pode comparar valores em colunas, valores literais, expresses aritmticas ou
funes. A clusula WHERE formada por trs elementos:

Nome de coluna

Operadores de comparao

Nome da coluna, constante ou lista de valores

Introduo ao Oracle: SQL e PL/SQL 2-4

Usando a Clusula WHERE


SQL> SELECT ename, job, deptno
2 FROM
emp
3 WHERE job='CLERK';
ENAME
---------JAMES
SMITH
ADAMS
MILLER

2-5

JOB
DEPTNO
--------- --------CLERK
30
CLERK
20
CLERK
20
CLERK
10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando a Clusula WHERE


No exemplo, a instruo SELECT recupera o nome, o cargo e o nmero do departamento de todos os
funcionrios cujo cargo CLERK.
Observe que o cargo CLERK foi especificado em letras maisculas para garantir que a
correspondncia seja feita com a coluna do cargo na tabela EMP. As strings de caractere no fazem
distino entre maisculas de minsculas.

Introduo ao Oracle: SQL e PL/SQL 2-5

Strings de Caractere e Datas


As strings de caractere e valores de data
aparecem entre aspas simples.
Os valores de caractere fazem distino
entre maisculas e minsculas e os
valores de data diferenciam formatos.
O formato de data default DD-MON-YY.
SQL> SELECT
2 FROM
3 WHERE

2-6

ename, job, deptno


emp
ename = 'JAMES' ;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Strings de Caractere e Datas


Strings de caractere e datas na clusula WHERE devem estar entre aspas simples (''). Constantes de
nmero, no entanto, no precisam.
Todas as pesquisas de caractere fazem distino entre maisculas de minsculas. No exemplo a
seguir, nenhuma linha retornou pois a tabela EMP armazena todas as datas em letras maisculas:
SQL> SELECT ename, empno, job, deptno
2 FROM
emp
3 WHERE job='clerk';

Os produtos da Oracle armazenam datas em um formato numrico interno, representando o sculo,


ano, ms, dia, horas, minutos e segundos. A exibio da data default DD-MON-YY.
Observao: A alterao do formato da data default ser abordada na lio subseqente.
Valores de nmero no aparecem entre aspas.

Introduo ao Oracle: SQL e PL/SQL 2-6

Operadores de Comparao
Operador
=

Igual a

>

Maior do que

>=
<

2-7

Significado

Maior do que ou igual a


Menor do que

<=

Menor ou igual a

<>

Diferente de

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Operadores de Comparao
Usa-se os operadores de comparao em condies que comparam uma expresso a outra. Eles so
usados na clusula WHERE no seguinte formato:
Sintaxe
WHERE expr valor operador

Exemplos
WHERE hiredate='01-JAN-95'
WHERE sal>=1500
WHERE ename='SMITH'

Introduo ao Oracle: SQL e PL/SQL 2-7

Usando Operadores
de Comparao
SQL> SELECT ename, sal, comm
2 FROM
emp
3 WHERE sal<=comm;

ENAME
SAL
COMM
---------- --------- --------MARTIN
1250
1400

2-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando Operadores de Comparao


No exemplo, a instruo SELECT recupera o nome, salrio e comisso da tabela EMP, em que o
salrio do funcionrio menor ou igual quantia da comisso. Observe que no h valor explcito
fornecido para a clusula WHERE. Os dois valores que esto sendo comparados so retirados das
colunas SAL e COMM na tabela EMP.

Introduo ao Oracle: SQL e PL/SQL 2-8

Outros Operadores de
Comparao

2-9

Operador

Significado

BETWEEN
...AND...

Entre dois valores (inclusive)

IN(list)

Vincula qualquer um de uma


lista de valores

LIKE

Vincula um padro de caractere

IS NULL

um valor nulo

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Introduo ao Oracle: SQL e PL/SQL 2-9

Usando o Operador BETWEEN


Use o operador BETWEEN para exibir linhas
baseadas em uma faixa de valores.
SQL> SELECT
2 FROM
3 WHERE

ename, sal
emp
sal BETWEEN 1000 AND 1500;

ENAME
SAL
---------- --------MARTIN
1250
TURNER
1500
WARD
1250
ADAMS
1100
MILLER
1300

2-10

Limite
inferior

Limite
superior

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Operador BETWEEN
Voc pode exibir linhas baseadas em uma faixa de valores usando o operador BETWEEN. A faixa
que voc especificar possuir uma faixa inferior e uma superior.
A instruo SELECT no slide retorna as linhas da tabela EMP para qualquer funcionrio cujo salrio
esteja entre US$1.000 e US$1.500.
Valores especificados com o operador BETWEEN so inclusivos. Voc deve especificar primeiro o
limite inferior.

Introduo ao Oracle: SQL e PL/SQL 2-10

Usando o Operador IN
Use o operador IN para testar os valores de
uma lista.
SQL> SELECT
2 FROM
3 WHERE
EMPNO
--------7902
7369
7788
7876

2-11

empno, ename, sal, mgr


emp
mgr IN (7902, 7566, 7788);

ENAME
SAL
MGR
---------- --------- --------FORD
3000
7566
SMITH
800
7902
SCOTT
3000
7566
ADAMS
1100
7788

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Operador IN
Para testar os valores em uma determinada lista, use o operador IN.
O exemplo do slide exibe o nmero do funcionrio, o nome, o salrio e o nmero de funcionrio do
gerente de todos os funcionrios cujo nmero de funcionrio do gerente for 7902, 7566 ou 7788.
O operador IN pode ser usado com qualquer tipo de dados. O exemplo seguinte retorna uma linha da
tabela EMP para qualquer funcionrio cujo nome estiver includo na lista de nomes na clusula
WHERE:
SQL> SELECT
2 FROM
3 WHERE

empno, ename, mgr, deptno


emp
ename IN ('FORD' , 'ALLEN');

Se forem utilizados caracteres ou datas na lista, eles devem estar entre aspas simples ('').

Introduo ao Oracle: SQL e PL/SQL 2-11

Usando o Operador LIKE


Use o operador LIKE para executar
pesquisas curinga de valores de string de
pesquisa vlidos.
As condies de pesquisa podem conter
caracteres literais ou nmeros.
% denota zero ou muitos caracteres.
_ denota um caractere.
SQL> SELECT
2 FROM
3 WHERE

2-12

ename
emp
ename LIKE 'S%';

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Operador LIKE
Talvez nem sempre voc saiba o valor exato pelo qual procurar. possvel selecionar linhas que
vinculem um padro de caractere usando o operador LIKE. A operao de vinculao de um padro
de caractere refere-se a uma pesquisa de curinga. Dois smbolos podem ser utilizados para construir a
string de pesquisa.
Smbolo

Descrio

Representa qualquer seqncia de zero ou mais caracteres.

Representa qualquer caractere nico.

A instruo SELECT acima retorna o nome do funcionrio da tabela EMP para qualquer funcionrio
cujo nome comea com "S". Note o "S". maisculo. Os nomes iniciados com "s" no retornaro.
O operador LIKE pode ser usado como um atalho para algumas comparaes BETWEEN. O
exemplo a seguir exibe os nomes as datas de admisso de todos os funcionrios admitidos entre
janeiro e dezembro de 1981:
SQL>
2
3

SELECT
FROM
WHERE

ename, hiredate
emp
hiredate LIKE '%1981';

Introduo ao Oracle: SQL e PL/SQL 2-12

Usando o Operador LIKE


Voc pode combinar caracteres de
vinculao de padro.
SQL> SELECT
2 FROM
3 WHERE

ename
emp
ename LIKE '_A%';

ENAME
---------MARTIN
JAMES
WARD

possvel usar o identificador ESCAPE para


procurar por "%" ou "_".
2-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Combinando Caracteres Curinga


Os smbolos % e _ podem ser usados em qualquer combinao com caracteres literais. O exemplo do
slide exibe os nomes de todos os funcionrios cujos nomes possuem a letra "A" como segundo
caractere.
A Opo ESCAPE
Quando for necessrio ter uma correspondncia exata para os caracteres '%' e '_' reais, use a opo
ESCAPE. Essa opo especifica qual o caractere ESCAPE. Caso possua HEAD_QUARTERS
como um nome de departamento, deve procurar por ele utilizando a seguinte instruo SQL:
SQL> SELECT * FROM dept
2 WHERE dname LIKE '%\_%' ESCAPE '\';
DEPTNO
DNAME
LOC
--------- -------------- ------------50
HEAD_QUARTERS ATLANTA

A opo ESCAPE identifica a barra invertida (\) como o caractere de escape. No padro, o caractere
de escape vem antes do sublinhado (_). Isso faz com que o Oracle Server interprete o sublinhado
literalmente.

Introduo ao Oracle: SQL e PL/SQL 2-13

Usando o Operador IS NULL


Teste para valores nulos com o operador
IS NULL.
SQL> SELECT
2 FROM
3 WHERE

ename, mgr
emp
mgr IS NULL;

ENAME
MGR
---------- --------KING

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

2-14

O Operador IS NULL
O operador IS NULL testa valores que so nulos. Um valor nulo significa que o valor no est
disponvel, no-atribudo, desconhecido ou no-aplicvel. Assim, no possvel testar com (=)
porque um valor nulo no pode ser igual ou desigual a qualquer valor. O exemplo do slide recupera o
nome e o gerente de todos os funcionrios que no possuem um gerente.
Por exemplo, para exibir o nome, o cargo e a comisso de todos os funcionrios que no esto
nomeados para obter uma comisso, use a seguinte instruo SQL:
SQL> SELECT
2 FROM
3 WHERE
ENAME
-------KING
BLAKE
CLARK
...

ename, job, comm


emp
comm IS NULL;

JOB
COMM
----------- -----PRESIDENT
MANAGER
MANAGER

Introduo ao Oracle: SQL e PL/SQL 2-14

Operadores Lgicos

2-15

Operador

Significado

AND

Retorna TRUE se as condies de


componentes forem TRUE

OR

Retorna TRUE se cada condio de


componente for TRUE

NOT

Retorna TRUE se a condio seguinte for


FALSE

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Operadores Lgicos
Um operador lgico combina o resultado de duas condies de componente para produzir um nico
resultado com base neles ou inverter o resultado para uma condio nica. Trs operadores lgicos
esto disponveis no SQL:

AND

OR

NOT

Todos os exemplos at aqui especificaram somente uma condio na clusula WHERE. Voc pode
usar vrias condies em uma clusula WHERE usando operadores AND e OR.

Introduo ao Oracle: SQL e PL/SQL 2-15

Usando o Operador AND


AND exige que ambas as condies
sejam TRUE.
SQL>
2
3
4

SELECT
FROM
WHERE
AND

EMPNO
--------7876
7934

2-16

empno, ename, job, sal


emp
sal>=1100
job='CLERK';

ENAME
---------ADAMS
MILLER

JOB
SAL
--------- --------CLERK
1100
CLERK
1300

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Operador AND
No exemplo, as duas condies devem ser verdadeiras para cada registro a ser selecionado. Assim,
um funcionrio que possua o cargo CLERK e receba mais de US$1.100 ser selecionado.
Todas as pesquisas de caractere fazem distino entre maisculas de minsculas. Nenhuma linha
retornar se CLERK no estiver em letra maiscula. As strings de caractere devem estar entre aspas.
Tabela de Verdade AND
A tabela a seguir mostra os resultados da combinao de duas expresses com AND:
AND
TRUE

TRUE
TRUE

FALSE
FALSE

NULL
NULL

FALSE
NULL

FALSE
NULL

FALSE
FALSE

FALSE
NULL

Introduo ao Oracle: SQL e PL/SQL 2-16

Usando o Operador OR
OR exige que cada condio seja TRUE.
SQL>
2
3
4

SELECT
FROM
WHERE
OR

empno, ename, job, sal


emp
sal>=1100
job='CLERK';

EMPNO ENAME
--------- ---------7839 KING
7698 BLAKE
7782 CLARK
7566 JONES
7654 MARTIN
...
7900 JAMES
...
14 rows selected.
2-17

JOB
SAL
--------- --------PRESIDENT
5000
MANAGER
2850
MANAGER
2450
MANAGER
2975
SALESMAN
1250
CLERK

950

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Operador OR
No exemplo, cada condio pode ser verdadeira para qualquer registro a ser selecionado. Assim, um
funcionrio que possua o cargo CLERK ou que receba mais de US$1.100 ser selecionado.
A Tabela de Verdade OR
A tabela a seguir mostra os resultados da combinao de duas expresses com OR:
OR
TRUE

TRUE
TRUE

FALSE
TRUE

NULL
TRUE

FALSE
NULL

TRUE
TRUE

FALSE
NULL

NULL
NULL

Introduo ao Oracle: SQL e PL/SQL 2-17

Usando o Operador NOT


SQL> SELECT ename, job
2 FROM
emp
3 WHERE job NOT IN ('CLERK','MANAGER','ANALYST');

ENAME
---------KING
MARTIN
ALLEN
TURNER
WARD

2-18

JOB
--------PRESIDENT
SALESMAN
SALESMAN
SALESMAN
SALESMAN

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Operador NOT
O exemplo do slide exibe o nome e o cargo de todos os funcionrios que no possuem os cargos
CLERK, MANAGER ou ANALYST.
A Tabela de Verdade NOT
A tabela a seguir mostra o resultado da aplicao do operador NOT para uma condio:
NOT
TRUE

TRUE
FALSE

FALSE
TRUE

NULL
NULL

Observao: O operador NOT pode ser utilizado tambm com outros operadores SQL, como
BETWEEN, LIKE e NULL.
...
...
...
...

WHERE
WHERE
WHERE
WHERE

job
sal
ename
comm

NOT
NOT
NOT
IS

IN ('CLERK', 'ANALYST')
BETWEEN 1000 AND 1500
LIKE '%A%'
NOT NULL

Introduo ao Oracle: SQL e PL/SQL 2-18

Regras de Precedncia
Ordem de Avaliao
1

Operador

Todos os operadores
de comparao
NOT

3
4

AND
OR

Sobreponha regras de precedncia usando


parnteses.

2-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Introduo ao Oracle: SQL e PL/SQL 2-19

Regras de Precedncia
SQL>
2
3
4
5

SELECT
FROM
WHERE
OR
AND

ENAME
---------KING
MARTIN
ALLEN
TURNER
WARD

2-20

ename, job, sal


emp
job='SALESMAN'
job='PRESIDENT'
sal>1500;
JOB
SAL
--------- --------PRESIDENT
5000
SALESMAN
1250
SALESMAN
1600
SALESMAN
1500
SALESMAN
1250

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exemplo de Precedncia do Operador AND


No exemplo do slide, h duas condies:

A primeira condio que o cargo seja PRESIDENT e o salrio maior que 1500.

A segunda condio que o cargo seja SALESMAN.

Portanto, a instruo SELECT faz a leitura do seguinte modo:


"Selecione a linha se o funcionrio for um PRESIDENT e receber mais que US$1.500 ou se o
funcionrio for um SALESMAN".

Introduo ao Oracle: SQL e PL/SQL 2-20

Regras de Precedncia
Use parnteses para forar a prioridade.
SQL>
2
3
4
5

SELECT
FROM
WHERE
OR
AND

ENAME
---------KING
ALLEN

2-21

ename, job, sal


emp
(job='SALESMAN'
job='PRESIDENT')
sal>1500;

JOB
SAL
--------- --------PRESIDENT
5000
SALESMAN
1600

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando Parnteses
No exemplo, h duas condies:

A primeira condio que o cargo seja PRESIDENT ou SALESMAN.

A segunda que o salrio sejam maior que 1500.

Portanto, a instruo SELECT faz a leitura do seguinte modo:


"Selecione a linha se um funcionrio for um PRESIDENT ou um SALESMAN e se o funcionrio
receber mais de US$1500".

Introduo ao Oracle: SQL e PL/SQL 2-21

Clusula ORDER BY
Classificar as linhas com a clusula ORDER BY
ASC: ordem crescente, default
DESC: ordem decrescente
A clusula ORDER BY vem depois na instruo
SELECT.
SQL> SELECT
ename, job, deptno, hiredate
2 FROM
emp
3 ORDER BY hiredate;
ENAME
JOB
DEPTNO HIREDATE
---------- --------- --------- --------SMITH
CLERK
20 17-DEC-80
ALLEN
SALESMAN
30 20-FEB-81
...
14 rows selected.
Copyright Oracle Corporation, 1999. Todos os direitos reservados.

2-22

A Clusula ORDER BY
A ordem das linhas retornadas em um resultado de consulta indefinida. A clusula ORDER BY
pode ser utilizada para classificar as linhas. Se voc usar a clusula ORDER BY, deve coloc-la por
ltimo. possvel especificar uma expresso ou um apelido para classificao.
Sintaxe
SELECT

expr

FROM

tabela

[WHERE

condio(es)]

[ORDER BY

{coluna, expr} [ASC|DESC]];

onde:

ORDER BY

especifica a ordem em que as linhas recuperadas so exibidas

ASC

ordena as linhas na ordem crescente (essa a ordem default)

DESC

ordena as linhas na ordem decrescente

Se a clusula ORDER BY no for usada, a ordem de classificao ser indefinida e o Oracle Server
talvez no extraia as linhas na mesma ordem ao realizar a mesma consulta duas vezes. Use a clusula
ORDER BY para exibir as linhas em uma ordem especfica.

Introduo ao Oracle: SQL e PL/SQL 2-22

Classificando em
Ordem Decrescente
SQL> SELECT
ename, job, deptno, hiredate
2 FROM
emp
3 ORDER BY hiredate DESC;
ENAME
JOB
DEPTNO HIREDATE
---------- --------- --------- --------ADAMS
CLERK
20 12-JAN-83
SCOTT
ANALYST
20 09-DEC-82
MILLER
CLERK
10 23-JAN-82
JAMES
CLERK
30 03-DEC-81
FORD
ANALYST
20 03-DEC-81
KING
PRESIDENT
10 17-NOV-81
MARTIN
SALESMAN
30 28-SEP-81
...
14 rows selected.
2-23

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Ordenao de Dados Default


A ordem de classificao default crescente:

Valores numricos so exibidos primeiro com os valores mais baixos por exemplo, 1999.

Valores de datas so exibidos primeiro com os valores mais recentes por exemplo,
01-JAN-92 antes de 01-JAN-95.

Valores de caracteres so exibidos em ordem alfabtica por exemplo, o A primeiro e o Z


por ltimo.

Os valores nulos so exibidos por ltimo em seqncias ascendentes e primeiro em seqncias


descendentes.

Invertendo a Ordem Default


Para inverter a ordem de exibio das linhas, especifique a palavra-chave DESC aps o nome da
coluna na clusula ORDER BY. O exemplo do slide classifica o resultado pelo funcionrio
contratado mais recentemente.

Introduo ao Oracle: SQL e PL/SQL 2-23

Classificando por Apelido de Coluna


SQL> SELECT
empno, ename, sal*12 annsal
2 FROM
emp
3 ORDER BY annsal;
EMPNO ENAME
ANNSAL
--------- ---------- --------7369 SMITH
9600
7900 JAMES
11400
7876 ADAMS
13200
7654 MARTIN
15000
7521 WARD
15000
7934 MILLER
15600
7844 TURNER
18000
...
14 rows selected.

2-24

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Classificando por Apelidos de Coluna


Voc pode usar um apelido de coluna na clusula ORDER BY. O exemplo do slide classifica os
dados por salrio anual.

Introduo ao Oracle: SQL e PL/SQL 2-24

Classificando por Vrias Colunas


A ordem da lista ORDER BY a ordem de
classificao.
SQL> SELECT
ename, deptno, sal
2 FROM
emp
3 ORDER BY deptno, sal DESC;
ENAME
DEPTNO
SAL
---------- --------- --------KING
10
5000
CLARK
10
2450
MILLER
10
1300
FORD
20
3000
...
14 rows selected.

Voc pode classificar por uma coluna que no


esteja na lista SELECT.
2-25

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Classificando por Vrias Colunas


Voc pode classificar os resultados da consulta por mais de uma coluna. O limite de classificao o
nmero de colunas de uma determinada tabela.
Na clusula ORDER BY, especifique as colunas e separe seus nomes usando vrgulas. Se deseja
inverter a ordem de uma coluna, especifique DESC aps seu nome. possvel ordenar por colunas
que no esto includas na clusula SELECT.
Exemplo
Exiba o nome e o salrio de todos os funcionrios. Ordene o resultado por nmero de departamento e,
em seguida, em ordem decrescente de salrio.
SQL> SELECT
2 FROM
3 ORDER BY

ename, sal
emp
deptno, sal DESC;

Introduo ao Oracle: SQL e PL/SQL 2-25

Sumrio

SELECT
FROM
[WHERE
[ORDER BY

2-26

[DISTINCT] {*| coluna [apelido], ...}


tabela
condio(es)]
{coluna, expr, apelido} [ASC|DESC]];

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Nesta lio, voc aprendeu sobre a restrio e classificao de colunas retornadas pela instruo
SELECT. Tambm aprendeu como implementar vrios operadores.

Introduo ao Oracle: SQL e PL/SQL 2-26

Viso Geral do Exerccio

Selecionando dados e alterando a ordem


das linhas exibidas
Restringindo colunas utilizando a clusula
WHERE
Usando as aspas nos apelidos de colunas

2-27

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Esta seo oferece uma variedade de exerccios usando a clusula WHERE e a
clusula ORDER BY.

Introduo ao Oracle: SQL e PL/SQL 2-27

Exerccio 2
1. Crie uma consulta para exibir o nome e o salrio dos funcionrios que recebem mais de
US$2.850. Salve a instruo SQL em um arquivo p2q1.sql. Execute a consulta.
ENAME
-------KING
JONES
FORD
SCOTT

SAL
---5000
2975
3000
3000

2. Crie uma consulta para exibir o nome do funcionrio e o nmero do departamento para o
nmero do funcionrio 7566.
ENAME DEPTNO
------ -----JONES
20

3. Modifique o arquivo p2q1.sql para exibir o nome e o salrio de todos os funcionrios cujos
salrios no estejam na faixa entre US$1.500 e US$2.850. Salve novamente a instruo SQL
em um arquivo nomeado p2q3.sql. Execute novamente a consulta.
ENAME
SAL
------- ----KING
5000
JONES
2975
MARTIN
1250
JAMES
950
WARD
1250
FORD
3000
SMITH
800
SCOTT
3000
ADAMS
1100
MILLER
1300
10 rows selected.

Introduo ao Oracle: SQL e PL/SQL 2-28

Exerccio 2 (continuao)
4. Exiba o nome do funcionrio, o cargo e a data de admisso dos funcionrios admitidos entre
20 de fevereiro de 1981 e 1 de maio de 1981. Ordene a consulta de modo crescente pela data
inicial.
ENAME
------ALLEN
WARD
JONES
BLAKE

JOB
--------SALESMAN
SALESMAN
MANAGER
MANAGER

HIREDATE
---------------20-FEB-81
22-FEB-81
02-APR-81
01-MAY-81

5. Exiba o nome do funcionrio e o nmero do departamento de todos os funcionrios entre os


departamentos 10 e 30 por ordem alfabtica de nome.
ENAME
DEPTNO
-------- -----ALLEN
30
BLAKE
30
CLARK
10
JAMES
30
JONES
10
MARTIN
30
MILLER
10
TURNER
30
WARD
30
9 rows selected.

6. Modifique o p2q3.sql para listar o nome e o salrio dos funcionrios que recebem mais de
US$1.500 e que esto nos departamentos 10 ou 30. Nomeie as colunas Employee e Monthly
Salary, respectivamente. Salve novamente a instruo SQL em um arquivo p2q6.sql.
Execute novamente a consulta..
Employee
-------KING
BLAKE
CLARK
ALLEN

Monthly Salary
-------------5000
2850
2450
1600

Introduo ao Oracle: SQL e PL/SQL 2-29

Exerccio 2 (continuao)
7. Exiba o nome e a data de admisso de cada funcionrio admitido em 1982.
ENAME
-----SCOTT
MILLER

HIREDATE
--------09-DEC-82
23-JAN-82

8. Exiba o nome e o cargo de todos os funcionrios que no possuem um gerente.


ENAME JOB
----- --------KING PRESIDENT

9. Exiba o nome, o salrio e a comisso de todos os funcionrios que recebem comisso.


Classifique os dados em ordem decrescente de salrios e comisses.
ENAME
------ALLEN
TURNER
MARTIN
WARD

SAL
---1600
1500
1250
1250

COMM
---300
0
1400
500

Se voc tiver tempo, complete os exerccios abaixo:


10. Exiba os nomes de todos os funcionrios que possuem um A na terceira letra de seus nomes.
ENAME
----------BLAKE
CLARK
ADAMS

11. Exiba todos os funcionrios que possuem duas letras L em seus nomes e esto no
departamento 30 ou seu gerente seja o 7782.
ENAME
---------ALLEN
MILLER

Introduo ao Oracle: SQL e PL/SQL 2-30

Exerccio 2 (continuao)
Se voc quiser mais desafios, complete os exerccios abaixo:
12. Exiba o nome, o cargo e o salrio de todos os funcionrios cujos cargos seja Clerk ou Analyst
e que seus salrios no sejam iguais a US$1.000, US$3.000 ou US$5.000.
ENAME
-----JAMES
SMITH
ADAMS
MILLER

JOB
SAL
------- ----CLERK
950
CLERK
800
CLERK
1100
CLERK
1300

13. Modifique o p2q6.sql para exibir o nome, o salrio e a comisso de todos os funcionrios
cuja quantia de comisso seja maior que seus salrios com 10% de aumento. Execute
novamente a consulta. Salve novamente a consulta como p2q13.sql.
Employee
Monthly Salary COMM
---------- --------------- ----MARTIN
1250 1400

Introduo ao Oracle: SQL e PL/SQL 2-31

Introduo ao Oracle: SQL e PL/SQL 2-32

3
Funes de Uma nica Linha

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Descrever vrios tipos de funes
disponveis no SQL
Usar funes de data, nmero e caractere
nas instrues SELECT
Descrever o uso das funes de converso

3-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
As funes formam o bloco de consulta bsico mais avanado e so usadas para manipular valores de
dados. Esta a primeira de duas lies a explorar funes. Sero abordadas as funes de caractere de
uma nica linha, de nmero e de datas, bem como aquelas funes que convertem dados de um tipo
para outro por exemplo, dados de caractere para numrico.

Introduo ao Oracle: SQL e PL/SQL 3-2

Funes SQL

Entrada

Sada

Funo

arg 1

A funo executa
a ao

arg 2

Resultado
valor

arg n

3-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes SQL
As funes so um recurso avanado do SQL e podem ser usadas para realizar o seguinte:

Executar clculos usando dados

Modificar itens de dados individuais

Manipular sada para grupos de linhas

Formatar datas e nmeros para exibio

Converter tipos de dados de coluna

As funes SQL podem aceitar argumentos e sempre retornar um valor.


Observao: A maioria das funes descritas nesta lio so especficas para a verso SQL da
Oracle.

Introduo ao Oracle: SQL e PL/SQL 3-3

Dois Tipos de Funes SQL

Funes

Funes de
Uma nica Linha

3-4

Funes de
Vrias Linhas

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes SQL (continuao)


H dois tipos distintos de funes:

Funes de Uma nica Linha

Funes de Vrias Linhas

Funes de Uma nica Linha


Essas funes operam somente linhas nicas e retornam um resultado por linha. H dois tipos
diferentes de funes de uma nica linha. Esta lio aborda as seguintes:

Caractere

Nmero

Data

Converso

Funes de Vrias Linhas


Essas funes manipulam grupos de linha a fim de obter um resultado por grupo de linhas.
Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, para uma lista
completa de funes e sintaxes disponveis.

Introduo ao Oracle: SQL e PL/SQL 3-4

Funes de Uma nica Linha


Manipulam itens de dados
Aceitam argumentos e retornam um valor
Agem em cada linha retornada
Retornam um resultado por linha
Podem modificar o tipo de dados
Podem ser aninhadas
function_name (coluna|expresso, [arg1, arg2,...])

3-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Uma nica Linha


Funes de uma nica linha so usadas para manipular itens de dados. Elas aceitam um ou mais
argumentos e retornam um valor para cada linha retornada pela consulta. Um argumento pode ser um
dos seguintes:

Constante fornecida pelo usurio


Valor varivel

Nome da coluna
Expresso

Os recursos de funes de uma nica linha:

Atuam em cada linha retornada na consulta


Retornam um resultado por linha

Podem retornar um valor de dados de um tipo diferente do mencionado


Podem esperar um ou mais argumentos

Podem ser usados em clusulas SELECT, WHERE e ORDER BY; podem ser aninhados
Na sintaxe:
function_name
coluna

o nome da funo
qualquer coluna de banco de dados nomeada

expresso

qualquer string de caractere ou expresso calculada

arg1, arg2

qualquer argumento a ser utilizado pela funo


Introduo ao Oracle: SQL e PL/SQL 3-5

Funes de Uma nica Linha


Caractere

Geral

Nmero
Funes de
Uma nica Linha

Converso

3-6

Data

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Uma nica Linha (continuao)


Esta lio aborda as seguintes funes de uma nica linha:

Funes de caractere: Aceitam entrada de caractere e podem retornar valores de nmero e


caractere

Funes numricas: Aceitam entrada numrica e retornam valores numricos

Funes de data: Operam sobre valores de tipo de dados da data (Todas as funes de data
retornam data um valor de tipo de dados de data exceto a funo MONTHS_BETWEEN, que
retorna um nmero.)

Funes de converso: Convertem um valor de um tipo de dados para outro

Funes gerais:
Funo NVL
Funo DECODE

Introduo ao Oracle: SQL e PL/SQL 3-6

Funes de Caractere
Funes de
caractere

Funes de Converso de
Maisculas e Minsculas

Funes de manipulao
de caractere

LOWER
UPPER

CONCAT
SUBSTR

INITCAP

LENGTH
INSTR
LPAD
TRIM

3-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Caractere
As funes de caractere de uma nica linha aceitam dados de caractere como entrada e podem
retornar valores de nmero e de caractere. As funes de caractere podem ser dividas nas
seguintes:

Funes de Converso de Maisculas e Minsculas


Funes de manipulao de caractere

Funo

Objetivo

LOWER(coluna|expresso)

Converte valores de caractere alfabtico para letras minsculas

UPPER(coluna|expresso)

Converte valores de caractere alfabtico para letras maisculas

INITCAP(coluna|expresso)

Converte valores de caractere alfabtico para usar maiscula na


primeira letra de cada palavra e todas as outras letras em
minsculas

CONCAT(coluna1|expresso1,
coluna2|expresso2)

Concatena o primeiro valor do caractere ao segundo valor do


caractere, equivalente ao operador de concatenao (||)

SUBSTR(coluna|expresso,m[,n])

Retorna caracteres especficos a partir do valor de caractere


comeando na posio m, at n caracteres depois (Se m for
negativo, a conta inicia no final do valor de caractere. Se n for
omitido, so retornados todos os caracteres at o final da string.)

Observao: Essas funes abordadas nesta lio so um subconjunto de funes disponveis.


Introduo ao Oracle: SQL e PL/SQL 3-7

Funes de Caractere
Funes de
caractere

Funes de Converso de
Maisculas e Minsculas

Funes de manipulao
de caractere

LOWER
UPPER

CONCAT
SUBSTR

INITCAP

LENGTH
INSTR
LPAD
TRIM

3-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Caractere (continuao)


Funo

Objetivo

LENGTH(coluna|expresso)

Retorna o nmero de caracteres do valor

INSTR(coluna|expresso,m)

Retorna a posio numrica do caractere nomeado

LPAD(coluna|expresso, n,
'string')

Preenche o valor de caracter justificado direita a uma largura


total de n posies de caractere

TRIM(anterior|posterior|ambos,
trim_character FROM trim_source)

Permitem a voc organizar cabealhos ou caracteres de fim de


linha (ou os dois) a partir de uma string de caractere. Se
trim_character ou trim_source for um caractere literal, voc
deve inclu-los entre aspas simples.
Este um recurso disponvel a partir Oracle8i em diante.

Introduo ao Oracle: SQL e PL/SQL 3-8

Funes de Converso de
Maisculas e Minsculas
Converter maisculas em minsculas para
strings de caractere

3-9

Funo

Resultado

LOWER('SQL Course')

sql course

UPPER('SQL Course')

SQL COURSE

INITCAP('SQL Course')

Sql Course

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Converso de Maisculas e Minsculas


LOWER, UPPER e INITCAP so as trs funes de converso de maiscula em minscula.

LOWER: Converte string de caracteres com letras maisculas e minsculas ou s maisculas


para letras minsculas

UPPER: Converte string de caracteres com letras maisculas e minsculas ou s minsculas


para letras maisculas

INITCAP: Converte a primeira letra de cada palavra para maiscula e mantm as outras letras
em minscula

SQL> SELECT 'The job title for '||INITCAP(ename)||' is '


2 ||LOWER(job) AS "EMPLOYEE DETAILS"
3 FROM emp;
EMPLOYEE DETAILS
----------------------------------------The job title for King is president
The job title for Blake is manager
The job title for Clark is manager
...
14 rows selected.

Introduo ao Oracle: SQL e PL/SQL 3-9

Usando Funes de Converso


de Maisculas e Minsculas
Exibir o nmero de funcionrio, nome e
nmero de departamento do funcionrio Blake.
SQL> SELECT empno, ename, deptno
2 FROM
emp
3 WHERE
ename = 'blake';
no rows selected
SQL> SELECT
2 FROM
3 WHERE

empno, ename, deptno


emp
ename = UPPER('blake');

EMPNO ENAME
DEPTNO
--------- ---------- --------7698 BLAKE
30
3-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Converso de Maisculas e Minsculas (continuao)


O exemplo do slide exibe o nmero de funcionrio, nome e nmero de departamento do funcionrio
BLAKE.
A clusula WHERE da primeira instruo SQL especifica o nome do funcionrio como 'blake'. Visto
que todos os dados da tabela EMP so armazenados em letra maiscula, o nome 'blake' no localiza uma
correspondncia na tabela EMP e como resultado nenhuma linha ser selecionada.
A clusula WHERE da segunda instruo SQL especifica que o nome do funcionrio na tabela EMP
seja comparado a 'blake', convertido para letras maisculas. Agora que os dois nomes esto em
maiscula, localizada uma correspondncia e uma linha selecionada. A clusula WHERE pode ser
escrita novamente da seguinte forma para produzir o mesmo resultado:
WHERE

ename = 'BLAKE'

O nome na entrada aparece como se estivesse armazenado no banco de dados. Para exibir o nome com a
primeira letra maiscula, use a funo INITCAP na instruo SELECT.
SQL> SELECT
2 FROM
3 WHERE

empno, INITCAP(ename), deptno


emp
ename = UPPER('blake');

Introduo ao Oracle: SQL e PL/SQL 3-10

Funes de Manipulao
de Caractere
Manipular strings de caractere
Funo

Resultado

CONCAT('Good', 'String')

GoodString

SUBSTR('String',1,3)

Str

LENGTH('String')

INSTR('String', 'r')

LPAD(sal,10,'*')

******5000

TRIM('S' FROM 'SSMITH')

MITH

3-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Manipulao de Caractere


CONCAT, SUBSTR, LENGTH, INSTR, LPAD e TRIM so as seis funes de manipulao de
caractere abordadas nesta lio.

CONCAT: Une valores de juno (Voc est limitado a usar dois parmetros com CONCAT.)

SUBSTR: Extrai uma string de determinado tamanho

LENGTH: Exibe o tamanho de uma string como um valor numrico

INSTR: Localiza a posio numrica do caractere nomeado

LPAD: Preenche o valor do caractere justificado direita

Observao: A funo de manipulao de caractere RPAD preenche o valor de caractere justificado


esquerda
TRIM: Organiza cabealho ou caracteres de fim de linha (ou os dois) a partir de uma string de
caractere. Se trim_character ou trim_source forem um caractere literal, voc deve inclu-los entre
aspas simples.

Introduo ao Oracle: SQL e PL/SQL 3-11

Usando as Funes de
Manipulao de Caractere
SQL> SELECT ename, CONCAT (ename, job), LENGTH(ename),
2
INSTR(ename, 'A')
3 FROM
emp
4 WHERE SUBSTR(job,1,5) = 'SALES';
ENAME
---------MARTIN
ALLEN
TURNER
WARD

3-12

CONCAT(ENAME,JOB)
LENGTH(ENAME) INSTR(ENAME,'A')
------------------- ------------- ---------------MARTINSALESMAN
6
2
ALLENSALESMAN
5
1
TURNERSALESMAN
6
0
WARDSALESMAN
4
2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Manipulao de Caractere (continuao)


O exemplo do slide exibe o nome do funcionrio e o cargo juntos, o tamanho do nome e a posio
numrica da letra A no nome do funcionrio, para todos os funcionrios que esto em vendas.
Exemplo
Modifique a instruo SQL no slide a fim de exibir os dados daqueles funcionrios cujos nomes
terminam com N.
SQL> SELECT
2
3 FROM
4 WHERE
ENAME
-------MARTIN
ALLEN

ename, CONCAT(ename, job), LENGTH(ename),


INSTR(ename, 'A')
emp
SUBSTR(ename, -1, 1) = 'N';

CONCAT(ENAME,JOB)
LENGTH(ENAME) INSTR(ENAME,'A')
------------------- ------------- ---------------MARTINSALESMAN
6
2
ALLENSALESMAN
5
1

Introduo ao Oracle: SQL e PL/SQL 3-12

Funes Numricas
ROUND: Arredonda valor para determinado
decimal
ROUND(45.926, 2)

45.93

TRUNC: Trunca valor para determinado


decimal
TRUNC(45.926, 2)

45.92

MOD: Retorna o restante da diviso


MOD(1600, 300)

3-13

100

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes Numricas
As funes numricas aceitam entrada numrica e retornam valores numricos. Esta seo descreve
algumas das funes numricas.
Funo

Objetivo

ROUND(coluna|expresso,n)

Arredonda a coluna, expresso ou valor para n casas decimais ou se


n for omitido, nenhuma casa decimal (Se n for negativo, os nmeros
esquerda do ponto decimal sero arredondados.)

TRUNC(coluna|expresso,n)

Trunca a coluna, expresso ou valor para n casas decimais


ou se n for omitido, nenhuma casa decimal (Se n for negativo, os
nmeros esquerda do ponto decimal sero truncados para zero.)

MOD(m,n)

Retorna o resto de m dividido por n.

Observao: Esta lista um subconjunto das funes numricas disponveis.


Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "Number
Functions".

Introduo ao Oracle: SQL e PL/SQL 3-13

Usando a Funo ROUND


SQL> SELECT ROUND(45.923,2), ROUND(45.923,0),
2
ROUND(45.923,-1)
3 FROM
DUAL;

ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1)


--------------- -------------- ----------------45.92
46
50

3-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funo ROUND
A funo ROUND arredonda a coluna, expresso ou valor para n casas decimais. Se o segundo
argumento for 0 ou estiver ausente, o valor ser arredondado para nenhuma casa decimal. Se o
segundo argumento for 2, o valor ser arredondado para duas casas decimais. Da mesma forma,
se o segundo argumento for -2, o valor ser arredondado para duas casas decimais para a esquerda.
A funo ROUND pode tambm ser utilizada com funes de data. Voc ver exemplos mais
adiante nesta seo.
A tabela DUAL fictcia. Mais informaes sero fornecidas mais tarde.

Introduo ao Oracle: SQL e PL/SQL 3-14

Usando a Funo TRUNC

SQL> SELECT TRUNC(45.923,2), TRUNC(45.923),


2
TRUNC(45.923,-1)
3 FROM
DUAL;

TRUNC(45.923,2) TRUNC(45.923) TRUNC(45.923,-1)


--------------- ------------- --------------45.92
45
40

3-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funo TRUNC
A funo TRUNC trunca a coluna, expresso ou valor para n casas decimais.
A funo TRUNC trabalha com argumentos similares aos da funo ROUND. Se o segundo
argumento for 0 ou estiver ausente, o valor ser truncado para nenhuma casa decimal. Se o segundo
argumento for 2, o valor ser truncado para duas casas decimais. Da mesma forma, se o segundo
argumento for -2, o valor ser truncado para duas casas decimais para esquerda.
Semelhante funo ROUND, a funo TRUNC pode ser usada com funes de data.

Introduo ao Oracle: SQL e PL/SQL 3-15

Usando a Funo MOD


Calcular o restante da proporo do salrio
para comisso de todos os funcionrios cujo
cargo salesman.
SQL> SELECT
2 FROM
3 WHERE

ename, sal, comm, MOD(sal, comm)


emp
job = 'SALESMAN';

ENAME
SAL
COMM MOD(SAL,COMM)
---------- --------- --------- ------------MARTIN
1250
1400
1250
ALLEN
1600
300
100
TURNER
1500
0
1500
WARD
1250
500
250

3-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funo MOD
A funo MOD localiza o restante do valor 1 dividido pelo valor 2. O exemplo do slide calcula o
restante da proporo de salrio para comisso de todos os funcionrios cujo cargo salesman.

Introduo ao Oracle: SQL e PL/SQL 3-16

Trabalhando com Datas


O Oracle armazena datas em um formato
numrico interno: sculo, ano, ms, dia,
horas, minutos, segundos.
O formato de data default DD-MON-YY.
SYSDATE uma funo de retorno de data
e hora.
DUAL uma tabela fictcia usada para
visualizar SYSDATE.

3-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Formato de Data Oracle


Os produtos da Oracle armazenam datas em um formato numrico interno, representando o sculo,
ano, ms, dia, horas, minutos e segundos.
O formato de entrada e exibio default para qualquer data DD-MON-YY. Datas vlidas para a
Oracle esto entre 1 de janeiro, 4712 A.C. e 31 de dezembro, 9999 D.C.
SYSDATE
SYSDATE a funo de data que retorna a data e a hora atual. Voc pode usar o SYSDATE da
mesma forma como usaria qualquer outro nome de coluna. Por exemplo, possvel exibir a data atual
selecionando SYSDATE a partir da tabela. Costuma-se selecionar SYSDATE em uma tabela fictcia
chamada DUAL.
DUAL
A tabela DUAL pertence ao usurio SYS e pode ser acessada por todos os usurios. Ela contm uma
coluna, DUMMY, e uma linha com o valor X. A tabela DUAL til quando deseja retornar um valor
somente uma vez por exemplo, o valor de uma constante, pseudocoluna ou expresso que no
derivada de uma tabela com dados do usurio. A tabela DUAL, em geral, utilizada pela totalidade
de sintaxe da clusula SELECT, pois as duas clusulas SELECT e FROM so obrigatrias e diversos
clculos no precisam selecionar das tabelas reais.
Exemplo
Exibir a data atual usando a tabela DUAL.
SQL> SELECT
SYSDATE
2 FROM
DUAL;
Introduo ao Oracle: SQL e PL/SQL 3-17

Aritmtica com Datas


Adicionar ou subtrair um nmero de, ou
para, uma data para um valor de data
resultante.
Subtrair duas datas a fim de localizar o
nmero de dias entre estas datas.
Adicionar horas para uma data dividindo o
nmero de horas por 24.

3-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Aritmtica com Datas


J que os bancos de dados armazenam datas como nmeros, voc pode executar clculos usando
operadores aritmticos como adio e subtrao. possvel adicionar e subtrair constantes de nmero
bem como datas.
Voc pode executar as seguintes operaes:
Operao

Resultado

Descrio

data + nmero

Data

Adiciona um nmero de dias para uma data

data - nmero

Data

Subtrai um nmero de dias de uma data

data - data

Nmero de dias

Subtrai uma data de outra

data + nmero/24

Data

Adiciona um nmero de horas para uma data

Introduo ao Oracle: SQL e PL/SQL 3-18

Usando Operadores Aritmticos


com Datas
SQL> SELECT ename, (SYSDATE-hiredate)/7 WEEKS
2 FROM
emp
3 WHERE deptno = 10;

ENAME
---------KING
CLARK
MILLER

3-19

WEEKS
--------830.93709
853.93709
821.36566

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Aritmtica com Datas (continuao)


O exemplo no slide exibe o nome e o nmero de semanas empregadas por todos os funcionrios do
departamento 10. Ele subtrai a data atual (SYSDATE) a partir da data na qual o funcionrio foi
admitido e divide o resultado por 7 a fim de calcular o nmero de semanas que o trabalhador est
empregado.
Observao: SYSDATE uma funo SQL que retorna a data e a hora atual. Seus resultados podem
ser diferentes dos obtidos no exemplo.

Introduo ao Oracle: SQL e PL/SQL 3-19

Funes de Data
Funo

Descrio

MONTHS_BETWEEN

Nmero de meses
entre duas datas

ADD_MONTHS

Adiciona meses de calendrio


para a data

NEXT_DAY

Dia seguinte da data


especificada

LAST_DAY

ltimo dia do ms

ROUND

Data de arredondamento

TRUNC

Data para truncada

3-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Data
Funes de data operam em datas Oracle. Todas as funes de data retornam um valor de tipo de dados
DATE exceto MONTHS_BETWEEN, que retorna um valor numrico.

MONTHS_BETWEEN(data1, data2): Localiza o nmero de meses entre a data 1 e a data 2. O


resultado pode ser positivo ou negativo. Se data1 for posterior a data2, o resultado ser positivo;
se data1 for anterior a data2, o resultado ser negativo. A parte no-inteira do resultado representa
uma parte do ms.

ADD_MONTHS(data, n): Adiciona um nmero n de meses de calendrio data. O valor de n


deve ser inteiro ou pode ser negativo.

NEXT_DAY(data, 'char'): Localiza a data do prximo dia especificado da data seguinte da


semana ('char'). O valor de char pode ser um nmero representando um dia ou uma string de
caractere.

LAST_DAY(data): Localiza a data do ltimo dia do ms que contm a data.

ROUND(data[,'fmt']): Retorna a data arredondada para a unidade especificada pelo modelo de


formato fmt. Se o modelo de formato fmt for omitido, a data ser arredondada para o dia mais
prximo.

TRUNC(data[, 'fmt']): Retorna a data com a parte da hora do dia truncada para a unidade
especificada pelo modelo de formato fmt. Se o modelo de formato fmt for omitido, a data ser
truncada para o dia mais prximo.

Esta lista um subconjunto de funes de data disponveis. Os modelos de formato so abordados mais
tarde nesta lio. Exemplos de modelos de formato so ms e ano.
Introduo ao Oracle: SQL e PL/SQL 3-20

Usando Funes de Data


MONTHS_BETWEEN ('01-SEP-95','11-JAN-94')
19.6774194

ADD_MONTHS ('11-JAN-94',6)

'11-JUL-94'

NEXT_DAY ('01-SEP-95','FRIDAY')

'08-SEP-95'

LAST_DAY('01-SEP-95')

'30-SEP-95'

3-21

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Data (continuao)


Para todos os funcionrios contratados por menos de 200 meses, exibir o nmero do funcionrio, a
data de admisso, o nmero de meses contratado, a data de reviso semestral, a primeira sexta-feira
aps a data da admisso e o ltimo dia do ms em que foi admitido.
SQL> SELECT
2
3
4
5 FROM
6 WHERE

empno, hiredate,
MONTHS_BETWEEN(SYSDATE, hiredate) TENURE,
ADD_MONTHS(hiredate, 6) REVIEW,
NEXT_DAY(hiredate, 'FRIDAY'), LAST_DAY(hiredate)
emp
MONTHS_BETWEEN (SYSDATE, hiredate)<200;

EMPNO HIREDATE
TENURE REVIEW
NEXT_DAY( LAST_DAY(
- --------- --------- --------- --------- --------7839 17-NOV-81 192.24794 17-MAY-82 20-NOV-81 30-NOV-81
7698 01-MAY-81 198.76407 01-NOV-81 08-MAY-81 31-MAY-81
...
11 rows selected.

Introduo ao Oracle: SQL e PL/SQL 3-21

-----

Usando Funes de Data


ROUND('25-JUL-95','MONTH')

01-AUG-95

ROUND('25-JUL-95','YEAR')

01-JAN-96

TRUNC('25-JUL-95','MONTH')

01-JUL-95

TRUNC('25-JUL-95','YEAR')

01-JAN-95

3-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Data (continuao)


As funes ROUND e TRUNC podem ser usadas para os valores de data e nmero. Quando usadas
com datas, estas funes arredondam ou truncam o modelo de formato especificado. Assim,
possvel arredondar datas para o ano ou ms mais prximo.
Exemplo
Compare as datas de admisso de todos os funcionrios contratados em 1982. Exiba o nmero do
funcionrio, a data de admisso e o ms de incio usando as funes ROUND e TRUNC.
SQL> SELECT
2
3 FROM
4 WHERE
EMPNO
--------7788
7934

empno, hiredate,
ROUND(hiredate, 'MONTH'), TRUNC(hiredate, 'MONTH')
emp
hiredate like '%1982';

HIREDATE
--------09-DEC-82
23-JAN-82

ROUND(HIR
--------01-DEC-82
01-FEB-82

TRUNC(HIR
--------01-DEC-82
01-JAN-82

Introduo ao Oracle: SQL e PL/SQL 3-22

Funes de Converso
Converso de
tipo de dados

Converso implcita
de tipo de dados

3-23

Converso explcita
de tipo de dados

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Converso
Alm dos tipos de dados Oracle, as colunas de tabela em um banco de dados Oracle8 podem ser
definidas usando os tipos de dados ANSI, DB2 e SQL/DS. No entanto, o Oracle Server converte
internamente tais tipos de dados para tipos de dados Oracle8.
Em alguns casos, o Oracle Server aceita dados de um tipo de dados em que espera dados de um tipo
de dados diferente. Isso permitido quando o Oracle Server pode converter dados automaticamente
para o tipo de dados esperado. Essa converso de tipo de dados pode ser realizada de forma implcita
pelo Oracle Server ou explcita pelo usurio.
As converses implcitas de tipo de dados funcionam de acordo com as regras explicadas nos
prximos dois slides.
As converses explcitas de tipo de dados podem ser realizadas usando-se as funes de converso.
As funes de converso convertem um valor de um tipo de dados para outro. Geralmente, o formato
dos nomes de funo seguem a conveno tipo de dados TO tipo de dados. O primeiro tipo de dados
um tipo de dados de entrada; o ltimo tipo de dados de sada.
Observao: Embora a converso implcita de tipos de dados esteja disponvel, recomendvel
que voc realize a converso explcita de tipo de dados a fim de garantir a confiabilidade das
instrues SQL.

Introduo ao Oracle: SQL e PL/SQL 3-23

Converso Implcita
de Tipo de Dados
Para atribuies, o Oracle Server pode
converter automaticamente o seguinte:
De

Para

VARCHAR2 ou CHAR

NUMBER

VARCHAR2 ou CHAR

DATE

NUMBER

VARCHAR2

DATE

VARCHAR2

3-24

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Converso Implcita de Tipo de Dados


A atribuio ocorre se o Oracle Server puder converter o tipo de dados do valor nela usado para a
atribuio destino.

Introduo ao Oracle: SQL e PL/SQL 3-24

Converso Implcita
de Tipo de Dados
Para avaliao da expresso, o Oracle Server
pode converter automaticamente o seguinte:
De

Para

VARCHAR2 ou CHAR

NUMBER

VARCHAR2 ou CHAR

DATE

3-25

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Converso Implcita de Tipo de Dados


Em geral, o Oracle Server usa a regra para expresso quando a converso de tipo de dados
necessria em lugares no cobertos por uma regra para as converses de atribuio.
Observao: Converses de CHAR para NUMBER ocorrem somente se a string de caractere
representar um nmero vlido. Converses de CHAR para DATE ocorrem somente se a string de
caractere possuir o formato default DD-MON-YY.

Introduo ao Oracle: SQL e PL/SQL 3-25

Converso Explcita
de Tipo de Dados
TO_NUMBER

NUMBER

TO_DATE

CHARACTER

TO_CHAR
3-26

DATE

TO_CHAR

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Converso Explcita de Tipo de Dados


O SQL oferece trs funes para converter um valor de um tipo de dados para outro:
Funo

Objetivo

TO_CHAR(nmero|data,[ fmt],
[nlsparams])

Converte um valor de nmero ou data para uma string


de caractere VARCHAR2 com modelo de formato fmt.
Converso de Nmero:
O parmetro nlsparams especifica os seguintes
caracteres, que so retornados por elementos de formato
de nmero:

Caractere decimal

Separador de grupo

Smbolo da moeda local

Smbolo da moeda internacional

Se nlsparams ou qualquer outro parmetro for omitido,


essa funo utilizar os valores de parmetro default
para a seo.

Introduo ao Oracle: SQL e PL/SQL 3-26

Converso Explcita
de Tipo de Dados
TO_NUMBER

NUMBER

CHARACTER

TO_CHAR
3-27

TO_DATE

DATE

TO_CHAR

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Converso Explcita de Tipo de Dados (continuao)


Funo

Objetivo

TO_CHAR(nmero|data,[ fmt],
[nlsparams])

Converso de data:

TO_NUMBER(carac,[fmt], [nlsparams])

O parmetro nlsparams especifica o idioma no qual os


nomes de dias, meses e abreviao retornam. Se este
parmetro for omitido, essa funo utilizar os idiomas
de data default para a seo.
Converte uma string de caractere contendo dgitos para
um nmero no formato especificado pelo modelo de
formato opcional fmt.
O parmetro nlsparams tem a mesma finalidade nesta
funo como na funo TO_CHAR para a converso
de nmero.

TO_DATE(carac,[fmt],[nlsparams])

Converte uma string de caractere representando uma


data para um valor de data de acordo com o fmt
especificado. Se fmt for omitido, o formato
DD-MON-YY.
O parmetro nlsparams possui a mesma finalidade na
funo TO_CHAR para a converso de data.

Introduo ao Oracle: SQL e PL/SQL 3-27

Converso Explcita
de Tipo de Dados
TO_NUMBER

NUMBER

CHARACTER

TO_CHAR
3-28

TO_DATE

DATE

TO_CHAR

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Converso Explcita de Tipo de Dados (continuao)


Observao: A lista de funes mencionadas nesta lio um subconjunto das funes de converso
disponveis.
Para obter mais informaes, consulte o Oracle8 Server SQL Reference, Release 8.0, "Conversion
Functions".

Introduo ao Oracle: SQL e PL/SQL 3-28

Funo TO_CHAR com Datas


TO_CHAR(data, 'fmt')

O modelo de formato:
Deve estar entre aspas simples e fazer
distino entre maisculas e minsculas
Pode incluir qualquer elemento de formato
de data vlido
Tem um elemento fm para remover espaos
preenchidos ou suprimir zeros esquerda
separado do valor de data por uma vrgula
3-29

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exibindo uma Data em um Formato Especfico


Anteriormente, todos os valores de data Oracle eram exibidos no formato DD-MON-YY. A funo
TO_CHAR permite converter uma data a partir desse formato default para um especificado por voc.
Diretrizes

O modelo de formato deve estar entre aspas simples e fazer distino entre maisculas e
minsculas.

O modelo de formato pode incluir qualquer elemento de formato de data vlido. Certifique-se
de separar o valor da data do modelo de formato por uma vrgula.

Os nomes de dias e meses na sada so preenchidos automaticamente por espaos.

Para remover os espaos em branco ou suprimir os zeros esquerda, use o modo de


preenchimento do elemento fm.

Voc pode redimensionar o tamanho da exibio do campo de caractere resultante com o


comando COLUMN do SQL*Plus.

A largura da coluna resultante , por padro, de 80 caracteres.

SQL> SELECT
2 FROM
3 WHERE

empno, TO_CHAR(hiredate, 'MM/YY') Month_Hired


emp
ename = 'BLAKE';

Introduo ao Oracle: SQL e PL/SQL 3-29

Elementos de Modelo
de Formato de Data
YYYY

Ano completo em nmeros

YEAR

Ano por extenso

MM

Valor de dois dgitos para ms

MONTH

Abreviao de trs letras do dia


da semana

DY

Abreviao de trs letras do dia


da semana

DAY

Nome completo do dia

3-30

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Elementos de Exemplo de Formatos de Data Vlidos


Elemento

Descrio

SCC ou CC

Sculo; Prefixos S data AC com -

Anos em datas YYYY ou SYYYY

Ano; Prefixos S data AC com -

YYY ou YY ou Y

ltimos trs, dois ou um dgitos do ano

Y,YYY

Ano com vrgula nesta posio

IYYY, IYY, IY, I

Quatro, trs, dois ou um dgito do ano com base no padro ISO

SYEAR ou YEAR

Ano inteiro; Prefixos S data AC com -

BC ou AD

Indicador AC/DC

B.C. ou A.D.

Indicador com pontos AC/DC

Trimestre do ano

MM

Ms, valor de dois dgitos

MONTH

Nome do ms preenchido com espaos limitado a nove caracteres

MON

Nome do ms, abreviao de trs letras

RM

Ms em nmeros romanos

WW ou W

Semana do ano ou ms

DDD ou DD ou D

Dia do ano, ms ou semana

DAY

Nome do dia preenchido com espaos limitado a nove caracteres

DY

Nome do dia; abreviao de trs letras

Dia do calendrio juliano; o nmero de dias desde 31de dezembro 4713 BC

Introduo ao Oracle: SQL e PL/SQL 3-30

Elementos de Modelo
de Formato de Data

Elementos de hora formatam a parte de


hora da data.
HH24:MI:SS AM

Adicionar strings de caractere incluindo-as


entres aspas.
DD "of" MONTH

15:45:32 PM

12 of OCTOBER

Sufixos de nmero escrevem os nmeros


por extenso.
ddspth

3-31

fourteenth

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Formatos de Hora
Use os formatos listados tabelas a seguir para exibir informaes de hora e literais e alterar numerais
para nmeros escritos.
Elemento

Descrio

AM ou PM

Indicador meridiano

A.M. ou P.M.

Indicador meridiano com pontos

HH ou HH12 ou HH24

Horas do dia ou hora (1 a 12) ou hora (0 a 23)

MI

Minuto (0 a 59)

SS

Segundo (0 a 59)

SSSSS

Segundos aps a meia-noite (086399)

Outros Formatos
Elemento

Descrio

/ . ,

A pontuao reproduzida no resultado

"of the"

A string entre aspas reproduzida no resultado

Especificando Sufixos para Influenciar Exibio de Nmero


Elemento

Descrio

TH

Nmero ordinal (por exemplo, DDTH para 4TH)

SP

Nmero por extenso (por exemplo, DDSP para FOUR)

SPTH ou THSP

Nmeros ordinais por extenso (por exemplo, DDSPTH para FOURTH)

Introduo ao Oracle: SQL e PL/SQL 3-31

Usando a Funo TO_CHAR


com Datas
SQL> SELECT ename,
2
TO_CHAR(hiredate, 'fmDD Month YYYY') HIREDATE
3 FROM
emp;

ENAME
HIREDATE
---------- ----------------KING
17 November 1981
BLAKE
1 May 1981
CLARK
9 June 1981
JONES
2 April 1981
MARTIN
28 September 1981
ALLEN
20 February 1981
...
14 rows selected.

3-32

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funo TO_CHAR com Datas


A instruo SQL no slide exibe o nome e as datas de admisso para todos os funcionrios. A data de
admisso aparece como 17 November 1981.
Exemplo
Modificar o exemplo do slide para exibir as datas em um formato que aparea como Seventh of
February 1981 08:00:00 AM.
SQL> SELECT
2
3
4 FROM

ename,
TO_CHAR(hiredate, 'fmDdspth "of" Month YYYY fmHH:MI:SS AM')
HIREDATE
emp;

ENAME
HIREDATE
---------- -----------------------------------------------KING
Seventeenth of November 1981 12:00:00 AM
BLAKE
First of May 1981 12:00:00 AM
...
14 rows selected.

Note que o ms segue o formato do modelo de formato especificado, ou seja, a primeira letra em
maiscula e o restante em minscula.
Introduo ao Oracle: SQL e PL/SQL 3-32

Funo TO_CHAR com Nmeros


TO_CHAR(nmero, 'fmt')

Use estes formatos com a funo TO_CHAR


para exibir um valor de nmero como um
caractere:

3-33

Representa um nmero

Forces a zero to be displayed

Coloca um sinal de dlar flutuante

Usa o smbolo da moeda local flutuante

Imprime um ponto decimal

Imprime um indicador de milhar


Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funo TO_CHAR com Nmeros


Ao trabalhar com valores de nmero tais como strings de caractere, voc deve converter esse nmeros
para o tipo de dados de caracter usando a funo TO_CHAR , que traduz o tipo de dados de
NUMBER para tipo de dados VARCHAR2. Essa tcnica particularmente til com concatenao.
Elementos de Formato de Nmero
Se estiver convertendo um nmero para tipo de dados de caractere, voc pode usar os seguintes
elementos:
Elemento

Descrio

Exemplo

Resultado

Posio numrica (nmero de 9s determinam o tamanho


da exibio)

999999

1234

Exibe zeros esquerda

099999

001234

Sinal de dlar flutuante

$999999

$1234

Smbolo da moeda local flutuante

L999999

FF1234

Ponto decimal na posio especificada

999999.99

1234.00

Vrgula na posio especificada

999,999

1,234

MI

Sinais de menos direita (valores negativos)

999999MI

1234-

PR

Coloca nmeros negativos entre parnteses

999999PR

<1234>

EEEE

Notao cientfica (formato deve especificar quatro Es)

99.999EEEE

1.234E+03

Multiplica por 10 n vezes (n = nmero de 9s aps o V)

9999V99

123400

Exibe valores de zero como espao, no 0

B9999.99

1234.00

Introduo ao Oracle: SQL e PL/SQL 3-33

Usando a Funo TO_CHAR


com Nmeros
SQL> SELECT
2 FROM
3 WHERE

TO_CHAR(sal,'$99,999') SALARY
emp
ename = 'SCOTT';

SALARY
-------$3,000

3-34

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes

O Oracle Server exibe uma string com sinais numricos (#) no lugar de um nmero inteiro cujos
dgitos excedam o nmero de dgitos fornecidos no modelo de formato.

O Oracle Server arredonda os valores decimais armazenados para o nmero de espaos


decimais fornecidos no modelo de formato.

Introduo ao Oracle: SQL e PL/SQL 3-34

Funes TO_NUMBER
e TO_DATE
Converter uma string de caractere para um
formato de nmero usando a funo
TO_NUMBER
TO_NUMBER(carac[, 'fmt'])

Converter uma string de caractere para um


formato de data usando a funo TO_DATE
TO_DATE(carac[, 'fmt'])

3-35

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes TO_NUMBER e TO_DATE


Talvez deseje converter uma string de caractere para um nmero ou data. Para completar essa tarefa,
use as funes TO_NUMBER ou TO_DATE. O modelo de formato que escolher ser baseado nos
elementos de formato demonstrados anteriormente.
Exemplo
Exibir os nomes e as datas de admisso para todos os funcionrios contratados em 22 de fevereiro
de 1981.
SQL> SELECT ename, hiredate
2 FROM
emp
3 WHERE hiredate = TO_DATE('February 22, 1981', 'Month dd,

ENAME
HIREDATE
---------- -------WARD
22-FEB-81

Introduo ao Oracle: SQL e PL/SQL 3-35

YYYY');

Formato de Data RR
Ano Atual
1995
1995
2001
2001

Data Especificada
27-OCT-95
27-OCT-17
27-OCT-17
27-OCT-95

Formato RR
1995
2017
2017
1995

Formato YY
1995
1917
2017
2095

Se o ano de dois dgitos for:

Se dois
dgitos do
ano atual
forem:

049

5099

3-36

049

5099

A data de devoluo
est no sculo atual

A data de devoluo
est no sculo
seguinte

A data de devoluo
est no sculo
anterior

A data de devoluo
est no sculo atual

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Elemento de Formato de Data RR


O formato de data RR similar ao elemento YY, porm ele permite especificar sculos diferentes.
Voc pode usar um elemento de formato de data RR no lugar de YY, para que o sculo do valor de
devoluo varie de acordo com o ano de dois dgitos especificado e com os ltimos dois dgitos do
ano atual. A tabela do slide resume o comportamento do elemento RR.
Ano Atual

Data Fornecida

Interpretada (RR)

Interpretada (YY)

1994

27-OCT-95

1995

1995

1994

27-OCT-17

2017

1917

2001

27-OCT-17

2017

2017

Introduo ao Oracle: SQL e PL/SQL 3-36

Funo NVL
Converte nulo para um valor real
Os tipos de dados que podem ser usados
so data, caractere e nmero.
Os tipos de dados devem corresponder com
NVL(comm,0)
NVL(hiredate,'01-JAN-97')
NVL(job,'No Job Yet')

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

3-37

A Funo NVL
Para converter um valor nulo para um valor real, use a funo NVL.
Syntax
NVL (expr1, expr2)

onde:

expr1

o valor de origem ou expresso que pode conter nulo

expr2

o valor de destino para a converso de nulo

Voc pode usar a funo NVL para converter qualquer tipo de dados, porm o valor de devoluo
sempre o mesmo do tipo de dados da expr1.
Converses NVL para Vrios Tipos de Dados
Tipo de dados

Exemplo de Converso

NUMBER

NVL(number_column,9)

DATE

NVL(date_column, '01-JAN-95')

CHAR ou VARCHAR2

NVL(character_column, 'Unavailable')

Introduo ao Oracle: SQL e PL/SQL 3-37

Usando a Funo NVL


SQL> SELECT ename, sal, comm, (sal*12)+NVL(comm,0)
2 FROM
emp;
ENAME
SAL
COMM (SAL*12)+NVL(COMM,0)
---------- --------- --------- -------------------KING
5000
60000
BLAKE
2850
34200
CLARK
2450
29400
JONES
2975
35700
MARTIN
1250
1400
16400
ALLEN
1600
300
19500
...
14 rows selected.

3-38

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funo NVL
Para calcular a remunerao anual de todos os funcionrios, voc precisa multiplicar o salrio mensal
por 12 e, em seguida, adicionar a comisso.
SQL> SELECT ename, sal, comm, (sal*12)+comm
2 FROM
emp;
ENAME
SAL
COMM (SAL*12)+COMM
---------- --------- --------- ------------KING
5000
BLAKE
2850
CLARK
2450
JONES
2975
MARTIN
1250
1400
16400
...
14 rows selected.

Note que a remunerao anual calculada somente para aqueles funcionrios que recebem uma
comisso. Se qualquer valor de coluna na expresso for nulo, o resultado ser nulo. Para calcular
valores para todos os funcionrios, voc deve converter o valor nulo para um nmero antes de aplicar
o operador aritmtico. No exemplo do slide, a funo para NVL usada para converter valores nulos
para zero.

Introduo ao Oracle: SQL e PL/SQL 3-38

Funo DECODE
Facilita pesquisas condicionais realizando
o trabalho de uma instruo CASE ou IFTHEN-ELSE
DECODE(col/express, pesquisa1, resultado1
[, pesquisa2, resultado2,...,]
[, default])

3-39

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Funo DECODE
A funo DECODE decodifica uma expresso de um modo similar lgica IF-THEN-ELSE usada
em diversas linguagens. A funo DECODE decodifica a expresso aps compar-la a cada valor de
pesquisa. Se a expresso for a mesma da pesquisa, o resultado retornado.
Se o valor default for omitido, ser retornado um valor nulo onde um valor de pesquisa no
corresponde a quaisquer valores de resultado.

Introduo ao Oracle: SQL e PL/SQL 3-39

Usando a Funo DECODE


SQL> SELECT job, sal,
2
DECODE(job, 'ANALYST',
3
'CLERK',
4
'MANAGER',
5
6
REVISED_SALARY
7 FROM
emp;

SAL*1.1,
SAL*1.15,
SAL*1.20,
SAL)

JOB
SAL REVISED_SALARY
--------- --------- -------------PRESIDENT
5000
5000
MANAGER
2850
3420
MANAGER
2450
2940
...
14 rows selected.

3-40

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando a Funo DECODE


Na instruo SQL acima, o valor de JOB est decodificado. Se JOB for ANALYST, o aumento de
salrio de 10%; se JOB for CLERK, o aumento de salrio de 15%; se JOB for MANAGER, o
aumento de salrio de 20%. Para todas as outras funes de trabalho, no h aumento de salrio.
A mesma instruo pode ser escrita como uma instruo IF-THEN-ELSE:
IF job =
IF job =
IF job =
ELSE sal

'ANALYST'
'CLERK'
'MANAGER'
= sal

THEN
THEN
THEN

sal = sal*1.1
sal = sal*1.15
sal = sal*1.20

Introduo ao Oracle: SQL e PL/SQL 3-40

Usando a Funo DECODE


Exibir a taxa de imposto aplicvel para cada
funcionrio do departamento 30.
SQL> SELECT ename, sal,
2
DECODE(TRUNC(sal/1000, 0),
3
0, 0.00,
4
1, 0.09,
5
2, 0.20,
6
3, 0.30,
7
4, 0.40,
8
5, 0.42,
9
6, 0.44,
10
0.45) TAX_RATE
11 FROM
emp
12 WHERE
deptno = 30;

3-41

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exemplo
O slide mostra outro exemplo usando a funo DECODE. Neste exemplo, determinamos a taxa de
imposto para cada funcionrio do departamento 30 com base no salrio mensal. As taxas de imposto
so mencionadas por valores na tabela a seguir.
Faixa Salarial Mensal

Taxa

US$0,00 - 999,99

0%

US$1.000,00 - 1.999,99

9%

US$2.000,00 - 2.999,99

20%

US$3.000,00 - 3.999,99

30%

US$4.000,00 - 4.999,99
US$5.000,00 - 2.999,99

40%
42%

US$6.000,00 - 6.999,99

44%

US$7.000,00 ou superior

45%

ENAME
SAL TAX_RATE
---------- --------- --------BLAKE
2850
.2
MARTIN
1250
.09
ALLEN
1600
.09
TURNER
1500
.09
...
6 rows selected.
Introduo ao Oracle: SQL e PL/SQL 3-41

Aninhando Funes
As funes de uma nica linha podem ser
aninhadas em qualquer nvel.
Funes aninhadas so avaliadas a partir do
nvel mais interno para o nvel mais externo.

F3(F2(F1(col,arg1),arg2),arg3)
Etapa 1 = Resultado 1
Etapa 2 = Resultado 2
Etapa 3 = Resultado 3

3-42

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Aninhando Funes
As funes de uma nica linha podem ser aninhadas em qualquer nvel. As funes aninhadas so
avaliadas desde o nvel mais interno at o mais externo. Alguns exemplos a seguir mostram a
flexibilidade dessas funes.

Introduo ao Oracle: SQL e PL/SQL 3-42

Aninhando Funes

SQL> SELECT
2
3 FROM
4 WHERE

ename,
NVL(TO_CHAR(mgr),'No Manager')
emp
mgr IS NULL;

ENAME
NVL(TO_CHAR(MGR),'NOMANAGER')
---------- ----------------------------KING
No Manager

3-43

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Aninhando Funes (continuao)


O exemplo do slide exibe o presidente da empresa, que no possui nenhum gerente. A avaliao da
instruo SQL envolve duas etapas:
1. Avaliar a funo interna a fim de converter um valor de nmero para uma string de caractere.
Result1 = TO_CHAR(mgr)
2. Avaliar a funo externa a fim de substituir o valor nulo com uma string de texto.
NVL(Result1, 'No Manager')
A expresso inteira transforma-se no cabealho da coluna, pois no foi fornecido nenhum apelido de
coluna.
Exemplo
Exibir a data da prxima sexta-feira, que fica seis meses aps a data de admisso. A data resultante
deve aparecer como Friday, March 12th, 1982. Ordenar os resultados por data de admisso.
SQL> SELECT
TO_CHAR(NEXT_DAY(ADD_MONTHS
2
(hiredate, 6), 'FRIDAY'),
3
'fmDay, Month ddth, YYYY')
4
"Next 6 Month Review"
5 FROM
emp
6 ORDER BY hiredate;

Introduo ao Oracle: SQL e PL/SQL 3-43

Sumrio
Use as funes para realizar o seguinte:
Executar clculos usando dados
Modificar itens de dados individuais
Manipular sada para grupos de linhas
Alterar formatos de data para exibio
Converter tipos de dados de coluna

3-44

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Uma nica Linha


As funes de uma nica linha podem ser aninhadas em qualquer nvel. As funes de uma nica
linha podem manipular o seguinte:

Dados de caractere: LOWER, UPPER, INITCAP, CONCAT, SUBSTR, INSTR, LENGTH

Dados de nmero: ROUND, TRUNC, MOD

Dados de data: MONTHS_BETWEEN, ADD_MONTHS, NEXT_DAY, LAST_DAY,


ROUND, TRUNC

Valores de data podem tambm usar operadores aritmticos.

As funes de converso podem converter valores de caractere, de data e numrico:


TO_CHAR, TO_DATE, TO_NUMBER

SYSDATE e DUAL
SYSDATE uma funo de data que retorna a data e a hora atual. Costuma-se selecionar SYSDATE
em uma tabela fictcia chamada DUAL.

Introduo ao Oracle: SQL e PL/SQL 3-44

Viso Geral do Exerccio


Criando consultas que exigem o uso de
funes numricas, de caractere e de data
Usando concatenao com funes
Criando consultas que diferenciam entre
letras maisculas e minsculas para testar
a utilidade das funes de caractere
Executando clculos de anos e meses de
servio de um funcionrio
Determinando a data de reviso para um
funcionrio
3-45

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Este exerccio desenvolvido para oferecer a voc uma variedade de exerccios usando diferentes
funes disponveis para tipos de dados de caractere, de nmero e data.
Lembre-se que para funes aninhadas, os resultados so avaliados a partir da funo mais interna
para a funo mais externa.

Introduo ao Oracle: SQL e PL/SQL 3-45

Exerccio 3
1. Crie uma consulta para exibir a data atual. Coloque um label na coluna Date.
Date
--------28-OCT-97

2. Exiba o nmero do funcionrio, o nome, o salrio e o aumento salarial de 15% expresso como
nmero inteiro. Coloque um label na coluna New Salary. Salve a instruo SQL em um arquivo
nomeado p3q2.sql.
3. Execute a consulta no arquivo p3q2.sql.
EMPNO ENAME
SAL New Salary
----- ------- ----- ---------7839 KING
5000
5750
7698 BLAKE
2850
3278
7782 CLARK
2450
2818
7566 JONES
2975
3421
7654 MARTIN
1250
1438
7499 ALLEN
1600
1840
7844 TURNER
1500
1725
7900 JAMES
950
1093
7521 WARD
1250
1438
7902 FORD
3000
3450
7369 SMITH
800
920
7788 SCOTT
3000
3450
7876 ADAMS
1100
1265
7934 MILLER
1300
1495
14 rows selected.

4. Modifique a consulta p3q2.sql para adicionar uma coluna que subtrair o salrio antigo do
novo salrio. Coloque um label na coluna Increase. Execute novamente a consulta.
EMPNO ENAME
SAL New Salary Increase
----- ------ ----- ---------- -------7839 KING
5000
5750
750
7698 BLAKE
2850
3278
428
7782 CLARK
2450
2818
368
7566 JONES
2975
3421
446
7654 MARTIN 1250
1438
188
7499 ALLEN
1600
1840
240
7844 TURNER 1500
1725
225
7900 JAMES
950
1093
143
. . .
14 rows selected.

Introduo ao Oracle: SQL e PL/SQL 3-46

Exerccio 3 (continuao)
5. Exibe o nome do funcionrio, a data de admisso, que a primeira segunda-feira aps seis
meses de servio. Coloque um label na coluna REVIEW. Formate as datas que aparecem em
formato semelhante a "Sunday, the Seventh of September, 1981".
ENAME
----KING
BLAKE
CLARK
JONES
MARTIN
ALLEN
TURNER
JAMES
WARD
FORD
SMITH
SCOTT
ADAMS
MILLER

HIREDATE
-------17-NOV-81
01-MAY-81
09-JUN-81
02-APR-81
28-SEP-81
20-FEB-81
08-SEP-81
03-DEC-81
22-FEB-81
03-DEC-81
17-DEC-80
09-DEC-82
12-JAN-83
23-JAN-82

REVIEW
-------------------------------------Monday, the Twenty-Fourth of May, 1982
Monday, the Second of November, 1981
Monday, the Fourteenth of December, 1981
Monday, the Fifth of October, 1981
Monday, the Twenty-Ninth of March, 1982
Monday, the Twenty-Fourth of August, 1981
Monday, the Fifteenth of March, 1982
Monday, the Seventh of June, 1982
Monday, the Twenty-Fourth of August, 1981
Monday, the Seventh of June, 1982
Monday, the Twenty-Second of June, 1981
Monday, the Thirteenth of June, 1983
Monday, the Eighteenth of July, 1983
Monday, the Twenty-Sixth of July, 1982

14 rows selected.

6. Para cada funcionrio exiba o nome do mesmo e calcule o nmero de meses entre hoje e a sua
data de admisso. Coloque um label na coluna MONTHS_WORKED. Ordene os resultados
por nmero de meses empregado. Arredonde para cima o nmero de meses para o nmero
inteiro mais prximo.
ENAME
------ADAMS
SCOTT
MILLER
JAMES
FORD
KING
MARTIN
TURNER
CLARK
BLAKE
JONES
WARD
ALLEN
SMITH

MONTHS_WORKED
------------177
178
188
190
190
191
192
193
196
197
198
199
199
202

14 rows selected

Introduo ao Oracle: SQL e PL/SQL 3-47

Exerccio 3 (continuao)
7. Crie uma consulta que produza as seguintes informaes para cada funcionrio: <nome do
funcionrio> recebe <salrio> mensalmente mas deseja <salrio multiplicado por 3>. Coloque
um label na coluna.
Dream Salaries
---------------------------------------------------KING earns $5,000.00 monthly but wants $15,000.00.
BLAKE earns $2,850.00 monthly but wants $8,550.00.
CLARK earns $2,450.00 monthly but wants $7,350.00.
JONES earns $2,975.00 monthly but wants $8,925.00.
MARTIN earns $1,250.00 monthly but wants $3,750.00.
ALLEN earns $1,600.00 monthly but wants $4,800.00
TURNER earns $1,500.00 monthly but wants $4,500.00.
JAMES earns $950.00 monthly but wants $2,850.00.
WARD earns $1,250.00 monthly but wants $3,750.00.
FORD earns $3,000.00 monthly but wants $9,000.00.
SMITH earns $800.00 monthly but wants $2,400.00.
SCOTT earns $3,000.00 monthly but wants $9,000.00.
ADAMS earns $1,100.00 monthly but wants $3,300.00
MILLER earns $1,300.00 monthly but wants $3,900.00.
14 rows selected.

Se voc tiver tempo, complete os exerccios abaixo:


8. Crie uma consulta que exiba o nome e o salrio de todos os funcionrios. Formate o salrio
para ter 15 caracteres e apresentar o sinal US$ esquerda. Coloque um label na coluna
SALARY.
ENAME
SALARY
-------- --------------SMITH
$$$$$$$$$$$$800
ALLEN
$$$$$$$$$$$1600
WARD
$$$$$$$$$$$1250
JONES
$$$$$$$$$$$2975
MARTIN
$$$$$$$$$$$1250
BLAKE
$$$$$$$$$$$2850
CLARK
$$$$$$$$$$$2450
SCOTT
$$$$$$$$$$$3000
KING
$$$$$$$$$$$5000
TURNER
$$$$$$$$$$$1500
ADAMS
$$$$$$$$$$$1100
JAMES
$$$$$$$$$$$$950
FORD
$$$$$$$$$$$3000
MILLER
$$$$$$$$$$$1300
14 rows selected.

Introduo ao Oracle: SQL e PL/SQL 3-48

Exerccio 3 (continuao)
9. Crie uma consulta que exibir o nome do funcionrio com a primeira letra maiscula e todas as
outras minsculas, bem como o tamanho de seus nomes, para todos os funcionrios cujo nome
comea com J, A ou M. Fornea a cada coluna um label apropriado.
Name
Length
------- -----Jones
5
Martin
6
Allen
5
James
5
Adams
5
Miller
6
6 rows selected.

10. Exiba o nome, a data de admisso e o dia da semana em que o funcionrio comeou a
trabalhar. Coloque um label na coluna DAY. Ordene os resultados por dia da semana,
iniciando por Segunda.
ENAME
HIREDATE
------ --------MARTIN 28-SEP-81
CLARK 09-JUN-81
KING
17-NOV-81
TURNER 08-SEP-81
SMITH 17-DEC-80
ADAMS 12-JAN-83
JONES 02-APR-81
FORD
03-DEC-81
SCOTT 09-DEC-82
JAMES 03-DEC-81
ALLEN 20-FEB-81
BLAKE 01-MAY-81
MILLER 23-JAN-82
WARD
22-FEB-81
14 rows selected.

DAY
----------MONDAY
TUESDAY
TUESDAY
TUESDAY
WEDNESDAY
WEDNESDAY
THURSDAY
THURSDAY
THURSDAY
THURSDAY
FRIDAY
FRIDAY
SATURDAY
SUNDAY

Introduo ao Oracle: SQL e PL/SQL 3-49

Exerccio 3 (continuao)
Se voc quiser mais desafios, complete os exerccios abaixo:
11. Crie uma consulta que exibir o nome do funcionrio e o valor da comisso. Se o funcionrio
no receber comisso, coloque "No Commission". Coloque um label na coluna COMM.
ENAME
-----SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

COMM
----------No Commission
300
500
No Commission
1400
No Commission
No Commission
No Commission
No Commission
0
No Commission
No Commission
No Commission
No Commission

14 rows selected.

12. Crie uma consulta que exiba os nomes dos funcionrios e indique as quantias de seus salrios
atravs de asteriscos. Cada asterisco representa cem dlares. Classifique os dados em ordem
decrescente de salrio. Coloque um label na coluna EMPLOYEE_AND_THEIR_SALARIES.
EMPLOYEE_AND_THEIR_SALARIES
----------------------------------------------------------KING
**************************************************
FORD
******************************
SCOTT
******************************
JONES
*****************************
BLAKE
****************************
CLARK
************************
ALLEN
****************
TURNER
***************
MILLER
*************
MARTIN
************
WARD
************
ADAMS
***********
JAMES
*********
SMITH
********
14 rows selected.

Introduo ao Oracle: SQL e PL/SQL 3-50

Exerccio 3 (continuao)
Se voc quiser mais desafios, complete o exerccio a seguir:
13. Crie uma consulta que exiba o grau para todos os funcionrios com base no valor da coluna JOB,
conforme a tabela mostrada abaixo:
JOB

GRADE

PRESIDENT

MANAGER

ANALYST

SALESMAN

CLERK

None of the above

JOB

GRADE

--------- ----CLERK

SALESMAN

SALESMAN

MANAGER

SALESMAN

MANAGER

MANAGER

ANALYST

PRESIDENT A
SALESMAN

CLERK

CLERK

ANALYST

CLERK

14 rows selected.

Introduo ao Oracle: SQL e PL/SQL 3-51

Introduo ao Oracle: SQL e PL/SQL 3-52

4
Exibindo Dados de
Vrias Tabelas

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Criar instrues SELECT para obter acesso
aos dados a partir de mais de uma tabela
usando as junes idnticas e noidnticas
Visualizar dados que, em geral, no
correspondem a uma condio de juno
usando junes externas
Unindo uma tabela a ela mesma
4-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Esta lio aborda como obter dados a partir de uma ou mais tabelas, usando diferentes mtodos
disponveis.

Introduo ao Oracle: SQL e PL/SQL 4-2

Obtendo Dados de Vrias Tabelas


EMP
EMPNO
-----7839
7698
...
7934

DEPT
ENAME
----KING
BLAKE

... DEPTNO
... -----...
10
...
30

MILLER ...

10

DEPTNO
-----10
20
30
40

DNAME
---------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
-------NEW YORK
DALLAS
CHICAGO
BOSTON

EMPNO DEPTNO LOC


----- ------- -------7839
10 NEW YORK
7698
30 CHICAGO
7782
10 NEW YORK
7566
20 DALLAS
7654
30 CHICAGO
7499
30 CHICAGO
...
14 rows selected.
4-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Dados de Vrias Tabelas


Algumas vezes necessrio utilizar dados a partir de uma ou mais tabelas. No exemplo do slide, o
relatrio exibe dados a partir de duas tabelas separadas.

EMPNO existe na tabela EMP.

DEPTNO existe nas tabelas EMP e DEPT.

LOC existe na tabela DEPT.

Para produzir o relatrio, voc precisa vincular as tabelas EMP e DEPT e ter acesso aos dados
das duas.

Introduo ao Oracle: SQL e PL/SQL 4-3

O Que uma Juno?


Use uma juno para consultar dados a partir
de uma ou mais tabelas.
SELECT
FROM
WHERE

tabela1.coluna, tabela2.coluna
tabela1, tabela2
tabela1.coluna1 = tabela2.coluna2;

Criar uma condio de juno na clusula


WHERE.
Prefixar o nome da coluna com o nome da
tabela quando o mesmo nome da coluna
aparecer em mais de uma tabela.
4-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Definindo Junes
Quando so necessrios dados de uma ou mais tabelas no banco de dados, usa-se uma condio de
juno. As linhas de uma tabela podem ser unidas s linhas de outra tabela de acordo com os valores
comuns existentes nas colunas correspondentes, isto , em geral colunas de chave primria e
estrangeira.
Para exibir dados a partir de uma ou mais tabelas relacionadas, crie uma condio de juno simples
na clusula WHERE.
Na sintaxe:
tabela1.coluna

denota a tabela e a coluna a partir das quais recupera-se os dados

tabela1.coluna1 =
tabela2.coluna2

a condio que junta (ou relaciona) tabelas

Diretrizes
Ao criar uma instruo SELECT que una tabelas, anteceda o nome da coluna com o nome da
tabela a fim de esclarecer e avanar o acesso ao banco de dados.
Caso aparea o mesmo nome da coluna em mais de uma tabela, o nome da coluna deve estar
prefixado com o nome da tabela.

Para juntar n tabelas, necessrio um mnimo de (n-1) condies de juno. Assim, para juntar
quatro tabelas, necessrio um mnimo de trs junes. Esta regra pode no se aplicar se sua
tabela possuir uma chave primria concatenada, no caso de mais de uma coluna ser necessria
para identificar exclusivamente cada linha.
Para obter mais informaes, consulte o Oracle Server SQL Reference Manual, Release 8, "SELECT".
Introduo ao Oracle: SQL e PL/SQL 4-4

Produto Cartesiano
Um produto cartesiano formado quando:
Uma condio de juno estiver omitida
Uma condio de juno estiver invlida
Todas as linhas na primeira tabela esto

unidas a todas as linhas da segunda


tabela
Para evitar um produto Cartesiano, sempre
inclua uma condio de juno vlida em
uma clusula WHERE.

4-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Produto Cartesiano
Quando uma condio de juno for completamente invlida ou omitida, o resultado um produto
Cartesiano no qual sero exibidas todas as combinaes de linhas. Todas as linhas da primeira tabela
esto unidas a todas as linhas da segunda.
Um produto Cartesiano tende a gerar um grande nmero de linhas e seu resultado raramente til.
Voc deve sempre incluir uma condio de juno em uma clusula WHERE, a menos que tenha uma
necessidade especfica de combinar todas as linhas de todas as tabelas.

Introduo ao Oracle: SQL e PL/SQL 4-5

Gerando um Produto Cartesiano


EMP (14 linhas)
EMPNO
-----7839
7698
...
7934

ENAME
----KING
BLAKE

... DEPTNO
... -----...
10
...
30

MILLER ...

"Produto
Cartesiano:
14*4=56 linhas"

4-6

DEPT (4 linhas)

10

DEPTNO
-----10
20
30
40

DNAME
---------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
-------NEW YORK
DALLAS
CHICAGO
BOSTON

ENAME
DNAME
--------------KING
ACCOUNTING
BLAKE
ACCOUNTING
...
KING
RESEARCH
BLAKE
RESEARCH
...
56 rows selected.

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Produto Cartesiano (continuao)


Gera-se um produto Cartesiano caso uma condio de juno seja omitida. O exemplo do slide exibe
o nome do funcionrio e do departamento a partir das tabelas EMP e DEPT. Porque nenhuma
clusula WHERE foi especificada, todas as linhas (14 linhas) da tabela EMP so unidas a todas as
linhas (4 linhas) na tabela DEPT, gerando dessa forma 56 linhas na sada.
SQL> SELECT
2 FROM

ename, dname
emp, dept;

ENAME
DNAME
---------- -------------KING
ACCOUNTING
BLAKE
ACCOUNTING
...
KING
RESEARCH
BLAKE
RESEARCH
...
56 rows selected.

Introduo ao Oracle: SQL e PL/SQL 4-6

Tipos de Junes
Juno
idntica

4-7

Juno
no-idntica

Juno
externa

Autojuno

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tipos de Junes
H dois tipos principais de condies de juno:

Junes idnticas

Junes no-idnticas

Mtodos de juno adicional incluem o seguinte:

Junes externas

Autojunes

Operadores de conjunto

Observao: Os operadores de conjunto no so abordados neste curso. Eles so abordados em


outro curso SQL.

Introduo ao Oracle: SQL e PL/SQL 4-7

O Que uma Juno Idntica?


EMP

DEPT

EMPNO ENAME
DEPTNO
------ ------- ------7839 KING
10
7698 BLAKE
30
7782 CLARK
10
7566 JONES
20
7654 MARTIN
30
7499 ALLEN
30
7844 TURNER
30
7900 JAMES
30
7521 WARD
30
7902 FORD
20
7369 SMITH
20
...
14 rows selected.
Chave estrangeira
4-8

DEPTNO
------10
30
10
20
30
30
30
30
30
20
20
...
14 rows

DNAME
---------ACCOUNTING
SALES
ACCOUNTING
RESEARCH
SALES
SALES
SALES
SALES
SALES
RESEARCH
RESEARCH

LOC
-------NEW YORK
CHICAGO
NEW YORK
DALLAS
CHICAGO
CHICAGO
CHICAGO
CHICAGO
CHICAGO
DALLAS
DALLAS

selected.

Chave primria

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Junes idnticas
Para determinar o nome do departamento de um funcionrio, compare o valor na coluna DEPTNO na
tabela EMP com os valores DEPTNO da tabela DEPT. O relacionamento entre as tabelas EMP e
DEPT uma juno idntica ou seja, os valores da coluna DEPTNO das duas tabelas devem ser
iguais. Com freqncia, essa juno envolve complementos de chave primria e estrangeira.
Observao: As junes idnticas tambm so chamadas de junes simples ou junes internas.

Introduo ao Oracle: SQL e PL/SQL 4-8

Recuperando Registros com


Junes Idnticas
SQL> SELECT
2
3 FROM
4 WHERE

emp.empno,
emp.ename, emp.deptno,
dept.deptno, dept.loc
emp, dept
emp.deptno=dept.deptno;

EMPNO ENAME DEPTNO DEPTNO LOC


----- ------ ------ ------ --------7839 KING
10
10 NEW YORK
7698 BLAKE
30
30 CHICAGO
7782 CLARK
10
10 NEW YORK
7566 JONES
20
20 DALLAS
...
14 rows selected.

4-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Recuperando Registros com Junes Idnticas


No exemplo do slide:

A clusula SELECT especifica os nomes de coluna a recuperar:


nome do funcionrio, nmero do funcionrio e nmero do departamento, que
so as colunas na tabela EMP
nmero do departamento, nome do departamento e localizao, que so as
colunas na tabela DEPT

A clusula FROM especifica as duas tabelas que o banco de dados deve acessar:
tabela EMP
tabela DEPT

A clusula WHERE especifica como as tabelas sero unidas:


EMP.DEPTNO=DEPT.DEPTNO

Porque a coluna DEPTNO comum s duas tabelas, ela deve estar prefixada pelo nome
da tabela a fim de evitar ambigidade.

Introduo ao Oracle: SQL e PL/SQL 4-9

Qualificando Nomes de
Coluna Ambguos
Use os prefixos de tabela para qualificar
nomes de coluna que esto em vrias
tabelas.
Melhore o desempenho usando os prefixos
de tabela.
Diferencie colunas que possuem nomes
idnticos, mas que residam em tabelas
diferentes usando apelidos de coluna.

4-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Qualificando Nomes de Coluna Ambguos


Voc precisa qualificar os nomes das colunas na clusula WHERE com o nome da coluna a fim de
evitar ambigidade. Sem os prefixos de tabela, a coluna DEPTNO pode vir tanto da tabela DEPT
quanto da EMP. necessrio adicionar o prefixo da tabela para executar a consulta.
Se no houver nenhum nome de coluna comum entre as duas tabelas, no haver necessidade de
qualificar as colunas. No entanto, voc obter um melhor desempenho usando o prefixo da tabela,
pois informa ao Oracle Server exatamente onde ir para localizar colunas.
A necessidade de qualificar nomes de coluna ambguos tambm aplicvel s colunas que podem
estar ambguas em outras clusulas, tais como a clusula SELECT ou a ORDER BY.

Introduo ao Oracle: SQL e PL/SQL 4-10

Condies de Pesquisa Adicional


Usando o Operador AND
EMP

DEPT

EMPNO ENAME
DEPTNO
------ ------- ------7839 KING
10
7698 BLAKE
30
7782 CLARK
10
7566 JONES
20
7654 MARTIN
30
7499 ALLEN
30
7844 TURNER
30
7900 JAMES
30
7521 WARD
30
7902 FORD
20
7369 SMITH
20
...
14 rows selected.

DEPTNO DNAME
------ --------10 ACCOUNTING
30 SALES
10 ACCOUNTING
20 RESEARCH
30 SALES
30 SALES
30 SALES
30 SALES
30 SALES
20 RESEARCH
20 RESEARCH
...
14 rows selected.

4-11

LOC
-------NEW YORK
CHICAGO
NEW YORK
DALLAS
CHICAGO
CHICAGO
CHICAGO
CHICAGO
CHICAGO
DALLAS
DALLAS

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Condies de Pesquisa Adicional


Alm da juno, possvel ter critrios para a clusula WHERE. Por exemplo, para exibir o nmero
de funcionrio, o nome, o nmero de departamento e a localizao do departamento do funcionrio
King, voc precisa de uma condio adicional na clusula WHERE.
SQL>
2
3
4

SELECT
FROM
WHERE
AND

empno, ename, emp.deptno, loc


emp, dept
emp.deptno = dept.deptno
INITCAP(ename) = 'King';

EMPNO ENAME
DEPTNO LOC
--------- ---------- --------- ------------7839 KING
10 NEW YORK

Introduo ao Oracle: SQL e PL/SQL 4-11

Usando Apelidos de Tabela


Simplifique consultas usando apelidos de tabela.
SQL> SELECT emp.empno,
emp.ename, emp.deptno,
2
dept.deptno, dept.loc
3 FROM
emp, dept
4 WHERE emp.deptno=dept.deptno;
SQL> SELECT e.empno, e.ename, e.deptno,
2
d.deptno, d.loc
3 FROM
emp e,
dept d
4 WHERE e.deptno= d.deptno;

4-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Apelidos de Tabela
Qualificar nomes de coluna com nomes de tabela pode consumir muito tempo, principalmente se os
nomes da tabela forem extensos. Voc pode usar apelidos de tabela no lugar de nomes de tabela. Da
mesma forma que um apelido de coluna fornece um outro nome coluna, um apelido de tabela fornece
um outro nome tabela. Os apelidos de tabela ajudam a manter o cdigo SQL menor, usando dessa
forma menos memria.
No exemplo, note como os apelidos de tabela so identificados na clusula FROM. O nome de tabela
especificado integralmente, seguido de um espao e, em seguida, do apelido da tabela.
A tabela EMP recebeu o apelido E, enquanto a tabela DEPT tem o apelido D.
Diretrizes

Os apelidos de tabela podem ter um tamanho de at 30 caracteres, porm quanto menores,


melhores.

Se um apelido de tabela for usado para um determinado nome de tabela na clusula FROM, ento
aquele apelido de tabela deve ser substitudo para o nome da tabela em toda a instruo SELECT.

Apelidos de tabela devem ser significativos.

O apelido de tabela vlido somente para a instruo SELECT atual.

Introduo ao Oracle: SQL e PL/SQL 4-12

Unindo Mais de Duas Tabelas


CUSTOMER

ORD

NAME
CUSTID
---------------JOCKSPORTS
100
TKB SPORT SHOP
101
VOLLYRITE
102
JUST TENNIS
103
K+T SPORTS
105
SHAPE UP
106
WOMENS SPORTS
107
...
...
9 rows selected.

4-13

CUSTID
ORDID
------- ------101
610
102
611
104
612
106
601
102
602
ITEM
106
604
ORDID ITEMID
106
605
------ ------...
610
3
21 rows selected.
611
1
612
1
601
1
602
1
...
64 rows selected.

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Condies de Pesquisa Adicional


Algumas vezes voc pode precisar unir mais de duas tabelas. Por exemplo, para exibir o nome, a
colocao das ordens, os nmeros de item, o total para cada item e o total para cada ordem para o
cliente TKB SPORT SHOP, voc ter de unir as tabelas CUSTOMER, ORD e ITEM.
SQL>
2
3
4
5

SELECT
FROM
WHERE
AND
AND

c.name, o.ordid, i.itemid, i.itemtot, o.total


customer c, ord o, item i
c.custid = o.custid
o.ordid =
i.ordid
c.name = 'TKB SPORT SHOP';

NAME
ORDID
ITEMID
ITEMTOT
TOTAL
------------ --------- --------- --------- --------TKB SPORT SHOP
610
3
58
101.4
TKB SPORT SHOP
610
1
35
101.4
TKB SPORT SHOP
610
2
8.4
101.4

Introduo ao Oracle: SQL e PL/SQL 4-13

Junes No-idnticas
EMP

SALGRADE

EMPNO ENAME
SAL
------ ------- -----7839 KING
5000
7698 BLAKE
2850
7782 CLARK
2450
7566 JONES
2975
7654 MARTIN
1250
7499 ALLEN
1600
7844 TURNER
1500
7900 JAMES
950
...
14 rows selected.

4-14

GRADE LOSAL HISAL


----- ----- -----1
700
1200
2
1201
1400
3
1401
2000
4
2001
3000
5
3001
9999

"o salrio na tabela EMP


est entre salrio inferior
e salrio superior na
tabela SALGRADE"

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Junes No-Idnticas
O relacionamento entre a tabela EMP e a tabela SALGRADE uma juno no-idntica, o que
significa que nenhuma coluna da tabela EMP corresponde diretamente a uma coluna da tabela
SALGRADE. O relacionamento entre as duas tabelas que a coluna SAL da tabela EMP est
entre a coluna LOSAL e HISAL da tabela SALGRADE. O relacionamento obtido usando um
outro operador que no o igual (=).

Introduo ao Oracle: SQL e PL/SQL 4-14

Recuperando Registros com


Junes No-idnticas
SQL>
2
3
4

SELECT
FROM
WHERE
BETWEEN

e.ename, e.sal, s.grade


emp e,
salgrade s
e.sal
s.losal AND s.hisal;

ENAME
SAL
GRADE
---------- --------- --------JAMES
950
1
SMITH
800
1
ADAMS
1100
1
...
14 rows selected.

4-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Junes No-Idnticas (continuao)


O exemplo do slide cria uma juno no-idntica para avaliar uma classificao de salrio do
funcionrio.
O salrio deve estar entre qualquer par de faixas salariais inferior ou superior.
importante notar que todos os funcionrios aparecem exatamente uma vez quando esta consulta
executada. Nenhum funcionrio repetido na lista. H dois motivos para isto:
Nenhuma das linhas na tabela de classificao salarial possui classificaes que se sobrepem.
Isto , o valor do salrio para um funcionrio pode estar somente entre valores salariais
superiores e inferiores de uma das linhas tabela de classificao salarial.
Todos os salrios dos funcionrios esto entre limites fornecidos pela tabela de classificao
salarial. Ou seja, nenhum funcionrio ganha menos que o valor contido na coluna LOSAL ou
mais que o valor mais alto contido na coluna HISAL.
Observao: Outros operadores tais como <= e >= podem ser utilizados, porm BETWEEN o mais
simples. Lembre-se de especificar o primeiro valor inferior e o ltimo valor superior ao usar
BETWEEN. Foram especificados apelidos de tabela por motivos de desempenho, no por causa da
possibilidade de ambigidade.

Introduo ao Oracle: SQL e PL/SQL 4-15

Junes Externas
DEPT

EMP
ENAME
----KING
BLAKE
CLARK
JONES
...

DEPTNO
-----10
30
10
20

DEPTNO
-----10
30
10
20
...
40

DNAME
---------ACCOUNTING
SALES
ACCOUNTING
RESEARCH
OPERATIONS

Nenhum funcionrio do
departamento OPERATIONS

4-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Retornando Registros sem Correspondncia Direta com as Junes Externas


Se uma linha no satisfizer uma condio de juno, a linha no aparecer no resultado da consulta.
Por exemplo, na condio de juno idntica das tabelas EMP e DEPT, o departamento
OPERATIONS no aparece porque ningum trabalha neste departamento.
SQL> SELECT e.ename, e.deptno, d.dname
2 FROM
emp e,
dept d
3 WHERE e.deptno = d.deptno;
ENAME
DEPTNO
---------- --------KING
10
BLAKE
30
CLARK
10
JONES
20
...
ALLEN
30
TURNER
30
JAMES
30
...
14 rows selected.

DNAME
------------ACCOUNTING
SALES
ACCOUNTING
RESEARCH
SALES
SALES
SALES

Introduo ao Oracle: SQL e PL/SQL 4-16

Junes Externas
Use uma juno externa para consultar
tambm todas as linhas que em geral no
atendem condio de juno.
O operador de juno externo um sinal
de adio (+).
SELECT tabela1.coluna, tabela2.coluna
FROM
tabela1, tabela2
WHERE tabela1.coluna(+) = tabela2.coluna;
SELECT tabela1.coluna , tabela2.coluna
FROM
tabela1, tabela2
WHERE tabela1.coluna = tabela2.coluna(+);

4-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Retornando Registros sem Correspondncia Direta com as Junes Externas


(continuao)
A(s) linha(s) ausente(s) pode(m) ser retornada(s) se um operador de juno externa for utilizado na
condio de juno. O operador um sinal de adio entre parnteses (+), e colocado ao "lado" da
juno que est com informao insuficiente. Este operador possui o efeito de criar uma ou mais
linhas nulas, para qual uma ou mais linhas da tabela no-deficiente pode ser unida.
Na sintaxe:
tabela1.coluna =
tabela2.coluna (+)

a condio que une (ou relaciona) as tabelas.


o smbolo de juno externa, que pode ser colocado em
qualquer lado da condio da clusula WHERE, mas no dos dois
lados (Coloque o smbolo de juno externa seguindo o nome da
coluna na tabela sem linhas correspondidas.)

Introduo ao Oracle: SQL e PL/SQL 4-17

Usando Junes Externas


SQL>
2
3
4

SELECT
FROM
WHERE
ORDER BY

e.ename, d.deptno, d.dname


emp e,
dept d
e.deptno(+) = d.deptno
e.deptno;

ENAME
DEPTNO DNAME
---------- --------- ------------KING
10 ACCOUNTING
CLARK
10 ACCOUNTING
...
40 OPERATIONS
15 rows selected.

4-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Retornando Registros sem Correspondncia Direta com as Junes Externas


(continuao)
O exemplo do slide exibe nmeros e nomes para todos os departamentos. O departamento
OPERATIONS, que no possui nenhum funcionrio, tambm exibido.
Restries da Juno Externa

O operador da juno externa pode aparecer somente de um lado da expresso o lado que
possui informaes ausentes. Ele retorna estas linhas de uma tabela que no possui
correspondncia direta em outra tabela.

Uma condio envolvendo uma juno externa no pode usar o operador IN ou estar vinculada
a outra condio pelo operador OR.

Introduo ao Oracle: SQL e PL/SQL 4-18

Autojunes
EMP (WORKER)
EMPNO
----7839
7698
7782
7566
7654
7499

ENAME
-----KING
BLAKE
CLARK
JONES
MARTIN
ALLEN

EMP (MANAGER)
MGR
---7839
7839
7839
7698
7698

EMPNO ENAME
----- -------7839
7839
7839
7698
7698

KING
KING
KING
BLAKE
BLAKE

"MGR na tabela WORKER igual a EMPNO


na tabela MANAGER"

4-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Unindo uma Tabela a Ela Mesma


Algumas vezes ser necessrio unir uma tabela a ela mesma. Para localizar o nome do gerente de
cada funcionrio, necessrio unir a tabela EMP a ela mesma ou executar uma autojuno. Por
exemplo, para localizar o nome do gerente de Blake, necessrio:

Localizar Blake na tabela EMP consultando a coluna ENAME.

Localizar o nmero do gerente de Blake consultando a coluna MGR. O nmero do gerente de


Blake 7839.

Localizar o nome do gerente como o EMPNO 7839 consultando a coluna ENAME. O nmero
do funcionrio King 7839, ento King gerente de Blake.

Neste processo, voc analisa a tabela duas vezes. Na primeira vez, voc consulta a tabela para
localizar Blake na coluna ENAME e o valor MGR de 7839. Na segunda vez, voc consulta a coluna
EMPNO para localizar 7839 e a coluna ENAME para localizar King.

Introduo ao Oracle: SQL e PL/SQL 4-19

Unindo uma Tabela a Ela Mesma


SQL> SELECT worker.ename||' works for '||manager.ename
2 FROM
emp worker, emp manager
3 WHERE worker.mgr = manager.empno;

WORKER.ENAME||'WORKSFOR'||MANAG
------------------------------BLAKE works for KING
CLARK works for KING
JONES works for KING
MARTIN works for BLAKE
...
13 rows selected.

4-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Unindo uma Tabela a Ela Mesma (continuao)


O exemplo do slide une a tabela EMP a ela mesma. Para simular duas tabelas na clusula FROM, h
dois apelidos, chamados WORKER e MANAGER, para a mesma tabela EMP.
Neste exemplo, a clusula WHERE contm a juno que significa "em que lugar o nmero de gerente
do trabalhador corresponde ao nmero do funcionrio para o gerente".

Introduo ao Oracle: SQL e PL/SQL 4-20

Sumrio
SELECT
FROM
WHERE

Juno
idntica

4-21

tabela1.coluna, tabela2.coluna
tabela1, tabela2
tabela1.coluna1 = tabela2.coluna2;

Juno
no-idntica

Juno
externa

Autojuno

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
H vrios modos para juntar tabelas. O elemento comum, no entanto, aquele que deseja vincular
atravs de uma condio na clusula WHERE. O mtodo que voc escolher ser baseado nas
estruturas de dados que estiver usando.
SELECT
FROM
WHERE

tabela1.coluna, tabela2.coluna
tabela1, tabela2
tabela1.coluna1 = tabela2.coluna2;

Introduo ao Oracle: SQL e PL/SQL 4-21

Viso Geral do Exerccio

Unindo tabelas usando uma juno idntica


Executando junes externas e autojunes
Adicionando condies

4-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Este exerccio tem como objetivo fornecer a voc experincia para extrair dados de mais de uma
tabela. Voc ser solicitado para unir e restringir linhas na clusula WHERE.

Introduo ao Oracle: SQL e PL/SQL 4-22

Exerccio 4
1. Crie uma consulta para exibir o nome, o nmero e o nome do departamento de todos os
funcionrios.
ENAME DEPTNO DNAME
------ ------ --------KING
10 ACCOUNTING
BLAKE
30 SALES
CLARK
10 ACCOUNTING
JONES
20 RESEARCH
MARTIN
30 SALES
ALLEN
30 SALES
TURNER
30 SALES
JAMES
30 SALES
WARD
30 SALES
FORD
20 RESEARCH
SMITH
20 RESEARCH
SCOTT
20 RESEARCH
ADAMS
20 RESEARCH
MILLER
10 ACCOUNTING
14 rows selected.

2. Crie uma lista nica de todos os cargos existentes no departamento 30. Inclua a localizao
do departamento 30 na sada.
JOB
--------CLERK
MANAGER
SALESMAN

LOC
------------CHICAGO
CHICAGO
CHICAGO

3. Crie uma consulta para exibir o nome do funcionrio, o nome do departamento e a


localizao de todos os funcionrios que recebem uma comisso.
ENAME
-----ALLEN
WARD
MARTIN
TURNER

DNAME
-----SALES
SALES
SALES
SALES

LOC
------------CHICAGO
CHICAGO
CHICAGO
CHICAGO

Introduo ao Oracle: SQL e PL/SQL 4-23

Exerccio 4 (continuao)
4. Exiba o nome do funcionrio e o nome do departamento para todos os funcionrios que
possuem um A em seus nomes. Salve a instruo SQL no arquivo nomeado p4q4.sql.
ENAME
DNAME
------- -----------BLAKE
SALES
CLARK
ACCOUNTING
MARTIN
SALES
ALLEN
SALES
JAMES
SALES
WARD
SALES
ADAMS
RESEARCH
7 rows selected.

5. Crie uma consulta para exibir o nome, o cargo, o nmero e o nome do departamento para todos
os funcionrios que trabalham em DALLAS.
ENAME
------SMITH
ADAMS
FORD
SCOTT
JONES

JOB
DEPTNO
------- ------CLERK
20
CLERK
20
ANALYST
20
ANALYST
20
MANAGER
20

DNAME
---------RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH

Introduo ao Oracle: SQL e PL/SQL 4-24

Exerccio 4 (continuao)
6. Exiba o nome e o nmero do funcionrio junto com o nome e o nmero do gerente. Coloque
um label nas colunas Employee, Emp#, Manager e Mgr#, respectivamente. Salve a instruo
SQL em um arquivo nomeado p4q6.sql.
Employee Emp#
Manager
-------- ------ ------SCOTT
7788 JONES
FORD
7902 JONES
ALLEN
7499 BLAKE
WARD
7521 BLAKE
JAMES
7900 BLAKE
TURNER
7844 BLAKE
MARTIN
7654 BLAKE
MILLER
7934 CLARK
ADAMS
7876 SCOTT
JONES
7566 KING
CLARK
7782 KING
BLAKE
7698 KING
SMITH
7369 FORD
13 rows selected.

Mgr#
---7566
7566
7698
7698
7698
7698
7698
7782
7788
7839
7839
7839
7902

7. Modifique o p4q6.sql para exibir todos os funcionrios incluindo King, que no possuem
um gerente. Salve-o novamente como p4q7.sql. Execute o p4q7.sql.
Employee Emp#
Manager Mgr#
-------- ------ ------- ----SCOTT
7788 JONES
7566
FORD
7902 JONES
7566
ALLEN
7499 BLAKE
7698
WARD
7521 BLAKE
7698
JAMES
7900 BLAKE
7698
TURNER
7844 BLAKE
7698
MARTIN
7654 BLAKE
7698
MILLER
7934 CLARK
7782
ADAMS
7876 SCOTT
7788
JONES
7566 KING
7839
CLARK
7782 KING
7839
BLAKE
7698 KING
7839
SMITH
7369 FORD
7902
KING
7839
14 rows selected.

Introduo ao Oracle: SQL e PL/SQL 4-25

Exerccio 4 (continuao)
Se voc tiver tempo, complete os exerccios abaixo:
8. Crie uma consulta que exibir o nome do funcionrios, o nmero do departamento e todos os
funcionrios que trabalham no mesmo departamento de um determinado funcionrio. Fornea a
cada coluna um label apropriado.
DEPARTMENT
---------10
10
10
10
10
10
20
20
20
20
20
20
20

EMPLOYEE
--------

COLLEAGUE
---------

CLARK
CLARK
KING
KING
MILLER
MILLER
ADAMS
ADAMS
ADAMS
ADAMS
FORD
FORD
FORD

KING
MILLER
CLARK
MILLER
CLARK
KING
FORD
JONES
SCOTT
SMITH
ADAMS
JONES
SCOTT

...
56 rows selected.

Introduo ao Oracle: SQL e PL/SQL 4-26

Exerccio 4 (continuao)
9. Mostre a estrutura da tabela SALGRADE. Crie uma consulta que exiba o nome, o cargo, o
nome do departamento, o salrio e a classificao de todos os funcionrios.
Name
Null?
----------- -------GRADE
LOSAL
HISAL
ENAME
-----MILLER
CLARK
KING
SMITH
SCOTT
FORD
ADAMS
JONES
JAMES
BLAKE
TURNER
ALLEN
WARD
MARTIN
14 rows

JOB
---------CLERK
MANAGER
PRESIDENT
CLERK
ANALYST
ANALYST
CLERK
MANAGER
CLERK
MANAGER
SALESMAN
SALESMAN
SALESMAN
SALESMAN
selected.

Type
------NUMBER
NUMBER
NUMBER

DNAME
SAL
---------- ----ACCOUNTING 1300
ACCOUNTING 2450
ACCOUNTING 5000
RESEARCH
800
RESEARCH
3000
RESEARCH
3000
RESEARCH
1100
RESEARCH
2975
SALES
950
SALES
2850
SALES
1500
SALES
1600
SALES
1250
SALES
1250

GRADE
----2
4
5
1
4
4
1
4
1
4
3
3
2
2

Introduo ao Oracle: SQL e PL/SQL 4-27

Exerccio 4 (continuao)
Se voc quiser mais desafios, complete os exerccios abaixo:
10. Crie uma consulta para exibir o nome e a data de admisso de qualquer funcionrio admitido
aps o funcionrio Blake.
ENAME
HIREDATE
------- --------KING
17-NOV-81
CLARK
09-JUN-81
MARTIN 28-SEP-81
TURNER 08-SEP-81
JAMES
03-DEC-81
FORD
03-DEC-81
SCOTT
09-DEC-82
ADAMS
12-JAN-83
MILLER 23-JAN-82
9 rows selected.

11. Exiba todos os nomes de funcionrios e as datas de admisso junto com o nome e a data de
admisso do gerente para todos os funcionrios admitidos antes de seus gerentes. Coloque
um label nas colunas Employee, Emp Hiredate, Manager e Mgr Hiredate, respectivamente.
Employee Emp Hiredate
-------- ------------ALLEN
20-FEB-81
WARD
22-FEB-81
JONES
02-APR-81
CLARK
09-JUN-81
BLAKE
01-MAY-81
SMITH
17-DEC-80
6 rows selected.

Manager
------BLAKE
BLAKE
KING
KING
KING
FORD

Mgr Hiredate
-----------01-MAY-81
01-MAY-81
17-NOV-81
17-NOV-81
17-NOV-81
03-DEC-81

Introduo ao Oracle: SQL e PL/SQL 4-28

5
Agregando Dados
Usando Funes de Grupo

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Identificar as funes de grupo disponveis
Descrever o uso de funes de grupo
Agrupar dados usando a clusula
GROUP BY
Incluir ou excluir linhas agrupadas usando
a clusula HAVING

5-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Esta lio aborda funes. Visa obter informaes sumariadas, tais como mdias, para grupos de
linhas. Discute como agrupar linhas de uma tabela em conjuntos menores e como especificar critrios
de pesquisa para grupos de linhas.

Introduo ao Oracle: SQL e PL/SQL 5-2

O Que So Funes de Grupo?


As funes de grupo operam em conjuntos de
linhas para fornecer um resultado por grupo.
EMP
DEPTNO
SAL
--------- --------10
2450
10
5000
10
1300
20
800
20
1100
20
3000
20
3000
20
2975
30
1600
30
2850
30
1250
30
950
30
1500
30
1250
5-3

"salrio
mximo na
tabela EMP"

MAX(SAL)
--------5000

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Grupo
De modo diferente das funes de uma nica linha, as funes de grupo operam em conjuntos de
linhas para fornecer um resultado por grupo. Esses conjuntos podem ser a tabela inteira ou a tabela
dividida em grupos.

Introduo ao Oracle: SQL e PL/SQL 5-3

Tipos de Funes de Grupo


AVG
COUNT
MAX
MIN
STDDEV
SUM
VARIANCE

5-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Grupo (continuao)


Cada uma das funes aceita um argumento. A tabela a seguir identifica as opes que podem ser
usadas na sintaxe:
Funo

Descrio

AVG([DISTINCT|ALL]n)

Valor mdio de n, ignorando valores nulos

COUNT({*|[DISTINCT|ALL]expr})

Nmero de linhas, onde expr avalia para algo diferente de


nulo (Conte todas as linhas selecionadas usando *,
inclusive duplicadas e linhas com nulos.)

MAX([DISTINCT|ALL]expr)

Valor mximo de expr, ignorando valores nulos

MIN([DISTINCT|ALL]expr)

Valor mnimo de expr, ignorando valores nulos

STDDEV([DISTINCT|ALL]x)

Desvio padro de n, ignorando valores nulos

SUM([DISTINCT|ALL]n)

Valores somados de n, ignorando valores nulos

VARIANCE([DISTINCT|ALL]x)

Variao de n, ignorando valores nulos

Introduo ao Oracle: SQL e PL/SQL 5-4

Usando Funes de Grupo

SELECT
FROM
[WHERE
[GROUP BY
[ORDER BY

5-5

[coluna,] group_function(coluna)
tabela
condio]
coluna]
coluna];

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes para o Uso de Funes de Grupo

DISTINCT faz com que a funo considere somente valores no-duplicados; ALL faz com que
ela considere cada valor, inclusive duplicados. O default ALL e, portanto, no precisa ser
especificado.

Os tipos de dados para os argumentos podem ser CHAR, VARCHAR2, NUMBER ou DATE,
onde expr est listado.

Todas as funes de grupo, exceto COUNT(*), ignoram valores nulos. Para substituir um valor
por valores nulos, use a funo NVL.

O Oracle Server classifica implicitamente a definio do resultado em ordem crescente quando


usa uma clusula GROUP BY. Para sobrepor essa ordenao default, DESC pode ser usado em
uma clusula ORDER BY.

Introduo ao Oracle: SQL e PL/SQL 5-5

Usando Funes AVG e SUM


Voc pode usar AVG e SUM para dados numricos.
SQL> SELECT
2
3 FROM
4 WHERE

AVG(sal), MAX(sal),
MIN(sal), SUM(sal)
emp
job LIKE 'SALES%';

AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL)


-------- --------- --------- --------1400
1600
1250
5600

5-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Grupo
Voc pode usar as funes AVG, SUM, MIN e MAX com colunas que possam armazenar dados
numricos. O exemplo no slide exibe os salrios maior, mdio, menor e a soma dos salrios mensais
de todos os vendedores.

Introduo ao Oracle: SQL e PL/SQL 5-6

Usando Funes MIN e MAX


Voc pode usar MIN e MAX para qualquer tipo
de dados.
SQL> SELECT
2 FROM

MIN(hiredate), MAX(hiredate)
emp;

MIN(HIRED MAX(HIRED
--------- --------17-DEC-80 12-JAN-83

5-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Grupo (continuao)


Voc pode usar as funes MAX e MIN para qualquer tipo de dados. O exemplo no slide exibe o
funcionrio mais antigo e o mais novo.
O exemplo a seguir exibe o primeiro e o ltimo nome de funcionrio em uma lista alfabtica de todos
os funcionrios.
SQL> SELECT
2 FROM

MIN(ename), MAX(ename)
emp;

MIN(ENAME) MAX(ENAME)
---------- ---------ADAMS
WARD

Observao: As funes AVG, SUM, VARIANCE e STDDEV s podem ser usadas com tipos de
dados numricos.

Introduo ao Oracle: SQL e PL/SQL 5-7

Usando a Funo COUNT


COUNT(*) retorna o nmero de linhas em uma
tabela.
SQL> SELECT
2 FROM
3 WHERE

COUNT(*)
emp
deptno = 30;

COUNT(*)
--------6

5-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Funo COUNT
A Funo COUNT tem dois formatos:

COUNT(*)

COUNT(expr)

COUNT(*) retorna o nmero de linhas em uma tabela, inclusive linhas duplicadas e linhas contendo
valores nulos em qualquer uma das colunas. Se uma clusula WHERE estiver includa na instruo
SELECT, COUNT(*) retornar o nmero de linhas que satisfizer a condio na clusula WHERE.
Entretanto, COUNT(expr) retorna o nmero de linhas no nulas na coluna identificada por expr.
O exemplo no slide exibe o nmero de funcionrios no departamento 30.

Introduo ao Oracle: SQL e PL/SQL 5-8

Usando a Funo COUNT


COUNT(expr) retorna o nmero de linhas no
nulas.
SQL> SELECT
2 FROM
3 WHERE

COUNT(comm)
emp
deptno = 30;

COUNT(COMM)
----------4

5-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Funo COUNT (continuao)


O exemplo no slide exibe o nmero de funcionrios no departamento 30 que podem receber uma
comisso. Observe que o resultado fornece o nmero total de quatro linhas porque dois funcionrios no
departamento 30 no podem receber a comisso e, portanto, a coluna COMM contm um valor nulo.
Exemplo
Exiba o nmero de departamentos na tabela EMP.
SQL> SELECT
2 FROM

COUNT(deptno)
emp;

COUNT(DEPTNO)
------------14

Exiba o nmero de departamentos distintos na tabela EMP.


SQL> SELECT
2 FROM

COUNT(DISTINCT (deptno))
emp;

COUNT(DISTINCT(DEPTNO))
----------------------3

Introduo ao Oracle: SQL e PL/SQL 5-9

Funes de Grupo e Valores Nulos


As funes de grupo ignoram valores nulos
na coluna.
SQL> SELECT AVG(comm)
2 FROM
emp;

AVG(COMM)
--------550

5-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Grupo e Valores Nulos


Todas as funes de grupo, com a exceo de COUNT (*), ignoram valores nulos na coluna. No
exemplo do slide, a mdia calculada com base somente nas linhas da tabela em que um valor
vlido armazenado na coluna COMM. A mdia calculada como o total da comisso sendo paga a
todos os funcionrios dividido pelo nmero de funcionrios recebendo a comisso (4).

Introduo ao Oracle: SQL e PL/SQL 5-10

Usando a Funo NVL


com Funes de Grupo
A funo NVL fora as funes de grupo a
inclurem valores nulos.
SQL> SELECT AVG(NVL(comm,0))
2 FROM
emp;
AVG(NVL(COMM,0))
---------------157.14286

5-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes de Grupo e Valores Nulos (continuao)


A funo NVL fora as funes de grupo a inclurem valores nulos. No exemplo do slide, a mdia
calculada com base em todas as linhas na tabela, independentemente de os valores nulos estarem
armazenados na coluna COMM. A mdia calculada como o total da comisso sendo paga a todos
os funcionrios dividido pelo nmero total de funcionrios na empresa (14).

Introduo ao Oracle: SQL e PL/SQL 5-11

Criando Grupos de Dados


EMP
DEPTNO
SAL
--------- --------10
2450
10
5000
10
1300
20
800
20
1100
20
3000
20
3000
20
2975
30
1600
30
2850
30
1250
30
950
30
1500
30
1250

5-12

2916.6667

DEPTNO AVG(SAL)
"salrio
mdio
------- --------na tabela
2175
10 2916.6667
EMP
para cada
20
2175
departamento"
30 1566.6667

1566.6667

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Grupos de Dados
At este momento, todas as funes de grupo trataram a tabela como um grande grupo de
informaes. s vezes, necessrio dividir a tabela de informaes em grupos menores. Isso pode
ser feito usando a clusula GROUP BY.

Introduo ao Oracle: SQL e PL/SQL 5-12

Criando Grupos de Dados:


Clusula GROUP BY
coluna, group_function(coluna)
tabela
condio]
group_by_expression]
coluna];

SELECT
FROM
[WHERE
[GROUP BY
[ORDER BY

Divida linhas de uma tabela em grupos


menores usando a clusula GROUP BY.

5-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Clusula GROUP BY
Voc pode usar a clusula GROUP BY para dividir as linhas de uma tabela em grupos. Em seguida,
pode usar as funes de grupo para retornar informaes sumrias para cada grupo.
Na sintaxe:
group_by_expression

especifica colunas cujos valores determinam a base para


agrupar linhas

Diretrizes

Se voc incluir uma funo de grupo em uma clusula SELECT, no poder selecionar
resultados individuais, a menos que a coluna individual aparea na clusula GROUP BY. Se
voc no conseguir incluir a lista de colunas, uma mensagem de erro ser exibida.

Ao usar uma clusula WHERE, voc pode excluir linhas com antecedncia antes de dividi-las
em grupos.

Voc deve incluir as colunas na clusula GROUP BY.

No possvel usar o apelido de coluna na clusula GROUP BY.

Por default, as linhas so classificadas por ordem crescente das colunas includas na lista
GROUP BY. Isso pode ser sobreposto usando a clusula ORDER BY.

Introduo ao Oracle: SQL e PL/SQL 5-13

Usando a Clusula GROUP BY


Todas as colunas na lista SELECT que no
estejam em funes de grupo devem estar na
clusula GROUP BY.
SQL> SELECT
deptno, AVG(sal)
2 FROM
emp
3 GROUP BY deptno;
DEPTNO AVG(SAL)
--------- --------10 2916.6667
20
2175
30 1566.6667

5-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Clusula GROUP BY (continuao)


Quando utilizar a clusula GROUP BY, certifique-se de que todas as colunas na lista SELECT que
no estejam nas funes de grupo estejam includas na clusula GROUP BY. O exemplo no slide
exibe o nmero do departamento e o salrio mdio para cada departamento. Essa instruo SELECT,
que contm uma clusula GROUP BY, avaliada da seguinte forma:

A clusula SELECT especifica as colunas a serem recuperadas:

A coluna de nmeros de departamento na tabela EMP

A mdia de todos os salrios no grupo que voc especificou na clusula GROUP BY

A clusula FROM especifica as tabelas que o banco de dados deve acessar:


a tabela EMP.

A clusula WHERE especifica as linhas a serem recuperadas. J que no h uma clusula


WHERE, todas as linhas so recuperadas por default.

A clusula GROUP BY especifica como as linhas devem ser agrupadas. As linhas so agrupadas
pelo nmero do departamento, de forma que a funo AVG que esteja sendo aplicada coluna
de salrios calcule o salrio mdio para cada departamento.

Introduo ao Oracle: SQL e PL/SQL 5-14

Usando a Clusula GROUP BY


A coluna GROUP BY no precisa estar na lista
SELECT.
SQL> SELECT
AVG(sal)
2 FROM
emp
3 GROUP BY deptno;

AVG(SAL)
--------2916.6667
2175
1566.6667

5-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Clusula GROUP BY (continuao)


A coluna GROUP BY no precisa estar na clusula SELECT. Por exemplo, a instruo SELECT no
slide exibe os salrios mdios para cada departamento sem exibir os respectivos nmeros dos
departamentos. Sem os nmeros dos departamentos, entretanto, os resultados no parecem
significativos.
Voc pode usar a funo de grupo na clusula ORDER BY.
SQL>
2
3
4

SELECT
FROM
GROUP BY
ORDER BY

deptno, AVG(sal)
emp
deptno
AVG(sal);

DEPTNO
AVG(SAL)
---------- -----------30
1566.6667
20
2175
10
2916.6667

Introduo ao Oracle: SQL e PL/SQL 5-15

Agrupando por Mais


de Uma Coluna

EMP

DEPTNO JOB
SAL
--------- --------- --------10 MANAGER
2450

5-16

10
10
20
20
20
20

PRESIDENT
CLERK
CLERK
CLERK
ANALYST
ANALYST

5000
1300
800
1100
3000
3000

20
30
30
30
30
30
30

MANAGER
SALESMAN
MANAGER
SALESMAN
CLERK
SALESMAN
SALESMAN

2975
1600
2850
1250
950
1500
1250

"soma de
salrios na
tabela EMP
para cada
cargo,
agrupados por
departamento"

SUM(SAL)
DEPTNO JOB
-------- --------- --------1300
10 CLERK
2450
10 MANAGER
PRESIDENT
ANALYST
CLERK
MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
10
20
20
20

5000
6000
1900
2975
950
2850
5600

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Grupos Dentro de Grupos


s vezes h necessidade de ver os resultados para grupos dentro de grupos. O slide mostra um
relatrio que exibe o salrio total sendo pago a cada cargo, dentro de cada departamento.
A tabela EMP agrupada primeiro pelo nmero do departamento e, dentro desse agrupamento,
agrupada pelo cargo. Por exemplo, os dois escriturrios no departamento 20 esto agrupados e um
nico resultado (salrio total) produzido para todos os vendedores dentro do grupo.

Introduo ao Oracle: SQL e PL/SQL 5-16

Usando a Clusula GROUP BY


em Vrias Colunas
SQL> SELECT
deptno, job, sum(sal)
2 FROM
emp
3 GROUP BY deptno, job;
DEPTNO JOB
SUM(SAL)
--------- --------- --------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
...
9 rows selected.

5-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Grupos Dentro de Grupos (continuao)


possvel retornar resultados sumrios para grupos e subgrupos listando mais de uma coluna
GROUP BY. Voc pode determinar a ordem de classificao default dos resultados pela ordem
das colunas na clusula GROUP BY. A instruo SELECT no slide, que contm uma clusula
GROUP BY, avaliada da seguinte forma:

A clusula SELECT especifica a coluna a ser recuperada:

O nmero do departamento na tabela EMP

O cargo na tabela EMP

A soma de todos os salrios no grupo que voc especificou na


clusula GROUP BY

A clusula FROM especifica as tabelas que o banco de dados deve acessar: a tabela EMP.

A clusula GROUP BY especifica como voc deve agrupar as linhas:

Primeiro, as linhas so agrupadas pelo nmero do departamento

Em seguida, dentro dos grupos de nmeros de departamentos, as linhas so


agrupadas pelo cargo

Dessa forma, a funo SUM aplicada coluna de salrios para todos os cargos dentro de cada
grupo de nmeros de departamentos.

Introduo ao Oracle: SQL e PL/SQL 5-17

Consultas Ilegais
Usando Funes de Grupo
Qualquer coluna ou expresso na lista SELECT
que no seja uma funo agregada deve estar
na clusula GROUP BY.
SQL> SELECT
2 FROM

olu

deptno, COUNT(ename)
emp;

OUP BY
R
G
a
l
u
s
te na clu
n
e
s
u
a
a
n

C deptno, COUNT(ename)
SELECT
*
ERROR at line 1:
ORA-00937: Nenhuma funo de grupo de grupo nico
(Not a single-group group function)
5-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Consultas Ilegais Usando Funes de Grupo


Sempre que voc usar uma mistura de itens individuais (DEPTNO) e funes de grupo (COUNT) na
mesma instruo SELECT, deve incluir uma clusula GROUP BY que especifique os itens
individuais (neste caso, DEPTNO). Se a clusula GROUP BY estiver ausente, aparecer a mensagem
de erro "Nenhuma funo de grupo de grupo nico" e um asterisco (*) apontar para a coluna que
contiver o erro. Voc pode corrigir o erro no slide ao adicionar a clusula GROUP BY.
SQL> SELECT
deptno,COUNT(ename)
2 FROM
emp
3 GROUP BY deptno;
DEPTNO COUNT(ENAME)
---------- -----------10
3
20
5
30
6
Qualquer coluna ou expresso na lista SELECT que no seja uma funo agregada deve estar na
clusula GROUP BY.

Introduo ao Oracle: SQL e PL/SQL 5-18

Consultas Ilegais
Usando Funes de Grupo
No possvel usar a clusula WHERE para
restringir grupos.
Use a clusula HAVING para restringir grupos.
la
su s
u
cl upo
a
r
r
sa gir g
u
el trin
v

WHERE AVG(sal) > 2000


s
s
os ra re
*
p
o E pa
ERROR at line 3:

N Egrupo
R
ORA-00934: A funo de
no permitida aqui
H
W allowed here)
(Group function is not

SQL>
2
3
4

5-19

SELECT
FROM
WHERE
GROUP BY

deptno, AVG(sal)
emp
AVG(sal) > 2000
deptno;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Consultas Ilegais Usando Funes de Grupo (continuao)


A clusula WHERE no pode ser usada para restringir grupos. A instruo SELECT no slide resulta
em um erro porque usa a clusula WHERE para restringir a exibio de salrios mdios dos
departamentos que tenham um salrio mdio maior do que US$ 2.000.
Voc pode corrigir o erro no slide usando a clusula HAVING para restringir grupos.
SQL>
2
3
4

SELECT
FROM
GROUP BY
HAVING

deptno, AVG(sal)
emp
deptno
AVG(sal) > 2000;

DEPTNO
AVG(SAL)
---------- -------------10
2916.6667
20
2175

Introduo ao Oracle: SQL e PL/SQL 5-19

Excluindo Resultados do Grupo


EMP
DEPTNO
SAL
--------- ---------

5-20

10
10
10
20
20

2450
5000
1300
800
1100

20
20

3000
3000

20
30
30
30
30
30
30

2975
1600
2850
1250
950
1500
1250

5000

3000

"salrio
mximo por
departamento
maior do que
US$ 2.900"

DEPTNO MAX(SAL)
--------- --------10
5000
20

3000

2850

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Restringindo Resultados do Grupo


Da mesma forma que voc usa a clusula WHERE para restringir as linhas que seleciona, pode usar a
clusula HAVING para restringir grupos. Para localizar o salrio mximo de cada departamento, mas
mostrar apenas os departamentos que tenham um salrio mximo de mais do que US$ 2.900, faa o
seguinte:

Localize o salrio mdio para cada departamento ao agrupar por nmero do departamento.

Restrinja os grupos aos departamentos com um salrio mximo maior do que US$ 2.900.

Introduo ao Oracle: SQL e PL/SQL 5-20

Excluindo Resultados do Grupo:


Clusula HAVING
Use a clusula HAVING para restringir grupos
As linhas so agrupadas.
A funo de grupo aplicada.
Os grupos que correspondem clusula
HAVING so exibidos.
SELECT
FROM
[WHERE
[GROUP BY
[HAVING
[ORDER BY
5-21

coluna, group_function
tabela
condio]
group_by_expression]
group_condition]
coluna];

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Clusula HAVING
Use a clusula HAVING para especificar quais grupos sero exibidos. Portanto, restrinja ainda mais
os grupos com base nas informaes agregadas.
Na sintaxe:
group_condition

restringe os grupos de linhas retornados aos grupos para os quais


a condio especificada seja TRUE

O Oracle Server executa as seguintes etapas quando voc usa a clusula HAVING:

As linhas so agrupadas.

A funo de grupo aplicada ao grupo.

Os grupos que correspondem aos critrios na clusula HAVING so exibidos.

A clusula HAVING pode preceder a clusula GROUP BY, mas recomenda-se que voc coloque a
clusula GROUP BY primeiro, por ser mais lgico. Os grupos so formados e as funes de grupo
so calculadas antes de a clusula HAVING ser aplicada aos grupos na lista SELECT.

Introduo ao Oracle: SQL e PL/SQL 5-21

Usando a Clusula HAVING


SQL>
2
3
4

SELECT
FROM
GROUP BY
HAVING

deptno, max(sal)
emp
deptno
max(sal)>2900;

DEPTNO MAX(SAL)
--------- --------10
5000
20
3000

5-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Clusula HAVING (continuao)


O exemplo no slide exibe nmeros de departamentos e o salrio mximo para os departamentos cujo
salrio mximo seja maior do que US$ 2.900.
Voc pode usar a clusula GROUP BY sem usar uma funo de grupo na lista SELECT.
Se voc restringir linhas baseado no resultado de uma funo de grupo, deve ter uma clusula
GROUP BY assim como a clusula HAVING.
O exemplo a seguir exibe os nmeros de departamentos e o salrio mdio para os departamentos cujo
salrio mximo seja maior do que US$ 2.900:
SQL>
2
3
4

SELECT
FROM
GROUP BY
HAVING

deptno, AVG(sal)
emp
deptno
MAX(sal) > 2900;

DEPTNO AVG(SAL)
--------- --------10 2916.6667
20
2175

Introduo ao Oracle: SQL e PL/SQL 5-22

Usando a Clusula HAVING


SQL>
2
3
4
5
6

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

job, SUM(sal) PAYROLL


emp
job NOT LIKE 'SALES%'
job
SUM(sal)>5000
SUM(sal);

JOB
PAYROLL
--------- --------ANALYST
6000
MANAGER
8275

5-23

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Clusula HAVING (continuao)


O exemplo no slide exibe o cargo e o salrio mensal total para cada cargo com uma folha de
pagamento total excedendo US$ 5.000. O exemplo exclui vendedores e classifica a lista pelo salrio
mensal total.

Introduo ao Oracle: SQL e PL/SQL 5-23

Aninhando Funes de Grupo


Exiba o salrio mdio mximo.
SQL> SELECT
max(avg(sal))
2 FROM
emp
3 GROUP BY deptno;
MAX(AVG(SAL))
------------2916.6667

5-24

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Aninhando Funes de Grupo


As funes de grupo podem ser aninhadas at uma profundidade de dois. O exemplo no slide exibe o
salrio mdio mximo.

Introduo ao Oracle: SQL e PL/SQL 5-24

Sumrio
SELECT
FROM
[WHERE
[GROUP BY
[HAVING
[ORDER BY

coluna, group_function(coluna)
tabela
condio]
group_by_expression]
group_condition]
coluna];

Ordem de avaliao das clusulas:


clusula WHERE
clusula GROUP BY
clusula HAVING

5-25

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Sete funes de grupo esto disponveis no SQL:

AVG

COUNT

MAX

MIN

SUM

STDDEV

VARIANCE

Voc pode criar subgrupos usando a clusula GROUP BY. Os grupos podem ser excludos usando a
clusula HAVING.
Coloque as clusulas HAVING e GROUP BY aps a clusula WHERE em uma instruo. Coloque a
clusula ORDER BY por ltimo.
O Oracle Server avalia as clusulas na seguinte ordem:

Se a instruo contm uma clusula WHERE, o servidor estabelece as linhas do candidato.

O servidor identifica os grupos especificados na clusula GROUP BY.

A clusula HAVING restringe ainda mais os grupos de resultado que no atendam aos critrios
do grupo na clusula HAVING.
Introduo ao Oracle: SQL e PL/SQL 5-25

Viso Geral do Exerccio

Mostrando diferentes consultas que usam


funes de grupo
Agrupando por linhas para obter mais de
um resultado
Excluindo grupos usando a clusula
HAVING

5-26

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Ao final desse exerccio, voc dever estar familiarizado com o uso de funes de grupo e a seleo
de grupos de dados.
Questes Impressas
No caso das questes 13, marque Verdadeiro ou Falso.
Observao: Os apelidos de colunas so usados para as consultas.

Introduo ao Oracle: SQL e PL/SQL 5-26

Exerccio 5
Determine a validade das afirmaes a seguir. Marque Verdadeiro ou Falso.
1. As funes de grupo operam em muitas linhas para produzir um resultado por grupo.
Verdadeiro/Falso
2. As funes de grupo incluem nulos nos clculos.
Verdadeiro/Falso
3. A clusula WHERE restringe as linhas antes da incluso em um clculo de grupo.
Verdadeiro/Falso
4. Exiba os salrios maior, mdio, menor e a soma de todos os salrios de todos os funcionrios.
Coloque um label nas colunas Maximum, Minimum, Sum e Average, respectivamente. Arredonde
os resultados para o nmero inteiro mais prximo. Salve a instruo SQL em um arquivo
chamado p5q4.sql.
Maximum
-------

Minimum
-------

5000

800

Sum Average
----- ------29025

2073

5. Modifique o p5q4.sql para exibir o salrio maior, mdio, menor e a soma de todos os salrios
para cada tipo de cargo. Salve novamente o arquivo com o nome p5q5.sql. Execute novamente
a consulta.
JOB
Maximum Minimum
Sum Average
---------- -------- -------- ----- -------ANALYST
3000
3000
6000
3000
CLERK
1300
800
4150
1038
MANAGER
2975
2450
8275
2758
PRESIDENT
5000
5000
5000
5000
SALESMAN
1600
1250
5600
1400

6. Crie uma consulta para exibir o nmero de pessoas com o mesmo cargo.
JOB

COUNT(*)

---------- -------ANALYST
2
CLERK
4
MANAGER
3
PRESIDENT
1
SALESMAN
4

Introduo ao Oracle: SQL e PL/SQL 5-27

Exerccio 5 (continuao)
7. Determine o nmero de gerentes sem list-los. Coloque um label na coluna Number of
Managers.
Number of Managers
-----------------6

8. Crie uma consulta para exibir a diferena entre os maiores e menores salrios. Coloque um
label na coluna DIFFERENCE.
DIFFERENCE
---------4200

Se voc tiver tempo, complete os exerccios abaixo:


9. Exiba o nmero do gerente e o salrio do funcionrio com menor pagamento sob a superviso
desse gerente. Exclua todos cujo gerente no seja conhecido. Exclua todos os grupos em que
o salrio mnimo seja menor do que US$ 1.000. Classifique a sada em ordem decrescente
de salrio.
MGR
-------7566
7839
7782
7788

MIN(SAL)
-------3000
2450
1300
1100

10. Crie uma consulta para exibir o nome do departamento, o nome do local, o nmero de
funcionrios e o salrio mdio de todos os funcionrios nesse departamento. Coloque
um label nas colunas dname, loc, Number of People e Salary, respectivamente.
Arredonde o salrio mdio para duas casas decimais
DNAME
-----------ACCOUNTING
RESEARCH
SALES

LOC
Number of People
--------- ---------------NEW YORK
3
DALLAS
5
CHICAGO
6

Introduo ao Oracle: SQL e PL/SQL 5-28

Salary
-------2916.67
2175
1566.67

Exerccio 5 (continuao)
Se voc quiser mais desafios, complete os exerccios abaixo:
11.

Crie uma consulta que exiba o nmero total de funcionrios e, desse total, o nmero total de
funcionrios contratados em 1980, 1981, 1982 e 1983. Coloque os cabealhos apropriados
nas colunas.
TOTAL 1980
----- ----14
1

12.

1981
----10

1982 1983
----- ----2
1

Crie uma consulta matriz para exibir o cargo, o salrio desse cargo baseado no nmero do
departamento e o salrio total desse cargo para todos os departamentos, colocando em cada
coluna um cabealho apropriado.
Job
Dept 10
--------- ------ANALYST
CLERK
1300
MANAGER
2450
PRESIDENT
5000
SALESMAN

Dept 20 Dept 30
Total
-------- -------- ------6000
6000
1900
950
4150
2975
2850
8275
5000
5600
5600

Introduo ao Oracle: SQL e PL/SQL 5-29

Introduo ao Oracle: SQL e PL/SQL 5-30

6
Subconsultas

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Descrever os tipos de problemas que as
subconsultas podem resolver
Definir as subconsultas
Listar os tipos de subconsultas
Criar subconsultas de uma nica linha e de
vrias linhas

6-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender sobre os recursos mais avanados da instruo SELECT. Voc pode criar
subconsultas na clusula WHERE de outra instruo SQL para obter valores baseados em um valor
condicional desconhecido. Esta lio abrange as subconsultas de uma nica linha e de vrias linhas.

Introduo ao Oracle: SQL e PL/SQL 6-2

Usando uma Subconsulta para


Resolver um Problema
"Quem tem um salrio maior que o de Jones?"
Consulta principal

"Que funcionrios tm um salrio maior


que o salrio de Jones?"
Subconsulta

6-3

"Qual o salrio de Jones?"

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando uma Subconsulta para Resolver um Problema


Suponha que voc deseje criar uma consulta para descobrir quem recebe um salrio maior que o de
Jones.
Para resolver esse problema, so necessrias duas consultas: uma consulta para descobrir quanto
Jones recebe e outra para descobrir quem recebe mais que essa quantia.
Voc pode resolver esse problema combinando as duas consultas, colocando uma consulta dentro da
outra consulta.
A consulta interna ou a subconsulta retorna um valor que usado pela consulta externa ou pela
consulta principal. Usar uma subconsulta equivale a executar duas consultas seqenciais e usar o
resultado da primeira como o valor de pesquisa na segunda consulta.

Introduo ao Oracle: SQL e PL/SQL 6-3

Subconsultas
SELECT
FROM
WHERE

select_list
tabela
operador expr
(SELECT
FROM

select_list
tabela);

A subconsulta (consulta interna)


executada uma vez antes da consulta
principal.
O resultado da subconsulta usado pela
consulta principal (consulta externa).

6-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Subconsultas
Uma subconsulta uma instruo SELECT que incorporada em uma clusula de outra instruo
SELECT. Voc pode desenvolver instrues sofisticadas a partir de instrues simples usando
subconsultas. Elas podem ser muito teis quando voc precisar selecionar linhas de uma tabela com
uma condio que dependa dos dados na prpria tabela.
possvel colocar a subconsulta em vrias clusulas SQL:

clusula WHERE

clusula HAVING

clusula FROM

Na sintaxe:
operador

inclui um operador de comparao tal como >, = ou IN

Observao: Os operadores de comparao subdividem-se em duas classes: operadores de uma


nica linha (>, =, >=, <, <>, <=) e operadores de vrias linhas (IN, ANY, ALL).
A subconsulta geralmente chamada de instruo SELECT, sub-SELECT ou SELECT interna
aninhada. A subconsulta normalmente executada primeiro e sua sada usada para concluir a
condio de consulta da consulta principal ou externa.

Introduo ao Oracle: SQL e PL/SQL 6-4

Usando uma Subconsulta


SQL> SELECT ename
2 FROM
emp
2975
3 WHERE sal >
4
(SELECT sal
5
FROM
emp
6
WHERE empno=7566);

ENAME
---------KING
FORD
SCOTT

6-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando uma Subconsulta


No slide, a consulta interna determina o salrio do funcionrio 7566. A consulta externa obtm o
resultado da consulta interna e o utiliza para exibir todos os funcionrios que recebem mais que
essa quantia.

Introduo ao Oracle: SQL e PL/SQL 6-5

Diretrizes para o
Uso de Subconsultas
Coloque as subconsultas entre parnteses.
Coloque as subconsultas no lado direito
do operador de comparao.
No adicione uma clusula ORDER BY a
uma subconsulta.
Use operadores de uma nica linha com
subconsultas de uma nica linha.
Use operadores de vrias linhas com
subconsultas de vrias linhas.
6-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes para o Uso de Subconsultas

Uma subconsulta deve estar entre parnteses.

Uma subconsulta deve aparecer do lado direito do operador de comparao.

As subconsultas no podem conter uma clusula ORDER BY. S possvel haver uma clusula
ORDER BY para uma instruo SELECT e, se estiver especificado, ela deve ser a ltima
clusula na instruo SELECT principal.

So usadas duas classes de operadores de comparao nas subconsultas: operadores de uma


nica linha e operadores de vrias linhas.

Introduo ao Oracle: SQL e PL/SQL 6-6

Tipos de Subconsultas
Subconsulta de uma nica linha
Consulta principal
retorna
Subconsulta

CLERK

Subconsulta de vrias linhas


Consulta principal
retorna
Subconsulta

CLERK
MANAGER

Subconsulta de vrias colunas


Consulta
Main query
principal
Subconsulta
Subquery
6-7

retorna

CLERK
7900
MANAGER 7698

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tipos de Subconsultas

Subconsultas de uma nica linha: consultas que retornam somente uma linha da instruo
SELECT interna

Subconsultas de vrias linhas: consultas que retornam mais de uma linha da instruo
SELECT interna

Subconsultas de vrias colunas: consultas que retornam mais de uma coluna da instruo
SELECT interna

Introduo ao Oracle: SQL e PL/SQL 6-7

Subconsultas de uma nica Linha


Retorne somente uma linha
Use operadores de comparao de uma
nica linha
Operador

6-8

Significado

Igual a

>

Maior do que

>=

Maior do que ou igual a

<

Menor do que

<=

Menor ou igual a

<>

Diferente de

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Subconsultas de uma nica Linha


A subconsulta de uma nica linha retorna uma linha da instruo SELECT interna. Esse tipo de
subconsulta usa um operador de uma nica linha. O slide fornece uma lista de operadores de uma
nica linha.
Exemplo
Exiba os funcionrios cujo cargo seja o mesmo do funcionrio 7369.
SQL> SELECT
2 FROM
3 WHERE
4
5
6

ENAME
---------JAMES
SMITH
ADAMS
MILLER

ename, job
emp
job =
(SELECT
FROM
WHERE

job
emp
empno = 7369);

JOB
--------CLERK
CLERK
CLERK
CLERK

Introduo ao Oracle: SQL e PL/SQL 6-8

Executando Subconsultas de
uma nica Linha
SQL>
2
3
4
5
6
7
8
9
10

SELECT
FROM
WHERE

AND

ename, job
emp
job =
(SELECT
FROM
WHERE
sal >
(SELECT
FROM
WHERE

CLERK

job
emp
empno = 7369)
1100

sal
emp
empno = 7876);

ENAME
JOB
---------- --------MILLER
CLERK

6-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Executando Subconsultas de uma nica Linha


A instruo SELECT pode ser considerada um bloco de consulta. O exemplo no slide exibe
funcionrios cujo cargo o mesmo que o do funcionrio 7369 e cujo salrio maior que o do
funcionrio 7876.
O exemplo consiste em trs blocos de consulta: a consulta externa e duas consultas internas. Os
blocos de consulta interna so executados primeiro, produzindo os resultados da consulta: CLERK e
1100, respectivamente. O bloco de consulta externa ento processado e usa os valores retornados
pelas consultas internas para completar suas condies de pesquisa.
Ambas as consultas internas retornam valores nicos (CLERK e 1100, respectivamente). Portanto,
essa instruo SQL chamada de subconsulta de uma nica linha.
Observao: As consultas externa e interna podem obter dados de tabelas diferentes.

Introduo ao Oracle: SQL e PL/SQL 6-9

Usando Funes de Grupo


em uma Subconsulta
SQL> SELECT
2 FROM
3 WHERE
4
5

ename, job, sal


emp
sal =
(SELECT
FROM

800

MIN(sal)
emp);

ENAME
JOB
SAL
---------- --------- --------SMITH
CLERK
800

6-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando Funes de Grupo em uma Subconsulta


possvel exibir dados de uma consulta principal usando uma funo de grupo em uma subconsulta
para retornar uma nica linha. A subconsulta fica entre parnteses e colocada aps o operador de
comparao.
O exemplo no slide exibe o nome do funcionrio, o cargo do funcionrio e o salrio de todos os
funcionrios cujo salrio seja igual ao salrio mnimo. A funo de grupo MIN retorna um nico
valor (800) para a consulta externa.

Introduo ao Oracle: SQL e PL/SQL 6-10

Clusula HAVING com


Subconsultas
O Oracle Server primeiro executa as
subconsultas.
O Oracle Server retorna os resultados para
a clusula HAVING da consulta principal.
SQL>
2
3
4
5
6
7

6-11

SELECT
FROM
GROUP BY
HAVING

deptno, MIN(sal)
emp
deptno
MIN(sal) >
(SELECT
FROM
WHERE

800

MIN(sal)
emp
deptno = 20);

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Clusula HAVING com Subconsultas


Voc pode usar as subconsultas no s na clusula WHERE, mas tambm na clusula HAVING.
O Oracle Server executa a subconsulta e os resultados so retornados para a clusula HAVING da
consulta principal.
A instruo SQL no slide exibe todos os departamentos que tenham um salrio mnimo maior que o
do departamento 20.
DEPTNO
MIN(SAL)
--------- --------10
1300
30
950

Exemplo
Localize o cargo com o menor salrio mdio.
SQL>
2
3
4
5
6

SELECT
FROM
GROUP BY
HAVING

job, AVG(sal)
emp
job
AVG(sal) = (SELECT
FROM
GROUP BY

MIN(AVG(sal))
EMP
job);

Introduo ao Oracle: SQL e PL/SQL 6-11

O que H de Errado
com esta Instruo?
SQL> SELECT empno, ename
2 FROM
emp
com
a
h
3 WHERE sal =
in
ica l(SELECT
4
MIN(sal)
n

has
a
n
i
m
l
u
5
FROM
emp
s
ia
de
r
r

o
v
d
GROUP BY deptno);
de
r6a

Ope onsulta
subc

ERROR:
ORA-01427: A subconsulta de uma nica linha retorna
mais de uma linha (Single-row subquery returns
more than one row)
no rows selected

6-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Erros em Subconsultas
Um erro comum em subconsultas o retorno de mais de uma linha para uma subconsulta de uma
nica linha.
Na instruo SQL do slide, a subconsulta contm uma clusula GROUP BY (deptno), o que indica
que a subconsulta retornar vrias linhas, uma para cada grupo que localizar. Nesse caso, o
resultado da subconsulta ser 800, 1300 e 950.
A consulta externa obtm os resultados da subconsulta (800, 950, 1300) e os utiliza na sua clusula
WHERE. A clusula WHERE contm um operador igual (=), um operador de comparao de uma
nica linha que espera somente um valor. O operador = no pode aceitar mais de um valor da
subconsulta e, portanto, gera o erro.
Para corrigir esse erro, altere o operador = para IN.

Introduo ao Oracle: SQL e PL/SQL 6-12

Esta Instruo Ir Funcionar?

SQL> SELECT ename,


2 FROM
emp
3 WHERE job =
4
5
6

job

(SELECT job
FROM
emp
WHERE
ename='SMYTHE');

no rows selected

ulta
s
n
o
ubc
s
A

6-13

nhu
e
n
rna
o
t
e
o r

alo
v
m

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Problemas nas Subconsultas


Um problema comum nas subconsultas nenhuma linha ser retornada pela consulta interna.
Na instruo SQL do slide, a subconsulta contm uma clusula WHERE (ename='SMYTHE').
Supostamente, a inteno localizar o funcionrio cujo nome seja Smythe. A instruo parece ser
correta, mas no seleciona linhas ao ser executada.
O problema que Smythe no foi escrito corretamente. No h nenhum funcionrio chamado
Smythe. Dessa forma, a subconsulta no retorna nenhuma linha. A consulta externa obtm os
resultados da subconsulta (nula) e os utiliza na sua clusula WHERE. A consulta externa no
localiza nenhum funcionrio com um cargo igual a nulo e, portanto, no retorna nenhuma linha.

Introduo ao Oracle: SQL e PL/SQL 6-13

Subconsultas de Vrias Linhas


Retorne mais de uma linha
Use operadores de comparao de vrias
linhas

6-14

Operador

Significado

IN

Igual a qualquer membro na lista

ANY

Compare o valor a cada valor retornado


pela subconsulta

ALL

Compare o valor a todo valor retornado


pela subconsulta

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Subconsultas de Vrias Linhas


As subconsultas que retornam mais de uma linha chamam-se subconsultas de vrias linhas. Voc
pode usar um operador de vrias linhas, em vez de um operador de uma nica linha, com uma
subconsulta de vrias linhas. O operador de vrias linhas espera um ou mais valores.
SQL> SELECT
2 FROM
3 WHERE
4
5

ename, sal, deptno


emp
sal IN (SELECT
MIN(sal)
FROM
emp
GROUP BY deptno);

Exemplo
Localize os funcionrios que recebam o mesmo salrio que o salrio mnimo dos departamentos.
A consulta interna executada primeiro, produzindo um resultado de consulta que contenha trs
linhas: 800, 950, 1300. O bloco da consulta principal processado em seguida e usa os valores
retornados pela consulta interna para completar sua condio de pesquisa. Na verdade, a consulta
principal pareceria da seguinte forma para o Oracle Server:
SQL> SELECT
2 FROM
3 WHERE

ename, sal, deptno


emp
sal IN (800, 950, 1300);

Introduo ao Oracle: SQL e PL/SQL 6-14

Usando o Operador ANY em


Subconsultas de Vrias Linhas
SQL>
2
3
4
5
6
7

SELECT
FROM
WHERE

AND

EMPNO
--------7654
7521

6-15

empno, ename, job 1300


1100
emp
800
sal < ANY
950
(SELECT
sal
FROM
emp
WHERE
job = 'CLERK')
job <> 'CLERK';

ENAME
---------MARTIN
WARD

JOB
--------SALESMAN
SALESMAN

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Subconsultas de Vrias Linhas (continuao)


O operador ANY (e o operador sinnimo SOME) compara um valor a cada valor retornado por uma
subconsulta. O exemplo no slide exibe funcionrios cujo salrio menor que o de qualquer
escriturrio e que no so escriturrios. O salrio mximo que um escriturrio recebe US$ 1.300.
A instruo SQL exibe todos os funcionrios que no so escriturrios, mas recebem menos
que US$ 1.300.
<ANY significa menos do que o mximo. >ANY significa mais do que o mnimo. =ANY equivale
a IN.

Introduo ao Oracle: SQL e PL/SQL 6-15

Usando o Operador ALL em


Subconsultas de Vrias Linhas
SQL> SELECT
2 FROM
3 WHERE
4
5
6
EMPNO
--------7839
7566
7902
7788

6-16

empno, ename, job 1566.6667


2175
emp
2916.6667
sal > ALL
(SELECT
avg(sal)
FROM
emp
GROUP BY
deptno);

ENAME
---------KING
JONES
FORD
SCOTT

JOB
--------PRESIDENT
MANAGER
ANALYST
ANALYST

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Subconsultas de Vrias Linhas (continuao)


O operador ALL compara um valor a todo valor retornado por uma subconsulta. O exemplo no slide
exibe funcionrios cujo salrio seja maior que os salrios mdios de todos os departamentos. O
salrio mdio mais alto de um departamento US$ 2.916,66, portanto a consulta retorna os
funcionrios cujo salrio seja maior que US$ 2.916,66.
>ALL significa mais do que o mximo e <ALL significa menos do que o mnimo.
O operador NOT pode ser usado com os operadores IN, ANY e ALL.

Introduo ao Oracle: SQL e PL/SQL 6-16

Sumrio
As subconsultas so teis quando uma
consulta baseia-se em valores desconhecidos.
SELECT
FROM
WHERE

6-17

select_list
tabela
operador expr
(SELECT select_list
FROM
tabela);

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Uma subconsulta uma instruo SELECT que incorporada em uma clusula de outra instruo
SQL. As subconsultas so teis quando uma consulta baseia-se em critrios de seleo com valores
intermedirios desconhecidos.
As subconsultas tm as seguintes caractersticas:

Podem passar uma linha de dados para uma instruo principal que contenha um operador de
uma nica linha, tal como =, <>, >, >=, < ou <=

Podem passar vrias linhas de dados para uma instruo principal que contenha um operador de
vrias linhas, tal como IN

So processadas primeiro pelo Oracle Server, e a clusula WHERE ou HAVING usa os


resultados

Podem conter funes de grupo

Introduo ao Oracle: SQL e PL/SQL 6-17

Viso Geral do Exerccio

Criando subconsultas para valores de


consulta com base em critrios
desconhecidos
Usando subconsultas para descobrir quais
valores existem em um conjunto de dados
e no em outro

6-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Neste exerccio, voc criar consultas complexas usando instrues SELECT aninhadas.
Questes Impressas
Voc pode considerar criar a consulta interna primeiro para essas questes. Certifique-se de que ela
execute e produza os dados que voc antecipar antes de codificar a consulta externa.

Introduo ao Oracle: SQL e PL/SQL 6-18

Exerccio 6
1. Crie uma consulta para exibir o nome e a data de admisso de todos os funcionrios no mesmo
departamento que Blake. Exclua Blake.
ENAME
HIREDATE
---------- --------ALLEN
20-FEB-81
WARD
22-FEB-81
MARTIN
28-SEP-81
TURNER
08-SEP-81
JAMES
03-DEC-81
5 rows selected.

2. Crie uma consulta para exibir o nmero e o nome de todos os funcionrios que recebam mais que
o salrio mdio. Classifique os resultados, por salrio, em ordem decrescente.
EMPNO ENAME
----- ----------7839 KING
7902 FORD
7788 SCOTT
7566 JONES
7698 BLAKE
7782 CLARK
6 rows selected.

3. Crie uma consulta que exiba o nmero e o nome de todos os funcionrios que trabalhem em um
departamento com qualquer funcionrio cujo nome contenha um T. Salve sua instruo SQL
em um arquivo chamado p6q3.sql.
EMPNO ENAME
------ -------7566 JONES
7788 SCOTT
7876 ADAMS
7369 SMITH
7902 FORD
7698 BLAKE
7654 MARTIN
7499 ALLEN
7844 TURNER
7900 JAMES
7521 WARD
11 rows selected.

Introduo ao Oracle: SQL e PL/SQL 6-19

Exerccio 6 (continuao)
4. Exiba o nome do funcionrio, o nmero do departamento e o cargo de todos os funcionrios
cuja localizao do departamento seja Dallas.
ENAME DEPTNO JOB
------ ------ --------JONES
20 MANAGER
FORD
20 ANALYST
SMITH
20 CLERK
SCOTT
20 ANALYST
ADAMS
20 CLERK

5. Exiba o nome e o salrio dos funcionrios que se reportem a King.


ENAME
-----BLAKE
CLARK
JONES

SAL
---2850
2450
2975

6. Exiba o nmero do departamento, o nome e o cargo de todos os funcionrios do


departamento de Vendas.
DEPTNO
-----30
30
30
30
30
30
6 rows

ENAME
JOB
-------- --------BLAKE
MANAGER
MARTIN
SALESMAN
ALLEN
SALESMAN
TURNER
SALESMAN
JAMES
CLERK
WARD
SALESMAN
selected.

Se voc tiver tempo, complete os exerccios abaixo:


7. Modifique p6q3.sql para exibir o nmero, o nome e o salrio de todos os funcionrios que
recebam mais que o salrio mdio e trabalhem em um departamento com qualquer funcionrio
cujo nome contenha um T. Salve novamente como p6q7.sql. Execute novamente a
consulta.
EMPNO
----7566
7788
7902
7698

ENAME
-----JONES
SCOTT
FORD
BLAKE

SAL
---2975
3000
3000
2850

Introduo ao Oracle: SQL e PL/SQL 6-20

7
Subconsultas de
Vrias Colunas

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Criar uma subconsulta de vrias colunas
Descrever e explicar o comportamento de
subconsultas quando valores nulos forem
recuperados
Criar uma subconsulta em uma clusula
FROM

7-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender a criar subconsultas de vrias colunas e subconsultas na clusula FROM
de uma instruo SELECT.

Introduo ao Oracle: SQL e PL/SQL 7-2

Subconsultas de Vrias Colunas


Consulta principal
MANAGER 10

Subconsulta
SALESMAN
MANAGER
CLERK

A consulta
principal compara

Valores de uma subconsulta de


vrias linhas e de vrias colunas
SALESMAN
MANAGER
CLERK

MANAGER 10

7-3

30
10
20

30
10
20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Subconsultas de Vrias Colunas


At este momento voc tem criado subconsultas de uma nica linha e subconsultas de vrias linhas,
onde somente uma coluna comparada na clusula WHERE ou na clusula HAVING da instruo
SELECT. Para comparar duas ou mais colunas, voc dever criar uma clusula WHERE composta
usando operadores lgicos. As subconsultas de vrias colunas permitem que voc combine condies
WHERE duplicadas em uma nica clusula WHERE.
Sintaxe
SELECT
FROM
WHERE

coluna, coluna, ...


tabela
(coluna, coluna, ...) IN
(SELECT coluna, coluna, ...
FROM
tabela
WHERE condio);

Introduo ao Oracle: SQL e PL/SQL 7-3

Usando Subconsultas de
Vrias Colunas
Exiba a ID da ordem, a ID do produto e a
quantidade de itens na tabela de itens que
corresponde ID do produto e quantidade
de um item na ordem 605.
SQL>
2
3
4
5
6
7

7-4

SELECT
FROM
WHERE

AND

ordid, prodid, qty


item
(prodid, qty) IN
(SELECT prodid, qty
FROM
item
WHERE ordid = 605)
ordid <> 605;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando Subconsultas de Vrias Colunas


O exemplo no slide o de uma subconsulta de vrias colunas porque a subconsulta retorna mais de
uma coluna. Ele compara os valores na coluna PRODID e na coluna QTY de cada linha do candidato
na tabela ITEM aos valores na coluna PRODID e na coluna QTY dos itens na ordem 605.
Primeiro, execute a subconsulta para ver os valores PRODID e QTY de cada item na ordem 605.
SQL> SELECT prodid, qty
2 FROM
item
3 WHERE ordid = 605;
PRODID
QTY
---------- --------100861
100
100870
500
100890
5
101860
50
101863
100
102130
10
6 rows selected.

Introduo ao Oracle: SQL e PL/SQL 7-4

Usando Subconsultas de
Vrias Colunas
Exiba o nmero da ordem, o nmero do
produto e a quantidade de qualquer item em
que o nmero do produto e a quantidade
correspondam ao nmero do produto e
quantidade de um item na ordem 605.
SQL>
2
3
4
5
6
7
7-5

SELECT
FROM
WHERE

ordid, prodid, qty


item
(prodid, qty) IN
(SELECT prodid, qty
FROM
item
WHERE ordid = 605)
ordid <> 605;

AND

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando Subconsultas de Vrias Colunas (continuao)


Quando a instruo SQL no slide executada, o servidor Oracle compara os valores nas colunas
PRODID e QTY e retorna as ordens em que o nmero e a quantidade do produto correspondem ao
nmero do produto e quantidade desse item na ordem 605.
A sada da instruo SQL :
ORDID

PRODID

QTY

--------- --------- --------617

100861

100

617

100870

500

616

102130

10

A sada mostra que h trs itens em outras ordens que contm o mesmo nmero do produto e a
mesma quantidade que um item na ordem 605. Por exemplo, a ordem 617 solicitou uma quantidade
500 do produto 100870. A ordem 605 tambm solicitou uma quantidade 500 do produto 100870.
Portanto, essas linhas do candidato so parte da sada.

Introduo ao Oracle: SQL e PL/SQL 7-5

Comparaes de Coluna

Aos pares
PRODID
101863
100861
102130
100890
100870
101860

7-6

Sem ser aos pares


QTY
100
100
10
5
500
50

PRODID
101863
100861
102130
100890
100870
101860

QTY
100
100
10
5
500
50

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Comparaes aos Pares Versus Comparaes que No Sejam aos Pares


As comparaes de coluna em consultas de vrias colunas podem ser comparaes aos pares ou no.
O slide mostra os nmeros do produto e as quantidades dos itens na ordem 605.
No exemplo do slide anterior, uma comparao aos pares foi executada na clusula WHERE. Cada
linha do candidato na instruo SELECT deve ter o mesmo nmero do produto e a mesma quantidade
que um item na ordem 605. Isso ilustrado no lado esquerdo do slide acima. As setas indicam que o
nmero do produto e a quantidade em uma linha do candidato correspondem a um nmero do
produto e a uma quantidade de um item na ordem 605.
Uma subconsulta de vrias colunas tambm pode ser uma comparao que no seja aos pares. Se
voc desejar uma comparao que no seja aos pares (um produto cruzado), voc dever usar uma
clusula WHERE com vrias condies. Uma linha do candidato deve corresponder s vrias
condies na clusula WHERE, mas os valores so comparados individualmente. Uma linha do
candidato deve corresponder a algum nmero do produto na ordem 605, assim como a alguma
quantidade na ordem 605, mas esses valores no precisam estar na mesma linha. Isso ilustrado
no lado direito do slide. Por exemplo, o produto 102130 aparece em outras ordens, uma ordem
correspondendo quantidade na ordem 605 (10) e outra ordem tendo uma quantidade de 500.
As setas exibem uma amostra das vrias quantidades solicitadas para determinado produto.

Introduo ao Oracle: SQL e PL/SQL 7-6

Subconsulta de Comparao
que No Seja aos Pares
Exiba o nmero da ordem, o nmero do produto e
a quantidade de qualquer item em que o nmero
do produto e a quantidade correspondam a
qualquer nmero do produto e quantidade de um
item na ordem 605.
SQL>
2
3
4
5
6
7
8
9
7-7

SELECT
FROM
WHERE

AND

AND

ordid, prodid, qty


item
prodid IN (SELECT
FROM
WHERE
qty
IN (SELECT
FROM
WHERE
ordid <> 605;

prodid
item
ordid = 605)
qty
item
ordid = 605)

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Subconsulta de Comparao que No Seja aos Pares


O exemplo no slide faz uma comparao das colunas sem ser aos pares. Ele exibe o nmero da ordem,
o nmero do produto e a quantidade de qualquer item em que o nmero do produto e a quantidade
correspondam a qualquer nmero do produto e quantidade de um item na ordem 605. A ordem 605 no
includa na sada.

Introduo ao Oracle: SQL e PL/SQL 7-7

Subconsulta que No Seja aos Pares


ORDID
PRODID
QTY
--------- --------- --------609
100870
5
616
100861
10
616
102130
10
621
100861
10
618
100870
10
618
100861
50
616
100870
50
617
100861
100
619
102130
100
615
100870
100
617
101860
100
621
100870
100
617
102130
100
. . .
16 rows selected.
7-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Subconsulta que No Seja aos Pares


Os resultados da subconsulta sem ser aos pares so mostrados no slide. Dezesseis linhas do candidato
na tabela ITEM correspondem s vrias condies na clusula WHERE.
Por exemplo, um item da ordem 621 retornado da instruo SQL. Um produto na ordem 621
(nmero do produto 100861) corresponde a um produto de um item na ordem 605. A quantidade
do produto 100861 na ordem 621 (10) corresponde quantidade em outro item na ordem 605
(a quantidade do produto 102130).

Introduo ao Oracle: SQL e PL/SQL 7-8

Valores Nulos em uma


Subconsulta
SQL> SELECT employee.ename
2 FROM
emp employee
3 WHERE
employee.empno NOT IN
4
(SELECT manager.mgr
5
FROM
emp manager);
no rows selected.

7-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Retornando Nulos no Conjunto Resultante de uma Subconsulta


A instruo SQL no slide tenta exibir todos os funcionrios que no tenham nenhum subordinado.
Logicamente, essa instruo SQL deveria ter retornado oito linhas. Entretanto, a instruo SQL no
retorna nenhuma linha. Um dos valores retornados pela consulta interna um valor nulo e, portanto, a
consulta inteira no retorna nenhuma linha. O motivo que todas as condies que comparam um valor
nulo resultam em um nulo. Dessa forma, sempre que houver a possibilidade de valores nulos serem
parte do conjunto resultante de uma subconsulta, o operador NOT IN no ser usado. O operador NOT
IN equivalente a !=ALL.
Observe que o valor nulo como parte do conjunto resultante de uma subconsulta no ser um problema
se voc estiver usando o operador IN. O operador IN equivalente a =ANY. Por exemplo, para exibir
os funcionrios que tm subordinados, use a seguinte instruo SQL:
SQL> SELECT
2 FROM
3 WHERE
4

employee.ename
emp employee
employee.empno IN (SELECT manager.mgr
FROM emp manager);

ENAME
---------KING
...
6 rows selected.
Introduo ao Oracle: SQL e PL/SQL 7-9

Usando uma Subconsulta na


Clusula FROM
SQL>
2
3
4
5
6

SELECT
FROM

WHERE
AND

a.ename, a.sal, a.deptno, b.salavg


emp a, (SELECT
deptno, avg(sal) salavg
FROM
emp
GROUP BY deptno) b
a.deptno = b.deptno
a.sal > b.salavg;

ENAME
SAL
DEPTNO
SALAVG
---------- --------- --------- ---------KING
5000
10 2916.6667
JONES
2975
20
2175
SCOTT
3000
20
2175
...
6 rows selected.
7-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando uma Subconsulta na Clusula FROM


Voc pode usar uma subconsulta na clusula FROM de uma instruo SELECT, o que se parece muito
com a forma de utilizar as views. Uma subconsulta na clusula FROM de uma instruo SELECT define
uma origem de dados para essa, e somente essa, instruo SELECT em particular. O exemplo no slide
exibe nomes de funcionrios, salrios, nmeros de departamento e salrios mdios de todos os
funcionrios que recebem mais que o salrio mdio nos seus departamentos.

Introduo ao Oracle: SQL e PL/SQL 7-10

Sumrio
Uma subconsulta de vrias colunas retorna
mais de uma coluna.
As comparaes de coluna em
comparaes de vrias colunas podem ser
aos pares ou no.
Uma subconsulta de vrias colunas
tambm pode ser usada na clusula FROM
de uma instruo SELECT.

7-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
As subconsultas de vrias colunas permitem que voc combine condies WHERE duplicadas em
uma nica clusula WHERE. As comparaes de coluna em consultas de vrias colunas podem ser
comparaes aos pares ou no. Voc pode usar uma subconsulta para definir uma tabela que seja
operada por uma consulta contida. Para isso, coloque a subconsulta na clusula FROM da consulta
contida, como se fosse um nome de tabela.

Introduo ao Oracle: SQL e PL/SQL 7-11

Viso Geral do Exerccio

Criando subconsultas de vrias colunas

7-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Neste exerccio, voc criar subconsultas de vrios valores.

Introduo ao Oracle: SQL e PL/SQL 7-12

Exerccio 7
1. Crie uma consulta para exibir o nome, o nmero do departamento e o salrio de qualquer
funcionrio cujo nmero do departamento e salrio correspondam ao nmero do
departamento e salrio de qualquer funcionrio que receba comisso.
ENAME
DEPTNO
SAL
-------- ------ -----MARTIN
30
1250
WARD
30
1250
TURNER
30
1500
ALLEN
30
1600

2. Exiba o nome, o nome do departamento e o salrio de qualquer funcionrio cujo salrio e


cuja comisso correspondam ao salrio e comisso de qualquer funcionrio localizado
em Dallas.
ENAME
------SMITH
ADAMS
JONES
FORD
SCOTT

DNAME
SAL
--------- -----RESEARCH
800
RESEARCH
1100
RESEARCH
2975
RESEARCH
3000
RESEARCH
3000

3. Crie uma consulta para exibir o nome, a data de admisso e o salrio de todos os funcionrios
que tenham o mesmo salrio e a mesma comisso que Scott.
Observao: No exiba SCOTT no conjunto de resultados.
ENAME
HIREDATE
SAL
------- --------- -----FORD

03-DEC-81

3000

4. Crie uma consulta para exibir os funcionrios que recebem um salrio maior que o de todos
os escriturrios. Classifique os resultados sobre salrios do maior para o menor.
ENAME
JOB
SAL
---------- --------- --------KING
PRESIDENT
5000
FORD
ANALYST
3000
SCOTT
ANALYST
3000
JONES
MANAGER
2975
BLAKE
MANAGER
2850
CLARK
MANAGER
2450
ALLEN
SALESMAN
1600
TURNER
SALESMAN
1500
8 rows selected.

Introduo ao Oracle: SQL e PL/SQL 7-13

Introduo ao Oracle: SQL e PL/SQL 7-14

8
Produzindo uma Sada
Legvel com o SQL*Plus

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Produzir consultas que requeiram uma
varivel de entrada
Personalizar o ambiente SQL*Plus
Produzir sadas mais legveis
Criar e executar arquivos de script
Salvar personalizaes

8-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender a incluir comandos do SQL*Plus para produzir sadas SQL mais legveis.
Voc pode criar um arquivo de comando contendo uma clusula WHERE para restringir as linhas
exibidas. Para alterar a condio sempre que o arquivo de comando for executado, use variveis de
substituio. As variveis de substituio podem substituir valores na clusula WHERE, uma string
de texto e at uma coluna ou um nome de tabela.

Introduo ao Oracle: SQL e PL/SQL 8-2

Relatrios Interativos

...sal = ?
deptno = ?
.. ename = ? ...

Desejo entrar com


valores de consulta em
tempo de execuo.

Usurio
8-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Relatrios Interativos
Os exemplos at aqui no tm sido interativos. Em uma aplicao concluda, o usurio acionaria o
relatrio, que, por sua vez, seria executado sem nenhum pedido posterior. A faixa de dados seria
predeterminada pela clusula WHERE fixada no arquivo de script do SQL*Plus.
Ao usar o SQL*Plus, voc pode criar relatrios que solicitem ao usurio o fornecimento de seus
prprios valores para restringir a faixa de dados retornada. Para criar relatrios interativos, voc pode
incorporar variveis de substituio em um arquivo de comando ou em uma nica instruo SQL.
Uma varivel pode ser comparada a um container em que os valores so armazenados
temporariamente.

Introduo ao Oracle: SQL e PL/SQL 8-3

Variveis de Substituio
Use as variveis de substituio do SQL*Plus
para armazenar valores temporariamente.
"E" comercial nico (&)
"E" comercial duplo (&&)
Comandos DEFINE e ACCEPT

Passe os valores da varivel entre instrues


SQL.
Altere dinamicamente cabealhos e rodaps.

8-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Variveis de Substituio
No SQL*Plus, voc pode usar variveis de substituio de "e" comercial nico (&) para armazenar valores
temporariamente.
possvel predefinir variveis no SQL*Plus usando os comandos ACCEPT ou DEFINE. ACCEPT l uma
linha de entrada do usurio e a armazena em uma varivel. DEFINE cria e atribui um valor a uma varivel.
Exemplos de Faixas de Dados Restritas

Relatar cifras somente para o trimestre atual ou para faixas de datas especificadas

Relatar somente os dados relevantes para o usurio solicitando o relatrio

Exibir somente o pessoal de determinado departamento

Outros Efeitos Interativos


Os efeitos interativos no esto restritos interao direta do usurio com a clusula WHERE.
Os mesmos princpios podem ser usados para alcanar outros objetivos. Por exemplo:

Alterar dinamicamente cabealhos e rodaps

Obter valores de entrada a partir de um arquivo em vez de a partir de uma pessoa

Passar valores de uma instruo SQL para outra

O SQL*Plus no suporta checagens de validao (exceto para tipos de dados) na entrada do usurio.
Certifique-se de criar prompts simples e sem ambigidade para o usurio.

Introduo ao Oracle: SQL e PL/SQL 8-4

Usando a Varivel de Substituio &


Use a varivel precedida de um "e" comercial
(&) para solicitar um valor ao usurio.
SQL> SELECT
2 FROM
3 WHERE

empno, ename, sal, deptno


emp
empno = &employee_num;

Enter value for employee_num: 7369


EMPNO ENAME
SAL
DEPTNO
--------- ---------- --------- --------7369 SMITH
800
20

8-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Varivel de Substituio de "E" Comercial nico


Ao executarem um relatrio, os usurios geralmente desejam restringir os dados retornados
dinamicamente. O SQL*Plus fornece essa flexibilidade atravs das variveis de usurio. Use um "e"
comercial (&) para identificar cada varivel na sua instruo SQL. No necessrio definir o valor de
cada varivel.
Notao

Descrio

&user_variable

Indica uma varivel em uma instruo SQL. Se a varivel


no existir, o SQL*Plus pedir que o usurio fornea um
valor (o SQL*Plus descarta uma nova varivel aps ser
usada).

O exemplo no slide cria uma instruo SQL para pedir que o usurio fornea um nmero de
funcionrio em tempo de execuo e exibe o nmero do funcionrio, o nome, o salrio e o nmero do
departamento desse funcionrio.
Com o "e" comercial nico, o usurio ser solicitado sempre que o comando for executado, se a
varivel no existir.

Introduo ao Oracle: SQL e PL/SQL 8-5

Usando o Comando SET VERIFY


Alterne a exibio do texto de um comando
antes e depois do SQL*Plus trocar variveis de
substituio por valores.
SQL>
SQL>
2
3

SET VERIFY ON
SELECT empno, ename, sal, deptno
FROM
emp
WHERE
empno = &employee_num;

Enter value for employee_num: 7369


old
3: WHERE empno = &employee_num
new
3: WHERE empno = 7369
...

8-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Comando SET VERIFY


Para confirmar as alteraes na instruo SQL, use o comando SET VERIFY do SQL*Plus. Definir
SET VERIFY ON faz com que o SQL*Plus exiba o texto de um comando antes e depois de trocar
variveis de substituio por valores.
O exemplo no slide exibe o valor antigo e o valor novo da coluna EMPNO.

Introduo ao Oracle: SQL e PL/SQL 8-6

Valores de Caractere e Data


com Variveis de Substituio
Use aspas simples para valores de caractere
e data.
SQL> SELECT ename, deptno, sal*12
2 FROM
emp
3 WHERE job='&job_title';

Enter value for job_title: ANALYST


ENAME
DEPTNO
SAL*12
---------- --------- --------SCOTT
20
36000
FORD
20
36000

8-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Especificando Valores de Caractere e Data com Variveis de Substituio


Em uma clusula WHERE, os valores de caractere e data devem estar entre aspas simples. A mesma
regra se aplica s variveis de substituio.
Para evitar entrar com as aspas em tempo de execuo, coloque a varivel entre aspas simples dentro
da prpria instruo SQL.
O slide mostra uma consulta para recuperar o nome do funcionrio, o nmero do departamento e o
salrio anual de todos os funcionrios baseado no cargo informado no prompt pelo usurio.
Observao: Voc tambm pode usar funes tais como UPPER e LOWER com o "e" comercial.
Use UPPER('&job_title') para que o usurio no precise informar o cargo em maisculas.

Introduo ao Oracle: SQL e PL/SQL 8-7

Especificando Nomes de Coluna,


Expresses e Texto em
Tempo de Execuo
Use variveis de substituio para
complementar o seguinte:
Condio WHERE
Clusula ORDER BY
Expresso da coluna
Nome da tabela
Toda a instruo SELECT
8-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Especificando Nomes de Coluna, Expresses e Texto em Tempo de Execuo


As variveis de substituio podem ser usadas na clusula WHERE de uma instruo SQL, assim
como tambm podem ser usadas para substituir nomes de colunas, expresses ou texto.
Exemplo
Exiba o nmero do funcionrio e qualquer outra coluna e qualquer condio dos funcionrios.
SQL> SELECT
2 FROM
3 WHERE

empno, &column_name
emp
&condition;

Informe um valor para column_name: job


Informe um valor para condition: deptno = 10
EMPNO
--------7839
7782
7934

JOB
--------PRESIDENT
MANAGER
CLERK

Se nenhum valor for informado para a varivel de substituio, ocorrer um erro quando voc executar
a instruo anterior.
Introduo ao Oracle: SQL e PL/SQL 8-8

Especificando Nomes de Coluna,


Expresses e Texto em
Tempo de Execuo
SQL>
2
3
4

SELECT
FROM
WHERE
ORDER BY

empno, ename, job, &column_name


emp
&condition
&order_column;

Enter value for column_name: sal


Enter value for condition: sal>=3000
Enter value for order_column: ename
EMPNO
--------7902
7839
7788
8-9

ENAME
---------FORD
KING
SCOTT

JOB
SAL
--------- --------ANALYST
3000
PRESIDENT
5000
ANALYST
3000

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Especificando Nomes de Coluna, Expresses e Texto em Tempo de Execuo


(continuao)
O exemplo no slide exibe o nmero do funcionrio, o nome, o cargo e qualquer outra coluna
especificada pelo usurio em tempo de execuo, na tabela EMP. O usurio tambm pode especificar
a condio para a recuperao de linhas e o nome da coluna pela qual os dados resultantes devem ser
solicitados.

Introduo ao Oracle: SQL e PL/SQL 8-9

Usando a Varivel de Substituio &&


Use o "e" comercial duplo (&&) se desejar
reutilizar o valor da varivel sem precisar
solicitar sempre o usurio.
SQL> SELECT
2 FROM
3 ORDER BY

empno, ename, job, &&column_name


emp
&column_name;

Enter value for column_name: deptno


EMPNO ENAME
JOB
DEPTNO
--------- ---------- --------- --------7839 KING
PRESIDENT
10
7782 CLARK
MANAGER
10
7934 MILLER
CLERK
10
...
14 rows selected.
8-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Varivel de Substituio de "e" Comercial Duplo


Voc pode usar varivel de substituio de "e" comercial duplo (&&) para reutilizar o valor da
varivel sem precisar solicitar sempre o usurio. O usurio s ver o prompt para o valor uma vez. No
exemplo do slide, o usurio solicitado a dar o valor para a varivel column_name somente uma vez.
O valor fornecido pelo usurio (deptno) usado para a exibio e a solicitao de dados.
O SQL*Plus armazena o valor fornecido usando o comando DEFINE. Ele o utilizar novamente
sempre que voc fizer referncia ao nome da varivel. Aps inserir uma varivel de usurio, voc
precisar usar o comando UNDEFINE para delet-la.

Introduo ao Oracle: SQL e PL/SQL 8-10

Definindo as Variveis de Usurio


Voc pode predefinir variveis usando um
destes dois comandos do SQL*Plus:
DEFINE: Crie uma varivel de usurio

de tipo de dados CHAR


ACCEPT: Leia a entrada do usurio e

armazene-a em uma varivel


Se voc precisar predefinir uma varivel
que inclua espaos, dever colocar o valor
entre aspas simples quando utilizar o
comando DEFINE.
8-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Definindo Variveis de Usurio


possvel predefinir variveis de usurio antes de executar uma instruo SELECT. O SQL*Plus
fornece dois comandos para definir e configurar variveis de usurio: DEFINE e ACCEPT.
Comando

Descrio

DEFINE varivel = valor

Cria uma varivel de usurio de tipo de dados CHAR e


atribui um valor a ela

DEFINE varivel

Exibe a varivel, seu valor e seu tipo de dados

DEFINE

Exibe todas as variveis de usurio com o valor e o tipo


de dados

ACCEPT (veja a sintaxe no prximo


slide)

L uma linha da entrada do usurio e a armazena em


uma varivel

Introduo ao Oracle: SQL e PL/SQL 8-11

O Comando ACCEPT
Cria um prompt personalizado durante a
aceitao da entrada do usurio
Define explicitamente uma varivel de tipo
de dados NUMBER ou DATE
Oculta a entrada do usurio por motivos de
segurana
ACCEPT varivel [tipo de dados] [FORMAT formato]
[PROMPT texto] [HIDE]

8-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Comando ACCEPT
Na sintaxe:
varivel

FOR[MAT] formato

o nome da varivel que armazena o valor (Se no existir,


ser criada pelo SQL*Plus.)
NUMBER, CHAR ou DATE (CHAR tem um limite de
comprimento mximo de 240 bytes. DATE comparado a um
modelo de formato, e o tipo de dados CHAR.)
especifica o modelo de formato por exemplo, A10 ou 9.999

PROMPT texto

exibe o texto antes de o usurio informar o valor

HIDE

suprime o que o usurio informar por exemplo, uma senha

tipo de dados

Observao: No preceda o parmetro de substituio do SQL*Plus com o "e" comercial (&)


quando fizer referncia ao parmetro de substituio no comando ACCEPT.

Introduo ao Oracle: SQL e PL/SQL 8-12

Usando o Comando ACCEPT


ACCEPT
SELECT
FROM
WHERE
/

dept PROMPT 'Provide the department name:'


*
dept
dname = UPPER('&dept')

Provide the department name: Sales


DEPTNO DNAME
LOC
--------- -------------- ------------30 SALES
CHICAGO

8-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando o Comando ACCEPT


O comando ACCEPT l varivel DEPT. O prompt que ele exibe ao pedir que o usurio fornea a
varivel "Fornea o nome do departamento". Em seguida, a instruo SELECT obtm o valor do
departamento informado pelo usurio e o utiliza para recuperar a linha apropriada da tabela DEPT.
Se o usurio entrar com um valor vlido para o nome do departamento, a instruo SELECT ser
executada da mesma forma que qualquer outra instruo SELECT, obtendo o valor entrado pelo
usurio e usando-o na clusula WHERE para comparar com DNAME.
Note que o caractere & no aparece com a varivel DEPT no comando ACCEPT. O & aparece
somente na instruo SELECT.
Diretrizes

Se no existir uma varivel, os comandos ACCEPT e DEFINE a criaro; se ela existir, esses
comandos a redefiniro automaticamente.
Ao usar o comando DEFINE, utilize aspas simples ('') para envolver uma string que
contenha um espao incorporado.
Use o comando ACCEPT para:

Fornecer um prompt personalizado ao aceitar a entrada do usurio; caso contrrio,


voc ver a mensagem default "Informe um valor para a varivel"
Definir explicitamente uma varivel de tipo de dados NUMBER ou DATE

Ocultar a entrada do usurio por motivos de segurana

Introduo ao Oracle: SQL e PL/SQL 8-13

Comandos DEFINE e UNDEFINE


A varivel permanece definida at voc:
Usar o comando UNDEFINE para limp-la;

ou
Sair do SQL*Plus

possvel verificar suas alteraes com o


comando DEFINE.
Para definir variveis para cada sesso,
modifique o arquivo login.sql de forma que
as variveis sejam criadas na inicializao.
8-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Os Comandos DEFINE e UNDEFINE


As variveis so definidas at voc:

Emitir o comando UNDEFINE em uma varivel; ou

Sair do SQL*Plus

Quando voc no define variveis, possvel verificar suas alteraes com o comando DEFINE.
Quando voc sai do SQL*Plus, as variveis definidas durante essa sesso so perdidas. Para definir
essas variveis para cada sesso, modifique o arquivo login.sql de forma que essas variveis
sejam criadas na inicializao.

Introduo ao Oracle: SQL e PL/SQL 8-14

Usando o Comando DEFINE


Crie uma varivel para armazenar o nome
do departamento.
SQL> DEFINE deptname = sales
SQL> DEFINE deptname
DEFINE DEPTNAME

= "sales" (CHAR)

Use a varivel da mesma forma que


usaria qualquer outra varivel.
SQL> SELECT *
2 FROM
dept
3 WHERE dname = UPPER('&deptname');

8-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando o Comando DEFINE


Voc pode usar o comando DEFINE para criar uma varivel e, em seguida, usar a varivel da
mesma forma que usaria qualquer outra varivel. O exemplo no slide cria uma varivel
DEPTNAME que contm o nome do departamento, SALES. A instruo SQL usa essa varivel
para exibir o nmero e o local do departamento de vendas.
DEPTNO DNAME
--------- ----------30 SALES

LOC
------------CHICAGO

Para apagar essa varivel, use o comando UNDEFINE:


SQL> UNDEFINE deptname
SQL> DEFINE deptname
symbol deptname is UNDEFINED

Introduo ao Oracle: SQL e PL/SQL 8-15

Personalizando o Ambiente
SQL*Plus
Use os comandos SET para controlar a
sesso atual.
SET system_variable value

Verifique o que voc definiu usando o


comando SHOW.
SQL> SET ECHO ON
SQL> SHOW ECHO
echo ON

8-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Personalizando o Ambiente SQL*Plus


Voc pode controlar o ambiente em que o SQL*Plus esteja atualmente operando usando os
comandos SET.
Na sintaxe:
system_variable

uma varivel que controla um aspecto do ambiente da sesso

value

um valor para a varivel do sistema

Voc pode verificar o que definiu usando o comando SHOW. O comando SHOW no slide checa se
ECHO estava ativado ou desativado.
Para ver todos os valores da varivel SET, use o comando SHOW ALL.
Para obter mais informaes, consulte o SQL*Plus Users Guide and Reference, Release 8,
"Command Reference".

Introduo ao Oracle: SQL e PL/SQL 8-16

Variveis do Comando SET


ARRAYSIZE {20 | n}
COLSEP {_ | text}
{6 | n |OFF | ON}

FEEDBACK

HEADING {OFF | ON}


LINESIZE {80 | n}
LONG {80 | n}
PAGESIZE {24 | n}
PAUSE {OFF | ON | text}
TERMOUT {OFF | ON}
8-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Variveis do Comando SET


Valores e Varivel de SET

Descrio

ARRAY[SIZE] {20| n}

Define o tamanho da extrao de dados do banco dados

COLSEP {_|text}

Define o texto a ser impresso entre colunas (O default um


espao.)

FEED[BACK] {6|n|OFF|ON}

Exibe o nmero de registros retornados por uma consulta


quando a consulta seleciona no mnimo n registros

HEA[DING] {OFF|ON}

Determina se os cabealhos da coluna so exibidos nos


relatrios

LIN[ESIZE] {80|n}

Define o nmero de caracteres por linha como n para


relatrios

LONG {80|n}

Define a largura mxima para a exibio de valores LONG

PAGES[IZE] {24|n}

Especifica o nmero de linhas por pgina de sada

PAU[SE] {OFF|ON|text}

Permite controlar a rolagem do seu terminal (Voc deve


pressionar [Return] aps ver cada pausa.)

TERM[OUT] {OFF|ON}

Determina se a sada exibida na tela

Observao: O valor n representa um valor numrico. Os valores sublinhados indicam valores


default. Se voc no entrar um valor com a varivel, o SQL*Plus ir pressupor o valor default.

Introduo ao Oracle: SQL e PL/SQL 8-17

Salvando as Personalizaes
no Arquivo login.sql
O arquivo login.sql contm o comando
SET standard e outros comandos do
SQL*Plus que so implementados no login.
Voc pode modificar o login.sql para
conter comandos SET adicionais.

8-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Configuraes Default Usando o Arquivo login.sql


O arquivo login.sql contm o comando SET standard e outros comandos do SQL*Plus que
podem ser necessrios para toda sesso. O arquivo lido e os comandos so implementados no login.
Quando voc efetua o logoff da sua sesso, todas as configuraes personalizadas so perdidas.
Alterando as Configuraes Default
As configuraes implementadas pelo login.sql podem ser alteradas durante a sesso atual.
As alteraes feitas s so atuais para essa sesso. Assim que voc efetua o logoff, essas
configuraes so perdidas.
Adicione ao arquivo login.sql as alteraes permanentes nas configuraes.

Introduo ao Oracle: SQL e PL/SQL 8-18

Comandos de Formato
do SQL*Plus

COLUMN [opo da coluna]


TTITLE [texto | OFF | ON]
BTITLE [texto | OFF | ON]
BREAK [ON report_element]

8-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Obtendo Relatrios Mais Legveis


Voc pode controlar os recursos de relatrio usando os seguintes comandos:
Comando

Descrio

COL[UMN] [opo da coluna]

Controla formatos de coluna

TTI[TLE] [texto|OFF|ON]

Especifica um cabealho para aparecer na parte superior de cada pgina

BTI[TLE] [texto|OFF|ON]

Especifica um rodap para aparecer na parte inferior de cada pgina do


relatrio

BRE[AK] [ON report_element]

Suprime valores duplicados e seciona linhas de dados com alimentao


de linha

Diretrizes

Todos os comandos de formato permanecem efetivos at o final da sesso do SQL*Plus ou at


que a configurao de formato seja sobregravada ou limpa.

Lembre-se de redefinir suas configuraes do SQL*Plus para os valores default aps cada
relatrio.

No h nenhum comando para definir uma varivel do SQL*Plus para seu valor default; voc
deve saber o valor especfico ou efetuar logoff e login novamente.

Se voc der um apelido sua coluna, dever fazer referncia ao nome do apelido, no ao nome
da coluna.
Introduo ao Oracle: SQL e PL/SQL 8-19

O Comando COLUMN
Controla a exibio de uma coluna
COL[UMN] [{coluna|apelido} [opo]]

CLE[AR]: Limpa qualquer formato de coluna


FOR[MAT] formato: Altera a exibio da
coluna usando um modelo de formato
HEA[DING] texto: Define o cabealho da
coluna
JUS[TIFY] {alinhamento}: Alinha o
cabealho da coluna para a esquerda, o
centro ou a direita
8-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Opes do Comando COLUMN


Opo

Descrio

CLE[AR]

Limpa qualquer formato de coluna

FOR[MAT] formato

Altera a exibio dos dados da coluna

HEA[DING] texto

Define o cabealho da coluna (Uma linha vertical (|) forar uma


alimentao de linha no cabealho se voc no justificar.)

JUS[TIFY] {alinhamento}

Justifica o cabealho da coluna (no os dados) esquerda, ao


centro ou direita

NOPRI[NT]

Oculta a coluna

NUL[L] texto

Especifica o texto a ser exibido para valores nulos

PRI[NT]

Mostra a coluna

TRU[NCATED]

Trunca a string no final da primeira linha da exibio

WRA[PPED]

Quebra o final da string para a prxima linha

Introduo ao Oracle: SQL e PL/SQL 8-20

Usando o Comando COLUMN


Crie cabealhos de coluna.
COLUMN ename HEADING 'Employee|Name' FORMAT A15
COLUMN sal JUSTIFY LEFT FORMAT $99,990.00
COLUMN mgr FORMAT 999999999 NULL 'No manager'

Exiba a configurao atual para a coluna


ENAME.
COLUMN ename

Limpe as configuraes para a coluna


ENAME.
COLUMN ename CLEAR

8-21

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exibindo ou Limpando Configuraes


Para mostrar ou limpar as configuraes do comando COLUMN atual, use os seguintes comandos:

Comando

Descrio

COL[UMN] coluna

Exibe as configuraes atuais para a coluna


especificada

COL[UMN]

Exibe as configuraes atuais para todas as colunas

COL[UMN] coluna CLE[AR]

Limpa as configuraes para a coluna especificada

CLE[AR] COL[UMN]

Limpa as configuraes para todas as colunas

No caso de um comando longo, voc poder continu-lo na prxima linha ao encerrar a linha atual
com um hfen (-).

Introduo ao Oracle: SQL e PL/SQL 8-21

Modelos de Formato COLUMN


Elemento Descrio

Exemplo

Resultado

An

Define uma largura de


exibio n

N/A

N/A

Dgito de supresso de um
nico zero

999999

1234

Aplica o zero esquerda

099999

01234

Cifro flutuante

$9999

$1234

Moeda local

L9999

L1234

Posio do ponto decimal

9999.99

1234.00

Separador de milhar

9,999

1,234

8-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Modelos de Formato COLUMN


O slide exibe modelos de formato COLUMN de exemplo.
O Oracle Server exibe uma string com sinais numricos (#) no lugar de um nmero inteiro cujos
dgitos excedam o nmero de dgitos fornecidos no modelo de formato. Tambm exibe sinais
numricos no lugar de um valor cujo modelo de formato seja alfanumrico, mas cujo valor real seja
numrico.

Introduo ao Oracle: SQL e PL/SQL 8-22

Usando o Comando BREAK

Suprime duplicaes e seciona linhas


Para suprimir duplicaes
SQL> BREAK ON ename ON job

Para secionar linhas em valores de quebra


SQL> BREAK ON ename SKIP 4 ON job SKIP 2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

8-23

O Comando BREAK
Use o comando BREAK para secionar linhas e suprimir valores duplicados. Para assegurar que o
comando BREAK funcione efetivamente, use a clusula ORDER BY para ordenar as colunas que
voc estiver quebrando.
Sintaxe
BREAK on column[|alias|row] [skip n|dup|page] on .. [on report]

onde:

pgina

muda para uma nova pgina quando o valor de quebra alterado

ignora n

ignora o nmero de linhas n quando o valor de quebra alterado


As quebras podem ser ativas em:
Coluna
Linha
Pgina
Relatrio

duplicar

exibe valores duplicados

Limpe todas as configuraes BREAK usando o comando CLEAR:


CLEAR BREAK

Introduo ao Oracle: SQL e PL/SQL 8-23

Usando os Comandos
TTITLE e BTITLE
Exiba cabealhos e rodaps.
TTI[TLE] [texto|OFF|ON]

Defina o cabealho do relatrio.


SQL> TTITLE 'Salary|Report'

Defina o rodap do relatrio.


SQL> BTITLE 'Confidential'

8-24

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Os Comandos TTITLE e BTITLE


Use o comando TTITLE para formatar cabealhos de pgina e o comando BTITLE para rodaps.
Os rodaps aparecem na parte inferior da pgina, de acordo com o valor PAGESIZE.
A sintaxe para BTITLE e TTITLE idntica. Somente a sintaxe para TTITLE mostrada. Voc pode
usar a barra vertical (|) para dividir o texto do ttulo em vrias linhas.
Na sintaxe:
texto

representa o texto do ttulo (Entre com aspas simples se o texto tiver


mais de uma palavra.).

O exemplo com TTITLE no slide define o cabealho do relatrio para exibir Salary centralizado em
uma linha e Report centralizado abaixo dele. O exemplo com BTITLE define o rodap do relatrio para
exibir Confidential. TTITLE coloca a data e o nmero da pgina automaticamente no relatrio.
Observao: O slide fornece uma sintaxe abreviada para TTITLE e BTITLE. Vrias opes para
TTITLE e BTITLE so abordadas em outro curso SQL.

Introduo ao Oracle: SQL e PL/SQL 8-24

Criando um Arquivo de Script


para Executar um Relatrio
1. Crie a instruo SQL SELECT.
2. Salve a instruo SELECT em um arquivo
de script.
3. Carregue o arquivo de script em
um editor.
4. Adicione comandos de formatao antes
da instruo SELECT.
5. Verifique se o caractere de finalizao
segue a instruo SELECT.
8-25

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando um Arquivo de Script para Executar um Relatrio


Voc pode entrar com cada um dos comandos do SQL*Plus no prompt SQL ou colocar todos os
comandos, inclusive a instruo SELECT, em um arquivo de comando (ou script). Um script tpico
consiste em no mnimo uma instruo SELECT e vrios comandos do SQL*Plus.
Como Criar um Arquivo de Script
1. Crie a instruo SQL SELECT no prompt SQL. Certifique-se de que os dados necessrios
para o relatrio estejam precisos antes de voc salvar a instruo em um arquivo e aplicar os
comandos de formatao. Certifique-se de que a clusula ORDER BY relevante esteja includa
se voc desejar usar quebras.
2. Salve a instruo SELECT em um arquivo de script.
3. Edite o arquivo de script para informar os comandos do SQL*Plus.
4. Adicione os comandos de formatao necessrios antes da instruo SELECT. Certifique-se de
no colocar comandos do SQL*Plus dentro da instruo SELECT.
5. Certifique-se de que a instruo SELECT seja seguida de um caractere de execuo: um pontoe-vrgula (;) ou uma barra (/).

Introduo ao Oracle: SQL e PL/SQL 8-25

Criando um Arquivo de Script


para Executar um Relatrio
6. Limpe os comandos de formatao
depois da instruo SELECT.
7. Salve o arquivo de script.
8. Entre com "START nome_do_arquivo"
para executar o script.

8-26

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Como Criar um Arquivo de Script (continuao)


6. Adicione os comandos do SQL*Plus para apagar formato aps o caractere de execuo. Outra
alternativa chamar um arquivo de redefinio que contenha todos os comandos de limpeza de
formato.
7. Salve o arquivo de script com suas alteraes.
8. No SQL*Plus, execute o arquivo de script ao entrar com START nome_do_arquivo ou @
nome_do_arquivo. Esse comando necessrio para ler e executar o arquivo de script.
Diretrizes

Voc pode incluir linhas em branco entre os comandos do SQL*Plus em um script.

possvel abreviar os comandos do SQL*Plus.

Inclua os comandos de redefinio no final do arquivo para restaurar o ambiente SQL*Plus


original.

REM representa um comentrio no SQL*Plus.

Introduo ao Oracle: SQL e PL/SQL 8-26

Exemplo de Relatrio
Fri Oct 24

page

Employee
Report
Job
Category
Employee
Salary
----------------------- ----------------------- ----------------CLERK
ADAMS
$1,100.00
JAMES
$950.00
MILLER
$1,300.00
SMITH
$800.00
MANAGER
BLAKE
$2,850.00
CLARK
$2,450.00
JONES
$2,975.00
SALESMAN
ALLEN
$1,600.00
MARTIN
$1,250.00
TURNER
$1,500.00
WARD
$1,250.00

Confidential
8-27

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exemplo
Crie um arquivo de script para elaborar um relatrio que exiba o cargo, o nome e o salrio de todo
funcionrio cujo salrio seja menor que US$ 3.000. Adicione um cabealho centralizado de luas
linhas em que se leia Employee Report e um rodap centralizado em que se leia Confidential.
Renomeie a coluna do cargo como Job Category dividida em duas linhas. Renomeie a coluna do
nome do funcionrio como Employee. Renomeie a coluna do salrio como Salary e formate-a como
US$ 2.500,00.
SET PAGESIZE 37
SET LINESIZE 60
SET FEEDBACK OFF
TTITLE 'Employee|Report'
BTITLE 'Confidential'
BREAK ON job
COLUMN job
HEADING 'Job|Category' FORMAT A15
COLUMN ename HEADING 'Employee' FORMAT A15
COLUMN sal
HEADING 'Salary' FORMAT $99,999.99
REM ** Insert SELECT statement
SELECT
job, ename, sal
FROM
emp
WHERE
sal < 3000
ORDER BY
job, ename
/
SET FEEDBACK ON
REM clear all formatting commands ...
Introduo ao Oracle: SQL e PL/SQL 8-27

Sumrio
Use as variveis de substituio do
SQL*Plus para armazenar valores
temporariamente.
Use os comandos SET para controlar o
ambiente SQL*Plus atual.
Use o comando COLUMN para controlar a
exibio de uma coluna.
Use o comando BREAK para suprimir
duplicaes e secionar linhas.
Use TTITLE e BTITLE para exibir
cabealhos e rodaps.
8-28

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
As variveis de substituio so teis para executar relatrios. Elas permitem flexibilidade para
substituir valores em uma clusula WHERE, nomes de coluna e expresses. Voc pode personalizar
relatrios criando arquivos de script com:

Variveis de substituio de "e" comercial nico

O comando ACCEPT

O comando DEFINE

O comando UNDEFINE

Variveis de substituio na linha de comando

Voc pode criar um relatrio mais legvel usando os seguintes comandos:

COLUMN

TTITLE

BTITLE

BREAK

Introduo ao Oracle: SQL e PL/SQL 8-28

Viso Geral do Exerccio


Criando uma consulta para exibir valores
usando variveis de substituio
Iniciando um arquivo de comando
contendo variveis
Usando o comando ACCEPT

8-29

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Este exerccio lhe d a oportunidade de criar arquivos que podem ser executados interativamente
atravs de variveis de substituio a fim de criar critrios de seleo em tempo de execuo.

Introduo ao Oracle: SQL e PL/SQL 8-29

Exerccio 8
Determine se as afirmaes a seguir so verdadeiras ou falsas:
1. Uma varivel de substituio de "e" comercial nico pedida no mximo uma vez.
Verdadeiro/Falso
2. O comando ACCEPT um comando SQL.
Verdadeiro/Falso
3. Crie um arquivo de script para exibir o nome do funcionrio, o cargo e a data de admisso de
todos os funcionrios que tenham iniciado entre determinada faixa. Concatene o nome e o
cargo juntos, separados por um espao e uma vrgula, e coloque um label na coluna
Employees. Pea que o usurio fornea as duas faixas usando o comando ACCEPT. Use o
formato MM/DD/AAAA. Salve o arquivo de script como p8q3.sql.
Please enter the low date range ('MM/DD/YYYY'): 01/01/1981
Please enter the high date range ('MM/DD/YYYY'): 01/01/1982
EMPLOYEES

HIREDATE

----------------- --------------KING, PRESIDENT


BLAKE, MANAGER
CLARK, MANAGER
JONES, MANAGER
MARTIN, SALESMAN
ALLEN, SALESMAN
TURNER, SALESMAN
JAMES, CLERK
WARD, SALESMAN
FORD, ANALYST
10 rows selected.

17-NOV-81
01-MAY-81
09-JUN-81
02-APR-81
28-SEP-81
20-FEB-81
08-SEP-81
03-DEC-81
22-FEB-81
03-DEC-81

4. Crie um script para exibir o nome do funcionrio, o cargo e o nome do departamento para uma
determinada localizao. A condio de pesquisa deve aceitar pesquisas sem distino entre
maisculas e minsculas para a localizao do departamento. Salve o arquivo de script como
p8q4.sql.
Please enter the location name: Dallas
EMPLOYEE NAME
------------JONES
FORD
SMITH
SCOTT
ADAMS

JOB
-----------MANAGER
ANALYST
CLERK
ANALYST
CLERK

DEPARTMENT NAME
--------------RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH

Introduo ao Oracle: SQL e PL/SQL 8-30

Exerccio 8 (continuao)
5. Modifique p8q4.sql para criar um relatrio que contenha o nome do departamento, o nome
do funcionrio, a data de admisso, o salrio e o salrio anual de cada funcionrio para todos
os funcionrios em uma determinada localizao. Pea a localizao ao usurio. Coloque um
label nas colunas DEPARTMENT NAME, EMPLOYEE NAME, START DATE, SALARY e
ANNUAL SALARY, colocando os labels em vrias linhas. Salve novamente o script como
p8q5.sql.
Please enter the location name: Chicago
DEPARTMENT
NAME
---------SALES

EMPLOYEE
NAME
----------BLAKE
MARTIN
ALLEN
TURNER
JAMES
WARD

START
DATE
--------01-MAY-81
28-SEP-81
20-FEB-81
08-SEP-81
03-DEC-81
22-FEB-81

SALARY
--------$2,850.00
$1,250.00
$1,600.00
$1,500.00
$950.00
$1,250.00

Introduo ao Oracle: SQL e PL/SQL 8-31

ANNUAL
SALARY
---------$34,200.00
$15,000.00
$19,200.00
$18,000.00
$11,400.00
$15,000.00

Introduo ao Oracle: SQL e PL/SQL 8-32

9
Manipulao de Dados

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Descrever cada instruo DML
Inserir linhas em uma tabela
Atualizar linhas em uma tabela
Deletar linhas de uma tabela
Controlar transaes

9-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender como inserir linhas, atualizar e deletar linhas existentes em uma tabela.
Voc tambm aprender como controlar transaes com as instrues COMMIT, SAVEPOINT e
ROLLBACK.

Introduo ao Oracle: SQL e PL/SQL 9-2

DML (Data Manipulation Language)


Uma instruo DML executada quando
voc:
Adiciona novas linhas a uma tabela
Modifica linhas existentes em uma

tabela
Remove linhas existentes de uma tabela

Uma transao consiste em um conjunto


de instrues DML que formam uma
unidade lgica de trabalho.

9-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

DML (Data Manipulation Language)


A DML (Data Manipulation Language) uma parte essencial do SQL. Quando voc quiser adicionar,
atualizar ou deletar dados no banco de dados, execute uma instruo DML. Um conjunto de
instrues DML que formam uma unidade lgica de trabalho chamada de transao.
Considere um banco de dados bancrio. Quando o cliente de um banco transfere dinheiro de uma
conta de poupana para uma conta corrente, a transao consiste em trs operaes separadas:
diminuir a conta de poupana, aumentar a conta corrente e registrar a transao no lanamento da
transao. O Oracle Server deve garantir que todas as trs instrues SQL sejam executadas para
manter as contas com um saldo apropriado. Quando algo impedir que uma das instrues na transao
seja executada, as outras instrues da transao devero ser desfeitas.

Introduo ao Oracle: SQL e PL/SQL 9-3

Adicionando uma Nova Linha


em uma Tabela
50 DEVELOPMENT
DEVELOPMENT DETROIT
50
DETROIT
Nova linha

" inserir uma nova linha


na tabela DEPT"

DEPT
DEPTNO
-----10
20
30
40

DNAME
LOC
---------- -------ACCOUNTING NEW YORK
RESEARCH
DALLAS
SALES
CHICAGO
OPERATIONS BOSTON

DEPT
DEPTNO
-----10
20
30
40

DNAME
LOC
---------- -------ACCOUNTING NEW YORK
RESEARCH
DALLAS
SALES
CHICAGO
OPERATIONS BOSTON

50 DEVELOPMENT DETROIT
9-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Adicionando uma Nova Linha em uma Tabela


O grfico do slide adiciona um novo departamento tabela DEPT.

Introduo ao Oracle: SQL e PL/SQL 9-4

A Instruo INSERT
Adicione novas linhas em uma tabela
usando a instruo INSERT.
INSERT INTO
VALUES

tabela [(coluna [, coluna...])]


(valor [, valor...]);

Somente uma linha inserida por vez com


esta sintaxe.

9-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Adicionando uma nova linha em uma Tabela (continuao)


Voc pode adicionar novas linhas tabela emitindo a instruo INSERT.
Na sintaxe:
tabela

o nome da tabela is the name of the table

coluna

o nome da coluna a ser preenchida

valor

o valor correspondente para a coluna

Observao: Esta instruo com a clusula VALUES adiciona somente uma linha por vez a uma
tabela.

Introduo ao Oracle: SQL e PL/SQL 9-5

Inserindo Novas Linhas


Insira uma nova linha contendo valores
para cada coluna.
Liste valores na ordem default das colunas
na tabela.
Liste opcionalmente as colunas na
clusula INSERT.
SQL> INSERT INTO
2 VALUES
1 row created.

dept (deptno, dname, loc)


(50, 'DEVELOPMENT', 'DETROIT');

Coloque os valores de data e caractere


entre aspas simples.
9-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Adicionando uma nova linha em uma Tabela (continuao)


Como voc pode inserir uma nova linha que contenha valores para cada coluna, a lista de colunas no
requerida na clusula INSERT. Entretanto, se voc no usar a lista de colunas, os valores devero
ser listados de acordo com a ordem default das colunas na tabela.
SQL> DESCRIBE

dept

Name
Null?
------------------------------- -------DEPTNO
NOT NULL
DNAME
LOC

Type
-----------NUMBER(2)
VARCHAR2(14)
VARCHAR2(13)

Para clareza, use a lista de colunas na clusula INSERT.


Coloque os valores de dados e caracteres entre aspas simples, no coloque valores numricos entre
aspas simples.

Introduo ao Oracle: SQL e PL/SQL 9-6

Inserindo Linhas com


Valores Nulos
Mtodo implcito: Omita a coluna da lista
de colunas.
SQL> INSERT INTO
2 VALUES
1 row created.

dept (deptno, dname )


(60, 'MIS');

Mtodo explcito: Especifique a palavrachave NULL.


SQL> INSERT INTO
2 VALUES
1 row created.

9-7

dept
(70, 'FINANCE', NULL);

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Mtodos para Inserir Valores Nulos


Mtodo

Descrio

Implcito

Omite a coluna da lista de colunas.

Explcito

Especifica a palavra-chave NULL na lista VALUES.


Especifica a string vazia ('') na lista VALUES; para strings de caractere e
datas somente.

Certifique-se de que a coluna de destino permita valores nulos verificando o status Null? a partir do
comando DESCRIBE do SQL*Plus.
O Oracle Server impe automaticamente todas as restries de integridade de dados, tipos de dados e
faixas de dados. Qualquer coluna que no esteja listada explicitamente obtm um valor nulo na nova
linha.

Introduo ao Oracle: SQL e PL/SQL 9-7

Inserindo Valores Especiais


A funo SYSDATE registra a data e hora atuais.
SQL> INSERT INTO
2
3
4 VALUES
5
6
1 row created.

9-8

emp (empno, ename, job,


mgr, hiredate, sal, comm,
deptno)
(7196, 'GREEN', 'SALESMAN',
7782, SYSDATE, 2000, NULL,
10);

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Inserindo Valores Especiais Usando Funes SQL


Voc pode usar pseudocolunas para inserir valores especiais em sua tabela.
O exemplo do slide registra informaes para o funcionrio Green na tabela EMP. Ele fornece a data
e hora atuais na coluna HIREDATE. Ele usa a funo SYSDATE para data e hora atuais.
Voc tambm poder usar a funo USER ao inserir linhas em uma tabela. A funo USER registra o
nome de usurio atual.
Confirmando Adies Tabela
SQL> SELECT
2 FROM
3 WHERE
EMPNO
--------7196

empno, ename, job, hiredate, comm


emp
empno = 7196;

ENAME

JOB

HIREDATE

COMM

---------- --------- --------- --------GREEN


SALESMAN 01-DEC-97

Introduo ao Oracle: SQL e PL/SQL 9-8

Inserindo Valores
Especficos de Data
Adicionar um novo funcionrio.
SQL> INSERT INTO
2 VALUES
3
4
1 row created.

emp
(2296,'AROMANO','SALESMAN',7782,
TO_DATE('FEB 3, 1997', 'MON DD, YYYY'),
1300, NULL, 10);

Verifique sua adio.


EMPNO ENAME
JOB
MGR
HIREDATE SAL COMM DEPTNO
----- ------- -------- ---- --------- ---- ---- -----2296 AROMANO SALESMAN 7782 03-FEB-97 1300
10

9-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Inserindo Valores Especficos de Data e Hora


O formato DD-MON-YY geralmente usado para inserir um valor de data. Com este formato,
lembre-se que o sculo atual o default. Como a data tambm contm informaes sobre a hora, a
hora default meia-noite (00:00:00).
Se uma data tiver que ser informada em um formato diferente do default por exemplo, outro
sculo e/ou uma hora especfica voc deve usar a funo TO_DATE.
O exemplo no slide registra informaes para o funcionrio Aromano na tabela EMP. Ele define a
coluna HIREDATE como 3 de fevereiro de 1997.
Se o formato RR estiver definido, o sculo pode no ser o atual.

Introduo ao Oracle: SQL e PL/SQL 9-9

Inserindo Valores Usando


Variveis de Substituio
Crie um script interativo usando parmetros
de substituio do SQL*Plus.
SQL> INSERT INTO
2 VALUES
3

dept (deptno, dname, loc)


(&department_id,
'&department_name', '&location');

Enter value for department_id: 80


Enter value for department_name: EDUCATION
Enter value for location: ATLANTA
1 row created.

9-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Inserindo Valores Usando Variveis de Substituio


Voc pode produzir uma instruo INSERT que permite que o usurio adicione valores
interativamente usando as variveis de substituio do SQL*Plus.
O exemplo do slide registra informaes para um departamento na tabela DEPT. Ele solicita ao
usurio o nmero do departamento, nome do departamento e localizao.
Para valores de data e caractere, o "e" comercial e o nome da varivel aparecem entre aspas simples.

Introduo ao Oracle: SQL e PL/SQL 9-10

Criando um Script
com Prompts Personalizados
ACCEPT armazena o valor em uma varivel.
PROMPT exibe o texto personalizado.
ACCEPT

department_id PROMPT 'Please enter the department number:'

ACCEPT

department_name PROMPT 'Please enter the department name:'


location PROMPT 'Please enter the location:'

ACCEPT
INSERT INTO
VALUES

9-11

dept (deptno, dname, loc)


(&department_id, '&department_name',
'&location');

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando um Script para Manipular Dados


Voc pode salvar o seu comando com variveis de substituio em um arquivo e execut-lo. Cada vez que
voc executar o comando, ele ir solicitar novos valores. Personalize os prompts usando o comando
ACCEPT do SQL*Plus.
O exemplo no slide registra informaes para um departamento na tabela DEPT. Ele solicita ao usurio o
nmero do departamento, o nome do departamento e a localizao usando mensagens de prompt
personalizadas.
Please enter the department number: 90
Please enter the department name: PAYROLL
Please enter the location: HOUSTON
1 row created.

No preceda o parmetro de substituio do SQL*Plus com o "e" comercial (&) ao fazer referncia a ele
no comando ACCEPT. Use um trao (-) para continuar com um comando do SQL*Plus na prxima linha.

Introduo ao Oracle: SQL e PL/SQL 9-11

Copiando Linhas
a partir de Outra Tabela
Crie a instruo INSERT com uma
subconsulta.
SQL> INSERT INTO managers(id, name, salary, hiredate)
2
SELECT empno, ename, sal, hiredate
3
FROM
emp
4
WHERE job = 'MANAGER';
3 rows created.

No use a clusula VALUES.


Faa a correspondncia do nmero de
colunas na clusula INSERT com o nmero
de colunas na subconsulta.
9-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Copiando Linhas a partir de Outra Tabela


Voc pode usar a instruo INSERT para adicionar linhas a uma tabela onde os valores so derivados de
tabelas existentes. No lugar da clusula VALUES, use uma subconsulta.
Sintaxe
INSERT INTO tabela [ coluna (, coluna) ]
subconsulta;

onde:

tabela

o nome da tabela

coluna

o nome da coluna a ser preenchida

subconsulta

a subconsulta que retorna linhas na tabela

Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "SELECT". seo
Subqueries.
O nmero de colunas e seus tipos de dados na lista de colunas da clusula INSERT devem coincidir com
o nmero de valores e seus tipos de dados na subconsulta.

Introduo ao Oracle: SQL e PL/SQL 9-12

Alterando os Dados
em uma Tabela

EMP
EMPNO ENAME
7839
7698
7782
7566
...

KING
BLAKE
CLARK
JONES

JOB

...

DEPTNO

PRESIDENT
MANAGER
MANAGER
MANAGER

10
30
10
20

"atualize uma
linha em uma
tabela EMP"

EMP
EMPNO ENAME
7839
7698
7782
7566
...
9-13

KING
BLAKE
CLARK
JONES

JOB

...

PRESIDENT
MANAGER
MANAGER
MANAGER

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Alterando os Dados em uma Tabela


O grfico do slide altera o nmero do departamento de Clark de 10 para 20.

Introduo ao Oracle: SQL e PL/SQL 9-13

DEPTNO
10
30
20
10
20

A instruo UPDATE
Modifique linhas existentes com a
instruo UPDATE.
UPDATE
SET
[WHERE

tabela
coluna = valor [, coluna = valor, ...]
condio];

Atualize mais de uma linha por vez, se


necessrio.

9-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Atualizando Linhas
Voc pode modificar linhas existentes usando a instruo UPDATE.
Na sintaxe acima:
tabela

o nome da tabela

coluna

o nome da coluna a ser preenchida

valor

o valor correspondente ou subconsulta para a coluna

condio

identifica as linhas a serem atualizadas e composto de nomes de colunas


expresses, constantes, subconsultas e operadores de comparao

Confirme a operao de atualizao consultando a tabela para exibir as linhas atualizadas.


Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "UPDATE".
Observao: Em geral, use a chave primria para identificar uma nica linha. Vrias linhas podero
ser atualizadas inesperadamente se outras colunas forem usadas. Por exemplo, identificar uma nica
linha na tabela EMP por nome perigoso porque mais de um funcionrio pode ter o mesmo nome.

Introduo ao Oracle: SQL e PL/SQL 9-14

Atualizando Linhas em uma Tabela


Uma linha ou linhas especficas so
modificadas quando voc especifica a
clusula WHERE.
SQL> UPDATE emp
2 SET
deptno = 20
3 WHERE
empno = 7782;
1 row updated.

Todas as linhas na tabela so modificadas


quando voc omite a clusula WHERE.
SQL> UPDATE employee
2 SET
deptno = 20;
14 rows updated.
9-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Atualizando Linhas (continuao)


A instruo UPDATE modifica linhas especficas, se a clusula WHERE for especificada.
O exemplo do slide transfere o funcionrio 7782 (Clark) para o departamento 20.
Se voc omitir a clusula WHERE, todas as linhas na tabela sero modificadas.
SQL> SELECT
2 FROM

ename, deptno
employee;

ENAME
DEPTNO
---------- --------KING
20
BLAKE
20
CLARK
20
JONES
20
MARTIN
20
ALLEN
20
TURNER
20
...
14 rows selected.

Observao: A tabela EMPLOYEE possui os mesmos dados que a tabela EMP.


Introduo ao Oracle: SQL e PL/SQL 9-15

Atualizando com Subconsulta de


Vrias Colunas
Atualize o cargo e o departamento do
funcionrio 7698 para coincidir com o do
funcionrio 7499.
SQL> UPDATE emp
2 SET
(job, deptno) =
3
(SELECT job, deptno
4
FROM
emp
5
WHERE
empno = 7499)
6 WHERE
empno = 7698;
1 row updated.

9-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Atualizando com Subconsulta de Vrias Colunas


Subconsultas de vrias colunas podem ser implementadas na clusula SET de uma instruo
UPDATE.
Sintaxe
UPDATE tabela
SET
(coluna, coluna, ...) =
(SELECT coluna, coluna, ...
FROM
tabela
WHERE
condio)
WHERE condio;

Introduo ao Oracle: SQL e PL/SQL 9-16

Atualizando Linhas Baseadas


em Outra Tabela
Use subconsultas em instrues UPDATE
para atualizar linhas em uma tabela baseada
em valores de outra tabela.
SQL> UPDATE employee
2 SET
deptno =
3
4
5 WHERE
job
=
6
7
2 rows updated.

9-17

(SELECT
FROM
WHERE
(SELECT
FROM
WHERE

deptno
emp
empno = 7788)
job
emp
empno = 7788);

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Atualizando Linhas Baseadas em Outra Tabela


Voc pode usar subconsultas em instrues UPDATE para atualizar linhas em uma tabela. O exemplo
no slide atualiza a tabela EMPLOYEE baseada nos valores da tabela EMP. Isso altera o nmero do
departamento de todos os funcionrios com o cargo do funcionrio 7788 para o nmero do
departamento atual do funcionrio 7788.

Introduo ao Oracle: SQL e PL/SQL 9-17

Atualizando Linhas: Erro de


Restrio de Integridade
SQL> UPDATE
2 SET
3 WHERE

emp
deptno = 55
deptno = 10;

te
s
i
x

er

d
de

m
ta
r
pa

en

to

55

UPDATE emp
e
o
*

ERROR at line 1: N
ORA-02291: integrity constraint (USR.EMP_DEPTNO_FK)
violated - parent key not found

9-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Erro de Restrio de Integridade


Se tentar atualizar um registro com um valor vinculado a uma restrio de integridade, voc causar
um erro.
No exemplo no slide, o nmero de departamento 55 no existe na tabela me, DEPT, assim voc no
receber a violao da chave me ORA-02291.
Observao: As restries de integridade garantem que os dados obedeam a um conjunto
predefinido de regras. Uma lio subseqente ir abordar as restries de integridade com mais
detalhes.

Introduo ao Oracle: SQL e PL/SQL 9-18

Removendo uma Linha de uma Tabela


DEPT
DEPTNO
-----10
20
30
40
50
60
...

DNAME
---------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
-------NEW YORK
DALLAS
CHICAGO
BOSTON
DEVELOPMENT DETROIT
MIS

" remova uma linha da


tabela DEPT"
DEPT
DEPTNO
-----10
20
30
40
60
...

9-19

DNAME
---------ACCOUNTING
RESEARCH
SALES
OPERATIONS
MIS

LOC
-------NEW YORK
DALLAS
CHICAGO
BOSTON

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Removendo uma Linha de uma Tabela


O grfico do slide remove o departamento DEVELOPMENT da tabela DEPT (pressupondo que no
h restries definidas na tabela DEPT).

Introduo ao Oracle: SQL e PL/SQL 9-19

A Instruo DELETE
Voc pode remover linhas existentes de uma
tabela usando a instruo DELETE.
DELETE [FROM]
[WHERE

9-20

tabela
condio];

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Deletando Linhas
Voc pode remover linhas existentes usando a instruo DELETE.
Na sintaxe:
tabela
condio

o nome da tabela
identifica as linhas a serem deletadas e composta de nomes de colunas,
expresses, constantes, subconsultas e operadores de comparao

Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "DELETE".

Introduo ao Oracle: SQL e PL/SQL 9-20

Deletando Linhas de uma Tabela


Linhas especficas so deletadas quando
voc especifica a clusula WHERE.
SQL> DELETE FROM
2 WHERE
1 row deleted.

department
dname = 'DEVELOPMENT';

Todas as linhas na tabela sero deletadas


se voc omitir a clusula WHERE.
SQL> DELETE FROM
4 rows deleted.

9-21

department;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Deletando Linhas (continuao)


Voc pode deletar determinadas linhas especificando a clusula WHERE na instruo DELETE. O
exemplo do slide deleta o departamento DEVELOPMENT da tabela DEPARTMENT. Voc pode
confirmar essa operao exibindo as linhas deletadas usando a instruo SELECT.
SQL> SELECT *
2 FROM
department
3 WHERE
dname = 'DEVELOPMENT';
no rows selected.

Exemplo
Remova todos os funcionrios que iniciaram aps 1 de janeiro de 1997.
SQL> DELETE FROM
2 WHERE
1 row deleted.

emp
hiredate > TO_DATE('01.01.1997', 'DD.MM.YYYY');

Se voc omitir a clusula WHERE, todas as linhas na tabela sero deletadas. O segundo exemplo no
slide deleta todas as linhas da tabela DEPARTMENT porque nenhuma clusula WHERE foi
especificada.
Observao: A tabela DEPARTMENT possui os mesmos dados que a tabela DEPT.

Introduo ao Oracle: SQL e PL/SQL 9-21

Deletando Linhas Baseadas em


Outra Tabela
Use subconsultas em instrues DELETE
para remover linhas de uma tabela baseadas
em valores de outra tabela.
SQL> DELETE FROM
2 WHERE
3
4
5
6 rows deleted.

9-22

employee
deptno =
(SELECT
FROM
WHERE

deptno
dept
dname ='SALES');

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Deletando Linhas Baseadas em Outra Tabela


Voc pode usar subconsultas para deletar linhas de uma tabela baseadas em valores de outra tabela.
O exemplo no slide deleta todos os funcionrios que estejam no departamento 30. A subconsulta
procura a tabela DEPT para localizar o nmero de departamento para o departamento SALES. A
subconsulta ento alimenta o nmero de departamento para a consulta principal, que deleta linhas de
dados da tabela EMPLOYEE baseada nesse nmero de departamento.

Introduo ao Oracle: SQL e PL/SQL 9-22

Deletando Linhas: Erro de


Restrio de Integridade
SQL> DELETE FROM
2 WHERE

a
linh a
a
dept
um imri
r
a
t
r
deptno = 10;
e
del have p geira
e
pod ma c stran
o

n enha u have e la.


c
o
t
e
V
c
con como ra tab
e
qu a da
out
m
s
e
u

DELETE FROM dept


*
ERROR at line 1:
ORA-02292: integrity constraint (USR.EMP_DEPTNO_FK)
violated - child record found

9-23

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Erro de Restrio de Integridade


Se tentar deletar um registro com um valor vinculado a uma restrio de integridade, voc
causar um erro.
O exemplo no slide tenta deletar o nmero de departamento 10 da tabela DEPT, o que resulta em um
erro porque o nmero de departamento usado como uma chave estrangeira na tabela EMP. Se o
registro pai que voc tentar deletar tiver registros filhos, voc receber a violao de registro filho
encontrada ORA-02292.

Introduo ao Oracle: SQL e PL/SQL 9-23

Transaes de Banco de Dados


Consistem de uma das seguintes instrues:
Instrues DML que fazem uma alterao
consistente nos dados
Uma instruo DDL
Uma instruo DCL

9-24

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Transaes de Banco de Dados


O Oracle Server garante consistncia de dados baseada em transaes. As transaes lhe do mais
flexibilidade e controle ao alterar dados e garantem a consistncia de dados no caso de falha do
usurio ou do sistema.
As transaes consistem de instrues DML que faam uma alterao consistente nos dados. Por
exemplo, uma transferncia de fundos entre duas contas deve incluir o dbito em uma conta e o
crdito em outra com mesma quantia. Ambas as aes devem falhar ou ter xito juntas. O crdito no
deve ser processado sem o dbito.
Tipos de Transao
Tipo

Descrio

Data manipulation
language (DML)

Consiste de qualquer nmero de instrues DML que o Oracle Server


trata como uma nica entidade ou unidade lgica de trabalho

Data definition language


(DDL)

Consiste de apenas uma instruo DDL

Data control language


(DCL)

Consiste de apenas uma instruo DCL

Introduo ao Oracle: SQL e PL/SQL 9-24

Transaes de Banco de Dados


Comea quando for executada a primeira
instruo SQL executvel
Termina com um dos seguintes eventos:
COMMIT ou ROLLBACK emitida
Instruo DDL ou DCL executada

(commit automtico)
O usurio sai
O sistema cai

9-25

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Quando uma Transao Inicia e Termina?


Uma transao inicia quando a primeira instruo SQL executvel for encontrada e termina quando
ocorrer uma das seguinte situaes:

Uma instruo COMMIT ou ROLLBACK for emitida

Uma instruo DDL, como CREATE, for emitida

Uma instruo DCL for emitida

O usurio sair do SQL*Plus

Houver uma falha no computador ou o sistema cair

Depois que uma transao termina, a prxima instruo SQL executvel automaticamente inicia a
prxima transao.
Uma instruo DDL ou DCL automaticamente processada e, portanto, finaliza implicitamente uma
transao.

Introduo ao Oracle: SQL e PL/SQL 9-25

Vantagens das Instrues


COMMIT e ROLLBACK
Garantir consistncia de dados
Visualizar alteraes nos dados antes de
fazer as alteraes permanentemente
Agrupar operaes relacionadas
logicamente

9-26

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Introduo ao Oracle: SQL e PL/SQL 9-26

Controlando Transaes
Transao

INSERT
INSERT
COMMIT

UPDATE
UPDATE

INSERT
INSERT

Savepoint A

DELETE
DELETE

Savepoint B

ROLLBACK para Savepoint B

ROLLBACK para Savepoint A

ROLLBACK
9-27

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Instrues de Controle de Transao Explcita


Voc pode controlar a lgica das transaes usando as instrues COMMIT, SAVEPOINT e
ROLLBACK.
Instruo

Descrio

COMMIT

Finaliza a transao atual tornando permanentes todas as alteraes


de dados pendentes

SAVEPOINT nome

Marca um ponto de gravao dentro da transao atual

ROLLBACK [TO
SAVEPOINT nome]

ROLLBACK finaliza a transao atual descartando todas as


alteraes de dados pendentes; ROLLBACK TO SAVEPOINT
descarta a transao atual para o ponto de gravao especfico,
descartando assim o ponto de gravao e quaisquer alteraes
subseqentes. Se voc omitir essa clusula, a instruo
ROLLBACK descarta toda a transao.

Observao: SAVEPOINT no uma SQL padro de ANSI.

Introduo ao Oracle: SQL e PL/SQL 9-27

Processando Transaes Implcitas


Um commit automtico ocorre sob as
seguintes circunstncias:
A instruo DDL emitida
A instruo DCL emitida
A sada normal do SQL*Plus, sem emitir
explicitamente COMMIT ou ROLLBACK
Um rollback automtico ocorre quando h
uma finalizao anormal do SQL*Plus ou
queda do sistema.

9-28

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Processando Transaes Implcitas


Status

Circunstncias

Processamento
automtico

As instrues DDL ou DCL so emitidas


Sada normal do SQL*Plus, sem emitir explicitamente COMMIT
ou ROLLBACK

Rollback automtico

Finalizao anormal do SQL*Plus ou queda do sistema

Observao: H um terceiro comando disponvel no SQL*Plus. O comando AUTOCOMMIT pode


ser alternado entre ON ou OFF. Se for definido como ON, cada instruo DML individual ser
processada assim que for executada. Voc no pode fazer roll back das alteraes. Se for definido
como OFF, COMMIT poder ser emitido explicitamente. Alm disso, COMMIT emitido quando
uma instruo DLL emitida ou quando voc sai do SQL*Plus.
Falhas do Sistema
Quando uma transao interrompida por uma falha do sistema, faz-se automaticamente roll back de
toda a transao. Isso impede que o erro faa alteraes no desejadas nos dados e retorna as tabelas
ao seu estado no momento do ltimo commit. Dessa forma, o Oracle Server protege a integridade das
tabelas.

Introduo ao Oracle: SQL e PL/SQL 9-28

Estado dos Dados Antes de


COMMIT ou ROLLBACK
O estado anterior dos dados pode ser
recuperado.
O usurio atual pode revisar os resultados das
operaes DML usando a instruo SELECT.
Outros usurios no podero ver os
resultados das instrues DML do usurio
atual.
As linhas afetadas so bloqueadas, outros
usurios no podero alterar os dados dentro
das linhas afetadas.
9-29

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Submetendo Alteraes a Commit


Todas as alteraes feitas nos dados durante a transao so temporrias at que a transao seja
processada.
Estado dos dados antes que COMMIT ou ROLLBACK seja emitido:

As operaes de manipulao de dados afetam primeiramente o buffer do banco de dados, assim, o


estado anterior dos dados pode ser recuperado.

O usurio atual pode revisar os resultados das operaes de manipulao de dados consultando as
tabelas.

Os outros usurios no podero exibir os resultados das operaes de manipulao de dados feitas
pelo usurio atual. O Oracle Server institui a consistncia na leitura para garantir que cada usurio
veja os dados como eram no ltimo commit.

As linhas afetadas so bloqueadas, os outros usurios no podero alterar os dados nas linhas
afetadas.

Introduo ao Oracle: SQL e PL/SQL 9-29

Estado dos Dados Aps COMMIT


As alteraes nos dados so feitas
permanentemente no banco de dados.
O estado anterior dos dados perdido
permanentemente.
Todos os usurios podem ver os resultados.
As linhas afetadas so desbloqueadas, essas
linhas esto disponveis para serem
manipuladas por outros usurios.
Todos os savepoints so apagados.

9-30

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Submetendo Alteraes a Commit (continuao)


Torne permanentes todas as alteraes pendentes usando a instruo COMMIT. Aps COMMIT:
O estado dos dados aps emitir uma COMMIT:

As alteraes nos dados so gravadas no banco de dados.

O estado anterior dos dados perdido permanentemente.

Todos os usurios podem exibir os resultados da transao.

As linhas afetadas so desbloqueadas, as linhas esto agora disponveis para outros usurios
executarem as novas alteraes nos dados.

Todos os savepoints so apagados.

Introduo ao Oracle: SQL e PL/SQL 9-30

Submetendo Dados a Commit


Fazer as alteraes.
SQL> UPDATE emp
2 SET
deptno = 10
3 WHERE
empno = 7782;
1 row updated.

Submeter alteraes a commit.


SQL> COMMIT;
Commit complete.

9-31

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Submetendo Alteraes a Commit (continuao)


O exemplo do slide atualiza a tabela EMP e define o nmero de departamento para o funcionrio 7782
(Clark) como 10. Ele depois torna a alterao permanente emitindo a instruo COMMIT.
Exemplo
Crie um novo departamento ADVERTISING com pelo menos um funcionrio. Torne permanentes as
alteraes nos dados.
SQL> INSERT INTO department(deptno, dname, loc)
2 VALUES
(50, 'ADVERTISING', 'MIAMI');
1 row created.
SQL> UPDATE employee
2 SET
deptno = 50
3 WHERE
empno = 7876;
1 row updated.
SQL> COMMIT;
Commit complete.

Introduo ao Oracle: SQL e PL/SQL 9-31

Estado dos Dados Aps ROLLBACK


Descarte todas as alteraes pendentes
usando a instruo ROLLBACK.
As alteraes nos dados so desfeitas.
O estado anterior dos dados restaurado.
As linhas afetadas so desbloqueadas.
SQL> DELETE FROM
14 rows deleted.
SQL> ROLLBACK;
Rollback complete.

9-32

employee;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Fazendo Roll Back de Alteraes


Descarte todas as alteraes pendentes usando a instruo ROLLBACK. Aps ROLLBACK:

As alteraes nos dados so desfeitas.

O estado anterior dos dados restaurado.

As linhas afetadas so desbloqueadas.

Exemplo
Ao tentar remover um registro da tabela TEST, voc pode acidentalmente esvaziar a tabela. Voc
pode corrigir o erro, emitir novamente a instruo apropriada e tornar permanentes as alteraes dos
dados.
SQL> DELETE FROM test;
25,000 rows deleted.
SQL> ROLLBACK;
Rollback complete.
SQL> DELETE FROM test
2 WHERE
id = 100;
1 row deleted.
SQL> SELECT
*
2 FROM
test
3 WHERE
id = 100;
No rows selected.
SQL> COMMIT;
Commit complete.
Introduo ao Oracle: SQL e PL/SQL 9-32

Fazendo Roll Back de Alteraes


para um Marcador
Crie um marcador em uma transao atual
usando a instruo SAVEPOINT.
Faa roll back do marcador usando a
instruo ROLLBACK TO SAVEPOINT.
SQL> UPDATE...
SQL> SAVEPOINT update_done;
Savepoint created.
SQL> INSERT...
SQL> ROLLBACK TO update_done;
Rollback complete.

9-33

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Fazendo Roll Back de Alteraes para um Savepoint


Voc pode criar um marcador na transao atual usando a instruo SAVEPOINT. Dessa forma, a
transao poder ser dividida em sees menores. Voc poder ento descartar as alteraes
pendentes at aquele marcador usando a instruo ROLLBACK TO SAVEPOINT.
Se voc criar um segundo savepoint com o mesmo nome que o anterior, o anterior ser deletado.

Introduo ao Oracle: SQL e PL/SQL 9-33

Rollback no Nvel da Instruo


Se uma nica instruo DML falhar durante
a execuo, ser feito roll back somente
dessa instruo.
O Oracle Server implementa um savepoint
implcito.
Todas as outras alteraes so mantidas.
O usurio deve finalizar as transaes
explicitamente usando uma instruo
COMMIT ou ROLLBACK.
9-34

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Rollback no Nvel da Instruo


Parte da transao pode ser descartada por um rollback implcito se for detectado um erro na
execuo da instruo. Se uma nica instruo DML falhar durante a execuo de uma transao, seu
efeito ser desfeito por um rollback no nvel da instruo, mas as alteraes feitas pelas instrues
DML anteriores na transao no sero descartadas. Somente o usurio poder fazer o roll back ou
process-las.
O Oracle emite uma instruo COMMIT implcita antes e aps qualquer instruo DDL (Data
Definition Language). Assim, mesmo que a instruo DDL no seja executada com xito, voc no
poder fazer roll back da instruo anterior porque o servidor emitiu um commit.
Finalize suas transaes explicitamente executando uma instruo COMMIT ou ROLLBACK.

Introduo ao Oracle: SQL e PL/SQL 9-34

Consistncia na Leitura
A consistncia na leitura garante sempre
uma exibio consistente dos dados.
As alteraes feitas por um usurio no
entram em conflito com as alteraes
feitas por outro usurio.
A consistncia na leitura garante que nos
mesmos dados:
Os leitores no esperem pelos autores
Os autores no esperem pelos leitores

9-35

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Consistncia na Leitura
Os usurios de bancos de dados fazem dois tipos de acesso ao banco de dados:

Operaes de leitura (instruo SELECT)

Operaes de gravao (instrues INSERT, UPDATE, DELETE)

Voc precisa de consistncia na leitura para que ocorra o seguinte:

O leitor e autor do banco de dados tenham garantia de uma exibio consistente dos
dados.

Os leitores no vejam os dados que estejam sendo alterados.

Os autores tenham garantia de que as alteraes no banco de dados sejam feitas de


forma consistente.

As alteraes feitas por um autor no interrompam ou entrem em conflito com as


alteraes que outro autor esteja fazendo.

O objetivo da consistncia na leitura garantir que cada usurio veja os dados como eles
eram no ltimo commit, antes da operao DML iniciar.

Introduo ao Oracle: SQL e PL/SQL 9-35

Implementao da Consistncia
na Leitura
Blocos
de dados

UPDATE emp
SET
sal = 2000
WHERE ename =
'SCOTT';

Segmentos
de rollback
Usurio A
SELECT *
FROM
emp;

Imagem da
consistncia
na leitura

Usurio B
9-36

dados
alterados
e dados
intactos
antes de
alterar dados
"antigos"

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Implementao da Consistncia na Leitura


A consistncia na leitura uma implementao automtica. Ela mantm uma cpia parcial do banco
de dados em segmentos de rollback.
Quando uma operao de insero, atualizao ou excluso feita no banco de dados, o Oracle
Server tira uma cpia dos dados antes de serem alterados e os grava no segmento de rollback.
Todos os leitores, exceto o que fez a alterao, ainda visualizam o banco de dados como era antes do
incio das alteraes, eles visualizam um "instantneo" dos segmentos de rollback dos dados.
Antes das alteraes serem processadas no banco de dados, somente o usurio que est modificando
os dados v o banco de dados com as alteraes, todas as outras pessoas vem o instantneo no
segmento de rollback. Isso garante que os leitores dos dados leiam dados consistentes que no
estejam sendo alterados no momento.
Quando uma instruo DML processada, a alterao feita no banco de dados torna-se visvel a
qualquer pessoa que execute a instruo SELECT. O espao ocupado pelos dados "antigos" no
arquivo do segmento de rollback liberado para ser utilizado novamente.
Se for feito o roll back da transao, as alteraes sero desfeitas.

A verso original, mais antiga, dos dados no segmento de rollback gravada de volta na tabela.

Todos os usurios vem o banco de dados como ele era antes da transao iniciar.

Introduo ao Oracle: SQL e PL/SQL 9-36

Bloqueando
Bloqueios do Oracle:
Impedem a interao destrutiva entre
transaes simultneas
No requerem ao do usurio
Usam automaticamente o nvel mais baixo de
restrio
So mantidos durante a durao da transao
H dois modos bsicos:
Exclusivo
Compartilhado

9-37

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Que So Bloqueios?
Bloqueios so mecanismos que impedem a interao destrutiva entre transaes que acessem o
mesmo recurso: um objeto de usurio (como tabelas ou linhas) ou objetos do sistema no visveis aos
usurios (como estruturas de dados compartilhados e linhas de dicionrios de dados).
Como o Oracle Bloqueia os Dados
O bloqueio em um banco de dados do Oracle totalmente automtico e no requer ao do usurio.
O bloqueio implcito ocorre para todas as instrues SQL exceto SELECT. O mecanismo de bloqueio
default do Oracle automaticamente usa o nvel mais inferior da restrio aplicvel, fornecendo assim
o maior grau de simultaneidade e mxima integridade de dados. O Oracle tambm permite que o
usurio bloqueie os dados manualmente.
Modos de Bloqueio
O Oracle usa dois modos de bloqueio em um banco de dados de vrios usurios:
Modo de Bloqueio

Descrio

exclusivo

Impede que um recurso seja compartilhado.


A primeira transao que bloquear um recurso exclusivamente ser a nica
alterao que poder alter-lo at ser liberado.

bloqueio
compartilhado

Permite que o recurso seja compartilhado.


Vrios usurios que leiam os dados podem compartilhar esses dados, mantendo
os bloqueios compartilhados para impedir o acesso simultneo por um escritor
(que precisa de um bloqueio exclusivo).
Vrias transaes podem adquirir bloqueios compartilhados no mesmo.

Introduo ao Oracle: SQL e PL/SQL 9-37

Sumrio
Instruo

Descrio

INSERT

Adiciona uma nova linha tabela

UPDATE

Modifica linhas existentes na tabela

DELETE

Remove linhas existentes da tabela

COMMIT

Torna permanente todas as alteraes pendentes

SAVEPOINT

Permite um rollback no marcador do savepoint

ROLLBACK

Descarta todas as alteraes nos dados pendentes

9-38

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Manipule dados no banco de dados do Oracle usando as instrues INSERT, UPDATE e DELETE.
Controle as alteraes nos dados usando as instrues COMMIT, SAVEPOINT e ROLLBACK.
O Oracle Server garante uma exibio consistente dos dados sempre.
O bloqueio pode ser implcito ou explcito.

Introduo ao Oracle: SQL e PL/SQL 9-38

Viso Geral do Exerccio


Inserindo linhas nas tabelas
Atualizando e deletando linhas na tabela
Controlando transaes

9-39

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Neste exerccio, voc ir adicionar linhas tabela MY_EMPLOYEE, atualizar e deletar dados da
tabela e controlar suas transaes.

Introduo ao Oracle: SQL e PL/SQL 9-39

Exerccio 9
Insira os dados na tabela MY_EMPLOYEE.
1. Execute o script lab9_1.sql para criar a tabela MY_EMPLOYEE que ser usada para o lab.
2. Descreva a estrutura da tabela MY_EMPLOYEE para identificar os nomes de coluna.
Name

Null?

Type

------------ --------- -----ID

NOT NULL

NUMBER(4)

LAST_NAME

VARCHAR2(25)

FIRST_NAME

VARCHAR2(25)

USERID

VARCHAR2(8)

SALARY

NUMBER(9,2)

3. Adicione a primeira linha de dados tabela MY_EMPLOYEE a partir dos dados do exemplo a
seguir. No liste as colunas na clusula INSERT.
ID

LAST_NAME

FIRST_NAME

USERID

SALARY

Patel

Ralph

rpatel

795

Dancs

Betty

bdancs

860

Biri

Ben

bbiri

1100

Newman

Chad

cnewman

750

Ropeburn

Audry

aropebur

1550

4. Preencha a tabela MY_EMPLOYEE com uma segunda linha de dados de exemplo da lista
anterior. Desta vez, liste as colunas explicitamente na clusula INSERT.
5. Confirme a adio tabela.
ID
--1
2

LAST_NAME
----------Patel
Dancs

FIRST_NAME
---------Ralph
Betty

USERID
-----rpatel
bdancs

SALARY
-----795
860

Introduo ao Oracle: SQL e PL/SQL 9-40

Exerccio 9 (continuao)
6. Crie um script chamado loademp.sql para carregar linhas na tabela MY_EMPLOYEE de
modo interativo. Solicite ao usurio a identificao, o nome, o sobrenome e o salrio do
funcionrio. Concatene a primeira letra do primeiro nome e os sete primeiros caracteres do
ltimo nome para produzir a identificao do usurio.
7. Preencha a tabela com as duas linhas de dados de exemplo a seguir, executando o script que
voc criou.
8. Confirme as adies tabela.
ID

LAST_NAME

FIRST_NAME USERID

SALARY

--- ---------- ---------- ------

------

1
2
3
4

Patel
Dancs
Biri
Newman

Ralph
Betty
Ben
Chad

rpatel
bdancs
bbiri
cnewman

795
860
1100
750

9. Torne essas adies permanentes.


Atualize e delete os dados da tabela MY_EMPLOYEE.
10. Altere o sobrenome do funcionrio 3 para Drexler.
11. Altere o salrio para 1000 de todos os funcionrios que ganhem menos de 900.
12. Verifique as alteraes na tabela.
LAST_NAME SALARY
--------- -----Patel
1000
Dancs
1000
Drexler
1100
Newman
1000

13. Delete Betty Dancs da tabela MY_EMPLOYEE.


14. Confirme as alteraes na tabela.
ID
--1
3
4

LAST_NAME
---------Patel
Drexler
Newman

FIRST_NAME
---------Ralph
Ben
Chad

USERID SALARY
------ -----rpatel
1000
bbiri
1100
cnewman 1000

Introduo ao Oracle: SQL e PL/SQL 9-41

Exerccio 9 (continuao)
15. Faa um commit de todas as alteraes pendentes.
Controle as transaes de dados na tabela MY_EMPLOYEE.
16. Preencha a tabela com a ltima linha de dados de exemplo, executando o script que voc criou na
etapa 6.
17. Confirme a adio tabela.
ID
--1
3
4
5

LAST_NAME
--------Patel
Drexler
Newman
Ropeburn

FIRST_NAME
----------Ralph
Ben
Chad
Audry

USERID
SALARY
-------- -----rpatel
1000
bbiri
1100
cnewman
1000
aropebur
1550

18. Marque um ponto intermedirio no processamento da transao.


19. Esvazie a tabela inteira.
20. Confirme se a tabela est vazia.
21. Descarte a operao DELETE mais recente sem descartar a operao INSERT anterior.
22. Confirme se a nova linha ainda est inalterada.
ID
--1
3
4
5

LAST_NAME
--------Patel
Drexler
Newman
Ropeburn

FIRST_NAME USERID
SALARY
---------- --------------Ralph
rpatel
1000
Ben
bbiri
1100
Chad
cnewman
1000
Audry
aropebur
1550

23. Torne a adio de dados permanente.

Introduo ao Oracle: SQL e PL/SQL 9-42

10
Criando e Gerenciando
Tabelas

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Descrever os principais objetos do banco
de dados
Criar tabelas
Descrever os tipos de dados que podem
ser usados ao especificar a definio da
coluna
Alterar definies de tabela
Eliminar, renomear e truncar tabelas
10-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender sobre os principais objetos do banco de dados e o relacionamento entre
eles. Voc tambm aprender como criar, alterar e eliminar tabelas.

Introduo ao Oracle: SQL e PL/SQL 10-2

Objetos do Banco de Dados

10-3

Objeto

Descrio

Tabela

Unidade bsica de armazenamento,


composta de linhas uma ou mais tabelas

View

Representa logicamente subconjuntos de


dados de uma ou mais tabelas

Seqncia

Gera valores de chave primria

ndice

Melhora o desempenho de algumas


consultas

Sinnimo

Atribui nomes alternativos a objetos

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetos do Banco de Dados


Um banco de dados Oracle pode conter vrias estruturas de dados. Cada estrutura deve ser descrita no
projeto do banco de dados para que possa ser criada durante o estgio de desenvolvimento do banco de
dados.

Tabela: Armazena dados

View: Subconjunto de dados de uma ou mais tabelas

Seqncia: Gera valores de chave primria

ndice: Melhora o desempenho de algumas consultas

Sinnimo: Atribui nomes alternativos a objetos

Estruturas de Tabela do Oracle8

As tabelas podem ser criadas a qualquer momento, at mesmo quando os usurios estiverem
usando o banco de dados.

No necessrio especificar o tamanho de nenhuma tabela. O tamanho definido pela quantidade


de espao alocada no banco de dados como um todo. Entretanto, importante estimar a quantidade
de espao que uma tabela usar.

A estrutura da tabela pode ser modificada on-line.

Observao: H mais objetos de banco de dados disponveis que no so abordados neste curso.

Introduo ao Oracle: SQL e PL/SQL 10-3

Convenes para Nomeao


Deve comear com uma letra
Pode ter de 1 a 30 caracteres
Deve conter somente AZ, az, 09, _, $ e #
No deve duplicar o nome de outro objeto
de propriedade do mesmo usurio
No deve ser uma palavra reservada pelo
Oracle Server

10-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Regras para Nomeao


Nomeie tabelas e colunas do banco de dados de acordo com as regras default de nomeao de
qualquer objeto do banco de dados Oracle:

Nomes de tabela e de colunas devem comear com uma letra e podem ter de 1 a 30 caracteres.

Os nomes devem conter somente os caracteres A-Z, az, 09, _ (sublinhado), $ e # (caracteres
legais, mas evite us-los).

Os nomes no devem duplicar o nome de outro objeto de propriedade do mesmo usurio do


Oracle Server.

Os nomes no devem ser uma palavra reservada do Oracle Server.

Diretrizes para Nomeao

Use nomes descritivos para tabelas e outros objetos do banco de dados.

Nomeie a mesma entidade de modo consistente em diferentes tabelas. Por exemplo, a coluna do
nmero do departamento chamada DEPTNO nas tabelas EMP e DEPT.

Observao: Os nomes no fazem distino entre maisculas de minsculas. Por exemplo, EMP
tratada com o mesmo nome que eMP ou eMp.
Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "Object Names and
Qualifiers".

Introduo ao Oracle: SQL e PL/SQL 10-4

A Instruo CREATE TABLE


Voc deve ter:
privilgio CREATE TABLE
Uma rea de armazenamento
CREATE [GLOBAL TEMPORARY] TABLE [esquema.]tabela
(tipo de dados da coluna
[DEFAULT expr][, ...]);

Especifique:
Nome da tabela
Nome da coluna, tipo de dados da

coluna e tamanho da coluna


10-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Instruo CREATE TABLE


Crie tabelas para armazenar dados executando a instruo SQL CREATE TABLE. Ela uma das
instrues DDL (data definition language) a ser abordada nas prximas lies. As instrues DDL so
um subconjunto de instrues SQL usadas para criar, modificar ou remover estruturas do banco de
dados Oracle8. Essas instrues possuem um efeito imediato no banco de dados e tambm registram
informaes no dicionrio de dados.
Para criar uma tabela, o usurio deve ter o privilgio CREATE TABLE e uma rea de armazenamento
na qual criar objetos. O administrador do banco de dados usa instrues DCL
(data control language), que sero abordadas mais tarde.
Na sintaxe:
GLOBAL TEMPORARY

especifica que a tabela temporria e que sua definio est


visvel em todas as sesses. Os dados em uma tabela temporria
so visveis somente na sesso que insere dados na tabela.

esquema

o mesmo do nome do proprietrio

tabela

o nome da tabela

DEFAULT expr

especifica um valor default se um valor estiver omitido na


instruo INSERT

coluna

o nome da coluna

tipo de dados

o tipo de dados e o comprimento da coluna

Introduo ao Oracle: SQL e PL/SQL 10-5

Fazendo Referncia a
Tabelas de Outro Usurio

As tabelas que pertencem a outros


usurios no esto no esquema do
usurio.
Voc deve usar o nome do proprietrio
como um prefixo da tabela.

10-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Fazendo Referncia a Tabelas de Outro Usurio


Um esquema um conjunto de objetos. Os objetos de esquema so as estruturas lgicas que fazem
referncia diretamente aos dados no banco de dados. Os objetos de esquema incluem tabelas, views,
sinnimos, seqncias, procedimentos armazenados, ndices, clusters e vnculos com o banco de dados.
Se uma tabela no pertencer ao usurio, o nome do proprietrio deve ser prefixado tabela.

Introduo ao Oracle: SQL e PL/SQL 10-6

A Opo DEFAULT
Especifique um valor default para uma coluna
durante uma insero.
hiredate DATE DEFAULT SYSDATE,

Valores legais so um valor literal, expresso


ou funo SQL.
Valores ilegais so outro nome da coluna ou
pseudocoluna.
O tipo de dados default deve corresponder ao
tipo de dados da coluna.
10-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Opo DEFAULT
Um valor default pode ser dado uma coluna usando-se a opo DEFAULT. Essa opo impede que
valores nulos entrem nas colunas se uma linha for inserida sem um valor para a coluna. O valor
default pode ser um literal, uma expresso ou uma funo SQL, como SYSDATE e USER, mas o
valor no pode ser o nome de outra coluna ou pseudocoluna como NEXTVAL ou CURRVAL. A
expresso default deve corresponder ao tipo de dados da coluna.

Introduo ao Oracle: SQL e PL/SQL 10-7

Criando Tabelas
Crie a tabela.
SQL> CREATE TABLE dept
2
(deptno NUMBER(2),
3
dname
VARCHAR2(14),
4
loc
VARCHAR2(13));
Table created.

Confirme a criao da tabela.


SQL> DESCRIBE dept
Name
Null?
--------------------------- -------DEPTNO
DNAME
LOC
10-8

Type
--------NUMBER(2)
VARCHAR2(14)
VARCHAR2(13)

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando Tabelas
O exemplo no slide cria a tabela DEPT, com trs colunas chamadas, DEPTNO, DNAME e LOC.
Ele tambm confirma a criao da tabela emitindo o comando DESCRIBE.
Como criar uma tabela uma instruo DDL, um commit automtico ocorre quando essa instruo
executada.

Introduo ao Oracle: SQL e PL/SQL 10-8

Tabelas no Banco de Dados Oracle


Tabelas do Usurio
Conjunto de tabelas criadas e mantidas

pelo usurio
Contm informaes sobre o usurio

Dicionrio de dados
Conjunto de tabelas criadas e mantidas

pelo Oracle server


Contm informaes sobre o banco de

dados
10-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tabelas no Banco de Dados Oracle


Tabelas do usurio so tabelas criadas pelo usurio, como EMP. H outro conjunto de tabelas e
views no banco de dados Oracle conhecido como o dicionrio de dados. Esse conjunto criado e
mantido pelo Oracle Server e contm informaes sobre o banco de dados.
Todas as tabelas de dicionrio de dados so de propriedade do usurio SYS. As tabelas-base
dificilmente so acessadas pelo usurio porque a informao contida nelas no de fcil
compreenso. Assim, os usurios geralmente acessam as views do dicionrio de dados porque as
informaes so apresentadas em um formato mais fcil de entender. As informaes armazenadas
no dicionrio de dados incluem nomes dos usurios do Oracle Server, privilgios concedidos a
usurios, nomes de objeto do banco de dados, restries de tabela e informaes sobre auditoria.
H quatro categorias de views do dicionrio de dados, cada categoria contm um prefixo distinto
que reflete o uso pretendido.
Prefixo

Descrio

USER_

Estas views contm informaes sobre objetos de propriedade do usurio.

ALL_

Estas views contm informaes sobre todas as tabelas (de objeto e relacionais)
acessveis ao usurio.

DBA_

Estas views so restritas. Estas views somente podem ser acessadas por pessoas que
tenham sido atribudas o DBA total.

V$_

Estas views contm informaes sobre views de desempenho dinmico, desempenho do


servidor do banco de dados e bloqueio.

Introduo ao Oracle: SQL e PL/SQL 10-9

Consultando o Dicionrio de Dados


Descreva tabelas de propriedade do usurio.
SQL> SELECT
2 FROM

*
user_tables;

Exiba tipos de objetos distintos de propriedade


do usurio.
SQL> SELECT
2 FROM

DISTINCT object_type
user_objects;

Exiba tabelas, views, sinnimos e seqncias


de propriedade do usurio.
SQL> SELECT
2 FROM

10-10

*
user_catalog;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Consultando o Dicionrio de Dados


Voc pode consultar as tabelas de dicionrio de dados para exibir vrios objetos de banco de dados de
sua propriedade. As tabelas de dicionrio de dados freqentemente usadas so:

USER_TABLES

USER_OBJECTS

USER_CATALOG

Observao: USER_CATALOG possui um sinnimo chamado CAT. Voc pode usar esse sinnimo
no lugar de USER_CATALOG nas instrues SQL.
SQL> SELECT *
2

FROM

CAT;

Introduo ao Oracle: SQL e PL/SQL 10-10

Tipos de Dados
Tipo de Dados

Descrio

VARCHAR2(tamanho)

Dados de caractere de comprimento


varivel

CHAR(tamanho)

Dados de caractere de comprimento fixo

NUMBER(p,s)

Dados numricos de comprimento varivel

DATE

Valores de data e hora

LONG

Dados de caractere de comprimento


varivel at 2 gigabytes

CLOB

Dados de caractere de um byte de at


4 gigabytes

RAW e LONG RAW

Dados binrios brutos

BLOB

Dados binrios de at 4 gigabytes

BFILE

Dados binrios armazenados em um


arquivo externo de at 4 gigabytes

10-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tipos de Dados
Tipo de Dados

Descrio

VARCHAR2(tamanho)

Dados de caractere de comprimento varivel (Um tamanho mximo deve


ser especificado). O tamanho default e mnimo 1; o tamanho mximo
4000.)

CHAR(tamanho)

Dados de caractere de comprimento fixo de bytes de tamanho de


comprimento (O tamanho default e mnimo 1; o tamanho mximo
2000.)

NUMBER(p,s)

Nmero contendo a preciso p e a escala s (A preciso o nmero total


de dgitos decimais e a escala o nmero de dgitos direita do ponto
decimal. A preciso pode variar de 1 a 38 e a escala, de -84 a 127.)

DATE

Valores de data e hora entre 1o de janeiro, 4712 A.C. e 31 de dezembro,


9999 D.C.

LONG

Dados de caractere de comprimento varivel at 2 gigabytes

CLOB

Dados de caractere de um byte de at 4 gigabytes

Introduo ao Oracle: SQL e PL/SQL 10-11

Tipos de Dados
Tipo de Dados

Descrio

VARCHAR2(tamanho)

Dados de caractere de comprimento


varivel

CHAR(tamanho)

Dados de caractere de comprimento fixo

NUMBER(p,s)

Dados numricos de comprimento varivel

DATE

Valores de data e hora

LONG

Dados de caractere de comprimento


varivel at 2 gigabytes

CLOB

Dados de caractere de um byte de at


4 gigabytes

RAW e LONG RAW

Dados binrios brutos

BLOB

Dados binrios de at 4 gigabytes

BFILE

Dados binrios armazenados em um


arquivo externo de at 4 gigabytes

10-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tipos de dados (continuao)


Tipo de Dados

Descrio

RAW(tamanho)

Dados binrios brutos de tamanho de comprimento (Um tamanho


mximo deve ser especificado. O tamanho mximo 2000.)

LONG RAW

Dados binrios brutos de comprimento varivel de at 2 gigabytes

BLOB

Dados binrios de at 4 gigabytes

BFILE

Dados binrios armazenados em um arquivo externo; at


4 gigabytes

Introduo ao Oracle: SQL e PL/SQL 10-12

Criando uma Tabela Usando


uma Subconsulta
Crie uma tabela e insira linhas combinando
a instruo CREATE TABLE e a opo da
subconsulta AS.
CREATE TABLE tabela
[(coluna, coluna...)]
AS subconsulta;

Faa a correspondncia do nmero de


colunas especificadas com o nmero
de colunas da subconsulta.
Defina colunas com nomes de colunas e
valores default.
10-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando uma Tabela a Partir de Linhas em Outra Tabela


Um segundo mtodo para criar uma tabela aplicar a clusula da subconsulta AS para criar a tabela e
inserir linhas retornadas da subconsulta.
Na sintaxe:
tabela

o nome da tabela.

coluna

o nome da coluna, valor default e restrio de integridade.

subconsulta

a instruo SELECT que define o conjunto de linhas a serem inseridas


sna nova tabela.

Diretrizes

A tabela ser criada com os nomes de coluna especificados e as linhas recuperadas pela
instruo SELECT sero inseridas na tabela.

A definio da coluna pode conter somente o nome da coluna e o valor default.

Se forem dadas especificaes para a coluna, o nmero de colunas deve ser igual ao nmero de
colunas na lista SELECT da subconsulta.

Se no forem dadas especificaes para a coluna, os nomes de coluna da tabela sero os


mesmos que os nomes de coluna na subconsulta.

Introduo ao Oracle: SQL e PL/SQL 10-13

Criando uma Tabela


Usando uma Subconsulta
SQL> CREATE TABLE
dept30
2 AS
3
SELECT
empno, ename, sal*12 ANNSAL, hiredate
4
FROM
emp
5
WHERE
deptno = 30;
Table created.
SQL> DESCRIBE dept30
Name
Null?
---------------------------- -------EMPNO
NOT NULL
ENAME
ANNSAL
HIREDATE
10-14

Type
----NUMBER(4)
VARCHAR2(10)
NUMBER
DATE

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando uma Tabela a Partir de Linhas em Outra Tabela (continuao)


O exemplo do slide cria uma tabela, DEPT30, que contm detalhes sobre todos os funcionrios que
trabalham no departamento 30. Observe que os dados da tabela DEPT30 vm da tabela EMP.
Voc pode verificar a existncia de uma tabela do banco de dados e verificar as definies da coluna
usando o comando DESCRIBE do SQL*Plus.
Fornea um apelido para a coluna ao selecionar uma expresso.

Introduo ao Oracle: SQL e PL/SQL 10-14

A Instruo ALTER TABLE


Use a instruo ALTER TABLE para:
Adicionar uma nova coluna
Modificar uma coluna existente
Definir um valor default para a nova coluna
ALTER TABLE tabela
ADD
(tipo de dados da coluna [DEFAULT expr]
[, tipo de dados da coluna ]...);
ALTER TABLE tabela
MODIFY
(tipo de dados da coluna [DEFAULT expr]
[, tipo de dados da coluna ]...);

10-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Instruo ALTER TABLE


Aps criar suas tabelas, voc talvez precise alterar as estruturas da tabela porque omitiu uma coluna
ou a definio da coluna precisa ser alterada. Voc pode fazer isso usando a instruo ALTER
TABLE.
Voc pode adicionar colunas a uma tabela usando a instruo ALTER TABLE com a clusula ADD.
Na sintaxe:
tabela

o nome da tabela

coluna

o nome da nova coluna

tipo de dados

o tipo de dados e o comprimento da nova coluna

DEFAULT expr

especifica o valor default para a nova coluna

Voc pode modificar colunas existentes em uma tabela usando a instruo ALTER TABLE com a
clusula MODIFY.
Observao: O slide fornece a sintaxe abreviada para ALTER TABLE. ALTER TABLE ser
abordada com mais detalhes em uma lio mais adiante.

Introduo ao Oracle: SQL e PL/SQL 10-15

Adicionando uma Coluna


DEPT30
EMPNO
-----7698
7654
7499
7844
...

Nova coluna
ENAME
ANNSAL
---------- -------BLAKE
34200
MARTIN
15000
ALLEN
19200
TURNER
18000

HIREDATE

JOB

01-MAY-81
28-SEP-81
20-FEB-81
08-SEP-81

"adicione
uma nova
coluna na
tabela
DEPT30"

DEPT30
EMPNO
-----7698
7654
7499
7844
...
10-16

ENAME
ANNSAL
---------- -------BLAKE
34200
MARTIN
15000
ALLEN
19200
TURNER
18000

HIREDATE

JOB

01-MAY-81
28-SEP-81
20-FEB-81
08-SEP-81

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Adicionando uma Coluna


O grfico adiciona a coluna JOB tabela DEPT30. Observe que a nova coluna torna-se a ltima
coluna na tabela.

Introduo ao Oracle: SQL e PL/SQL 10-16

Adicionando uma Coluna


Use a clusula ADD para adicionar colunas.
SQL> ALTER TABLE dept30
2 ADD
(job VARCHAR2(9));
Table altered.

A coluna nova torna-se a ltima coluna.


EMPNO ENAME
ANNSAL HIREDATE JOB
--------- ---------- --------- --------- ---7698 BLAKE
34200 01-MAY-81
7654 MARTIN
15000 28-SEP-81
7499 ALLEN
19200 20-FEB-81
7844 TURNER
18000 08-SEP-81
...
6 rows selected.

10-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes para Adicionar uma Coluna

Voc pode adicionar ou modificar colunas, mas no pode remov-las de uma tabela.

Voc no pode especificar onde a coluna deve aparecer. A coluna nova torna-se a ltima
coluna.

O exemplo no slide adiciona uma coluna chamada JOB tabela DEPT30. A coluna JOB torna-se a
ltima coluna na tabela.
Observao: Se uma tabela j contiver linhas quando uma coluna for adicionada, ento a nova
coluna ser inicialmente nula para todas as linhas.

Introduo ao Oracle: SQL e PL/SQL 10-17

Modificando uma Coluna


Voc pode alterar um tipo de dados,
tamanho e valor default de uma coluna.
SQL> ALTER TABLE
2 MODIFY
Table altered.

dept30
(ename VARCHAR2(15));

Uma alterao no valor default afeta


somente as inseres subseqentes
tabela.

10-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Modificando uma Coluna


Voc pode modificar uma definio de coluna usando a instruo ALTER TABLE com a clusula
MODIFY. A modificao da coluna pode incluir alteraes ao tipo de dados, tamanho e valor default
da coluna.
Diretrizes

Aumente a largura ou preciso de uma coluna numrica.

Diminua a largura de uma coluna se ela contiver somente valores nulos e se a tabela no tiver
linhas.

Altere o tipo de dados se a coluna contiver valores nulos.

Converta uma coluna CHAR para o tipo de dados VARCHAR2 ou converta uma coluna
VARCHAR2 para o tipo de dados CHAR se a coluna contiver valores nulos ou se voc no
alterar o tamanho.

Uma alterao no valor default de uma coluna afeta somente as inseres subseqentes tabela.

Introduo ao Oracle: SQL e PL/SQL 10-18

Eliminando uma Coluna


Use a clusula DROP COLUMN para eliminar
colunas que voc no precisa mais na
tabela.
SQL> ALTER TABLE
2 DROP COLUMN
Table altered.

10-19

dept30
job ;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Eliminando uma Coluna


Voc pode eliminar uma coluna de uma tabela usando a instruo ALTER TABLE com a clusula
DROP COLUMN. Esse um recurso disponvel a partir do Oracle8i.
Diretrizes

A coluna pode ou no conter dados.

Somente uma coluna pode ser eliminada por vez.

A tabela deve permanecer com pelo menos uma coluna aps ser alterada.

Depois que a coluna for eliminada, no poder ser recuperada.

Introduo ao Oracle: SQL e PL/SQL 10-19

Opo SET UNUSED


Use a opo SET UNUSED para marcar
uma ou mais colunas como no usadas.
Use a opo DROP UNUSED COLUMNS
para remover as colunas marcadas como
UNUSED.
ALTER TABLE
tabela
SET
UNUSED (coluna);

OR
ALTER
TABLE tabela
SET UNUSED COLUMN coluna;
ALTER TABLE tabela
DROP UNUSED COLUMNS;

10-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Opo SET UNUSED


A opo SET UNUSED marca uma ou mais colunas como no usadas para que possam ser
eliminadas quando a demanda nos recursos do sistema for menor. Esse recurso est disponvel no
Oracle8i. Ao especificar esta clusula voc, na verdade, no remove as colunas de destino de cada
linha na tabela (ou seja, no restaura o espao em disco usado por essas colunas). Por isso, o tempo
de resposta mais rpido do que seria se voc executasse a clusula DROP. As colunas no usadas
so tratadas como se fossem eliminadas, embora os dados da coluna permaneam nas linhas da
tabela. Aps uma coluna ter sido marcada como no usada, voc no ter acesso a essa coluna .
Uma consulta "SELECT *" no recuperar os dados de colunas no usadas. Alm disso, os nomes e
tipos de colunas marcadas como no usadas no sero exibidos durante DESCRIBE e voc poder
adicionar tabela uma nova coluna com o mesmo nome que uma coluna no usada.

Introduo ao Oracle: SQL e PL/SQL 10-20

Opo DROP UNUSED COLUMNS


DROP UNUSED COLUMNS remove da tabela todas as colunas marcadas atualmente como no
usadas. Voc pode usar essa instruo quando quiser recuperar o espao em disco extra de colunas
no usadas na tabela. Se a tabela no contiver colunas no usadas, a instruo retornar sem erros.
SQL> ALTER TABLE
2

SET

dept30

UNUSED (ename);

Table altered.
SQL> ALTER TABLE
2

DROP

dept30

UNUSED COLUMNS;

Table altered.

Introduo ao Oracle: SQL e PL/SQL 10-21

Eliminando uma Tabela


Todos os dados e estrutura da tabela sero
excludos.
Todas as transaes pendentes sofrero
commit.
Todos os ndices sero eliminados.
Voc no pode fazer roll back desta
instruo.
SQL> DROP TABLE dept30;
Table dropped.

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

10-22

Eliminando uma Tabela


A instruo DROP TABLE remove a definio de uma tabela do Oracle8. Quando voc elimina uma
tabela, o banco de dados perde todos os dados na tabela e todos os ndices associados a ela.
Sintaxe
DROP TABLE tabela;

onde:

tabela

o nome da tabela

Diretrizes

Todos os dados so deletados da tabela.

As views e sinnimos permanecero, mas sero invlidos.

Todas as transaes pendentes sofrero commit.

Somente o criador da tabela ou um usurio com o privilgio DROP ANY TABLE poder
remover uma tabela.

A instruo DROP TABLE, uma vez executada, irreversvel. O Oracle Server no questiona a ao
quando voc emite a instruo DROP TABLE. Se voc possuir tal tabela ou tiver um privilgio de
nvel superior, ento a tabela ser imediatamente removida. Todas as instrues DDL emitem um
commit, tornando assim a transao permanente.

Introduo ao Oracle: SQL e PL/SQL 10-22

Alterando o Nome de um Objeto


Para alterar o nome de uma tabela, view,
seqncia ou sinnimo, execute a
instruo RENAME.
SQL> RENAME dept TO department;
Table renamed.

Voc deve ser o proprietrio do objeto.

10-23

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Renomeando uma Tabela


As instrues DDL adicionais incluem a instruo RENAME, que usada para renomear uma tabela,
view, seqncia ou sinnimo.
Sintaxe
RENAME

onde:

old_name

TO

new_name;

old_name

o nome antigo da tabela, da view, da seqncia ou do sinnimo

new_name

o novo nome da tabela, da view, da seqncia ou do sinnimo

Voc deve ser o proprietrio do objeto que renomear.

Introduo ao Oracle: SQL e PL/SQL 10-23

Truncando uma Tabela


A Instruo TRUNCATE TABLE:
Remove todas as linhas de uma tabela
Libera o espao de armazenamento

usado por esta tabela


SQL> TRUNCATE TABLE department;
Table truncated.

Voc no pode fazer roll back da remoo


da linha ao usar TRUNCATE.
Como alternativa, voc pode remover as
linhas usando a instruo DELETE.
Copyright Oracle Corporation, 1999. Todos os direitos reservados.

10-24

Truncando uma Tabela


Outra instruo DDL a instruo TRUNCATE TABLE, que usada para remover todas as linhas
de uma tabela e para liberar o espao de armazenamento usado por essa tabela. Ao usar a instruo
TRUNCATE TABLE, voc no pode fazer roll back da remoo de linha.
Sintaxe
TRUNCATE

onde:

TABLE

tabela

tabela;

o nome da tabela

Voc deve ser o proprietrio da tabela ou ter privilgios de sistema DELETE TABLE para truncar
a tabela.
A instruo DELETE tambm pode remover todas as linhas de uma tabela, mas no libera o espao
de armazenamento.

Introduo ao Oracle: SQL e PL/SQL 10-24

Adicionando Comentrios a uma Tabela


Voc pode adicionar comentrios a uma
tabela ou coluna usando a instruo
COMMENT.
SQL> COMMENT ON TABLE emp
2 IS 'Employee Information';
Comment created.

Os comentrios podem ser exibidos atravs


das views do dicionrio de datas.
ALL_COL_COMMENTS
USER_COL_COMMENTS
ALL_TAB_COMMENTS
USER_TAB_COMMENTS
10-25

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Adicionando um Comentrio a uma Tabela


Voc pode adicionar um comentrio de at 2.000 bytes sobre uma coluna, tabela, view ou instantneo
usando a instruo COMMENT. O comentrio armazenado no dicionrio de dados e pode ser visto
em uma das seguintes views do dicionrio de datas na coluna COMMENTS:

ALL_COL_COMMENTS

USER_COL_COMMENTS

ALL_TAB_COMMENTS

USER_TAB_COMMENTS

Sintaxe
COMMENT ON TABLE tabela | COLUMN tabela.coluna
IS 'text';

onde:

tabela
coluna
texto

o nome da tabela
o nome da coluna em uma tabela
o texto do comentrio

Voc pode eliminar um comentrio do banco de dados definindo-o como uma string vazia ('').
SQL> COMMENT ON TABLE

emp IS ' ';

Introduo ao Oracle: SQL e PL/SQL 10-25

Sumrio
Instruo

Descrio

CREATE TABLE

Cria uma tabela

ALTER TABLE

Modifica as estruturas da tabela

DROP TABLE

Remove as linhas e estrutura da tabela

RENAME

Altera o nome de uma tabela, view,


seqncia ou sinnimo

TRUNCATE

Remove todas as linhas de uma tabela e


libera o espao de armazenamento

COMMENT

Adiciona comentrios a uma tabela ou view

10-26

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

CREATE TABLE

Cria uma tabela.

Cria uma tabela baseada em outra tabela usando uma subconsulta.

ALTER TABLE

Modifica as estruturas da tabela.

Altera larguras da coluna, tipos de dados da coluna e adiciona colunas.

DROP TABLE

Remove linhas e estrutura de uma tabela.

Uma vez executada, no possvel fazer roll back dessa instruo.

RENAME

Renomeia uma tabela, view, seqncia ou sinnimo.

TRUNCATE

Remove todas as linhas de uma tabela e libera o espao de armazenamento usado pela tabela.

A instruo DELETE remove somente linhas.

COMMENT

Adiciona um comentrio a uma tabela ou coluna.

Consulta o dicionrio de dados para ver o comentrio.


Introduo ao Oracle: SQL e PL/SQL 10-26

Viso Geral do Exerccio


Criando novas tabelas
Criando uma nova tabela usando a sintaxe
CREATE TABLE AS
Modificando definies da coluna
Verificando que as tabelas existem
Adicionando comentrios s tabelas
Eliminando tabelas
Alterando tabelas

10-27

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Crie novas tabelas usando a instruo CREATE TABLE. Confirme se a nova tabela foi adicionada
ao banco de dados. Crie a sintaxe no arquivo de comandos e execute-o para criar a tabela.

Introduo ao Oracle: SQL e PL/SQL 10-27

Exerccio 10
1. Crie a tabela DEPARTMENT de acordo com tabela de exemplo a seguir. Informe a sintaxe em um
script chamado p10q1.sql e execute o script para criar a tabela. Confirme se a tabela foi criada.
Id

Name

Datatype

Number

Varchar2

Length

25

Column Name
Key Type
Nulls/Unique
FK Table
FK Column

Name
Null?
Type
---------- -------- ----------ID
NAME

NUMBER(7)
VARCHAR2(25)

2. Preencha a tabela DEPARTMENT com os dados a partir da tabela DEPT. Inclua somente colunas
que voc precisar.
3. Create Crie a tabela EMPLOYEE de acordo com a tabela de exemplo a seguir. Informe a sintaxe
em um script chamado p10q3.sql e execute o script para criar a tabela. Confirme se a tabela
foi criada.
ID

LAST_NAME

FIRST_NAME

DEPT_ID

Datatype

Number

Varchar2

Varchar2

Number

Length

25

25

Column Name
Key Type
Nulls/Unique
FK Table
FK Column

Name

Null?

Type

------------- -------- -----------ID


LAST_NAME
FIRST_NAME
DEPT_ID

NUMBER(7)
VARCHAR2(25)
VARCHAR2(25)
NUMBER(7)

Introduo ao Oracle: SQL e PL/SQL 10-28

Exerccio 10 (continuao)
4. Modifique a tabela EMPLOYEE para aceitar os sobrenomes longos dos funcionrios.
Confirme suas modificaes.
Name

Null?

Type

------------- -------- ----------ID


LAST_NAME
FIRST_NAME
DEPT_ID

NUMBER(7)
VARCHAR2(50)
VARCHAR2(25)
NUMBER(7)

5. Confirme se as tabelas DEPARTMENT e EMPLOYEE foram armazenadas no dicionrio de


dados. (Dica: USER_TABLES)
TABLE_NAME
------------------------DEPARTMENT
EMPLOYEE

6. Crie a tabela EMPLOYEE2 de acordo com a estrutura da tabela EMP. Inclua apenas as
colunas EMPNO, ENAME e DEPTNO. Nomeie as colunas como ID, LAST_NAME e
DEPT_ID na nova tabela, respectivamente.
7. Elimine a tabela EMPLOYEE.
8. Renomeie a tabela EMPLOYEE2 para EMPLOYEE.
9. Adicione um comentrio s definies das tabelas DEPARTMENT e EMPLOYEE,
descrevendo as tabelas. Confirme as adies ao dicionrio de dados.
10. Elimine a coluna LAST_NAME da tabela EMPLOYEE. Confirme a modificao verificando
a descrio da tabela.
11. Crie a tabela EMPLOYEE2 de acordo com a estrutura da tabela EMP. Inclua apenas as
colunas EMPNO, ENAME e DEPTNO. Nomeie as colunas como ID, LAST_NAME e
DEPT_ID na nova tabela, respectivamente. Marque a coluna DEPT_ID na tabela
EMPLOYEE2 como UNUSED. Confirme a modificao, verificando a descrio da tabela.
12. Elimine todas as colunas UNUSED a partir da tabela EMPLOYEE2. Confirme a modificao,
verificando a descrio da tabela.

Introduo ao Oracle: SQL e PL/SQL 10-29

Introduo ao Oracle: SQL e PL/SQL 10-30

11
Incluindo Restries

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos

Depois de completar esta lio, voc poder


fazer o seguinte:
Descrever restries
Criar e manter restries

11-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender como implementar regras comerciais incluindo restries de integridade.

Introduo ao Oracle: SQL e PL/SQL 11-2

O Que So Restries?
As restries impem regras no nvel da
tabela.
As restries evitam que uma tabela seja
deletada se houver dependncias.
Os seguintes tipos de restrio so vlidos
no Oracle:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
11-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Restries
O Oracle Server usa restries para impedir que dados invlidos sejam digitados nas tabelas.
Use restries para fazer o seguinte:

Impor regras no nvel da tabela sempre que uma linha for inserida, atualizada ou deletada da
tabela. A restrio deve ser satisfeita para a operao ser bem-sucedida.

Impedir que uma tabela seja deletada se houver dependncias de outras tabelas.

Fornecer regras para ferramentas do Oracle, como o Oracle Developer.

Restries de Integridade de Dados


Restrio

Descrio

NOT NULL

Especifica que esta coluna no pode conter um valor nulo

UNIQUE

Especifica uma coluna ou combinao de colunas cujos valores


devem ser exclusivos para todas as linhas na tabela

PRIMARY KEY

Identifica exclusivamente cada linha da tabela

FOREIGN KEY

Estabelece e impe um relacionamento de chave estrangeira entre a


coluna e a coluna da tabela referenciada

CHECK

Especifica uma condio que deve ser verdadeira

Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "CONSTRAINT
Clause".
Introduo ao Oracle: SQL e PL/SQL 11-3

Diretrizes sobre Restries


Nomeie uma restrio ou o Oracle Server
gerar um nome usando o formato SYS_Cn.
Crie uma restrio:
No momento em que a tabela for criada
Depois que a tabela tiver sido criada

Defina uma restrio no nvel da coluna ou


da tabela.
Exiba uma restrio no dicionrio de dados.

11-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes sobre Restries


Todas as restries so armazenadas no dicionrio de dados. Ser mais fcil fazer referncia s
restries se voc der a elas um nome significativo. Os nomes de restries devem seguir as regras
padro para nomeao de objeto. Se voc no nomear a restrio, o Oracle gerar um nome com o
formato SYS_Cn, onde n um nmero inteiro para criar um nome de restrio exclusivo.
As restries podem ser definidas quando a tabela for criada ou depois de ter sido criada.
Voc pode ver as restries definidas para uma tabela especfica olhando na tabela do dicionrio de
dados USER_CONSTRAINTS.

Introduo ao Oracle: SQL e PL/SQL 11-4

Definindo Restries
CREATE TABLE [esquema.]tabela
(tipo de dados da coluna [DEFAULT expr]
[column_constraint],
...
[table_constraint][,...]);

CREATE TABLE emp(


empno NUMBER(4),
ename VARCHAR2(10),
...
deptno NUMBER(2) NOT NULL,
CONSTRAINT emp_empno_pk
PRIMARY KEY (EMPNO));

11-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Definindo Restries
O slide fornece a sintaxe para definir restries ao criar uma tabela.
Na sintaxe:
esquema

igual ao nome do proprietrio

tabela

o nome da tabela

DEFAULT expr

especifica um valor default se um valor estiver omitido na instruo


INSERT

coluna

o nome da coluna

tipo de dados

o tipo de dados e o comprimento da coluna

column_constraint

uma restrio de integridade como parte da definio da coluna

table_constraint

uma restrio de integridade como parte da definio da tabela

Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "CREATE
TABLE".

Introduo ao Oracle: SQL e PL/SQL 11-5

Definindo Restries
Nvel de restrio da coluna
coluna [CONSTRAINT constraint_name] constraint_type,

Nvel de restrio da tabela


coluna,...
[CONSTRAINT constraint_name] constraint_type
(coluna, ...),

11-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Definindo Restries (continuao)


As restries geralmente so criadas ao mesmo tempo em que criada a tabela. As restries podem
ser adicionadas a uma tabela depois de sua criao e podem ser desativadas temporariamente.
As restries podem ser definidas em um ou dois nveis.
Nvel da
Restrio

Descrio

Column

Faz referncia a uma nica coluna e definida dentro de uma especificao


para a coluna qual pertence

Table

Faz referncia a uma ou mais colunas e definida separadamente das definies


da coluna na tabela; pode definir quaisquer restries exceto
NOT NULL

Na sintaxe:
constraint_name

o nome da restrio

constraint_type

o tipo da restrio

Introduo ao Oracle: SQL e PL/SQL 11-6

A Restrio NOT NULL


Assegura que os valores nulos no sejam
permitidos para a coluna
EMP

EMPNO ENAME
7839
7698
7782
7566
...

KING
BLAKE
CLARK
JONES

JOB

COMM

PRESIDENT
MANAGER
MANAGER
MANAGER

Restrio NOT NULL


(nenhuma linha pode
conter um valor nulo para
esta coluna)

11-7

...

DEPTNO
10
30
10
20

Ausncia da restrio
Restrio NOT NULL
NOT NULL
(qualquer linha pode
conter um valor nulo para
esta coluna)

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Restrio NOT NULL


A restrio NOT NULL assegura que os valores nulos no sejam permitidos na coluna. As colunas
sem uma restrio NOT NULL podem conter valores nulos por default.

Introduo ao Oracle: SQL e PL/SQL 11-7

A Restrio NOT NULL


Definida no nvel da coluna
SQL> CREATE TABLE
2
empno
3
ename
4
job
5
mgr
6
hiredate
7
sal
8
comm
9
deptno

11-8

emp(
NUMBER(4),
VARCHAR2(10) NOT NULL,
VARCHAR2(9),
NUMBER(4),
DATE,
NUMBER(7,2),
NUMBER(7,2),
NUMBER(7,2) NOT NULL);

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Restrio NOT NULL (continuao)


A restrio NOT NULL pode ser especificada somente no nvel da coluna, no no da tabela.
O exemplo do slide aplica a restrio NOT NULL s colunas ENAME e DEPTNO da tabela EMP.
Como essas restries no possuem nome, o Oracle Server criar nomes para elas.
Voc pode especificar o nome da restrio ao especific-la.
... deptno NUMBER(7,2)
CONSTRAINT emp_deptno_nn NOT NULL...

Observao: Todos os exemplos de restrio descritos nesta lio podem no estar presentes nas
tabelas de exemplo fornecidas com o curso. Se desejar, essas restries podem ser adicionadas
s tabelas.

Introduo ao Oracle: SQL e PL/SQL 11-8

A Restrio UNIQUE KEY


Restrio UNIQUE KEY
DEPT

DEPTNO
-----10
20
30
40

DNAME
---------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
-------NEW YORK
DALLAS
CHICAGO
BOSTON

Inserir em

11-9

50 SALES

DETROIT

No permitido
(DNAME-SALES j existe)

60

BOSTON

Permitido

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Restrio UNIQUE KEY


Uma restrio de integridade UNIQUE KEY requer que cada valor em uma coluna ou conjunto de
colunas (chave) seja exclusivo ou seja, duas linhas de uma tabela no podem ter valores
duplicados em uma coluna especfica ou conjunto de colunas. A coluna (ou conjunto de colunas)
includa na definio da restrio UNIQUE KEY chamada de chave exclusiva. Se a chave UNIQUE
contiver mais de uma coluna, tal grupo de colunas considerado uma chave exclusiva composta.
As restries UNIQUE KEY permitem a entrada de valores nulos a menos que voc defina as
restries NOT NULL para as mesmas colunas. Na realidade, qualquer nmero de linhas pode incluir
valores nulos para colunas sem restries NOT NULL porque os valores nulos no so considerados.
Um valor nulo em uma coluna (ou em todas as colunas de uma chave UNIQUE composta) sempre
satisfaz uma restrio de UNIQUE KEY.
Observao: Por causa do mecanismo de pesquisa por restries UNIQUE em mais de uma coluna,
voc no pode ter valores idnticos nas colunas no-nulas de uma restrio de UNIQUE KEY
composta parcialmente nula.

Introduo ao Oracle: SQL e PL/SQL 11-9

A Restrio UNIQUE KEY


Definida no nvel da tabela ou da coluna
SQL> CREATE TABLE
2
deptno
3
dname
4
loc
5
CONSTRAINT

11-10

dept(
NUMBER(2),
VARCHAR2(14),
VARCHAR2(13),
dept_dname_uk UNIQUE(dname));

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Restrio UNIQUE KEY (continuao)


Restries UNIQUE KEY podem ser definidas no nvel da coluna ou da tabela. Uma chave exclusiva
composta criada usando-se a definio no nvel da tabela.
O exemplo no slide aplica a restrio UNIQUE KEY coluna DNAME da tabela DEPT. O nome da
restrio DEPT_DNAME_UK.
Observao: O Oracle Server impe a restrio UNIQUE KEY implicitamente criando um ndice
exclusivo na chave exclusiva.

Introduo ao Oracle: SQL e PL/SQL 11-10

A Restrio PRIMARY KEY


PRIMARY KEY
DEPT

DEPTNO
-----10
20
30
40

DNAME
---------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
-------NEW YORK
DALLAS
CHICAGO
BOSTON

Inserir em

20 MARKETING
FINANCE

11-11

DALLAS
NEW YORK

No permitido
(DEPTNO 20 j existe)
No permitido
(DEPTNO nulo)

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Restrio PRIMARY KEY


Uma restrio PRIMARY KEY cria uma chave primria para a tabela. Somente uma chave primria
pode ser criada para cada tabela. A restrio PRIMARY KEY uma coluna ou conjunto de colunas
que identifica exclusivamente cada linha em uma tabela. Essa restrio impe a exclusividade da
coluna ou combinao de colunas e assegura que nenhuma coluna que seja parte da chave primria
possa conter um valor nulo.

Introduo ao Oracle: SQL e PL/SQL 11-11

A Restrio PRIMARY KEY


Definida no nvel da tabela ou da coluna
SQL> CREATE TABLE
2
deptno
3
dname
4
loc
5
CONSTRAINT
6
CONSTRAINT

11-12

dept(
NUMBER(2),
VARCHAR2(14),
VARCHAR2(13),
dept_dname_uk UNIQUE (dname),
dept_deptno_pk PRIMARY KEY(deptno));

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Restrio PRIMARY KEY (continuao)


As restries PRIMARY KEY podem ser definidas no nvel da coluna ou da tabela. Uma PRIMARY
KEY composta criada usando-se a definio no nvel da tabela.
O exemplo no slide define uma restrio PRIMARY KEY na coluna DEPTNO da tabela DEPT.
O nome da restrio DEPT_DEPTNO_PK.
Observao: Um ndice UNIQUE automaticamente criado para uma coluna PRIMARY KEY.

Introduo ao Oracle: SQL e PL/SQL 11-12

A Restrio FOREIGN KEY


DEPT
PRIMARY
KEY

DEPTNO
-----10
20
...

DNAME
---------ACCOUNTING
RESEARCH

LOC
-------NEW YORK
DALLAS

EMP

EMPNO ENAME
7839 KING
7698 BLAKE
...

JOB

...

COMM

PRESIDENT
MANAGER

DEPTNO
10
30

Inserir em

7571 FORD
7571 FORD
11-13

MANAGER
MANAGER

FOREIGN
KEY

...
...

200
200

9
20

No
permitido
(DEPTNO 9
no existe na
tabela DEPT)
Permitido

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Restrio FOREIGN KEY


FOREIGN KEY, ou uma restrio de integridade referencial, designa uma coluna ou combinao de
colunas como a chave estrangeira e estabelece um relacionamento entre a chave primria ou uma
chave exclusiva na mesma tabela ou uma tabela diferente. No exemplo do slide, DEPTNO foi
definida como a chave estrangeira na tabela EMP (tabela filha ou dependente); ela faz referncia
coluna DEPTNO da tabela DEPT (tabela me ou referenciada).
Um valor de chave estrangeira deve corresponder a um valor existente na tabela me ou ser NULL.
As chaves estrangeiras so baseadas nos valores dos dados, sendo puramente lgicas, e no ponteiros
fsicos.

Introduo ao Oracle: SQL e PL/SQL 11-13

A Restrio FOREIGN KEY


Definida no nvel da tabela ou da coluna
SQL> CREATE TABLE emp(
2
empno
NUMBER(4),
3
ename
VARCHAR2(10) NOT NULL,
4
job
VARCHAR2(9),
5
mgr
NUMBER(4),
6
hiredate DATE,
7
sal
NUMBER(7,2),
8
comm
NUMBER(7,2),
9
deptno
NUMBER(7,2) NOT NULL,
10
CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno)
11
REFERENCES dept (deptno));

11-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Restrio FOREIGN KEY (continuao)


As restries FOREIGN KEY podem ser definidas no nvel da restrio da tabela ou coluna. Uma
chave estrangeira composta deve ser criada usando-se a definio no nvel da tabela.
O exemplo no slide define uma restrio FOREIGN KEY na coluna DEPTNO da tabela EMP,
usando uma sintaxe no nvel da tabela. O nome da restrio EMP_DEPTNO_FK.
A chave estrangeira tambm pode ser definida no nvel da coluna, desde que a restrio seja baseada
em uma nica coluna. A sintaxe diferente pois as palavras-chave FOREIGN KEY no aparecem.
Por exemplo:
SQL> CREATE TABLE emp
(.
deptno NUMBER(2) CONSTRAINT emp_deptno_fk REFERENCES
dept(deptno),
.
);

Introduo ao Oracle: SQL e PL/SQL 11-14

Palavras-chave da
Restrio FOREIGN KEY
FOREIGN KEY: Define a coluna na tabela
filha no nvel de restrio da tabela
REFERENCES: Identifica a tabela e a
coluna na tabela me
ON DELETE CASCADE: Permite excluso
na tabela me e das linhas dependentes na
tabela filha

11-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Restrio FOREIGN KEY (continuao)


A chave estrangeira definida na tabela filha e a tabela contendo a coluna referenciada a tabela
me. A chave estrangeira definida usando-se uma combinao das seguintes palavras-chave:

FOREIGN KEY usada para definir a coluna na tabela filha no nvel de restrio da tabela.

REFERENCES identifica a tabela e a coluna na tabela me.

ON DELETE CASCADE indica que quando a linha na tabela me deletada, as linhas


dependentes na tabela filha tambm sero deletadas.

Sem a opo ON DELETE CASCADE, a linha na tabela me no pode ser deletada se for feita
referncia a ela na tabela filha.

Introduo ao Oracle: SQL e PL/SQL 11-15

A Restrio CHECK
Define uma condio que cada linha deve
satisfazer
Expresses que no so permitidas:
Referncias s pseudocolunas CURRVAL,
NEXTVAL, LEVEL, e ROWNUM
Chamadas para as funes SYSDATE, UID,
USER e USERENV
Consultas que se referem a outros valores
em outras linhas
..., deptno NUMBER(2),
CONSTRAINT emp_deptno_ck
CHECK (DEPTNO BETWEEN 10 AND 99),...
11-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Restrio CHECK
A restrio CHECK define uma condio que cada linha deve satisfazer. A condio pode usar as
mesmas construes que as condies de consulta, com as seguintes excees:

Referncias s pseudocolunas CURRVAL, NEXTVAL, LEVEL e ROWNUM

Chamadas para as funes SYSDATE, UID, USER e USERENV

Consultas que se referem a outros valores em outras linhas

Uma nica coluna pode ter vrias restries CHECK que fazem referncia coluna na sua definio.
No h limite no nmero de restries CHECK que voc pode definir em uma coluna.
As restries CHECK podem ser definidas no nvel da coluna ou da tabela.

Introduo ao Oracle: SQL e PL/SQL 11-16

Adicionando uma Restrio


ALTER TABLE tabela
ADD [CONSTRAINT restrio] tipo (coluna);

Adicione ou elimine, mas no modifique


uma restrio
Ative ou desative restries
Adicione uma restrio NOT NULL usando
a clusula MODIFY

11-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Adicionando uma Restrio


Voc pode adicionar uma restrio para tabelas existentes usando uma instruo ALTER TABLE
com a clusula ADD.
Na sintaxe:
tabela

o nome da tabela

restrio

o nome da restrio

tipo

o tipo da restrio

coluna

o nome da coluna afetada pela restrio

A sintaxe do nome da restrio opcional, embora recomendada. Se voc no nomear suas restries,
o sistema criar nomes de restrio.
Diretrizes

Voc pode adicionar, eliminar, ativar ou desativar uma restrio, mas no pode modificar sua
estrutura.

Voc pode adicionar uma restrio NOT NULL a uma coluna existente usando a clusula
MODIFY da instruo ALTER TABLE.

Observao: Voc pode definir uma coluna NOT NULL somente se a tabela no contiver linhas,
porque os dados no podem ser especificados para linhas existentes ao mesmo tempo em que a
coluna adicionada.

Introduo ao Oracle: SQL e PL/SQL 11-17

Adicionando uma Restrio


Adicione uma restrio FOREIGN KEY tabela
EMP indicando que um gerente j deve existir
como um funcionrio vlido na tabela EMP.
SQL> ALTER TABLE
emp
2 ADD CONSTRAINT emp_mgr_fk
3
FOREIGN KEY(mgr) REFERENCES emp(empno);
Table altered.

11-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Adicionando uma Restrio (continuao)


O exemplo no slide cria uma restrio FOREIGN KEY na tabela EMP. A restrio assegura que um
gerente existe como um funcionrio vlido na tabela EMP.

Introduo ao Oracle: SQL e PL/SQL 11-18

Eliminando uma Restrio


Remova a restrio do gerente da tabela
EMP.
SQL> ALTER TABLE
2 DROP CONSTRAINT
Table altered.

emp
emp_mgr_fk;

Remova a restrio PRIMARY KEY na


tabela DEPT e elimine a restrio FOREIGN
KEY associada na coluna EMP.DEPTNO.
SQL> ALTER TABLE
dept
2 DROP PRIMARY KEY CASCADE;
Table altered.

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

11-19

Eliminando uma Restrio


Para eliminar uma restrio, voc pode identificar o nome da restrio a partir das views do
dicionrio de dados USER_CONSTRAINTS e USER_CONS_COLUMNS. Em seguida, use a
instruo ALTER TABLE com a clusula DROP. A opo CASCADE da clusula DROP faz com
que quaisquer restries dependentes sejam eliminadas.
Sintaxe
ALTER TABLE tabela
DROP PRIMARY KEY | UNIQUE (coluna) |
CONSTRAINT
restrio [CASCADE];

onde:

tabela

o nome da tabela

coluna

o nome da coluna afetada pela restrio

restrio

o nome da restrio

Quando voc elimina uma restrio de integridade, essa restrio no mais imposta pelo Oracle
Server e no fica mais disponvel no dicionrio de dados.

Introduo ao Oracle: SQL e PL/SQL 11-19

Desativando Restries
Execute a clusula DISABLE da instruo
ALTER TABLE para desativar uma
restrio de integridade.
Aplique a opo CASCADE para desativar
restries de integridade dependentes.
SQL> ALTER TABLE
2 DISABLE CONSTRAINT
Table altered.

emp
emp_empno_pk CASCADE;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

11-20

Desativando uma Restrio


Voc pode desativar uma restrio sem elimin-la ou recri-la usando a instruo ALTER TABLE
com a clusula DISABLE.
Sintaxe
ALTER TABLE
tabela
DISABLE CONSTRAINT restrio [CASCADE];

onde:

tabela

o nome da tabela

restrio

o nome da restrio

Diretrizes

Voc pode usar a clusula DISABLE nas instrues CREATE TABLE e ALTER TABLE.

A clusula CASCADE desativa restries de integridade dependentes.

Introduo ao Oracle: SQL e PL/SQL 11-20

Ativando Restries
Ative uma restrio de integridade
atualmente desativada na definio da
tabela usando a clusula ENABLE.
SQL> ALTER TABLE
2 ENABLE CONSTRAINT
Table altered.

emp
emp_empno_pk;

Um ndice UNIQUE ou PRIMARY KEY


automaticamente criado se voc ativar uma
restrio UNIQUE KEY ou PRIMARY KEY.

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

11-21

Ativando uma Restrio


Voc pode ativar uma restrio sem elimin-la ou recri-la usando a instruo ALTER TABLE com a
clusula ENABLE.
Sintaxe
ALTER
ENABLE

onde:

TABLE
tabela
CONSTRAINT restrio;

tabela

o nome da tabela

restrio

o nome da restrio

Diretrizes

Se voc ativar uma restrio, essa restrio ser aplicada a todos os dados na tabela. Todos os
dados na tabela devem ajustar-se restrio.

Se voc ativar uma restrio UNIQUE KEY ou PRIMARY KEY, um ndice UNIQUE ou
PRIMARY KEY automaticamente criado.

Voc pode usar a clusula ENABLE nas instrues CREATE TABLE e ALTER TABLE.

Introduo ao Oracle: SQL e PL/SQL 11-21

Restries em Cascata
A clusula CASCADE CONSTRAINTS
usada junto com a clusula DROP
COLUMN.
A clusula CASCADE CONSTRAINTS
elimina todas as restries de integridade
referenciais que se referem s chaves
exclusiva e primria definidas nas colunas
eliminadas.

11-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

CONSTRAINTS em cascata
Esta instruo ilustra o uso da clusula CASCADE CONSTRAINTS. Suponha que a tabela test1 seja
criada da seguinte forma:
SQL> CREATE TABLE test1 (
2

pk NUMBER PRIMARY KEY,

fk NUMBER,

col1 NUMBER,

col2 NUMBER,

CONSTRAINT fk_constraint FOREIGN KEY (fk) REFERENCES test1,

CONSTRAINT ck1 CHECK (pk > 0 and col1 > 0),

CONSTRAINT ck2 CHECK (col2 > 0));

Um erro ser retornado para as seguintes instrues:


SQL> ALTER TABLE test1 DROP (pk); -- pk uma chave me
SQL> ALTER TABLE test1 DROP (col1); -- c1 referenciada pela restrio de vrias
colunas ck1

Introduo ao Oracle: SQL e PL/SQL 11-22

Restries em Cascata

A clusula CASCADE CONSTRAINTS


tambm elimina todas as restries de vrias
colunas definidas nas colunas eliminadas.

11-23

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

CONSTRAINTS em cascata (continuao)


Quando as seguintes instrues so submetidas, a coluna ok, a restrio de chave primria, a restrio
de chave estrangeira, a restrio fk e a restrio de verificao ck1 so eliminadas:
SQL> ALTER TABLE test1 DROP (pk) CASCADE CONSTRAINTS;

Se todas as colunas referenciadas pelas restries definidas nas colunas eliminadas tambm forem
eliminadas, ento CASCADE CONSTRAINTS no requerida. Por exemplo, pressupondo que
nenhuma outra restrio referencial de outras tabelas refere-se coluna PK, ento vlido submeter a
seguinte instruo sem a clusula CASCADE CONSTRAINTS:
SQL> ALTER TABLE test1 DROP (pk, fk, col1);

Introduo ao Oracle: SQL e PL/SQL 11-23

Verificando Restries
Consulte a tabela USER_CONSTRAINTS para
ver todos os nomes e definies de restrio.
SQL>
2
3
4

SELECT constraint_name, constraint_type,


search_condition
FROM
user_constraints
WHERE table_name = 'EMP';

CONSTRAINT_NAME
-----------------------SYS_C00674
SYS_C00675
EMP_EMPNO_PK
...

11-24

C
C
C
P

SEARCH_CONDITION
------------------------EMPNO IS NOT NULL
DEPTNO IS NOT NULL

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Verificando Restries
Aps criar uma tabela, voc pode confirmar sua existncia emitindo um comando DESCRIBE. A
nica restrio que voc pode verificar a restrio NOT NULL. Para ver todas as restries em sua
tabela, consulte a tabela USER_CONSTRAINTS.
O exemplo no slide exibe todas as restries da tabela EMP.
Observao: As restries que no forem nomeadas pelo proprietrio da tabela recebem o nome de
restrio atribudo pelo sistema. No tipo de restrio, C significa CHECK, P significa PRIMARY
KEY, R significa integridade referencial e U significa chave UNIQUE. Observe que a restrio NOT
NULL , na verdade, uma restrio CHECK.

Introduo ao Oracle: SQL e PL/SQL 11-24

Verificando Colunas Associadas


com Restries
Visualize as colunas associadas aos nomes de
restrio na view USER_CONS_COLUMNS.
SQL> SELECT
2 FROM
3 WHERE

constraint_name, column_name
user_cons_columns
table_name = 'EMP';

CONSTRAINT_NAME
------------------------EMP_DEPTNO_FK
EMP_EMPNO_PK
EMP_MGR_FK
SYS_C00674
SYS_C00675

11-25

COLUMN_NAME
---------------------DEPTNO
EMPNO
MGR
EMPNO
DEPTNO

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Verificando Restries (continuao)


Voc pode ver os nomes das colunas envolvidas em restries consultando a view do dicionrio de
dados USER_CONS_COLUMNS. Essa view especialmente til para restries que usam o nome
atribudo pelo sistema.

Introduo ao Oracle: SQL e PL/SQL 11-25

Sumrio
Crie os seguintes tipos de restries:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK

Consulte a tabela USER_CONSTRAINTS para


ver todos os nomes e definies de restrio.

11-26

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
O Oracle Server usa restries para impedir que dados invlidos sejam digitados nas tabelas.
Os seguintes tipos de restries so vlidos:

NOT NULL

UNIQUE

PRIMARY KEY

FOREIGN KEY

CHECK

Voc pode consultar a tabela USER_CONSTRAINTS para ver todos os nomes e definies de
restrio.

Introduo ao Oracle: SQL e PL/SQL 11-26

Viso Geral do Exerccio

Adicionando restries s tabelas


existentes
Adicionando mais colunas a uma tabela
Exibindo informaes nas views do
dicionrio de dados

11-27

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Neste exerccio, voc adicionar restries e mais colunas a uma tabela usando as instrues
abordadas nesta lio.
Observao: recomendvel que voc nomeie as restries que for definir durante os exerccios.

Introduo ao Oracle: SQL e PL/SQL 11-27

Exerccio 11
1. Adicione uma restrio no nvel de tabela PRIMARY KEY tabela EMPLOYEE, usando a
coluna ID. A restrio deve ser nomeada quando for criada.
Dica: A restrio ativada assim que o comando ALTER TABLE executado corretamente.
2. Crie uma restrio PRIMARY KEY na tabela DEPARTMENT usando a coluna ID. A
restrio deve ser nomeada quando for criada.
Dica: A restrio ativada assim que o comando ALTER TABLE executado corretamente.
3. Adicione uma referncia de chave estrangeira na tabela EMPLOYEE que ir assegurar que
o funcionrio no seja atribudo a um departamento no existente.
4. Confirme se as restries foram adicionadas, consultando USER_CONSTRAINTS. Observe
os tipos e nomes das restries. Salve o texto da instruo em um arquivo chamado
p11q4.sql.
CONSTRAINT_NAME
C
----------------------- -DEPARTMENT_ID_PK
P
EMPLOYEE_ID_PK
P
EMPLOYEE_DEPT_ID_FK
R

5. Exiba os tipos e nomes de objeto a partir da view de dicionrio de dados USER_OBJECTS


para as tabelas EMPLOYEE e DEPARTMENT. Voc pode desejar formatar as colunas para
torn-las mais legveis. Observe se as novas tabelas e o novo ndice foram criados.
OBJECT_NAME
---------------DEPARTMENT
DEPARTMENT_ID_PK
EMPLOYEE
EMPLOYEE_ID_PK

OBJECT_TYPE
----------TABLE
INDEX
TABLE
INDEX

Se voc tiver tempo, complete o exerccio abaixo:


6. Modifique a tabela EMPLOYEE. Adicione a coluna SALARY do tipo de dados NUMBER,
preciso 7.

Introduo ao Oracle: SQL e PL/SQL 11-28

12
Criando Views

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Descrever uma view
Criar uma view
Recuperar dados atravs de uma view
Alterar a definio de uma view
Inserir, atualizar e deletar dados atravs de
uma view
Eliminar uma view
12-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender a criar e usar views. Voc tambm aprender a consultar o objeto
relevante do dicionrio de dados para recuperar informaes sobre views.

Introduo ao Oracle: SQL e PL/SQL 12-2

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Descrever uma view em linha
Executar a Anlise "Top-N"

12-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc tambm aprender a criar e usar views em linha e executar a anlise Top-N usando
views em linha.

Introduo ao Oracle: SQL e PL/SQL 12-3

Objetos de Banco de Dados

12-4

Objeto

Descrio

Tabela

Unidade bsica de armazenamento; composto de


linhas e colunas

View

Representa logicamente subconjuntos de dados de


uma ou mais tabelas

Seqncia

Gera valores de chave primria

ndice

Melhora o desempenho de algumas consultas

Sinnimo

Nome alternativo para um objeto

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Introduo ao Oracle: SQL e PL/SQL 12-4

O Que uma View?


Tabela EMP
EMPNO ENAME

JOB
JOB

MGR HIREDATE

SAL
SAL COMM
COMM DEPTNO
DEPTNO

----- -------------- ------------------------- --------- ---------- ---------------------7839


7839 KING

PRESIDENT
PRESIDENT

17-NOV-81

5000
5000

7782
7698 CLARK
BLAKE

MANAGER
MANAGER

7839 09-JUN-81
01-MAY-81

2850
1500

7934
7782 MILLER
CLARK

MANAGER
CLERK

7839 23-JAN-82
7782
09-JUN-81

2450
1300

10
10

7566
7566 JONES

MANAGER
MANAGER

7839 02-APR-81

2975
2975

20
20

SALESMAN
ANALYST

7698 09-DEC-82
7566
28-SEP-81

1250
3000 1400

30
20

SALESMAN
CLERK

7698 12-JAN-83
7788
20-FEB-81

1600
1100

300

30
20

1500
800

30
20

View EMPVU10
7788
7654 SCOTT
MARTIN
7876
7499 ADAMS
ALLEN

EMPNO 7844
ENAME
JOB 7902
TURNER SALESMAN
SMITH
CLERK
7698 17-DEC-80
08-SEP-81
------ 7369
-----------------7902
7900 FORD
JAMES
CLERK
ANALYST
7698 03-DEC-81
7566
7839 7698
KING
PRESIDENT
7521 BLAKE
WARD
SALESMAN
MANAGER
7698 01-MAY-81
7839
22-FEB-81
7782 7654
CLARK
MANAGER
7902
FORD
MARTIN
ANALYST
SALESMAN
7566 28-SEP-81
7698
03-DEC-81
7499
7369 ALLEN
SMITH
CLERK
SALESMAN 7698
7902 20-FEB-81
7934 MILLER
CLERK 17-DEC-80

12-5

10
10
300

950
3000

30
10

30
20

1250
2850

500

30
30

3000
1250

1400

20
30

800
1600

300

20
30

20
30

7844
7788 TURNER
SCOTT

ANALYST
SALESMAN

7566 08-SEP-81
7698
09-DEC-82

3000
1500

7900
7876 JAMES
ADAMS

CLERK
CLERK

7788 03-DEC-81
7698
12-JAN-83

1100
950

7521
7934 WARD
MILLER

CLERK
SALESMAN

7782 22-FEB-81
7698
23-JAN-82

1300
1250

20
30
500

10
30

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Que uma View?


Voc pode apresentar combinaes ou subconjuntos lgicos de dados criando views de tabelas.
Uma view uma tabela lgica baseada em uma tabela ou outra view. Uma view no contm dados
prprios mas como uma janela atravs da qual os dados das tabelas podem ser vistos ou alterados.
As tabelas nas quais uma view baseada so chamadas tabelas-base. A view armazenada como
uma instruo SELECT no dicionrio de dados.

Introduo ao Oracle: SQL e PL/SQL 12-5

Por Que Usar Views?


Para restringir o acesso a dados
Para facilitar as consultas complexas
Para permitir a independncia dos dados
Para apresentar diferentes views dos
mesmos dados

12-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Vantagens das Views

As views restringem o acesso a dados porque uma view pode exibir colunas seletivas a
partir da tabela.

As views permitem que usurios faam consultas simples para recuperar resultados de
consultas complexas. Por exemplo, as views permitem que usurios consultem informaes de
vrias tabelas sem saber como criar uma instruo de juno.

As views permitem a independncia de dados para usurios ad hoc e programas aplicativos.


Uma view pode ser usada para recuperar os dados de vrias tabelas.

As views fornecem acesso aos dados a grupos de usurios de acordo com seus critrios em
particular.

Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "CREATE
VIEW".

Introduo ao Oracle: SQL e PL/SQL 12-6

Views Simples e
Views Complexas
Recurso

Views Simples Views Complexas

Nmero de tabelas

Uma

Uma ou mais

Contm funes

No

Sim

Contm grupos de dados

No

Sim

DML atravs da view

Sim

Nem sempre

12-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Views Simples versus Complexas


H duas classificaes para views: simples e complexa. A diferena bsica est relacionada s
operaes DML (inserir, atualizar e deletar).

Uma view simples uma que:

Cria dados a partir de somente uma tabela

No contm funes ou grupos de dados

Pode executar a DML atravs da view

Uma view complexa uma que:

Cria dados a partir de vrias tabelas

Contm funes ou grupos de dados

Nem sempre executa a DML atravs da view

Introduo ao Oracle: SQL e PL/SQL 12-7

Criando uma View


Embuta uma subconsulta na instruo
CREATE VIEW.
View CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW
[(apelido[, apelido]...)]
AS subconsulta
[WITH CHECK OPTION [CONSTRAINT restrio]]
[WITH READ ONLY];

A subconsulta pode conter uma sintaxe


SELECT complexa.
A subconsulta no pode conter uma
clusula ORDER BY.
12-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando uma View


Voc pode criar uma view incorporando uma subconsulta na instruo CREATE VIEW.
Na sintaxe:
OR REPLACE

recria a view se ela j existir

FORCE

cria a view independentemente das tabelas-base existirem ou no

NOFORCE

cria a view somente se as tabelas-base existirem (default)

view

o nome da view

apelido

especifica nomes para as expresses selecionadas pela consulta da


view (O nmero de apelidos deve corresponder ao nmero de
expresses selecionadas pela view.)

subconsulta

uma instruo SELECT completa (Voc pode usar apelidos para as


colunas na lista SELECT.)

WITH CHECK OPTION especifica que somente linhas acessveis view podem ser inseridas
ou atualizadas
restrio

o nome atribudo restrio CHECK OPTION

WITH READ ONLY

assegura que as operaes DML no possam ser executadas nesta


view

Introduo ao Oracle: SQL e PL/SQL 12-8

Criando uma View


Crie uma view, EMPVU10, que contenha
detalhes sobre os funcionrios no
departamento 10.
SQL>
2
3
4
View

CREATE VIEW
AS SELECT
FROM
WHERE
created.

empvu10
empno, ename, job
emp
deptno = 10;

Descreva a estrutura da view usando o


comando DESCRIBE do SQL*Plus.
SQL> DESCRIBE empvu10

12-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando uma View (continuao)


O exemplo no slide cria uma view que contm o nmero, nome e cargo para todos os funcionrios no
departamento 10.
Voc pode exibir a estrutura da view usando o comando DESCRIBE do SQL*Plus.
Name
Null?
------------------------------- -------EMPNO
NOT NULL
ENAME
JOB

Type
-----------NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)

Diretrizes para criar uma view:

A subconsulta que define uma view pode conter sintaxe SELECT complexa, incluindo junes,
grupos e subconsultas.

A subconsulta que define a view no pode conter uma clusula ORDER BY. A clusula
ORDER BY especificada quando voc recupera dados da view.

Se voc no especificar um nome de restrio para uma view criada com CHECK OPTION, o
sistema ir atribuir um nome default no formato SYS_Cn.

Voc pode usar a opo OR REPLACE para alterar a definio da view sem elimin-la e
recri-la ou reconceder-lhe os privilgios de objeto anteriormente concedidos.

Introduo ao Oracle: SQL e PL/SQL 12-9

Criando uma View


Crie uma view usando apelidos de coluna
na subconsulta.
SQL>
2
3
4
5
View

CREATE VIEW
AS SELECT
FROM
WHERE
created.

salvu30
empno EMPLOYEE_NUMBER, ename NAME,
sal SALARY
emp
deptno = 30;

Selecione as colunas a partir desta view


pelos nomes de apelidos dados.

12-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando uma View (continuao)


Voc pode controlar os nomes de coluna incluindo apelidos de coluna na subconsulta.
O exemplo no slide cria uma view contendo o nmero do funcionrio (empno) com o apelido
EMPLOYEE_NUMBER, o nome (ename) com o apelido NAME e o salrio (sal) com o apelido
SALARY para o departamento 30.
Como alternativa, voc pode controlar os nomes de coluna incluindo apelidos de coluna na clusula
CREATE VIEW.

Introduo ao Oracle: SQL e PL/SQL 12-10

Recuperando Dados de uma View


SQL>
2

SELECT *
FROM
salvu30;

EMPLOYEE_NUMBER
--------------7698
7654
7499
7844
7900
7521

NAME
SALARY
---------- --------BLAKE
2850
MARTIN
1250
ALLEN
1600
TURNER
1500
JAMES
950
WARD
1250

6 rows selected.

12-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Recuperando Dados de uma View


Voc pode recuperar os dados de uma view como faria de qualquer tabela. Voc pode exibir o
contedo de toda a view ou somente ver linhas e colunas especficas.

Introduo ao Oracle: SQL e PL/SQL 12-11

Consultando uma View

SQL*Plus
SELECT *
FROM
empvu10;

7839
7782
7934

12-12

USER_VIEWS
EMPVU10
SELECT
FROM
WHERE

KING
PRESIDENT
CLARK MANAGER
MILLER CLERK

empno, ename, job


emp
deptno = 10;

EMP

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Views no Dicionrio de Dados


Depois que a view for criada, voc pode consultar a tabela do dicionrio de dados chamada
USER_VIEWS para ver o nome e a definio da view. O texto da instruo SELECT que constitui a
view armazenado em uma coluna LONG.
Acesso a Dados Usando Views
Quando voc acessa dados, usando uma view, o Oracle Server executa as seguintes operaes:
1. Recupera a definio da view da tabela do dicionrio de dados USER_VIEWS.
2. Verifica os privilgios de acesso para a tabela-base da view.
3. Converte a consulta da view em uma operao equivalente nas tabelas ou tabela-base
subjacentes. Em outras palavras, os dados so recuperados a partir da(s) tabela(s)-base, ou uma
atualizao feita nela(s).

Introduo ao Oracle: SQL e PL/SQL 12-12

Modificando uma View


Modificar a view EMPVU10 usando a clusula
CREATE OR REPLACE VIEW. Adicionar um
apelido para cada nome de coluna.
SQL>
2
3
4
5
View

CREATE OR REPLACE VIEW empvu10


(employee_number, employee_name, job_title)
AS SELECT
empno, ename, job
FROM
emp
WHERE
deptno = 10;
created.

Os apelidos de coluna na clusula CREATE


VIEW esto listados na mesma ordem que as
colunas na subconsulta.
12-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Modificando uma View


A opo OR REPLACE permite que uma view seja criada mesmo que uma j exista com esse nome,
substituindo, assim, a verso antiga da view para o seu proprietrio. Isso significa que a view poder
ser alterada sem eliminar, recriar e reconceder os privilgios de objeto.
Observao: Ao atribuir apelidos de coluna na clusula CREATE VIEW, lembre-se de que os
apelidos esto listados na mesma ordem que as colunas na subconsulta.

Introduo ao Oracle: SQL e PL/SQL 12-13

Criando uma View Complexa


Criar uma view complexa que contenha
funes de grupo para exibir os valores a
partir de duas tabelas.
SQL>
2
3
4
5
6
7
View

12-14

CREATE VIEW
AS SELECT
FROM
WHERE
GROUP BY
created.

dept_sum_vu
(name, minsal, maxsal, avgsal)
d.dname, MIN(e.sal), MAX(e.sal),
AVG(e.sal)
emp e, dept d
e.deptno = d.deptno
d.dname;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando uma View Complexa


O exemplo no slide cria uma view complexa de dos nomes de departamento, salrio mnimo e
mximo e o salrio mdio por departamento. Note que os nomes alternativos foram especificados
para a view. Esse um requisito se uma coluna da view derivar de uma funo ou expresso.
Voc poder ver a estrutura da view usando o comando DESCRIBE do SQL*Plus. Exibir o contedo
da view emitindo uma instruo SELECT.
SQL> SELECT
2

FROM

NAME

*
dept_sum_vu;
MINSAL

MAXSAL

AVGSAL

-------------- --------- --------- --------ACCOUNTING

1300

5000 2916.6667

RESEARCH

800

3000

2175

SALES

950

2850 1566.6667

Introduo ao Oracle: SQL e PL/SQL 12-14

Regras para Executar Operaes


DML em uma View
Voc poder executar as operaes DML em
views simples.
Voc no poder remover uma linha se a view
contiver:
Funes de grupo
Uma clusula GROUP BY
A palavra-chave DISTINCT
A palavra-chave da pseudocoluna ROWNUM

12-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Executando Operaes DML em uma View


Voc poder executar as operaes DML em dados pela view se essas operaes seguirem
determinadas regras.
Voc poder remover uma linha da view, exceto se ela contiver:

Funes de grupo

Uma clusula GROUP BY

A palavra-chave da pseudocoluna ROWNUM

Introduo ao Oracle: SQL e PL/SQL 12-15

Regras para Executar Operaes


DML em uma View
Voc no poder modificar dados em uma view
se eles contiverem:
Uma das condies mencionadas no slide
anterior
Colunas definidas por expresses
A pseudocoluna ROWNUM
Voc no poder adicionar dados se:
A view contiver uma das condies

mencionadas acima ou no slide anterior


Houver colunas NOT NULL nas tabelas-base
que no forem selecionadas pela view
12-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Executando Operaes DML em uma View (continuao)


Voc poder modificar os dados em uma view, exceto se ela contiver uma das condies mencionadas
no slide anterior e uma dos seguintes:
Colunas definidas por expresses por exemplo, SAL * 12
A pseudocoluna ROWNUM
Voc poder adicionar dados por uma view, exceto se ela contiver uma das condies acima e houver
colunas NOT NULL, sem um valor default, na tabela-base que no forem selecionadas pela view.
Todos os valores necessrios devem estar presentes na Lembre-se de que voc esta adicionando
valores diretamente na tabela subjacente na view.
Para obter mais informaes, consulte o 0racle8 Server SQL Reference, Release 8, "CREATE VIEW".

Introduo ao Oracle: SQL e PL/SQL 12-16

Usando a Clusula
WITH CHECK OPTION
Voc poder garantir que a DML na view
continue no domnio da view usando a
clusula WITH CHECK OPTION.
SQL>
2
3
4
5
View

CREATE OR REPLACE VIEW empvu20


AS SELECT
*
FROM
emp
WHERE
deptno = 20
WITH CHECK OPTION CONSTRAINT empvu20_ck;
created.

Qualquer tentativa de alterao do nmero


do departamento para qualquer linha na view
falhar porque ela violar a restrio WITH
CHECK OPTION.
12-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando a Clusula WITH CHECK OPTION


possvel executar verificaes de integridade referencial pelas views. Voc dever tambm impor
restries no nvel de banco de dados. A view poder ser usada para proteger a integridade dos dados,
mas o uso muito restrito.
A clusula WITH CHECK OPTION especifica que INSERTS e UPDATES executados pela view
no tm permisso de criar linhas que a view no possa selecionar e, portanto, ela permite restries
de integridade e verificaes de validao de dados a serem impostas aos dados que estiverem sendo
inseridos ou atualizados.
Se houver uma tentativa de executar operaes DML em linhas que a view no selecionou, ser
exibido um erro, com o nome da restrio, se ele tiver sido especificado.
SQL> UPDATE empvu20
2 SET
deptno = 10
3 WHERE empno = 7788;
update empvu20
*
ERRO na linha 1: (ERROR at line1)
ORA-01402: violao na clusula where WITH CHECK OPTION na view
(view WITH CHECK OPTION where-clause violation)

Observao: Nenhuma linha atualizada porque se o nmero do departamento fosse alterado para
10, a view no seria mais capaz de enxergar o funcionrio. Por isso, com a clusula WITH CHECK
OPTION, a view poder ver apenas funcionrios do departamento 20 e no permitir que o nmero
de departamento para esses funcionrios seja alterado na view.
Introduo ao Oracle: SQL e PL/SQL 12-17

Negando Operaes DML


Voc poder assegurar que nenhuma operao
DML ocorra atravs da adio da opo WITH
READ ONLY definio da sua view.
SQL>
2
3
4
5
6
View

CREATE OR REPLACE VIEW empvu10


(employee_number, employee_name, job_title)
AS SELECT
empno, ename, job
FROM
emp
WHERE
deptno = 10
WITH READ ONLY;
created.

Qualquer tentativa de executar uma DML


em uma linha na view resultar em erro no
Oracle Server.
12-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Negando Operaes DML


Voc poder garantir que nenhuma operao DML ocorra na sua view criando-a com a opo WITH
READ ONLY. O exemplo no slide modifica a view EMPVU10 para impedir que as operaes DML
na view.
Quaisquer tentativas de remover uma linha da view resultar em erro.
SQL> DELETE FROM empvu10
2 WHERE employee_number = 7782;
DELETE FROM empvu10
*
ERRO na linha 1 (ERROR at line 1:)
ORA-01752: No possvel deletar da view sem exatamente uma chave
preservada tabela (Cannot delete from view without exactly one keypreserved table)

Quaisquer tentativas de inserir uma linha ou modific-la usando a view resultar em erro no Oracle
Server -01733: no permitida coluna virtual aqui (virtual column not
allowed here).

Introduo ao Oracle: SQL e PL/SQL 12-18

Removendo uma View


Remover uma view sem perder dados porque
uma view est baseada em tabelas
subjacentes no banco de dados.
DROP VIEW view;

SQL> DROP VIEW empvu10;


View dropped.

12-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Removendo uma View


Voc deve usar a instruo DROP VIEW para remover uma view. A instruo remove a definio da
view do banco de dados. A eliminao de views no tem efeito nas tabelas nas quais ela baseada.
As views ou outras aplicaes baseadas em views deletadas tornam-se invlidas. Apenas o criador ou
usurio com o privilgio DROP ANY VIEW poder remover uma view.
Na sintaxe:
view

o nome da view

Introduo ao Oracle: SQL e PL/SQL 12-19

Views Em Linha
Uma view em linha uma subconsulta
subjacente com um apelido (nome de
correlao) que pode ser usado em uma
instruo SQL.
Uma view em linha similar ao uso de uma
subconsulta nomeada na clusula FROM
da consulta principal.
Uma view em linha no um objeto de
esquema.

12-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Views Em Linha
Uma view em linha na clusula FROM de uma instruo SELECT define uma fonte de dados para a
instruo SELECT. No exemplo abaixo, a view em linha b retorna os detalhes de todos os nmeros do
departamento e o salrio mximo para cada departamento da tabela EMP. A clusula WHERE a.deptno
= b.deptno AND a.sal < b.maxsal de consulta principal exibe os nomes dos funcionrios, salrio,
nmeros do departamento e os salrios mximos de todos os funcionrios que ganham menos que o
salrio mximo em seus departamentos.
SQL> SELECT
2

FROM

a.ename, a.sal, a.deptno, b.maxsal


emp a, (SELECT

deptno, max(sal) maxsal

FROM

emp

GROUP BY deptno) b

WHERE

a.deptno = b.deptno

AND

a.sal < b.maxsal;

ENAME
SAL
DEPTNO
MAXSAL
---------- --------- --------- --------CLARK
2450
10
5000
MILLER
1300
10
5000
...
TURNER
1500
30
2850
JAMES
950
30
2850
10 rows selected.
Introduo ao Oracle: SQL e PL/SQL 12-20

Anlise "Top-N"
As consultas Top-N pedem os maiores ou
menores valores n de uma coluna.
Quais so os dez produtos mais

vendidos?
Quais so os dez produtos menos

vendidos?
Tanto o conjunto dos maiores quanto dos
menores valores so considerados
consultas Top-N.

12-21

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Anlise "Top-N"
As consultas Top-N so teis em cenrios onde existe a necessidade de exibir apenas os maiores ou
menores registros n de uma tabela baseada em uma condio. Esse conjunto de resultados podem ser
para anlise posterior. Por exemplo, ao usar as anlises Top-N voc poder executar os seguintes
tipos de consultas:

Os trs maiores salrios na empresa

Os quatro mais novos contratados da empresa

Os dois melhores representantes de vendas que venderam mais produtos

Os trs melhores produtos que mais venderam nos ltimos seis meses

Introduo ao Oracle: SQL e PL/SQL 12-21

Executando a Anlise "Top-N"


A estrutura de nvel mais elevado de uma
consulta de anlise Top-N :
SQL> SELECT [column_list], ROWNUM
2 FROM (SELECT [column_list] FROM table
3
ORDER BY Top-N_column)
4 WHERE ROWNUM <= N

12-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Executando a Anlise "Top-N"


As consultas Top-N usam uma estrutura de consultas aninhadas consistentes com os elementos
descritos abaixo:

Uma subconsulta ou uma view em linha para gerar a lista classificada de dados. A subconsulta
ou a view em linha inclui a clusula ORDER BY para assegurar que a classificao esteja na
ordem desejada. Para os resultados recuperando os maiores valores, necessrio um
parmetro DESC.

Uma consulta externa para limitar o nmero de linhas no conjunto final de resultados.
A consulta externa inclui os seguintes componentes:

A pseudocoluna ROWNUM, que atribui um valor seqencial iniciando com 1 para cada
uma das linhas retornadas da subconsulta.

A clusula WHERE, que especifica as linhas n a serem retornadas. A clusula externa


WHERE deve usar um operador < ou <=.

Introduo ao Oracle: SQL e PL/SQL 12-22

Exemplo de Anlise "Top-N"


Para exibir os nomes dos funcionrios que
recebem os trs maiores salrios e seus
nomes na tabela EMP.
SQL> SELECT ROWNUM as RANK, ename, sal
2 FROM (SELECT ename,sal FROM emp
3
ORDER BY sal DESC)
4 WHERE ROWNUM <= 3;
RANK
--------1
2
3

ENAME
---------KING
SCOTT
FORD

SAL
--------5000
3000
3000

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

12-23

Exemplo de Anlise "Top-N"


O exemplo no slide descreve como exibir os nomes e os salrios dos trs funcionrios mais bem
pagos na tabela EMP. A subconsulta retorna os detalhes de todos os nomes de funcionrios e salrios
da tabela EMP, classificados em ordem decrescente de salrios. A clusula WHERE ROWNUM < 3
da consulta principal garante que apenas os trs primeiros registros do conjunto de resultados sero
exibidos.
Eis aqui um outro exemplo de anlises Top-N que usa uma view em linha. O exemplo abaixo usa a
view em linha E para exibir os quatro funcionrios mais antigos na empresa.
SQL> SELECT
2

FROM

3
4

ROWNUM as SENIOR,E.ename, E.hiredate


(SELECT ename,hiredate FROM emp
ORDER BY hiredate)E

WHERE rownum <= 4;

SENIOR ENAME

HIREDATE

--------- ---------- --------1 SMITH

17-DEC-80

2 ALLEN

20-FEB-81

3 WARD

22-FEB-81

4 JONES

02-APR-81
Introduo ao Oracle: SQL e PL/SQL 12-23

Sumrio
Uma view criada a partir de dados em
outras tabelas ou views.
Uma view fornece todas as vantagens a
seguir:
Restringe o acesso a bancos de dados
Simplifica as consultas
Permite a independncia de dados
Exibe vrias views dos mesmos dados
Pode ser eliminada sem remover os dados

subjacentes
12-24

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Que uma View?


Uma view baseada em uma tabela ou em uma outra view e age como uma janela atravs da qual os
dados nas tabelas podem ser vistos ou alterados. Uma view no contm dados. A definio de view
est armazenada no dicionrio de dados. Voc poder ver a definio de view na tabela de dicionrio
de dados USER_VIEWS.
Vantagens das Views

Restringem o acesso a bancos de dados

Simplificam as consultas

Permite a independncia de dados

Exibem vrias views dos mesmos dados

Podem ser removidas sem afetar os dados subjacentes

Opes de Views

Pode ser uma view simples baseada em uma tabela

Pode ser uma view complexa baseada em mais de uma tabela ou pode conter grupos de funes

Pode ser substituda se um dos mesmos nomes existir

Pode conter uma restrio de verificao

Pode ser somente para leitura

Introduo ao Oracle: SQL e PL/SQL 12-24

Sumrio
Uma view em linha uma subconsulta com
um nome apelido.
As anlises "Top-N" podem ser executadas
usando-se:
Subconsulta
Consulta externa

12-25

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Introduo ao Oracle: SQL e PL/SQL 12-25

Viso Geral do Exerccio


Criando uma view simples
Criando uma view complexa
Criando uma view com restrio de
verificao
Tentando modificar dados na view
Exibindo definies de view
Removendo views

12-26

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Neste exerccio, voc criar views simples e complexas e tentar executar instrues DML nas
views.

Introduo ao Oracle: SQL e PL/SQL 12-26

Exerccio 12
1. Crie uma view chamada EMP_VU baseada no nome e nmero do funcionrio e
nmero de departamento na tabela EMP. Altere o cabealho do nome do funcionrio para
EMPLOYEE.
2. Exiba o contedo da view EMP_VU.
EMPNO EMPLOYEE DEPTNO
----- -------- -----7839 KING
7698 BLAKE
7782 CLARK
7566 JONES
7654 MARTIN
7499 ALLEN
7844 TURNER
7900 JAMES
7521 WARD
7902 FORD
7369 SMITH
7788 SCOTT
7876 ADAMS
7934 MILLER
14 rows selected.

10
30
10
20
30
30
30
30
30
20
20
20
20
10

3. Selecione o texto e o nome da view a partir do dicionrio de dados USER_VIEWS.


VIEW_NAME
TEXT
----------- ---------------------------------------EMP_VU
SELECT empno, ename employee, deptno
FROM emp

4. Usando sua view EMP_VU, insira uma consulta para exibir todos os nomes dos funcionrios e os
nmeros de departamento.
EMPLOYEE

DEPTNO

---------- --------KING

10

BLAKE

30

CLARK

10

JONES

20

MARTIN

30

...
14 rows selected.

Introduo ao Oracle: SQL e PL/SQL 12-27

Exerccio 12 (continuao)
5. Crie uma view nomeada DEPT20 que contenha o nmero e o nome do funcionrio e
o nmero de departamento de todos os funcionrios no departamento 20. Coloque um label na
coluna da view de EMPLOYEE_ID, EMPLOYEE, and DEPARTMENT_ID. No permita que
um funcionrio seja reatribudo a um outro departamento na view.
6. Exiba a estrutura e o contedo da view DEPT20.
Name
--------------EMPLOYEE_ID
EMPLOYEE
DEPARTMENT_ID
EMPLOYEE_ID
----------7566
7902
7369
7788
7876

Null?
Type
-------- -----NOT NULL NUMBER(4)
VARCHAR2(10)
NOT NULL NUMBER(2)

EMPLOYEE DEPARTMENT_ID
-------- ------------JONES
20
FORD
20
SMITH
20
SCOTT
20
ADAMS
20

7. Tente reatribuir Smith ao departamento 30.


Se voc tiver tempo, complete o exerccio abaixo:
8. Crie uma view chamada SALARY_VU baseada no nome do funcionrio, nome do
departamento, salrio e grau de salrio de todos os funcionrios. Coloque um label nas
colunas de Employee, Department, Salary e Grade, respectivamente.

Introduo ao Oracle: SQL e PL/SQL 12-28

13
Outros Objetos do
Banco de Dados

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Descrever alguns objetos do banco de
dados e seus usos
Criar, manter e usar seqncias
Criar e manter ndices
Criar sinnimos particulares e pblicos

13-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender a criar e manter alguns dos outros objetos do banco de dados que so
normalmente utilizados. Esses objetos incluem seqncias, ndices e sinnimo.

Introduo ao Oracle: SQL e PL/SQL 13-2

Objetos do Banco de Dados

13-3

Objeto

Descrio

Tabela

Unidade bsica de armazenamento,


composta de linhas e colunas

View

Representa logicamente subconjuntos de dados


de uma ou mais tabelas

Seqncia

Gera valores de chave primria

ndice

Melhora o desempenho de algumas consultas

Sinnimo

Nome alternativo para um objeto

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetos do Banco de Dados


Muitas aplicaes necessitam usar nmeros exclusivos como valores de chave primria. Voc pode
elaborar o cdigo na aplicao para tratar essa necessidade ou usar uma seqncia para gerar nmeros
exclusivos.
Para melhorar o desempenho de algumas consultas, voc deve considerar criar um ndice. Voc
tambm pode usar os ndices para aplicar exclusividade a uma coluna ou um conjunto de colunas.
possvel fornecer nomes alternativos para objetos usando sinnimos.

Introduo ao Oracle: SQL e PL/SQL 13-3

O Que uma Seqncia?


Gera nmeros exclusivos automaticamente
um objeto compartilhvel
geralmente usada para criar um valor de
chave primria
Substitui o cdigo de aplicao
Acelera a eficcia do acesso a valores de
seqncia quando esto em cache na
memria

13-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Que uma Seqncia?


Uma seqncia um objeto do banco de dados criado pelo usurio que pode ser compartilhado por
vrios usurios para gerar nmeros inteiros exclusivos. Voc pode usar as seqncias para gerar
valores de chave primria automaticamente.
Um uso comum para as seqncias criar um valor de chave primria, que deve ser exclusivo para
cada linha. A seqncia gerada e incrementada (ou diminuda) por uma rotina Oracle8 interna. Esse
objeto pode economizar tempo, pois capaz de reduzir a quantidade de cdigo de aplicao
necessria para criar uma rotina de gerao de seqncias.
Os nmeros de seqncia so armazenados e gerados de modo independente das tabelas. Portanto, a
mesma seqncia pode ser usada para vrias tabelas.

Introduo ao Oracle: SQL e PL/SQL 13-4

A Instruo CREATE SEQUENCE


Defina uma seqncia para gerar nmeros
seqenciais automaticamente.
CREATE SEQUENCE seqncia
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];

13-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando uma Seqncia


Gere nmeros de seqncia automaticamente usando a instruo CREATE SEQUENCE.
Na sintaxe:
seqncia

o nome do gerador da seqncia

INCREMENT BY n

especifica o intervalo entre nmeros de seqncia onde n um


nmero inteiro (Se essa clusula for omitida, a seqncia ser
incrementada em 1.)

START WITH n

especifica o primeiro nmero de seqncia a ser gerado


(Se essa clusula for omitida, a seqncia comear com 1.)

MAXVALUE n

especifica o valor mximo que a seqncia pode gerar

NOMAXVALUE

especifica um valor mximo de 10^27 para uma seqncia crescente


e 1 para uma seqncia decrescente (Essa a opo default.)

MINVALUE n

especifica o valor de seqncia mnimo

NOMINVALUE

especifica um valor mnimo de 1 para uma seqncia crescente e


(10^26) para uma seqncia decrescente (Essa a opo default.)

Introduo ao Oracle: SQL e PL/SQL 13-5

Criando uma Seqncia (continuao)


CYCLE | NOCYCLE

especifica que a seqncia continue a gerar valores aps


alcanar seu valor mximo ou mnimo ou no gere
valores adicionais (NOCYCLE a opo default.)

CACHE n | NOCACHE

especifica quantos valores o Oracle Server alocar


previamente e manter na memria (Por default, o Oracle
Server colocar em cache 20 valores.)

Introduo ao Oracle: SQL e PL/SQL 13-6

Criando uma Seqncia


Crie uma seqncia chamada DEPT_DEPTNO
para ser usada na chave primria da
tabela DEPT.
No use a opo CYCLE.
SQL> CREATE SEQUENCE dept_deptno
2
INCREMENT BY 1
3
START WITH 91
4
MAXVALUE 100
5
NOCACHE
6
NOCYCLE;
Sequence created.

13-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando uma Seqncia (continuao)


O exemplo no slide cria uma seqncia chamada DEPT_DEPTNO para ser usada na coluna
DEPTNO da tabela DEPT. A seqncia comea em 91, no permite cache e no permite o ciclo
da seqncia.
No use a opo CYCLE se a seqncia for utilizada para gerar valores de chave primria, a menos
que voc tenha um mecanismo confivel que expurgue linhas antigas mais rpido do que o ciclo da
seqncia.
Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "CREATE
SEQUENCE".

Introduo ao Oracle: SQL e PL/SQL 13-7

Confirmando Seqncias
Verifique seus valores de seqncia na
tabela do dicionrio de dados
USER_SEQUENCES.
SQL> SELECT
2
3 FROM

sequence_name, min_value, max_value,


increment_by, last_number
user_sequences;

A coluna LAST_NUMBER exibe o prximo


nmero de seqncia disponvel.

13-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Confirmando Seqncias
Aps voc criar sua seqncia, ela documentada no dicionrio de dados. J que uma
seqncia um objeto do banco de dados, voc pode identific-la na tabela do dicionrio
de dados USER_OBJECTS.
Tambm possvel confirmar as configuraes da seqncia selecionando a partir da tabela do
dicionrio de dados USER_SEQUENCES.
SEQUENCE_NAME

MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER

-------------- ----------- --------- ------------ ----------CUSTID

1 1.000E+27

109

DEPT_DEPTNO

100

91

ORDID

1 1.000E+27

622

PRODID

1 1.000E+27

200381

Introduo ao Oracle: SQL e PL/SQL 13-8

Pseudocolunas
NEXTVAL e CURRVAL
NEXTVAL retorna o prximo valor de
seqncia disponvel.
Retorna um valor exclusivo sempre que
feita referncia a ele, at mesmo por
usurios diferentes.
CURRVAL obtm o valor de seqncia atual.
NEXTVAL deve ser emitido para essa
seqncia antes que CURRVAL contenha
um valor.
13-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando uma Seqncia


Aps criar a seqncia, voc poder us-la para gerar nmeros seqenciais a serem usados nas suas
tabelas. Faa referncia aos valores de seqncia usando as pseudocolunas NEXTVAL e CURRVAL.
Pseudocolunas NEXTVAL e CURRVAL
A pseudocoluna NEXTVAL usada para extrair nmeros de seqncia sucessivos de uma seqncia
especificada. Voc deve qualificar NEXTVAL com o nome da seqncia. Quando voc faz
referncia seqncia.NEXTVAL, um novo nmero de seqncia gerado e o nmero de seqncia
atual colocado em CURRVAL.
A pseudocoluna CURRVAL usada para fazer referncia a um nmero de seqncia que o usurio
atual acabou de gerar. NEXTVAL deve ser usado para gerar um nmero de seqncia na sesso do
usurio atual antes que seja feita referncia CURRVAL. Voc deve qualificar CURRVAL com o
nome da seqncia. Quando feita referncia seqncia.CURRVAL, o ltimo valor retornado ao
processo desse usurio exibido.

Introduo ao Oracle: SQL e PL/SQL 13-9

Pseudocolunas
NEXTVAL e CURRVAL
NEXTVAL retorna o prximo valor de
seqncia disponvel.
Retorna um valor exclusivo sempre que
feita referncia a ele, at mesmo por
usurios diferentes.
CURRVAL obtm o valor de seqncia atual.
NEXTVAL deve ser emitido para essa
seqncia antes que CURRVAL contenha
um valor.
13-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Regras para Usar NEXTVAL e CURRVAL


Voc pode usar NEXTVAL e CURRVAL nos seguintes casos:

Na lista SELECT de uma instruo SELECT que no seja parte de uma subconsulta

Na lista SELECT de uma subconsulta em uma instruo INSERT

Na clusula VALUES de uma instruo INSERT

Na clusula SET de uma instruo UPDATE

Voc no pode usar NEXTVAL e CURRVAL nos seguintes casos:

Na lista SELECT de uma view

Em uma instruo SELECT com a palavra-chave DISTINCT

Em uma instruo SELECT com as clusulas GROUP BY, HAVING ou ORDER BY

Em uma subconsulta de uma instruo SELECT, DELETE ou UPDATE

Em uma expresso DEFAULT de uma instruo CREATE TABLE ou ALTER TABLE

Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, seo
"Pseudocolumns" e "CREATE SEQUENCE".

Introduo ao Oracle: SQL e PL/SQL 13-10

Usando uma Seqncia


Insira um novo departamento chamado
"MARKETING" em San Diego.
SQL> INSERT INTO
2 VALUES
3
1 row created.

dept(deptno, dname, loc)


(dept_deptno.NEXTVAL,
'MARKETING', 'SAN DIEGO');

Visualize o valor atual para a seqncia


DEPT_DEPTNO.
SQL> SELECT
2 FROM

13-11

dept_deptno.CURRVAL
dual;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando uma Seqncia


O exemplo no slide insere um novo departamento na tabela DEPT. Ele usa a seqncia
DEPT_DEPTNO para gerar um novo nmero de departamento.
Voc pode exibir o valor atual da seqncia:
SQL> SELECT
2

FROM

dept_deptno.CURRVAL
dual;

CURRVAL
------91

Suponha agora que voc deseje admitir funcionrios para o novo departamento. A instruo INSERT
que pode ser executada repetidamente para todos os novos funcionrios pode incluir o seguinte
cdigo:
SQL> INSERT INTO emp ...
2

VALUES (emp_empno.NEXTVAL, dept_deptno.CURRVAL, ...);

Observao: O exemplo acima pressupe que uma seqncia EMP_EMPNO j tenha sido criada
para gerar um novo nmero de funcionrio.
Introduo ao Oracle: SQL e PL/SQL 13-11

Usando uma Seqncia


Colocar valores de seqncia em cache na
memria permite um acesso mais rpido a
esses valores.
Podem ocorrer intervalos em valores de
seqncia quando:
Ocorrer um rollback
O sistema falhar
Uma seqncia for usada em outra tabela

Visualize a prxima seqncia disponvel, se


tiver sido criada com NOCACHE, consultando
a tabela USER_SEQUENCES.
13-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Colocando Valores de Seqncia em Cache


Coloque seqncias em cache na memria para permitir um acesso mais rpido aos valores de
seqncia. O cache preenchido na primeira referncia seqncia. Cada solicitao para o prximo
valor de seqncia recuperada na seqncia em cache. Aps a ltima seqncia ser usada, a prxima
solicitao para a seqncia baixa outro cache de seqncias para a memria.
Cuidado com Gaps na sua Seqncia
Apesar de os geradores de seqncia emitirem nmeros de seqncia sem gaps, essa ao ocorre
independentemente de um commit ou rollback. Portanto, se voc fizer o rollback de uma instruo que
contenha uma seqncia, o nmero ser perdido.
Outro evento que pode causar gaps na seqncia uma falha do sistema. Se a seqncia colocar valores
em cache na memria, esses valores sero perdidos em caso de falha do sistema.
J que as seqncias no esto diretamente ligadas s tabelas, a mesma seqncia pode ser usada para
vrias tabelas. Se isso ocorrer, cada tabela poder contar gaps nos nmeros seqenciais.
Visualizando o Prximo Valor de Seqncia Disponvel Sem Increment-lo
Se a seqncia tiver sido criada com NOCACHE, ser possvel visualizar o prximo valor de seqncia
disponvel sem increment-lo ao consultar a tabela USER_SEQUENCES.

Introduo ao Oracle: SQL e PL/SQL 13-12

Modificando uma Seqncia


Altere o valor de incremento, o valor mximo,
o valor mnimo, a opo de ciclo ou a opo
de cache.
SQL> ALTER SEQUENCE dept_deptno
2
INCREMENT BY 1
3
MAXVALUE 999999
4
NOCACHE
5
NOCYCLE;
Sequence altered.

13-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Alterando uma Seqncia


Se voc alcanar o limite MAXVALUE para sua seqncia, nenhum valor adicional da seqncia
ser alocado e ocorrer um erro indicando que a seqncia excede o MAXVALUE. Para continuar a
usar a seqncia, voc pode modific-la usando a instruo ALTER SEQUENCE.
Sintaxe
ALTER

onde:

SEQUENCE seqncia
[INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];

seqncia

o nome do gerador da seqncia

Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "ALTER
SEQUENCE".

Introduo ao Oracle: SQL e PL/SQL 13-13

Diretrizes para Modificar


uma Seqncia
Voc deve ser o proprietrio ou possuir o
privilgio ALTER para a seqncia.
Somente os nmeros de seqncia futuras
so afetados.
A seqncia deve ser eliminada e
recriada para reiniciar a seqncia em um
nmero diferente.
Alguma validao executada.

13-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes

Voc deve ser o proprietrio ou possuir o privilgio ALTER para a seqncia a fim de
modific-la.

Somente os nmeros de seqncia futuros so afetados pela instruo ALTER SEQUENCE.

A opo START WITH no pode ser alterada usando ALTER SEQUENCE. A seqncia deve
ser eliminada e recriada para reiniciar a seqncia em um nmero difere.

Alguma validao executada. Por exemplo, no possvel impor um novo MAXVALUE


menor do que o nmero de seqncia atual.

SQL> ALTER SEQUENCE dept_deptno


2
INCREMENT BY 1
3
MAXVALUE 90
4
NOCACHE
5
NOCYCLE;
ALTER SEQUENCE dept_deptno
*
ERROR at line 1:
ORA-04009: No possvel tornar MAXVALUE menor do que o valor
atual (MAXVALUE cannot be made to be less than the current value)

Introduo ao Oracle: SQL e PL/SQL 13-14

Removendo uma Seqncia


Remova uma seqncia do dicionrio de
dados usando a instruo DROP
SEQUENCE.
Aps remover a seqncia, voc no poder
mais fazer referncia ela.
SQL> DROP SEQUENCE dept_deptno;
Sequence dropped.

13-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Removendo uma Seqncia


Para remover uma seqncia do dicionrio de dados, use a instruo DROP SEQUENCE. Voc deve
ser o proprietrio da seqncia ou possuir o privilgio DROP ANY SEQUENCE para remov-la.
Sintaxe
DROP

onde:

SEQUENCE seqncia;

seqncia

o nome do gerador da seqncia

Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "DROP
SEQUENCE".

Introduo ao Oracle: SQL e PL/SQL 13-15

O Que um ndice?
um objeto de esquema
usado pelo Oracle Server para acelerar a
recuperao de linhas usando um ponteiro
Pode reduzir a E/S do disco usando um
mtodo rpido de acesso a caminhos para
localizar os dados rapidamente
independente da tabela que indexa
usado e mantido automaticamente pelo
Oracle Server

13-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Que um ndice?
Um ndice do Oracle Server um objeto de esquema que pode acelerar a recuperao de linhas
usando um ponteiro. Os ndices podem ser criados explcita ou automaticamente. Se no houver um
ndice na coluna, ocorrer uma anlise em toda a tabela.
Um ndice fornece acesso direto e rpido s linhas em uma tabela. Seu objetivo reduzir a
necessidade de E/S do disco usando um caminho indexado para localizar dados rapidamente. O
ndice usado e mantido automaticamente pelo Oracle Server. Aps a criao de um ndice, no
necessria nenhuma atividade direta do usurio.
Os ndices so lgica e fisicamente independentes da tabela que indexam. Isso significa que eles
podem ser criados e eliminados a qualquer momento e no tm nenhum efeito sobre as tabelas-base
ou outros ndices.
Observao: Quando voc elimina uma tabela, os ndices correspondentes tambm so eliminados.
Para obter mais informaes, consulte o Oracle Server Concepts Manual, Release 8, seo "Schema
Objects", tpico "Indexes".

Introduo ao Oracle: SQL e PL/SQL 13-16

Como os ndices so Criados?


Automaticamente: Um ndice exclusivo
criado automaticamente quando voc
define uma restrio PRIMARY KEY ou
UNIQUE em uma definio de tabela.
Manualmente: Os usurios podem criar
ndices no-exclusivos em colunas para
acelerar o tempo de acesso s linhas.

13-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Como os ndices so Criados?


possvel criar dois tipos de ndices. Um tipo um ndice exclusivo. O Oracle Server cria esse ndice
automaticamente quando voc define que uma coluna de uma tabela tenha uma restrio PRIMARY
KEY ou UNIQUE KEY. O nome do ndice o nome dado restrio.
O outro tipo de ndice que um usurio pode criar um ndice no-exclusivo. Por exemplo, voc pode
criar um ndice da coluna FOREIGN KEY para uma juno em uma consulta a fim de aumentar a
velocidade de recuperao.

Introduo ao Oracle: SQL e PL/SQL 13-17

Criando um ndice
Crie um ndice em uma ou mais colunas.
CREATE INDEX ndice
ON tabela (coluna[, coluna]...);

Aumente a velocidade do acesso de


consulta na coluna ENAME da tabela EMP.
SQL> CREATE INDEX
2 ON
Index created.

13-18

emp_ename_idx
emp(ename);

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando um ndice
Crie um ndice em uma ou mais colunas emitindo uma instruo CREATE INDEX.
Na sintaxe:
ndice

o nome do ndice

tabela

o nome da tabela

coluna

o nome da coluna na tabela a ser indexada

Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "CREATE
INDEX".

Introduo ao Oracle: SQL e PL/SQL 13-18

Quando Criar um ndice


Quando a coluna for usada freqentemente na
clusula WHERE ou em uma condio de juno.
Quando a coluna contiver uma ampla faixa de
valores.
Quando a coluna contiver um grande nmero
de valores nulos.
Quando duas ou mais colunas forem usadas
juntas com freqncia em uma clusula
WHERE ou em uma condio de juno.
Quando a tabela for grande e se esperar que a
maioria das consultas recupere menos que 2 a
4% das linhas.
13-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Mais Nem Sempre Melhor


Ter mais ndices em uma tabela no significa que as consultas sero aceleradas. Cada operao DML
que seja submetida a commit em uma tabela com ndices significa que os ndices devem ser
atualizados. Quanto mais ndices associados a uma tabela voc tiver, maior ser o esforo feito pelo
Oracle Server para atualizar todos os ndices aps uma DML.
Quando Criar um ndice

Quando a coluna for usada freqentemente na clusula WHERE ou em uma condio de


juno.

Quando a coluna contiver uma ampla faixa de valores.

Quando a coluna contiver um grande nmero de valores nulos.

Quando duas ou mais colunas forem usadas juntas com freqncia em uma clusula
WHERE ou em uma condio de juno.

Quando a tabela for grande e se esperar que a maioria das consultas recupere menos
que 2 a 4% das linhas.

Lembre-se de que, para aplicar exclusividade, voc deve definir uma restrio exclusiva na definio
da tabela. Em seguida, um ndice exclusivo ser criado automaticamente.

Introduo ao Oracle: SQL e PL/SQL 13-19

Quando No Criar um ndice


Quando a tabela for pequena.
Quando as colunas no forem utilizadas
com freqncia como uma condio na
consulta.
Quando se esperar que a maioria das
consultas recupere mais que 2 a 4% das
linhas.
Quando a tabela for atualizada com
freqncia.

13-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Quando No Criar um ndice

Quando a tabela for pequena.

Quando as colunas no forem utilizadas com freqncia como uma condio na consulta.

Quando se esperar que a maioria das consultas recupere mais que 2 a 4% das linhas.

Quando a tabela for atualizada com freqncia. Se voc tiver um ou mais ndices em uma
tabela, as instrues DML que acessarem a tabela sero mais lentas.

Introduo ao Oracle: SQL e PL/SQL 13-20

Confirmando ndices
A view do dicionrio de dados
USER_INDEXES contm o nome do ndice e
sua exclusividade.
A view USER_IND_COLUMNS contm os
nomes do ndice, da tabela e da coluna.
SQL>
2
3
4
5

SELECT
FROM
WHERE
AND

13-21

ic.index_name, ic.column_name,
ic.column_position col_pos,ix.uniqueness
user_indexes ix, user_ind_columns ic
ic.index_name = ix.index_name
ic.table_name = 'EMP';

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Confirmando ndices
Confirme a existncia de ndices na view do dicionrio de dados USER_INDEXES. Tambm
possvel checar as colunas envolvidas em um ndice consultando a view USER_IND_COLUMNS.
O exemplo no slide exibe todos os ndices anteriormente criados, os nomes de coluna afetados e a
exclusividade na tabela EMP.
INDEX_NAME

COLUMN_NAME

COL_POS UNIQUENESS

-----------------

--------------- ------- ----------

EMP_EMPNO_PK

EMPNO

1 UNIQUE

EMP_ENAME_IDX

ENAME

1 NONUNIQUE

Observao: A sada foi formatada.

Introduo ao Oracle: SQL e PL/SQL 13-21

ndices Baseados em Funo


Um ndice baseado em funo aquele que
se baseia em expresses.
Uma expresso de ndice elaborada a partir
de colunas de tabela, constantes, funes
SQL e funes definidas pelo usurio.
SQL> CREATE TABLE test (col1 NUMBER);
SQL> CREATE INDEX test_index on test(col1,col1+10);
SQL> SELECT col1+10 FROM test;

13-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

ndice Baseado em Funo


Os ndices baseados em funo definidos com as palavras-chave UPPER(column_name) ou
LOWER(column_name) aceitam pesquisas sem a distino entre maisculas e minsculas. Por
exemplo, o ndice a seguir:
SQL> CREATE INDEX uppercase_idx ON emp (UPPER(ename));

Facilita o processamento de consultas como:


SQL> SELECT * FROM emp WHERE UPPER(ename) = 'KING';

Para garantir que o Oracle use o ndice em vez de desempenhar uma anlise em toda a tabela,
certifique-se de que o valor da funo no seja nulo em consultas subseqentes. Por exemplo, a
instruo abaixo certamente usar o ndice, mas sem a clusula WHERE o Oracle executar uma
anlise em toda a tabela.
SQL> SELECT * FROM emp
2

WHERE UPPER (ename) IS NOT NULL

ORDER BY UPPER (ename);

O Oracle trata os ndices com colunas marcadas como DESC como ndices baseados em funo. As
colunas marcadas como DESC so classificadas em ordem decrescente.

Introduo ao Oracle: SQL e PL/SQL 13-22

Removendo um ndice
Remova um ndice do dicionrio de dados.
SQL> DROP INDEX index;

Remova o ndice EMP_ENAME_IDX do


dicionrio de dados.
SQL> DROP INDEX emp_ename_idx;
Index dropped.

Para eliminar um ndice, voc precisa ser o


proprietrio do ndice ou possuir o privilgio
DROP ANY INDEX.
13-23

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Removendo um ndice
Voc no pode modificar ndices. Para alterar um ndice, voc deve elimin-lo e, em seguida,
recri-lo. Remova uma definio de ndice do dicionrio de dados emitindo a instruo DROP
INDEX. Para eliminar um ndice, voc precisa ser o proprietrio do ndice ou possuir o privilgio
DROP ANY INDEX.
Na sintaxe:
ndice

o nome do ndice

Introduo ao Oracle: SQL e PL/SQL 13-23

Sinnimos
Simplifique o acesso aos objetos criando um
sinnimo (outro nome para um objeto).
Consulte uma tabela de propriedade de
outro usurio.
Abrevie nomes de objeto longos.
CREATE [PUBLIC] SYNONYM sinnimo
FOR
objeto;

13-24

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando um Sinnimo para um Objeto


Para consultar uma tabela de propriedade de outro usurio, necessrio preceder o nome da tabela
com o nome do usurio que a criou, seguido por um ponto. A criao de um sinnimo elimina a
necessidade de qualificar o nome do objeto com o esquema e fornece um nome alternativo para uma
tabela, view, seqncia, um procedimento ou outros objetos. Esse mtodo pode ser especialmente til
com nomes de objeto longos, tais como views.
Na sintaxe:
PUBLIC

cria um sinnimo acessvel a todos os usurios

sinnimo

o nome do sinnimo a ser criado

objeto

identifica o objeto para o qual o sinnimo criado

Diretrizes

O objeto no pode estar contido em um pacote.

Um nome de sinnimo particular deve ser distinto de todos os outros objetos de


propriedade do mesmo usurio.

Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "CREATE
SYNONYM".

Introduo ao Oracle: SQL e PL/SQL 13-24

Criando e Removendo Sinnimos


Crie um nome abreviado para a view
DEPT_SUM_VU.
SQL> CREATE SYNONYM d_sum
2 FOR
dept_sum_vu;
Synonym Created.

Elimine um sinnimo.
SQL> DROP SYNONYM d_sum;
Synonym dropped.

13-25

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando um Sinnimo para um Objeto (continuao)


O exemplo no slide cria um sinnimo para a view DEPT_SUM_VU para referncia mais rpida.
A DBA pode criar um sinnimo pblico acessvel a todos os usurios. O exemplo a seguir cria um
sinnimo pblico chamado DEPT para a tabela DEPT de Alice:
SQL> CREATE PUBLIC SYNONYM
2

FOR

dept

alice.dept;

Synonym created.

Removendo um Sinnimo
Para eliminar um sinnimo, use a instruo DROP SYNONYM. Somente a DBA pode eliminar um
sinnimo pblico.
SQL> DROP SYNONYM

dept;

Synonym dropped.

Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "DROP SYNONYM".

Introduo ao Oracle: SQL e PL/SQL 13-25

Sumrio
Gere nmeros de seqncia automaticamente
usando um gerador de seqncia.
Visualize informaes sobre a seqncia na
tabela do dicionrio de dados
USER_SEQUENCES.
Crie ndices para aumentar a velocidade de
recuperao de consultas.
Visualize informaes sobre o ndice na
tabela do dicionrio USER_INDEXES.
Use sinnimos para fornecer nomes
alternativos para objetos.
13-26

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Seqncias
O gerador de seqncia pode ser usado para gerar nmeros de seqncia automaticamente para linhas
em tabelas. Isso pode economizar tempo e reduzir a quantidade de cdigo de aplicao necessria.
Uma seqncia um objeto do banco de dados que pode ser compartilhado com outros usurios. As
informaes sobre a seqncia podem ser encontradas na tabela USER_SEQUENCES do dicionrio
de dados.
Para usar uma seqncia, faa referncia ela com as pseudocolunas NEXTVAL ou CURRVAL.

Recupere o prximo nmero na seqncia fazendo referncia seqncia.NEXTVAL.

Retorne o nmero disponvel atual fazendo referncia seqncia.CURRVAL.

ndices
Os ndices so usados para a velocidade de recuperao de consultas.
Os usurios podem visualizar as definies dos ndices na view do dicionrio de dados
USER_INDEXES.
Um ndice pode ser eliminado pelo criador ou por um usurio que possua o privilgio DROP ANY
INDEX usando a instruo DROP INDEX.
Sinnimos
As DBAs podem criar sinnimos pblicos e os usurios podem criar sinnimos particulares por
questes de convenincia usando a instruo CREATE SYNONYM. Os sinnimos permitem nomes
abreviados ou nomes alternativos para objetos. Remova os sinnimos usando a instruo DROP
SYNONYM.
Introduo ao Oracle: SQL e PL/SQL 13-26

Viso Geral do Exerccio


Criando seqncias
Usando seqncias
Criando ndices no-exclusivos
Exibindo informaes do dicionrio de
dados sobre seqncias e ndices
Eliminando ndices

13-27

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Neste exerccio, voc criar uma seqncia a ser usada quando preencher sua tabela
DEPARTMENT. Voc tambm criar ndices implcitos e explcitos.

Introduo ao Oracle: SQL e PL/SQL 13-27

Exerccio 13
1. Crie uma seqncia para ser usada com a coluna de chave primria da tabela DEPARTMENT.
A seqncia deve comear em 60 e ter um valor mximo de 200. Incremente sua seqncia
em dez nmeros. Nomeie a seqncia DEPT_ID_SEQ.
2. Crie um script para exibir as seguintes informaes sobre as seqncias: nome da seqncia,
valor mximo, tamanho do incremento e ltimo nmero. Nomeie o script como p13q2.sql.
Execute o script.
SEQUENCE_NAME
------------CUSTID
DEPT_ID_SEQ
ORDID
PRODID

MAX_VALUE INCREMENT_BY
--------- -----------1.000E+27
1
200
10
1.000E+27
1
1.000E+27
1

LAST_NUMBER
----------109
60
622
200381

3. Crie um script interativo para inserir uma linha na tabela DEPARTMENT. Nomeie o script como
p13q3.sql. Certifique-se de usar a seqncia criada para a coluna ID. Crie um prompt
personalizado para informar o nome do departamento. Execute o script. Adicione dois
departamentos chamados Education e Administration. Confirme as adies.
4. Crie um ndice no-exclusivo na coluna de chave estrangeira (dept_id) na tabela EMPLOYEE.
5. Exiba os ndices e as exclusividades existentes no dicionrio de dados para a tabela EMPLOYEE.
Salve a instruo em um script chamado p13q5.sql.
INDEX_NAME
-------------------EMPLOYEE_DEPT_ID_IDX
EMPLOYEE_ID_PK

TABLE_NAME
-----------EMPLOYEE
EMPLOYEE

UNIQUENESS
--------NONUNIQUE
UNIQUE

Introduo ao Oracle: SQL e PL/SQL 13-28

Você também pode gostar