Você está na página 1de 360

Introduo ao Oracle: SQL

e PL/SQL
Guia do Estudante Volume 2

41010BP13
Produo 1.3
Fevereiro de 2000
M08945-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 de Exerccios
B Descries da Tabela e Dados
ndice

xv

xvi

14
Controlando o
Acesso do Usurio

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Criar usurios
Criar funes para facilitar a configurao
e manuteno do modelo de segurana
Usar as instrues GRANT e REVOKE para
conceder e revogar os privilgios de objeto

14-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender como controlar o acesso de banco de dados a objetos especficos e
adicionar novos usurios com diferentes nveis de privilgio de acesso.

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

Controlando o Acesso do Usurio


Administrador
do banco de dados

Privilgios
de usurio e senha
Usurios

14-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Controlando o Acesso do Usurio


Em um ambiente de vrios usurios, voc deseja manter a segurana de acesso e de uso do banco de
dados. Com a segurana de banco de dados do Oracle Server, voc pode:

Controlar o acesso ao banco de dados

Conceder acesso a objetos especficos no banco de dados

Confirmar privilgios concedidos e recebidos com o dicionrio de dados Oracle

Criar sinnimos para os objetos de banco de dados

A segurana de banco de dados pode ser classificada em duas categorias: segurana de sistema e
segurana de banco de dados. A segurana de sistema cobre o acesso e o uso do banco de dados no
nvel de sistema como, por exemplo, nome de usurio e senha, espao em disco alocado aos usurios
e operaes do sistema permitidas pelo usurio. A segurana de banco de dados cobre o acesso e o
uso dos objetos de banco de dados e as aes que esses usurios possam ter sobre os objetos.

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

Privilgios
Segurana de banco de dados:
Segurana de sistema
Segurana de dados
Privilgios de sistema: Obter acesso ao
banco de dados
Privilgios de objeto: Manipular o
contedo dos objetos de banco de dados
Esquema: Coleo de objetos como, por
exemplo, tabelas, views e seqncias

14-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Privilgios
Os privilgios constituem o direito de executar instrues SQL particulares. O administrador de
banco de dados um usurio de alto nvel com a habilidade de conceder aos usurios acesso ao banco
de dados e aos objetos. Os usurios requerem privilgios de sistema para obter acesso aos privilgios
de objeto e de banco de dados para manipular o contedo dos objetos no banco de dados. Tambm
pode ser fornecido aos usurios o privilgio de conceder privilgios adicionais a outros usurios ou a
funes, que so grupos nomeados de privilgios relacionados.
Esquema
Um esquema uma coleo de objetos como, por exemplo, tabelas, views e seqncias. O esquema
pertence a um usurio de banco de dados e tem o mesmo nome do usurio.
Para obter mais informaes, consulte o Oracle Server Application Developers Guide, Release 8,
seo "Establishing a Security Policy" e Oracle Server Concepts Manual, Release 8, tpico
"Database Security".

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

Privilgios de Sistema
Mais de 80 privilgios esto disponveis.
O DBA possui privilgios de sistema de
alto nvel:
Criar novos usurios
Remover usurios
Remover tabelas
Fazer back up de tabelas

14-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Privilgios de Sistema
Mais de 80 privilgios esto disponveis para usurios e funes. Os privilgios de sistema so
tipicamente fornecidos pelo administrador do banco de dados.
Privilgios de DBA Tpicos
Privilgio de Sistema

Operaes Autorizadas

CREATE USER

Permite que o cedente crie outros usurios Oracle


(um privilgio requerido para uma funo DBA)

DROP USER

Elimina um outro usurio

DROP ANY TABLE

Elimina uma tabela em qualquer esquema

BACKUP ANY TABLE

Faz back up de tabela nos esquemas com o utilitrio de


exportao

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

Criando Usurios
O DBA cria usurios usando a instruo
CREATE USER.
CREATE
USER usurio
IDENTIFIED BY
senha;

SQL> CREATE
USER scott
2 IDENTIFIED BY
tiger;
User created.

14-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando um Usurio
O DBA cria o usurio executando a instruo CREATE USER. O usurio no possui privilgios
nesse ponto. O DBA pode ento conceder um nmero de privilgios quele usurio. Esses privilgios
determinam o que o usurio pode fazer no nvel de banco de dados.
O slide fornece a sintaxe resumida para criar um usurio.
Na sintaxe:
usurio

o nome do usurio a ser criado

senha
especifica que o usurio deve estabelecer login com essa senha
Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "GRANT"
(System Privileges and Roles) e "CREATE USER".

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

Privilgios de Sistema de Usurio


Quando o usurio for criado, o DBA poder
conceder privilgios de sistema especficos
para ele.
GRANT privilgio [, privilgio...]
TO usurio [, usurio...];

Um desenvolvedor de aplicao pode ter os


seguintes privilgios de sistema:
CREATE SESSION
CREATE TABLE
CREATE SEQUENCE
CREATE VIEW
CREATE PROCEDURE
14-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Privilgios Tpicos de Usurio


Agora que o DBA criou um usurio, o DBA poder atribuir privilgios quele usurio.
Privilgio de Sistema

Operaes Autorizadas

CREATE SESSION

Conectar-se ao banco de dados

CREATE TABLE

Criar tabelas no esquema do usurio

CREATE SEQUENCE

Criar uma seqncia no esquema do usurio

CREATE VIEW

Criar uma view no esquema do usurio

CREATE PROCEDURE

Criar um funo, pacote ou procedimento armazenado no


esquema do usurio

Na sintaxe:
privilgio

o privilgio de sistema a ser concedido

usurio

o nome do usurio

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

Concedendo
Privilgios de Sistema
O DBA pode conceder privilgios de sistema
especficos a um usurio.
SQL> GRANT create table, create sequence, create view
2 TO
scott;
Grant succeeded.

14-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Concedendo Privilgios de Sistema


O DBA usa a instruo GRANT para alocar os privilgios de sistema para o usurio. Quando forem
concedidos privilgios ao usurio, ele pode us-los imediatamente.
No exemplo do slide, foram atribudos privilgios ao usurio Scott para criar tabelas, seqncias e
views.

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

O Que uma Funo?

Usurios

Gerenciador

Privilgios
Alocando privilgios
sem uma funo

14-9

Alocando privilgios
com uma funo

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Que uma Funo?


Uma funo um grupo nomeado de privilgios relacionados que podem ser concedidos ao usurio.
Isso faz com que a concesso e revogao de privilgios se torne mais fcil de desempenhar e manter.
Um usurio pode ter acesso a vrias funes e vrios usurios podem ter a mesma funo atribuda a
eles. As funes so criadas tipicamente para uma aplicao de banco de dados.
Criando e Atribuindo uma Funo
Primeiro, o DBA deve criar uma funo. O DBA pode ento atribuir privilgios e usurios s funes.
Sintaxe
CREATE

onde:

ROLE

funo

funo;

o nome da funo a ser criada

Agora que a funo foi criada, o DBA pode usar a instruo GRANT para atribuir usurios s funes
e privilgios funo.

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

Criando e Concedendo
Privilgios a uma Funo
SQL> CREATE ROLE manager;
Role created.

SQL> GRANT create table, create view


2
to manager;
Grant succeeded.

SQL> GRANT manager to BLAKE, CLARK;


Grant succeeded.

14-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando uma Funo


O exemplo no slide cria um gerente de funo e permite que os gerentes criem tabelas e views.
Ele atribui ento a funo de gerentes a Blake e a Clark. Agora Blake e Clark podem criar tabelas
e views.

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

Alterando Sua Senha


O DBA cria a sua conta de usurio e
inicializa a sua senha.
Voc pode alterar sua senha usando a
instruo ALTER USER.
SQL> ALTER USER scott
2
IDENTIFIED BY lion;
User altered.

14-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Alterando Sua Senha


O DBA cria uma conta de usurio e inicializa uma senha para cada usurio. Voc pode alterar sua
senha usando a instruo ALTER USER.
Sintaxe
ALTER USER usurio IDENTIFIED BY senha;

onde:

usurio

o nome do usurio

senha

especifica a nova senha

Embora essa instruo possa ser usada para alterar a senha, h vrias outras opes. Voc deve ter o
privilgio ALTER USER para alterar uma opo.
Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "ALTER USER".

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

Privilgios de Objeto
Privilgio
de Objeto

Tabela

ALTER

DELETE

View

Seqncia

EXECUTE
INDEX

INSERT

REFERENCES

SELECT

UPDATE

14-12

Procedimento

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Privilgios de Objeto
Um privilgio de objeto um privilgio ou direito de desempenhar uma determinada ao em uma
tabela, view, seqncia ou procedimento especfico. Cada objeto tem um conjunto determinado de
privilgios concedveis. A tabela no slide lista os privilgios de vrios objetos. Observe que apenas
os privilgios que se aplicam a uma seqncia so SELECT e ALTER. UPDATE, REFERENCES
e INSERT podem ser restringidos especificando-se um subconjunto das colunas atualizveis. Um
privilgio SELECT pode ser restringido criando uma view com um subconjunto de colunas e
concedendo o privilgio SELECT na view. Uma concesso em um sinnimo convertida para uma
concesso na tabela base referenciada pelo sinnimo.

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

Privilgios de Objeto
Os privilgios de objeto variam de objeto para
objeto.
Um proprietrio tem todos os privilgios
sobre o objeto.
Um proprietrio pode fornecer privilgios
especficos sobre o objeto de proprietrio.
GRANT
ON
TO
[WITH GRANT

14-13

object_priv [(colunas)]
objeto
{usurio|funo|PUBLIC}
OPTION];

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Concedendo Privilgios de Objeto


Privilgios de objeto diferentes esto disponveis para tipos diferentes de objetos de esquema. Um
usurio tem automaticamente todos os privilgios de objeto para objetos de esquema contidos no
esquema do usurio. Um usurio pode conceder qualquer privilgio de objeto sobre qualquer objeto
de esquema que o usurio possua para qualquer outro usurio ou funo. Se a concesso incluir a
instruo GRANT OPTION, o cedente pode reconceder o privilgio de objeto para outros usurios;
seno, o cedente pode usar o privilgio, mas no pode conced-lo a outros usurios.
Na sintaxe:
object_priv

um privilgio de objeto a ser concedido

ALL

especifica todos os privilgios de objeto.

colunas

especifica a coluna de uma tabela ou view sobre as quais os


privilgios so concedidos

ON objeto

o objeto sobre o qual os privilgios so concedidos

TO

identifica a quem o privilgio concedido

PUBLIC

concede privilgios de objeto a todos os usurios

WITH GRANT OPTION

permite que o cedente conceda privilgios de objeto a outros


usurios e funes

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

Concedendo Privilgios de Objeto


Concede privilgios de consulta na
tabela EMP.
SQL> GRANT
select
2 ON
emp
3 TO
sue, rich;
Grant succeeded.

Concede privilgios para atualizar colunas


especficas aos usurios e funes.
SQL> GRANT
update (dname, loc)
2 ON
dept
3 TO
scott, manager;
Grant succeeded.

14-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes

Para conceder privilgios sobre um objeto, ele deve estar no seu prprio esquema ou voc deve
ter recebido os privilgios de objeto WITH GRANT OPTION.

Um proprietrio de objeto pode conceder qualquer privilgio de objeto sobre o objeto para
qualquer outro usurio ou funo do banco de dados.

O proprietrio de um objeto adquire automaticamente todos os privilgios de objeto sobre aquele


objeto.

O primeiro exemplo no slide concede aos usurios Sue e Rich o privilgio de consultar a tabela EMP.
O segundo exemplo concede privilgios UPDATE sobre colunas especficas na tabela DEPT a Scott e
funo de gerente.
Se Sue ou Rich tiverem que selecionar dados da tabela emp, a sintaxe que eles tero de usar :
SQL> SELECT *
2 FROM scott.emp;

Outra alternativa criar um sinnimo para a tabela e selecionar no sinnimo.


SQL> CREATE SYNONYM emp FOR scott.emp
SQL> SELECT * FROM emp;
Observao: Os DBAs geralmente alocam privilgios de sistema e qualquer usurio que possua um
objeto pode conceder privilgios de objeto.

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

Usando palavras chave WITH


GRANT OPTION e PUBLIC
Dar autoridade a um usurio para passar
os privilgios.
SQL> GRANT
select, insert
2 ON
dept
3 TO
scott
4 WITH GRANT OPTION;
Grant succeeded.

Permitir que todos os usurios no sistema


consultem dados na tabela DEPT de Alice.
SQL> GRANT
select
2 ON
alice.dept
3 TO
PUBLIC;
Grant succeeded.
14-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Palavra-chave WITH GRANT OPTION


Um privilgio que concedido WITH GRANT OPTION pode ser passado para outros usurios e
funes pelo cedente. Os privilgios de objeto que foram concedidos WITH GRANT OPTION so
revogados quando o privilgio do concessor for revogado.
O exemplo no slide d ao usurio Scott acesso sua tabela DEPT com o privilgio de consultar a
tabela e adicionar linhas a ela. O exemplo tambm permite que Scott conceda esse privilgio a outros.
Palavra-chave PUBLIC
O proprietrio de uma tabela pode conceder acesso a todos os usurios usando a palavra-chave
PUBLIC.
O segundo exemplo permite que todos os usurios no sistema consultem dados na tabela DEPT de
Alice.

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

Confirmando Privilgios Concedidos


Tabela de Dicionrio de Dados

Descrio

ROLE_SYS_PRIVS

Privilgios de sistema concedidos


a funes

ROLE_TAB_PRIVS

Privilgios de tabela concedidos


a funes

USER_ROLE_PRIVS

Funes acessveis ao usurio

USER_TAB_PRIVS_MADE

Os privilgios de objeto concedidos


aos objetos do usurio

USER_TAB_PRIVS_RECD

Os privilgios de objeto concedidos


ao usurio

USER_COL_PRIVS_MADE

Os privilgios de objeto concedidos s


colunas dos objetos do usurio

USER_COL_PRIVS_RECD

Os privilgios de objeto concedidos ao


usurio em colunas especficas

14-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Confirmando Privilgios Concedidos


Se voc tentar executar uma operao no autorizada por exemplo, deletar uma linha de uma
tabela para a qual voc no tem o privilgio DELETE o Oracle Server no permitir que a
operao ocorra.
Se voc receber a mensagem de erro "tabela ou view no existe" ( "table or view does not exist" do
Oracle Server, voc poder ter:

Nomeado uma tabela ou view que no existe

Tentado executar uma operao em uma tabela ou view para a qual voc no tem o privilgio
apropriado

Voc pode acessar os dicionrios de dados para ver os privilgios que voc tem. A tabela no slide
descreve vrias tabelas de dicionrios de dados.

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

Como Revogar Privilgios de Objeto


Use a instruo REVOKE para revogar os
privilgios concedidos a outros usurios.
Os privilgios concedidos a outros
usurios por WITH GRANT OPTION
tambm sero revogados.
REVOKE {privilgio [, privilgio...]|ALL}
ON
objeto
FROM
{usurio[, usurio...]|funo|PUBLIC}
[CASCADE CONSTRAINTS];

14-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Revogando Privilgios de Objeto


A remoo de privilgios concedidos a outros usurios usando a instruo REVOKE. Quando voc
usa a instruo REVOKE, os privilgios que voc especificar so revogados dos usurios que voc
nomear e dos outros usurios para quem esses privilgios foram concedidos pela clusula WITH
GRANT OPTION.
Na sintaxe:
CASCADE

obrigatrio para remover quaisquer restries de integridade feitas ao

CONSTRAINTS

objeto por meio do privilgio REFERENCES

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

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

Revogando Privilgios de Objeto


Assim como a usuria Alice, revogue os
privilgios SELECT e INSERT fornecidos ao
usurio Scott na tabela DEPT.
SQL> REVOKE select, insert
2 ON
dept
3 FROM
scott;
Revoke succeeded.

14-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Revogando Privilgios de Objeto (continuao)


O exemplo no slide revoga os privilgios SELECT e INSERT concedidos ao usurio Scott na tabela
DEPT.
Observao: Se um usurio obtiver o privilgio WITH GRANT OPTION, ele tambm poder
conceder o privilgio WITH GRANT OPTION para que uma longa corrente de cedentes seja
possvel, mas no so permitidas concesses circulares. Se um proprietrio revogar um privilgio de
um usurio que concedeu o mesmo privilgio a outros usurios, a instruo REVOKE se aplicar
tambm aos outros usurios.
Por exemplo, se um usurio A concede o privilgio SELECT em uma tabela ao usurio B incluindo
WITH GRANT OPTION, o usurio B pode conceder ao usurio C o privilgio SELECT chamado
WITH GRANT OPTION e o usurio C pode conceder ao usurio D o privilgio SELECT. Se o
usurio A revoga o privilgio do usurio B, esse mesmo privilgio, concedido aos usurios C e D,
so revogados.

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

Sumrio
Instruo

Ao

CREATE USER

Permite que o DBA crie um usurio

GRANT

Permite que o usurio conceda a outros


usurios privilgios para acessar os objetos
do usurio

CREATE ROLE

Permite que o DBA crie um conjunto


de privilgios

ALTER USER

Permite que os usurios alterem as suas


senhas

REVOKE

Remove os privilgios sobre um objeto dos


usurios

14-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Os DBAs estabelecem segurana de banco de dados inicial para usurios atribuindo privilgios aos
outros usurios.

O DBA cria usurios que devem ter uma senha. O DBA tambm responsvel por estabelecer
os privilgios de sistema iniciais dos usurios.

Quando o usurio tiver criado um objeto, o usurio pode passar quaisquer privilgios de objeto
disponveis a outros usurios ou para todos os usurios usando a instruo GRANT.

Um DBA pode criar funes usando a instruo CREATE ROLE para passar um conjunto de
privilgios de sistema ou de objeto a vrios usurios. As funes tornam a concesso e a
revogao de privilgios mais fceis de manter.

Os usurios podem alterar sua senha usando a instruo ALTER USER.

Voc pode remover privilgios de usurios usando a instruo REVOKE.

As views do dicionrio de dados permitem que os usurios vejam os privilgios concedidos a


eles e aqueles que so concedidos sobre os seus objetos.

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

Viso Geral do Exerccio


Concedendo a outros usurios privilgios
sobre sua tabela
Modificando a tabela de um outro usurio
atravs de privilgios concedidos a voc
Criando um sinnimo
Consultando as views do dicionrio de
dados relacionados aos privilgios

14-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Junte-se a outros alunos para este exerccio de controle de acesso aos objetos de banco de dados.

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

Exerccio 14
1. Qual o privilgio que um usurio deve receber para estabelecer login no Oracle Server? um
privilgio de objeto ou sistema?
_____________________________________________________________________
2. Qual o privilgio que um usurio deve receber para criar tabelas?
_____________________________________________________________________
3. Se voc criar uma tabela, quem poder passar privilgios para outros usurios sobre sua tabela?
_____________________________________________________________________
4. Voc o DBA. Voc est criando muitos usurios que esto exigindo os mesmos privilgios de
sistema. O que voc faria para tornar seu trabalho mais fcil?
_____________________________________________________________________
5. Que comando voc usa para alterar sua senha?
_____________________________________________________________________
6. Conceda acesso tabela DEPT a outro usurio. Faa com que o usurio lhe conceda acesso de
consulta tabela DEPT dele(a).
7. Consulte todas as linhas na tabela DEPT.
DEPTNO
-----10
20
30
40

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

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

8. Adicione uma nova linha tabela DEPT. A equipe 1 deve adicionar Education como o
departamento nmero 50. A Equipe 2 deve adicionar o departamento Administration como o
departamento nmero 50. Torne as alteraes permanentes.
9. Crie um sinnimo para a tabela DEPT da outra equipe.

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

Exerccio 14 (continuao)
10. Consulte todas as linhas na tabela DEPT da outra equipe, usando o sinnimo.
Resultados da instruo SELECT para a Equipe 1.
DEPTNO
-----10
20
30
40
50

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

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

Resultados da instruo SELECT para a Equipe 2.


DEPTNO
-----10
20
30
40
50

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

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

11. Consulte o dicionrio de dados USER_TABLES para ver as informaes sobre as tabelas que
voc possui.
TABLE_NAME
---------------BONUS
CUSTOMER
DEPARTMENT
DEPT
DUMMY
EMP
EMPLOYEE
ITEM
MY_EMPLOYEE
ORD
PRICE
PRODUCT
SALGRADE
13 rows selected.

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

Exerccio 14 (continuao)
12. Consulte a view de dicionrio de dados ALL_TABLES para ver as informaes sobre todas as
tabelas que voc pode acessar. Exclua as suas prprias tabelas.
TABLE_NAME
---------DEPT

OWNER
----------<user2>

13. Revogue o privilgio SELECT da outra equipe.

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

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

15
SQL Workshop

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Workshop


Criando tabelas e seqncias
Modificando dados nas tabelas
Modificando uma definio de tabela
Criando uma view
Criando scripts que contenham comandos
SQL e SQL*Plus
Gerando um relatrio simples

15-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Workshop


Neste workshop voc estruturar um conjunto de tabelas de bancos de dados para uma aplicao de
vdeo. Ao criar as tabelas, voc inserir, atualizar e deletar registros em um banco de dados de
armazenamento de vdeo e gerar um relatrio. O banco de dados contm apenas as tabelas
essenciais.
Observao: Se voc quiser estruturar as tabelas, poder executar o script buildtab.sql no
SQL*Plus. Se voc quiser eliminar as tabelas, poder executar o script dropvid.sql no
SQL*Plus. Voc poder ento executar o script buildvid.sql no SQL*Plus para criar e povoar
a tabela. Se voc usar o script buildvid.sql para estruturar e povoar as tabelas, inicie com o
Exerccio 6b.

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

Exerccio 15
1. Crie as tabelas de acordo com as tabelas de exemplo a seguir. Escolha os tipos de dados
apropriados e certifique-se de adicionar restries de integridade.
a. Nome da tabela: MEMBER
Column_
Name

MEMBER_ LAST_
ID
NAME

Key
Type

PK

Null/
Unique

NN,U

FIRST_NAME

ADDRESS

CITY

PHONE

NN

JOIN_
DATE

NN
System
Date

Default
Value
Datatype

Number

VARCHAR2

VARCHAR2

VARCHAR2

VARCHAR2

VARCHAR2

Length

10

25

25

100

30

15

Date

b. Nome da tabela: TITLE


Column_
Name

TITLE_ID

Key
Type

PK

Null/
Unique

NN,U

TITLE

DESCRIPTION

NN

NN

RATING

CATEGORY

G, PG, R,
NC17, NR

Datatype

Number

VARCHAR2

VARCHAR2

VARCHAR2

DRAMA,
COMEDY,
ACTION,
CHILD,
SCIFI,
DOCUMEN
TARY
VARCHAR2

Length

10

60

400

20

Check

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

RELEASE_
DATE

Date

Exerccio 15 (continuao)
c. Nome da tabela: TITLE_COPY
Column
Name
Key
Type
Null/
Unique
Check

COPY_ID

TITLE_ID

PK

PK,FK

NN,U

NN,U

STATUS

NN
AVAILABLE,
DESTROYED,
RENTED,
RESERVED

TITLE

FK Ref
Table
FK Ref
Col
Datatype

Number

Number

VARCHAR2

Length

10

10

15

TITLE_ID

d. Nome da tabela: RENTAL


Column
Name

BOOK_
DATE

MEMBER_
ID

COPY_
ID

Key
Type
Default
Value
FK Ref
Table
FK Ref
Col
Datatype

PK

PK,FK1

PK,FK2

Length

ACT_RET_
DATE

TITLE_
ID
PK,FK2

System
Date

System Date
+ 2 days
MEMBER

Date

EXP_RET_
DATE

MEMBER_
ID
Number

TITLE_
COPY
COPY_
ID
Number

10

10

TITLE_
COPY
TITLE_ID
Date

Date

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

Number
10

Exerccio 15 (continuao)
e. Nome da tabela: RESERVATION
Column
Name

RES_
DATE

MEMBER_
ID

TITLE_
ID

Key
Type

PK

PK,FK1

PK,FK2

Null/
Unique

NN,U

NN,U

NN

FK Ref
Table

MEMBER

TITLE

FK Ref
Column

MEMBER_ID

TITLE_ID

Number

Number

10

10

Datatype
Length

Date

2. Verifique se as tabelas e as restries foram criadas adequadamente, verificando o dicionrio


de dados.
TABLE_NAME
----------MEMBER
RENTAL
RESERVATION
TITLE
TITLE_COPY

CONSTRAINT_NAME
-----------------------------MEMBER_LAST_NAME_NN
MEMBER_JOIN_DATE_NN
MEMBER_MEMBER_ID_PK
RENTAL_BOOK_DATE_COPY_TITLE_PK
RENTAL_MEMBER_ID_FK
RENTAL_COPY_ID_TITLE_ID_FK
RESERVATION_RESDATE_MEM_TIT_PK
RESERVATION_MEMBER_ID
RESERVATION_TITLE_ID
...
17 rows selected.

C
C
C
P
P
R
R
P
R
R

TABLE_NAME
-------------MEMBER
MEMBER
MEMBER
RENTAL
RENTAL
RENTAL
RESERVATION
RESERVATION
RESERVATION

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

Exerccio 15 (continuao)
3. Crie seqncias para identificar exclusivamente cada linha das tabelas MEMBER e TITLE.
a. Nmero de membro para tabela MEMBER: inicie com 101; no permita o armazenamento
em cache dos valores. Nomeie a seqncia member_id_seq.
b. Nmero de ttulo para a tabela TITLE: inicie com 92; no permita o armazenamento em
cache. Nomeie a seqncia title_id_seq.
c. Verifique a existncia das seqncias no dicionrio de dados.
SEQUENCE_NAME INCREMENT_BY LAST_NUMBER
-------------- ------------ ----------TITLE_ID_SEQ
1
92
MEMBER_ID_SEQ
1
101

4. Adicione dados s tabelas. Crie um script para cada conjunto de dados a adicionar.
a. Adicione ttulos de filmes tabela TITLE . Crie um script para fornecer as informaes
sobre os filmes. Salve o arquivo de script como p8q4.sql. Use as seqncias para
identificar exclusivamente cada ttulo. Informe as datas de lanamento no formato
DD-MON-YYYY. Lembre-se que as aspas simples devem ser tratadas com ateno em
um campo de caractere. Verifique as adies.
TITLE
-----------------------Willie and Christmas Too
Alien Again
The Glob
My Day Off
Miracles on Ice
Soda Gang
6 rows selected.

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

Exerccio 15 (continuao)
Title

Description

Rating

Category

Release_date

Willie and
Christmas
Too

All of Willies friends make


a Christmas list for Santa, but
Willie has yet to add his own
wish list.
Yet another installation of
science fiction history. Can
the heroine save the planet
from the alien life form?
A meteor crashes near a
small American town and
unleashes carnivorous goo in
this classic.
With a little luck and a lot of
ingenuity, a teenager skips
school for a day in New York
A six-year-old has doubts
about Santa Claus, but she
discovers that miracles really
do exist.
After discovering a cache of
drugs, a young couple find
themselves pitted against a
vicious gang.

CHILD

05-OCT-1995

SCIFI

19-MAY-1995

NR

SCIFI

12-AUG-1995

PG

COMEDY

12-JUL-1995

PG

DRAMA

12-SEP-1995

NR

ACTION

01-JUN-1995

Alien Again

The Glob

My Day Off

Miracles on
Ice

Soda Gang

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

Exerccio 15 (continuao)
b. Adicione dados tabela MEMBER. Crie um script nomeado p15q4b.sql para pedir
informaes aos usurios. Execute o script. Certifique-se de usar a seqncia para adicionar
o membro nmeros.
First_
Name
Carmen

Last_Name
Velasquez

LaDoris

Ngao

Midori

Nagayama

Mark

Address
283 King
Street
5 Modrany

City
Seattle

Phone
206-899-6666

Join_Date
08-MAR-1990

Bratislava

586-355-8882

08-MAR-1990

Sao Paolo

254-852-5764

17-JUN-1991

Lagos

63-559-7777

07-APR-1990

Audry

Quick-toSee
Ropeburn

68 Via
Centrale
6921 King
Way
86 Chu Street

41-559-87

18-JAN-1991

Molly

Urguhart

3035 Laurier

Hong
Kong
Quebec

418-542-9988

18-JAN-1991

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

Exerccio 15 (continuao)
c. Adicione as seguintes cpias de filmes tabela TITLE_COPY:
Observao: Obtenha os nmeros do title_id para este exerccio.
Title
Willie and Christmas Too
Alien Again
The Glob
My Day Off

Miracles on Ice
Soda Gang

Copy_Id
1
1
2
1
1
2
3
1
1

Status
AVAILABLE
AVAILABLE
RENTED
AVAILABLE
AVAILABLE
AVAILABLE
RENTED
AVAILABLE
AVAILABLE

d. Adicione os seguintes aluguis tabela RENTAL:


Observao: O nmero de ttulo pode ser diferente, dependendo no nmero de seqncia.
Title_
Id
92

Copy_
Id
1

Member_
Id
101

Book_date
3 days ago

Exp_Ret_Date
1 day ago

Act_Ret_Date
2 days ago

93
95
97

2
3
1

101
102
106

1 day ago
2 days ago
4 days ago

1 day from now


Today
2 days ago

2 days ago

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

Exerccio 15 (continuao)
5. Crie uma view nomeada TITLE_AVAIL para mostrar os ttulos dos filmes e a disponibilidade
de cada cpia e a data esperada de devoluo, caso esteja alugado. Consulte todas as linhas a
partir da view. Ordene os resultados por ttulo.
TITLE

COPY_ID STATUS

EXP_RET_D

------------------ ------- ---------- -----------Alien Again


Alien Again
Miracles on Ice
My Day Off
My Day Off
My Day Off
Soda Gang
The Glob
Willie and Christmas Too
9 rows selected.

1
2
1
1
2
3
1
1
1

AVAILABLE
RENTED
AVAILABLE
AVAILABLE
AVAILABLE
RENTED
AVAILABLE
AVAILABLE
AVAILABLE

05-NOV-97

06-NOV-97
04-NOV-97
05-NOV-97

6. Faa alteraes nos dados das tabelas.


a. Adicione um novo ttulo. O filme se chama "Interstellar Wars", que tem censura PG e
classificado como fico cientfica. O data de lanamento 07-JUL-77. A descrio filme
de ao "Futuristic interstellar action movie. Can the rebels save the humans from the evil
empire?" Certifique-se de adicionar um registro da cpia do ttulo para as duas cpias.
b. Informe duas reservas. Uma reserva para Carmen Velasquez, que deseja alugar
"Interstellar Wars". Outra para Mark Quick-to-See, que deseja alugar "Soda Gang".

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

Exerccio 15 (continuao)
c. A cliente Carmen Velasquez aluga a cpia 1 do filme "Interstellar Wars". Remova a sua
reserva do filme. Registre as informaes sobre o aluguel. Autorize o valor padro
da data de devoluo estimada a ser usado. Verifique se o aluguel foi registrado usando a
view que voc criou.
TITLE

COPY_ID STATUS

EXP_RET_D

----------------------- ------- --------- ---------------Alien Again


1 AVAILABLE
Alien Again
2 RENTED
05-NOV-97
Interstellar Wars
1 RENTED
08-NOV-97
Interstellar Wars
2 AVAILABLE
Miracles on Ice
1 AVAILABLE
My Day Off
1 AVAILABLE
My Day Off
2 AVAILABLE
My Day Off
3 RENTED
06-NOV-97
Soda Gang
1 AVAILABLE 04-NOV-97
The Glob
1 AVAILABLE
Willie and Christmas Too
1 AVAILABLE 05-NOV-97
11 rows selected.

7. Faa uma modificao em uma das tabelas.


a. Adicione uma coluna PRICE tabela TITLE para registrar o preo de compra o vdeo.
A coluna deve ter um comprimento total de oito registros e duas casas decimais. Verifique
as modificaes.
Name
-------------TITLE_ID
TITLE
DESCRIPTION
RATING
CATEGORY
RELEASE_DATE
PRICE

Null?
--------NOT NULL
NOT NULL
NOT NULL

Type
----NUMBER(10)
VARCHAR2(60)
VARCHAR2(400)
VARCHAR2(4)
VARCHAR2(20)
DATE
NUMBER(8,2)

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

Exerccio 15 (continuao)
b. Crie um script denominado p15q7b.sql para atualizar cada vdeo com o preo de
acordo com a lista a seguir.
Observao: Obtenha os title_id numbers para este exerccio.
Title
Willie and Christmas Too
Alien Again
The Glob
My Day Off
Miracles on Ice
Soda Gang
Interstellar Wars

Price
25
35
35
35
30
35
29

c. Certifique-se de que no futuro todos os ttulos contenham um preo. Verifique a restrio.


CONSTRAINT_NAME
-----------------TITLE_PRICE_NN

C SEARCH_CONDITION
-- ----------------C PRICE IS NOT NULL

8. Crie um relatrio intitulado Relatrio Histrico de Cliente. Esse relatrio conter o histrico
de aluguel de vdeos de cada cliente. Certifique-se de incluir o nome do cliente, o filme
alugado, as datas e a durao do aluguel. Nmero total de aluguis de todos os clientes no
perodo de criao do relatrio. Salve o script em um arquivo nomeado p15q8.sql.
MEMBER
TITLE
---------------- -----------------------Carmen Velasquez Willie and Christmas Too
Alien Again

BOOK_DATE DURATION
--------- -------03-NOV-97
1
09-AUG-98

Interstellar Wars

10-AUG-98

LaDoris Ngao

My Day Off

08-AUG-98

Molly Urguhart

Soda Gang

06-AUG-98

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

16
Declarando Variveis

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Listar os benefcios do cdigo PL/SQL
Reconhecer o bloco PL/SQL bsico e suas
sees
Descrever o significado das variveis no
cdigo PL/SQL
Declarar Variveis PL/SQL
Executar o bloco PL/SQL

16-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Esta lio apresenta as regras e estruturas bsicas para criao e execuo dos blocos de cdigos
PL/SQL. Ela tambm mostra como declarar variveis e atribuir tipos de dados a elas.

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

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

16-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sobre PL/SQL
A linguagem 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. A linguagem PL/SQL oferece recursos de engenharia de software modernos, como, por
exemplo, a encapsulao de dados, o tratamento de excees, a ocultao de informaes e a
orientao a objeto, etc., trazendo os recursos de programao mais modernos para o Oracle Server
e o Toolset.
A linguagem PL/SQL incorpora muitos recursos avanados criados em linguagens de programao
projetadas durante as dcadas de 70 e 80. Alm de aceitar a manipulao de dados, ele tambm
permite que as instrues de consulta da linguagem SQL sejam includas em unidades procedurais
de cdigo e estruturadas em blocos, tornando a linguagem SQL uma linguagem avanada de
processamento de transaes. Com a linguagem PL/SQL, voc pode usar as instrues SQL para
refinar os dados do Oracle e as instrues de controle PL/SQL para processar os dados.

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

Benefcios da Linguagem PL/SQL


Integrao

Aplicao

Biblioteca
compartilhada
16-4

Oracle Server

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Integrao
A linguagem PL/SQL desempenha um papel central tanto para o Oracle Server (atravs de
procedimentos armazenados, funes armazenadas, gatilhos de banco de dados e pacotes) quanto
para as ferramentas de desenvolvimento Oracle (atravs de gatilhos de componente do Oracle
Developer).
As aplicaes do Oracle Developer fazem uso das bibliotecas compartilhadas que armazenam cdigo
(procedimentos e funes) e que podem ser acessadas local ou remotamente. O Oracle Developer
consiste no Oracle Forms, Oracle Reports e Oracle Graphics.
Os tipos de dados SQL tambm podem ser usados no cdigo PL/SQL. Combinados com o acesso
direto que a linguagem SQL fornece, esses tipos de dados compartilhados integram a linguagem
PL/SQL com o dicionrio de dados do Oracle Server. A linguagem PL/SQL une o acesso
conveniente tecnologia de banco de dados com a necessidade de capacidade de programao
procedural.
PL/SQL nas Ferramentas Oracle
Vrias ferramentas Oracle, inclusive o Oracle Developer, tm o seu prprio mecanismo PL/SQL, o
qual independente do mecanismo presente no Oracle Server.
O mecanismo filtra as instrues SQL e as envia individualmente ao executor da instruo SQL no
Oracle Server. Ele processa as instrues procedurais restantes no executor da instruo procedural,
que est no mecanismo PL/SQL.
O executor da instruo procedural processa os dados que so locais para a aplicao (que j esto
no ambiente do cliente, em vez de estarem no banco de dados). Isso reduz o trabalho enviado ao
Oracle Server e o nmero de cursores de memria necessrios.
Introduo ao Oracle: SQL e PL/SQL 16-4

Benefcios da Linguagem PL/SQL


Melhorar desempenho
SQL

Aplicao

SQL

Outros
DBMSs

SQL
SQL

Aplicao

16-5

SQL
IF...THEN
SQL
ELSE
SQL
END IF;
SQL

Oracle com
PL/SQL

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Desempenho Melhorado
A linguagem PL/SQL pode melhorar o desempenho de uma aplicao. Os benefcios diferem
dependendo do ambiente de execuo.

A linguagem PL/SQL pode ser usado para agrupar as instrues SQL em um nico bloco e
enviar esse bloco inteiro para o servidor em uma nica chamada, reduzindo assim o trfego da
rede. Sem o cdigo PL/SQL, as instrues SQL seriam enviadas ao Oracle Server uma de
cada vez. Cada instruo SQL resulta em uma outra chamada do Oracle Server e uma maior
sobrecarga de desempenho. Em um ambiente de rede, a sobrecarga pode se tornar
significativa. Como ilustra o slide, se sua aplicao for SQL intensiva, voc pode usar os
subprogramas e blocos PL/SQL para agrupar as instrues SQL antes de envi-las ao Oracle
Server para execuo.

A linguagem PL/SQL tambm pode cooperar com as ferramentas de desenvolvimento de


aplicao do Oracle Server como, por exemplo, Oracle Developer Forms e Reports. Ao
adicionar recursos de processamento procedural a essas ferramentas, a linguagem PL/SQL
aumenta o desempenho.

Observao: Os procedimentos e as funes declaradas como parte de uma aplicao do Developer


so distintos daqueles armazenados no banco de dados, embora as suas estruturas gerais sejam as
mesmas. Os subprogramas armazenados so objetos de banco de dados e esto armazenados no
dicionrio de dados. Eles podem ser acessados por qualquer nmero de aplicaes, incluindo as
aplicaes do Developer.

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

Estrutura de Bloco PL/SQL


DECLARE Opcional
Variveis, cursores, excees definidas
pelo usurio

BEGIN Obrigatrio
Instrues SQL
Instrues PL/SQL
EXCEPTION Opcional
Aes a serem desempenhadas quando
ocorrem erros

END; Obrigatrio

DECLARE
BEGIN
EXCEPTION
END;

16-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Estrutura de Bloco PL/SQL


A linguagem PL/SQL uma linguagem estruturada em blocos, o que significa que os programas
podem ser divididos em blocos lgicos. Um bloco PL/SQL consiste em at trs sees: declarativa
(opcional), executvel (necessria) e tratamento de exceo (opcional). Apenas as palavras-chave
BEGIN e END so necessrias. Voc poder declarar variveis localmente para o bloco que as usa.
As condies de erro (conhecidas como excees) podem ser tratadas especificamente no bloco aos
quais elas se aplicam. Voc poder armazenar e alterar os valores em um bloco PL/SQL declarando
e referenciando variveis e outros identificadores.
A tabela a seguir descreve as trs sees de bloco:
Seo

Descrio

Incluso

Declarativa

Contm todas as variveis, constantes, cursores e


excees definidas pelo usurio que so referenciadas
nas sees executvel e declarativa

Opcional

Executvel

Contm instrues SQL para manipular dados no


banco de dados e instrues PL/SQL para manipular
dados no bloco

Obrigatria

Tratamento de
exceo

Especifica as aes a desempenhar quando erros e


condies anormais surgem na seo executvel

Opcional

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

Estrutura de Bloco PL/SQL


DECLARE
v_variable VARCHAR2(5);
BEGIN
SELECT
column_name
INTO
v_variable
FROM
table_name;
EXCEPTION
WHEN exception_name THEN
...
END;

DECLARE
BEGIN
EXCEPTION
END;

16-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Executando Instrues e Blocos PL/SQL a partir do Cdigo SQL*Plus

Coloque um ponto-e-vrgula (;) no final de uma instruo SQL ou instruo de controle


PL/SQL.

Use uma barra (/) para executar o bloco annimo PL/SQL no buffer de SQL*Plus. Quando o
bloco for executado corretamente, sem erros que no possam ser tratados, a sada de
mensagem dever ser a seguinte:
PL/SQL procedure successfully completed
(Procedimento PL/SQL concludo corretamente)

Coloque um ponto (.) para fechar um buffer de SQL*Plus. Um bloco PL/SQL tratado como
uma instruo contnua no buffer e os ponto-e-vrgulas no bloco no fecham ou executam o
buffer.

Observao: Em PL/SQL, um erro chamado de exceo.


As palavras-chave de seo DECLARE, BEGIN e EXCEPTION no so seguidas por ponto-evrgulas. Entretanto, END e todas as outras instrues PL/SQL necessitam de um ponto-e-vrgula
para terminar a instruo. Voc poder criar uma string de instrues na mesma linha, mas esse
mtodo no recomendado pela clareza ou edio.

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

Tipos de Bloco
Annimo

Procedimento

Funo

[DECLARE]

PROCEDURE name
IS

BEGIN
--statements

BEGIN
--statements

[EXCEPTION]

[EXCEPTION]

FUNCTION name
RETURN datatype
IS
BEGIN
--statements
RETURN value;
[EXCEPTION]

END;

END;

END;

16-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tipos de Bloco
Toda unidade PL/SQL compreende um ou mais blocos. Esses blocos podem ser inteiramente separados
ou aninhados um dentro do outro. As unidades bsicas (procedimentos e funes, tambm conhecidas
como subprogramas e blocos annimos) que compem um programa PL/SQL so blocos lgicos, os
quais podem conter qualquer nmero de sub-blocos aninhados. Por isso, um bloco pode representar
uma pequena parte de um outro bloco, o qual, por sua vez pode ser parte da unidade de cdigo inteira.
Dos dois tipos de construes PL/SQL disponveis, blocos annimos e subprogramas, apenas os blocos
annimos so abordados neste curso.
Blocos Annimos
Os blocos annimos so blocos sem nome. Eles so declarados em um ponto do aplicativo onde eles
devem ser executados e so passados para o mecanismo PL/SQL para serem executados em tempo de
execuo. Voc poder incorporar um bloco annimo em um programa pr-compilador e em SQL*Plus
ou Server Manager. Os gatilhos nos componentes do Oracle Developer consistem nesses blocos.
Subprogramas
Os subprogramas so blocos PL/SQL nomeados que podem assumir parmetros e podem ser
chamados. Voc pode declar-los como procedimentos ou como funes. Geralmente, voc deve usar
um procedimento para desempenhar uma ao e uma funo para calcular um valor.
Voc poder armazenar subprogramas no servidor ou no nvel de aplicao. Ao usar os componentes
do Oracle Developer (Forms, Relatrios e Grficos), voc poder declarar os procedimentos e funes
como parte da aplicao (um form ou relatrio) e cham-los a partir de outros procedimentos, funes e
gatilhos (veja a prxima pgina) na mesma aplicao sempre que necessrio.
Observao: Uma funo similar a um procedimento, exceto que uma funo deve retornar um valor.
Os procedimentos e funes so abordados no prximo curso sobre PL/SQL.
Introduo ao Oracle: SQL e PL/SQL 16-8

Construes de Programa
Bloco
annimo

DECLARE

Gatilho
de aplicao

BEGIN

Procedimento/
funo
armazenado(a)

Procedimento/
funo
de aplicao

EXCEPTION
Gatilho de
banco de
dados

16-9

END;

Procedimento/
funo
em pacote

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Construes de Programa
A tabela a seguir descreve em linhas gerais uma variedade de construes de programa PL/SQL que
usam o bloco PL/SQL bsico. Eles esto disponveis de acordo com o ambiente no qual eles so
executados.
Construo de
Programa

Descrio

Disponibilidade

Bloco annimo

O bloco PL/SQL no nomeado incorporado


em uma aplicao ou emitido interativamente

Todos os ambientes PL/SQL

Funo ou
procedimento
armazenado

O bloco PL/SQL nomeado armazenado no


Oracle Server que pode aceitar parmetros e
pode ser chamado repetidamente pelo nome

Oracle Server

Funo ou
procedimento de
aplicao

O bloco PL/SQL nomeado armazenado na


aplicao Oracle Developer ou na biblioteca
compartilhada que pode aceitar parmetros e
pode ser chamado repetidamente pelo nome

Componentes do Oracle
Developer por exemplo,
Forms

Pacote

Mdulo PL/SQL nomeado que agrupa


procedimentos, funes e identificadores
relacionados

Componentes do Oracle Server e


Oracle Developer por
exemplo, Forms

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

Construes de Programa
Anonymous
Bloco
annimo
block
DECLARE

Application
Gatilho
detrigger
aplicao

BEGIN
EXCEPTION

Gatilho de
Database
banco de
trigger

END;

dados

16-10

Stored
Procedimento/
funo
procedure/
armazenado(a)
function
Application
Procedimento/
funo
procedure/
de
aplicao
function

Packaged
Procedimento/
funo
procedure/
em
pacote
function

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Construes de Programa (continuao)


Construo de
Programa

Descrio

Disponibilidade

Gatilho de banco
de dados

O bloco PL/SQL que associado com uma


tabela de banco de dados e que acionado
automaticamente quando disparado pela
instruo DML

Oracle Server

Gatilho de
aplicao

O bloco PL/SQL que associado com uma


evento de aplicao e que acionado
automaticamente

Componentes do Oracle
Developer por exemplo,
Forms

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

Uso de Variveis
Usar variveis para:
Armazenamento temporrio de dados
Manipulao de valores armazenados
Reutilizao
Facilidade de manuteno

16-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Uso de Variveis
Com o cdigo PL/SQL, voc poder declarar variveis e depois us-las em instrues procedurais e
SQL onde uma expresso possa ser usada.

Armazenamento temporrio de dados


Os dados podem ser armazenados temporariamente em uma ou mais variveis para uso quando
na validao da entrada de dados para processamento posterior no processo de fluxo de dados.

Manipulao de valores armazenados


As variveis podem ser usadas para clculo e manipulao de outros dados sem acessar o banco
de dados.

Reutilizao
Quando declaradas, as variveis podem ser usadas repetidamente em uma aplicao
simplesmente referenciando-as em outras instrues, incluindo outras instrues declarativas.

De fcil manuteno
Ao usar %TYPE e %ROWTYPE (mais informaes sobre %ROWTYPE so abordadas em
uma lio subseqente), voc declara variveis, baseando as declaraes nas definies das
colunas de banco de dados. As variveis PL/SQL ou variveis de cursor anteriormente
declaradas no escopo atual podero usar tambm os atributos %TYPE e %ROWTYPE como
especificadores de tipos de dados. Se uma definio subjacente for alterada, a declarao de
varivel se altera de acordo durante a execuo. Isso permite a independncia dos dados, reduz
custos de manuteno e permite que os programas se adaptem, conforme o banco de dados for
alterado, para atender s novas necessidades comerciais.
Introduo ao Oracle: SQL e PL/SQL 16-11

Tratando Variveis em PL/SQL


Declarar e inicializar as variveis na seo
de declarao.
Atribuir novos valores s variveis na
seo executvel.
Passar valores aos blocos PL/SQL atravs
de parmetros.
Ver os resultados pelas variveis de sada.

16-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tratando Variveis em PL/SQL


Declarar e inicializar as variveis na seo de declarao.
Voc poder declarar variveis na parte declarativa de qualquer subprograma, pacote ou bloco
PL/SQL. As declaraes alocam espao de armazenamento para um valor, especificam seus
tipos de dados e nomeiam a localizao de armazenamento para que voc possa referencilos. As declaraes podero tambm atribuir um valor inicial e impor a restrio NOT NULL.
Atribuir novos valores s variveis na seo executvel.
O valor existente da varivel substitudo pelo novo.
No so permitidas referncias posteriores. Voc deve declarar um varivel antes de
referenci-la em outras instrues, incluindo outras instrues declarativas.

Passar valores aos subprogramas PL/SQL atravs de parmetros.


H trs modos de parmetros, IN (o default), OUT e IN OUT. Voc deve usar o parmetro IN
para passar valores aos subprogramas que esto sendo chamados. Voc deve usar o parmetro
OUT para retornar valores ao chamador de um subprograma. E voc deve usar o parmetro IN
OUT para passar valores iniciais ao subprograma que est sendo chamado e para retornar
valores ao chamador. Os parmetros dos subprogramas IN e OUT so abordados em outro
curso.
Ver os resultados em um bloco PL/SQL atravs de variveis de sada.
Voc poder usar variveis de referncias para a entrada ou sada em instrues de
manipulao de dados SQL.

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

Tipos de Variveis
Variveis PL/SQL:
Escalar
Composta
Referncia
LOB (objetos grandes)

Variveis No-PL/SQL: Variveis de


ligao e de host

16-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Todas as variveis PL/SQL tm um tipo de dados, o qual especifica um formato de armazenamento,


restries e uma faixa vlida de valores. A linguagem PL/SQL suporta quatro categorias de tipos de
dados escalar, composta, referencial e LOB (objeto grande) que voc pode usar para declarar
variveis, constantes e indicadores.

Os tipos de dados escalares armazenam um nico valor. Os principais tipos de dados so


aqueles que correspondem aos tipos de coluna nas tabelas do Oracle Server; a linguagem
PL/SQL tambm suporta variveis booleanas.

Os tipos de dados compostos como, por exemplo, os registros, permitem que os grupos de
campos sejam definidos e manipulados nos blocos PL/SQL. Os tipos de dados compostos so
mencionados apenas brevemente neste curso.

Os tipos de dados referenciais armazenam valores, chamados de indicadores, que designam


outros itens de programa. Os tipos de dados referenciais no so abordados neste curso.

Os tipos de dados LOB armazenam valores, chamados de endereos, que especificam a


localizao de objetos grandes (imagens grficas, por exemplo) que so armazenadas fora de
linha. Os tipos de dados LOB so abordados apenas brevemente neste curso.

As variveis no-PL/SQL incluem variveis da linguagem de host declaradas em programas do prcompilador, campos de tela nas aplicaes Forms e variveis de host SQL*Plus.
Para obter mais informaes sobre os LOBs, consulte o PL/SQL Users Guide and Reference,
Release 8, "Fundamentals".

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

Tipos de Variveis
Variveis PL/SQL:
Escalar
Composta
Referncia
LOB (objetos grandes)

Variveis No-PL/SQL: Variveis de


ligao e de host

16-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Usando Variveis SQL*Plus nos Blocos PL/SQL


O cdigo PL/SQL no tem capacidade de entrada/sada prpria. Voc dever contar com o
ambiente no qual o cdigo PL/SQL estiver sendo executado para passar valores para e de um bloco
PL/SQL.
No ambiente SQL*Plus, as variveis de substituio SQL*Plus permitem que partes da sintaxe de
comando sejam armazenadas e depois editadas no comando antes de execut-lo. As variveis de
substituio so variveis que voc pode usar para passar valores de tempo de execuo, nmeros
ou caracteres, a um bloco PL/SQL. Voc poder referenci-las em um bloco PL/SQL com um "e"
comercial precedendo-as do mesmo modo que voc referencia as variveis de substituio
SQL*Plus em uma instruo SQL. Os valores do texto so substitudos no bloco PL/SQL antes que
esse bloco seja executado. Por isso, voc no poder substituir os valores diferentes para as
variveis de substituio usando um loop. Apenas um valor substituir os valores de substituio.
As variveis de host (ou "ligao") SQL*Plus podem ser usadas para passar valores de tempo de
execuo do bloco PL/SQL de volta para o ambiente SQL*Plus. Voc poder referenci-las em um
bloco PL/SQL com dois-pontos precedendo-as. As variveis de ligao so discutidas em mais
detalhes mais adiante nesta lio.

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

Tipos de Variveis

25-OCT-99

TRUE
"Four score and seven years ago
our fathers brought forth upon
this continent, a new nation,
conceived in LIBERTY, and dedicated

256120.08

to the proposition that all men


are created equal."

Atlanta
16-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tipos de Variveis
O slide ilustra os seguintes tipos de dados de varivel:

TRUE representa um valor booleano.

25-OCT-99 representa uma varivel DATE (data).

A fotografia representa uma varivel BLOB.

O texto de um discurso representa uma varivel LONG RAW.

256120.08 representam um tipo de dados NUMBER com preciso e escala.

O filme representa uma varivel BFILE.

O nome da cidade representa uma varivel VARCHAR2.

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

Declarando Variveis PL/SQL


Sintaxe
identificador [CONSTANT] tipo de dados [NOT NULL]
[:= | DEFAULT expr];

Exemplos
Declare
v_hiredate
v_deptno
v_location
c_comm

16-16

DATE;
NUMBER(2) NOT NULL := 10;
VARCHAR2(13) := 'Atlanta';
CONSTANT NUMBER := 1400;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Declarando Variveis PL/SQL


Voc precisa declarar todos os identificadores PL/SQL na seo de declarao antes de referenci-los
no bloco PL/SQL. Voc tem a opo de atribuir um valor inicial. Voc no precisa atribuir um valor
a uma varivel para declar-la. Se voc referenciar outras variveis em uma declarao, voc dever
estar certo de declar-las separadamente em uma instruo anterior.
Na sintaxe:
identificador

o nome da varivel

CONSTANT

restringe as variveis para que o seu valor no possa ser alterado; as


constantes devem ser inicializadas

tipo de dados

so tipos de dados escalares, compostos, referenciais ou LOB (Esse curso


aborda apenas os tipos de dados escalares e compostos.)

NOT NULL

restringe a varivel para que ela contenha um valor (variveis NOT NULL
devem ser inicializadas.)

expr

uma expresso PL/SQL que pode ser uma literal, uma outra varivel ou
uma expresso que envolve operadores e funes

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

Declarando Variveis PL/SQL


Diretrizes
Seguir as convenes de nomeao.
Inicializar as variveis designadas como
NOT NULL e CONSTANT.
Inicializar os identificadores usando o
operador de atribuio (:=) ou a palavra
reservada DEFAULT.
Declarar no mximo um identificador por
linha.
16-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes
A expresso atribuda pode ser uma literal, uma outra varivel ou uma expresso que envolve
operadores e funes.

Nomeie o identificador de acordo com as mesmas regras usadas por objetos SQL.

Voc poder usar convenes de nomeao por exemplo, v_name para representar uma
varivel e c_name e representar uma varivel constante.

Inicialize a varivel em uma expresso com o operador de atribuio (:=) ou, equivalentemente,
com a palavra reservada DEFAULT. Se voc no atribuir um valor inicial, a nova varivel
conter NULL por default at que voc o atribua mais tarde.

Se voc usar a restrio NOT NULL, voc deve atribuir um valor.

A declarao de apenas um identificador por linha torna o cdigo mais fcil de ler e de manter.

Em declaraes constantes, a palavra-chave CONSTANT deve preceder o especificador de


tipo. A declarao a seguir nomeia a constante NUMBER, subtipo REAL e atribui o valor de
50000 constante. Uma constante deve ser inicializada em sua declarao; seno, voc obter
uma mensagem de erro de compilao quando a declarao for elaborada (compilada).
v_sal

CONSTANT REAL := 50000.00;

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

Regras para Nomeao


Duas variveis podem ter o mesmo nome,
contanto que elas estejam em blocos
diferentes.
O nome da varivel (identificador) no deve
ser igual ao nome das colunas de
e
o d res

tabela usado no bloco.


ven
ado o
con

tific empn
v_

n
a
DECLARE
um ra Ide lo,
e
t
empno NUMBER(4);
a
o
Ad o p exemp
BEGIN
ea por
m
SELECT
empno
o
:
n
QL
INTO
empno
S
/
PL
FROM
emp
WHERE
ename = 'SMITH';
END;

16-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Regras para Nomeao


Dois objetos podem ter o mesmo nome, contanto que eles sejam definidos em diferentes blocos.
Onde eles coexistirem, apenas o objeto declarado no bloco atual pode ser usado.
Voc no deve escolher o nome (identificador) para uma varivel igual ao nome das colunas de
tabela usado no bloco. Se as variveis PL/SQL ocorrerem nas instrues SQL e tiverem o mesmo
nome que uma coluna, o Oracle Server supe que seja a coluna que esteja sendo referenciada.
Embora o cdigo de exemplo no slide funcione, o cdigo criado usando o mesmo nome para uma
tabela de banco de dados e para uma varivel no fcil de ler ou manter.
Considere a adoo de uma conveno de nomeao de vrios objetos como o seguinte exemplo. O
uso de v_ as como um prefixo que representa uma varivel e g_ representando uma varivel global
impede conflitos de nomeao com os objetos do banco de dados.
DECLARE
v_hiredate
g_deptno
BEGIN
...

date;
number(2) NOT NULL := 10;

Observao: Os identificadores no devem ter mais de 30 caracteres. O primeiro caracter deve ser
uma letra; os restantes podem ser letras, nmeros ou smbolos especiais.

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

Atribuindo Valores s Variveis


Sintaxe
identificador := expr;

Exemplos
Determine uma data de admisso predefinida
para novos empregados.
v_hiredate := '31-DEC-98';

Defina o nome do funcionrio para Maduro.


v_ename := 'Maduro';

16-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Atribuindo Valores s Variveis


Para atribuir ou reatribuir um valor a uma varivel, crie uma instruo de atribuio PL/SQL. Voc
deve nomear explicitamente a varivel para receber o novo valor esquerda do operador de atribuio
(:=).
Na sintaxe:
identificador
o nome da varivel escalar
expr
pode ser uma chamada varivel, literal ou funcional, mas no uma coluna
de banco de dados
Os exemplos de atribuio de valor da varivel so definidos com se segue:
Defina o identificador v_hiredate para um valor de 31-DEC-98.
Armazene o nome "Maduro" no identificador v_ename.
Uma outra maneira de atribuir valores s variveis selecionar ou trazer valores de banco de dados
para dentro delas. O exemplo a seguir calcula um bnus de 10% ao seleciona o salrio do funcionrio:
SQL> SELECT
2 INTO
3 FROM
4 WHERE

sal * 0.10
v_bonus
emp
empno = 7369;

Depois voc poder usar a varivel v_bonus em um outro computador ou inserir seu valor em uma
tabela de banco de dados.
Observao: Para atribuir um valor em uma varivel do banco de dados, use uma instruo SELECT
ou FETCH.
Introduo ao Oracle: SQL e PL/SQL 16-19

Palavras-chave e Inicializao
de Variveis
Usando:
Operador de atribuio (:=)
Palavra-chave DEFAULT
Restrio NOT NULL

16-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

As variveis so inicializadas toda vez que um bloco ou subprograma for informado. Por default, as
variveis so inicializadas em NULL. A no ser que voc expressamente inicialize uma varivel, os
seus valores so indefinidos.

Use o operador de atribuio (:=) para as variveis que no tm valor tpico.


v_hiredate := '15-SEP-1999'

Observao: Essa atribuio possvel apenas em Oracle8i. As verses anteriores podem requerer
o uso da funo TO_DATE.
Como o formato de data default definido no Oracle Server pode diferir de banco de dados para
banco de dados, voc poder querer atribuir valores de data de uma maneira genrica, como no
exemplo anterior.

DEFAULT: Voc poder usar a palavra-chave DEFAULT em vez do operador de atribuio


para inicializar as variveis. Use DEFAULT para as variveis que tm um valor tpico.
g_mgr

NUMBER(4) DEFAULT 7839;

NOT NULL: Imponha a restrio NOT NULL quando a varivel tiver que conter um valor.
Voc no poder atribuir valores nulos a uma varivel definida como NOT NULL. A restrio
NOT NULL deve ser seguida por uma clusula de inicializao.
v_location

VARCHAR2(13) NOT NULL := 'CHICAGO';

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

(continuao)
Observao: As literais de string devem ser includas entre aspas simples por exemplo, 'Hello,
world'. Se houver uma aspa simples na string, crie uma aspa simples duas vezes por exemplo, para
inserir um valor FISHERMANS DRIVE, a string seria 'FISHERMAN'S DRIVE'.

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

Tipos de Dados Escalares


Armazenar um valor nico
No ter componentes internos

25-OCT-99
"Four score and seven years
ago our fathers brought

TRUE

forth upon this continent, a


new nation, conceived in

256120.08

LIBERTY, and dedicated to


the proposition that all men
are created equal."

16-22

Atlanta

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tipos de Dados Escalares


Um tipo de dados escalares armazena um valor nico e no possui componentes internos. Os tipos de
dados escalares podem ser classificados em quatro categorias: nmero, caractere, data e booleano. Os
tipos de dados de caractere e nmero possuem subtipos que associam um tipo bsico a uma restrio.
Por exemplo, INTEGER e POSITIVE so subtipos do tipo bsico NUMBER.
Para obter mais informaes e completar a lista de tipos de dados escalares, consulte o PL/SQL
Users Guide and Reference, Release 8, "Fundamentals".

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

Tipos de Dados Escalares Bsicos


VARCHAR2 (maximum_length)
NUMBER [(preciso, escala)]
DATE
CHAR [(maximum_length)]
LONG
LONG RAW
BOOLEAN
BINARY_INTEGER
PLS_INTEGER
16-23

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tipos de Dados Escalares Bsicos


Tipo de Dados

Descrio

VARCHAR2
(maximum_length)

Tipo bsico para dados de caractere de tamanho varivel com at 32.767


bytes. No h tamanho default para as constantes e variveis VARCHAR2.

NUMBER
[(preciso, escala)]

Tipo bsico para nmeros fixos e de ponto flutuante.

DATE

Tipo bsico para datas e horas. Valores DATE incluem a hora do dia em
segundos desde a meia-noite. A faixa para datas entre 4712 A.C. e
9999 D.C.

CHAR
[(maximum_length)]

Tipo bsico para dados de caractere de tamanho fixo at 32.767 bytes. Se


voc no especificar um comprimento_mx, o tamanho default ser definido
como 1.

LONG

Tipo bsico para dados de caracter de tamanho varivel at 32.760 bytes.


A largura mxima de uma coluna de banco de dados LONG de
2.147.483.647 bytes.

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

Tipos de Dados Escalares Bsicos


VARCHAR2 (maximum_length)
NUMBER [(preciso, escala)]
DATE
CHAR [(maximum_length)]
LONG
LONG RAW
BOOLEAN
BINARY_INTEGER
PLS_INTEGER
16-24

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tipos de Dados Escalares Bsicos (continuao)


Tipo de Dados

Descrio

LONG RAW

Tipo bsico para dados binrios e strings de byte de at 32.760 bytes. Dados
LONG RAW so no interpretados pelo cdigo PL/SQL.

BOOLEAN

Tipo bsico que armazena um de trs possveis valores usados para clculos
lgicos: TRUE, FALSE ou NULL.

BINARY_INTEGER

Tipo bsico para inteiros entre -2.147.483.647 e 2.147.483.647.

PLS_INTEGER

Tipo bsico para inteiros designados entre -2.147.483.647 e 2.147.483.647.


Os valores PLS_INTEGER requerem menos armazenamento e so mais
rpidos que os valores NUMBER e BINARY_INTEGER.

Observao: O tipo de dados LONG similar ao VARCHAR2, exceto que pelo fato de que o
comprimento mximo de um valor LONG de 32.760 bytes. Por isso, valores maiores que 32.760
bytes no podero ser selecionados de uma coluna de banco de dados LONG para uma varivel
LONG PL/SQL.

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

Declarando Variveis Escalares


Exemplos
v_job
v_count
v_total_sal
v_orderdate
c_tax_rate
v_valid

16-25

VARCHAR2(9);
BINARY_INTEGER := 0;
NUMBER(9,2) := 0;
DATE := SYSDATE + 7;
CONSTANT NUMBER(3,2) := 8.25;
BOOLEAN NOT NULL := TRUE;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Declarando Variveis Escalares


Os exemplos de declarao de varivel mostrados no slide so definidos como se segue:

v_job: Varivel declarada para armazenar o cargo de um funcionrio.

v_count: Varivel declarada para contar as iteraes de um loop e inicializar a varivel em 0.

v_total_sal: Varivel declarada para acumular o salrio total de um departamento e inicializar a


varivel em 0.

v_orderdate: Varivel declarada para armazenar a data de entrega de uma ordem de compra e
inicializar a varivel em uma semana a partir do dia de hoje.

c_tax_rate: Constante declarada para a taxa de imposto, que nunca se altera no bloco PL/SQL.

v_valid: Indicador declarado para indicar se os dados so vlidos ou invlidos e inicializar a


varivel como TRUE.

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

O Atributo %TYPE
Declarar uma varivel de acordo com:
Uma definio de coluna de banco de

dados
Uma outra varivel anteriormente

declarada
Prefixo %TYPE com:
A coluna e tabela do banco de dados
O nome da varivel anteriormente

declarada
16-26

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

O Atributo %TYPE
Ao declarar variveis PL/SQL para armazenar os valores de coluna, voc dever garantir que a
varivel seja de preciso e tipo de dados corretos. Caso contrrio, uma mensagem de erro PL/SQL
ocorrer durante a execuo.
Em vez de embutir no cdigo o tipo de dados e a preciso de uma varivel, voc poder usar o
atributo %TYPE para declarar uma varivel de acordo com uma outra coluna de banco de dados ou
varivel declarada anteriormente. O atributo %TYPE usado com mais freqncia quando o valor
armazenado na varivel for derivado de uma tabela no banco de dados ou se ocorre alguma gravao
na varivel. Para usar o atributo no lugar do tipo de dados necessrio na declarao da varivel, crie
um prefixo para ele com o nome da coluna e da tabela de banco de dados. Se estiver referenciando
uma varivel declarada anteriormente, crie um prefixo para o nome da varivel relativa ao atributo.
O cdigo PL/SQL determina o tipo de dados e o tamanho da varivel quando o bloco for compilado,
de modo que ele seja sempre compatvel com a coluna usada para preenche-lo. Isso definitivamente
uma vantagem para criar e manter o cdigo, porque no h necessidade de se preocupar com
alteraes no tipo de dados da coluna feitos no nvel de banco de dados. Voc poder tambm
declarar uma varivel de acordo com uma outra declarada anteriormente pela prefixao do nome da
varivel relativa ao atributo.

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

Declarando Variveis com o


Atributo %TYPE
Exemplos
...
v_ename
v_balance
v_min_balance
...

16-27

emp.ename%TYPE;
NUMBER(7,2);
v_balance%TYPE := 10;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Declarando Variveis com o Atributo %TYPE


Declare as variveis para armazenar o nome de um funcionrio.
...
v_ename
...

emp.ename%TYPE;

Declare as variveis para armazenar o saldo de uma conta corrente bancria, assim como um saldo
mnimo, que inicie em 10.
...
v_balance
v_min_balance
...

NUMBER(7,2);
v_balance%TYPE := 10;

Uma restrio da coluna NOT NULL no se aplica a variveis declaradas usando %TYPE. Por isso,
se voc declarar uma varivel que estiver usando o atributo %TYPE usando uma coluna de banco de
dados definida como NOT NULL, voc poder atribuir um valor NULL varivel.

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

Declarando Variveis Booleanas


Apenas os valores TRUE, FALSE e NULL
podem ser atribudos a uma varivel
booleana.
As variveis so conectadas pelos
operadores lgicos AND, OR e NOT.
As variveis sempre produzem TRUE,
FALSE ou NULL.
Expresses aritmticas, de caracteres e de
dados podem ser usadas para retornar
uma valor booleano.
16-28

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Declarando Variveis Booleanas


Com o cdigo PL/SQL voc poder comparar variveis em instrues SQL e procedurais. Essas
comparaes, chamadas expresses booleanas, consistem em expresses simples ou complexas
separadas por operadores relacionais. Em uma instruo SQL, voc poder usar expresses booleanas
para especificar as linhas em uma tabela que so afetadas por uma instruo. Em instrues
procedurais, as expresses booleanas so a base para o controle condicional.
NULL significa um valor ausente, inaplicvel ou desconhecido.
Exemplos
v_sal1 := 50000;
v_sal2 := 60000;
A expresso a seguir produz TRUE:
v_sal1 < v_sal2

Declare e inicialize uma varivel booleana:


v_comm_sal BOOLEAN := (v_sal1 < v_sal2);

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

Estrutura de Registro PL/SQL


TRUE

23-DEC-98

Estrutura de tabela PL/SQL

1
2
3
4

SMITH
JONES
NANCY
TIM

ATLANTA

Estrutura de tabela PL/SQL

1
2
3
4

5000
2345
12
3456

VARCHAR2
BINARY_INTEGER
16-29

NUMBER
BINARY_INTEGER

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tipos de Dados Compostos


Os tipos de dados compostos (tambm conhecidos como conjuntos) so TABLE, RECORD,
NESTED TABLE e VARRAY. Utilize o tipo de dados RECORD para manipular os dados
relacionados, porm diferentes, como uma unidade lgica. Utilize o tipo de dados TABLE para fazer
referncia e manipular conjuntos de dados como um objeto inteiro. Os dois tipos de dados RECORD
e TABLE so cobertos em detalhe em uma lio subseqente. Os tipos de dados NESTED TABLE e
VARRAY no so abordados neste curso.
Para obter mais informaes, consulte o PL/SQL Users Guide and Reference, Release 8,
"Collections and Records".

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

Variveis de Tipo de Dados LOB


Manual
(CLOB)
Foto
(BLOB)
Filme
(BFILE)

NCLOB

16-30

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Variveis de Tipo de Dados LOB


Com o tipo de dados LOB (large object, objeto grande) do Oracle8, voc poder armazenar blocos
de dados no estruturados (como, por exemplo, texto, imagens grficas, videoclipes e formatos de
arquivo para armazenar sons) de at 4 gigabytes em tamanho. Os tipos de dados LOB fornecem
acesso eficiente, aleatrio e em intervalos aos dados, podendo ser atributos de um tipo de objeto.
Os LOBs tambm suportam acesso aleatrio a dados.

O tipo de dados CLOB (character large object, objeto grande de caractere) usado para
armazenar blocos grandes de dados com caracteres de um nico byte no banco de dados.

O tipo de dados BLOB (binary large object, objeto grande binrio) usado para armazenar
objeto binrios grandes no banco de dados em linha (dentro de uma linha de tabela) ou fora de
linha (fora da linha de tabela).

O tipo de dados BFILE (binary file, arquivo binrio) usado para armazenar objetos grandes
binrios em arquivos do sistema operacional fora do banco de dados.

O tipo de dados NCLOB (objeto grande de caractere do idioma nacional) usado para
armazenar blocos grandes de dados NCHAR de byte nico ou de bytes mltiplos de largura
fixa no banco de dados, dentro e fora de linha.

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

Variveis de Ligao

Varivel
de ligao S/O
Servidor

16-31

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Variveis de Ligao
Uma varivel de ligao uma varivel que voc declara em um ambiente de host e usa para passar
valores de tempo de execuo, nmero ou caractere, para ou de um ou mais programas PL/SQL, os
quais podem us-la como usariam qualquer outra varivel. Voc poder referenciar variveis
declaradas em ambientes de host ou chamada em instrues PL/SQL, a no ser que a instruo esteja
em um procedimento, funo ou pacote. Isso inclui as variveis de linguagem declaradas em
programas do pr-compilador, campos de tela em aplicaes de Form do Oracle Developer e as
variveis de ligao SQL*Plus.
Criando Variveis de Ligao
Para declarar uma varivel de ligao no ambiente SQL*Plus, voc deve usar o comando
VARIABLE. Por exemplo, voc poder declarar uma varivel de tipo NUMBER e VARCHAR2
como se segue:
VARIABLE return_code NUMBER
VARIABLE return_msg VARCHAR2(30)

Tanto o cdigo SQL quanto o SQL*Plus podero referenciar a varivel de ligao, e o cdigo
SQL*Plus poder exibir seus valores.

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

Exibindo Variveis de Ligao


Para exibir o valor atual das variveis de ligao no ambiente SQL*Plus, voc dever usar o
comando PRINT. Entretanto, PRINT no poder ser usado em um bloco PL/SQL como um comando
SQL*Plus. O exemplo a seguir ilustra um comando PRINT:
SQL> VARIABLE g_n NUMBER
...
SQL> PRINT g_n

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

Referenciando Variveis
No-PL/SQL
Armazenar o salrio anual em uma varivel
de host SQL*Plus.
:g_monthly_sal := v_sal / 12;

Referenciar variveis no-PL/SQL como


variveis de host.
Criar um prefixo para as referncias com
dois-pontos (:).

16-33

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Atribuindo Valores s Variveis


Para referenciar variveis de host, voc deve criar prefixos para as referncias com dois-pontos (:)
para distingui-las das variveis PL/SQL.
Exemplo
Esse exemplo calcula o salrio mensal, de acordo com o salrio anual fornecido pelo usurio. Esse
script contm tanto os comandos SQL*Plus quanto um bloco PL/SQL completo.
VARIABLE
ACCEPT

g_monthly_sal NUMBER
p_annual_sal PROMPT 'Please enter the annual salary: '

DECLARE
v_sal
NUMBER(9,2) := &p_annual_sal;
BEGIN
:g_monthly_sal := v_sal/12;
END;
/
PRINT

g_monthly_sal

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

DBMS_OUTPUT.PUT_LINE

Um procedimento de pacote fornecido pela


Oracle
Uma alternativa para exibir dados a partir
de um bloco PL/SQL
Dever ser ativado em SQL*Plus com
SET SERVEROUTPUT ON

16-34

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Uma outra Opo


Voc viu que pode declarar uma varivel de host, referenci-la em um bloco PL/SQL e exibir o
contedo dela em SQL*Plus usando o comando PRINT. Uma outra opo para exibir as informaes de
um bloco PL/SQL DBMS_OUTPUT.PUT_LINE. O procedimento DBMS_OUTPUT um pacote
fornecido pela Oracle e o PUT_LINE um procedimento no pacote.
Em um bloco PL/SQL, referencie o procedimento DBMS_OUTPUT.PUT_LINE e, entre parnteses, as
informaes que voc deseja imprimir na tela. O pacote deve primeiro ser ativado na sesso SQL*Plus.
Para fazer isso, execute comando SET SERVEROUTPUT ON do cdigo SQL*Plus.
Exemplo
Esse script calcula o salrio mensal e imprime-as na tela, usando o procedimento
DBMS_OUTPUT.PUT_LINE.
SET SERVEROUTPUT ON
ACCEPT p_annual_sal PROMPT 'Please enter the annual salary: '
DECLARE
v_sal NUMBER(9,2) := &p_annual_sal;
BEGIN
v_sal := v_sal/12;
DBMS_OUTPUT.PUT_LINE ('The monthly salary is ' || TO_CHAR(v_sal));
END;
/
Introduo ao Oracle: SQL e PL/SQL 16-34

Sumrio
Os blocos PL/SQL so compostos
pelas seguintes sees:
Declarativa (opcional)
Executvel (necessria)
Tratamento de exceo

(opcional)

DECLARE
BEGIN
EXCEPTION
END;

Um bloco PL/SQL pode ser um


procedimento, funo ou bloco
annimo.
16-35

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Um bloco PL/SQL a unidade bsica e sem nome de um programa PL/SQL. Ele consiste em um
conjunto de instrues SQL ou PL/SQL e desempenha uma funo lgica nica. A parte declarativa
a primeira parte de um bloco PL/SQL e usada para declarar objetos como, por exemplo, variveis,
constantes, cursores e definies de situaes de erro chamadas de excees. A parte executvel a
parte obrigatria de um bloco PL/SQL e contm instrues SQL e PL/SQL para consultar e
manipular dados. A parte de tratamento de exceo est embutida na parte executvel de um bloco e
colocada no final da parte executvel.
Um bloco PL/SQL annimo a unidade bsica, sem nome de um programa PL/SQL. Os
procedimentos e funes podem ser compilados separadamente e armazenadas permanentemente em
um banco de dados Oracle, prontos para serem executados.

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

Sumrio
Identificadores PL/SQL:
So definidos na seo declarativa
Podem ser tipo de dados escalares,

compostos, referenciais ou LOB


Podem ser baseados em estruturas de

uma outra varivel ou objeto de banco


de dados
Podem ser inicializados

16-36

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio (continuao)
Todos os tipos de dados PL/SQL so escalares, compostos, referenciais ou LOB. Os tipos de dados
escalares no tm quaisquer componentes neles, enquanto que os tipos de dados sim. As variveis
PL/SQL so declaradas e inicializadas na seo declarativa.

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

Viso Geral do Exerccio

Determinando a validade das declaraes


Desenvolvendo um bloco PL/SQL simples

16-37

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Esse exerccio enfatiza os fundamentos do cdigo PL/SQL aprendidos nesta lio, incluindo tipos de
dados, definies legais de identificadores validao de expresses. Voc deve colocar todos esses
elementos juntos para criar um bloco PL/SQL simples.
Questes Impressas
As questes 1 e 2 so questes impressas.

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

Exerccio 16
1. Avalie cada uma das declaraes a seguir. Determine quais delas no so legais e explique
por qu.
a.

DECLARE
v_id

b.

NUMBER(4);

DECLARE
v_x, v_y, v_z

c.

DECLARE
v_birthdate

d.

VARCHAR2(10);

DATE NOT NULL;

DECLARE
v_in_stock

BOOLEAN := 1;

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

Exerccio 16 (continuao)
2. Em cada uma das seguintes atribuies, determine o tipo de dados da expresso resultante.
a.

v_days_to_go := v_due_date - SYSDATE;

b.

v_sender := USER || ': ' || TO_CHAR(v_dept_no);

c.

v_sum := $100,000 + $250,000;

d.

v_flag := TRUE;

e.

v_n1 := v_n2 > (2 * v_n3);

f.

v_value := NULL;

3. Crie um bloco annimo para a sada da frase "My PL/SQL Block Works" na tela.
G_MESSAGE
----------------------My PL/SQL Block Works

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

Exerccio 16 (continuao)
Se voc tiver tempo, complete o exerccio abaixo:
4. Crie um bloco que declare duas variveis. Atribua o valor dessas variveis PL/SQL
s variveis de host SQL*Plus e imprima os resultados das variveis PL/SQL na tela. Execute
o bloco PL/SQL. Salve o bloco PL/SQL no arquivo p16q4.sql.
V_CHAR Character (variable length)
V_NUM Number

Atribua valores a essas variveis do seguinte modo:


Variable Value
-------- ------------------------------------V_CHAR
V_NUM

The literal '42 is the answer'


The first two characters from V_CHAR

G_CHAR
--------------------42 is the answer
G_NUM
--------42

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

17
Criando Instrues
Executveis

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Reconhecer a importncia da seo
executvel
Criar instrues na seo executvel
Criar regras de blocos aninhados
Executar e testar um bloco PL/SQL
Usar convenes de codificao

17-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender como criar cdigos executveis no bloco PL/SQL. Voc tambm
aprender as regras de aninhamento dos blocos PL/SQL de cdigo, assim como executar e testar seu
cdigo PL/SQL.

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

Diretrizes e Sintaxe
de Bloco PL/SQL
As instrues podem continuar por vrias
linhas.
As unidades lexicais podem ser separadas
por:
Espaos
Delimitadores
Identificadores
Literais
Comentrios
17-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes e Sintaxe de Bloco PL/SQL


Como o PL/SQL uma extenso do SQL, as regras gerais de sintaxe que se aplicam ao SQL, tambm se
aplicam linguagem PL/SQL.
As unidades lexicais (por exemplo, identificadores e literais) podero ser separadas por um ou mais
espaos ou outros delimitadores que no podem ser confundidos como parte da unidade lexical.
Voc no poder embutir espaos em unidades lexicais, exceto para literais de string e comentrios.
As instrues podem ser divididas pelas linhas, mas palavras-chave no.
Delimitadores
Os Delimitadores so smbolos simples ou compostos que tm significado especial para o PL/SQL.
Smbolos Simples
Smbolos Compostos
Smbolo

Significado

Smbolo

Significado

Operador de adio

<>

Operador relacional

Operador de subtrao/negao

!=

Operador relacional

Operador de multiplicao

||

Operador de concatenao

Operador de diviso

--

Operador relacional

/*

Indicador de comentrio de uma


nica linha
Delimitador de comentrio inicial

Indicador de acesso remoto

*/

Delimitador de comentrio final

Finalizador de instruo

:=

Operador de atribuio

Para obter mais informaes, consulte PL/SQL Users Guide and Reference, Release 8, "Fundamentals".
Introduo ao Oracle: SQL e PL/SQL 17-3

Diretrizes e Sintaxe
de Bloco PL/SQL
Identificadores
Podem conter at 30 caracteres
No podem conter palavras reservadas, a
no ser que estejam entre aspas duplas
Devem ser iniciados por um caractere
alfabtico
No devem ter o mesmo nome de uma
coluna de tabela de banco de dados

17-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Identificadores
Os Identificadores so usados para nomear itens e unidades do programa PL/SQL, os quais podem
incluir constantes, variveis, excees, cursores, variveis de cursores, subprogramas e pacotes.

Os identificadores podem conter at 30 caracteres, mas eles devero ser iniciados por um
caractere alfabtico.

No escolha o mesmo nome para os identificadores e para as colunas na tabela usada no bloco.
Se os identificadores PL/SQL estiverem nas mesmas instrues SQL e tiverem o mesmo nome
de uma coluna, o Oracle supe que ele a coluna que est sendo referenciada.

As palavras reservadas no podero ser usadas como identificadores, a no ser que elas estejam
entre aspas duplas (por exemplo, "SELECT").

As palavras reservadas devero ser criadas em letra maiscula para facilitar a leitura.

Para obter uma lista completa de palavras reservadas, consulte o PL/SQL Users Guide and
Reference, Release 8, "Appendix F".

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

Diretrizes e Sintaxe
de Bloco PL/SQL
Literais
Caracteres e literais de data devem estar

entre aspas simples.


v_ename := 'Henderson';

Os nmeros podero ser valores

simples ou notaes cientficas.


Um bloco PL/SQL finalizado por uma
barra ( / ) em uma linha sozinha.

17-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Literais

Uma literal um valor booleano, um valor numrico explcito, um caractere ou uma string no
representados por um identificador.

As literais de caracteres incluem todos os caracteres imprimveis no conjunto de


caracteres do PL/SQL: letras, numerais, espaos e smbolos especiais.

As literais numricas podero ser representadas por um valor simples (por exemplo,
32.5) ou por uma notao cientfica (por exemplo, 2E5, significando 2* (10 potncia
de 5) = 200000).

Um bloco PL/SQL finalizado por uma barra ( / ) em uma linha sozinha.

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

Comentando Cdigo
Crie prefixos de dois hifens (--) para
comentrios de uma nica linha.
Coloque os comentrios de vrias linhas
entre os smbolos /* e */.
Exemplo
...
v_sal NUMBER (9,2);
BEGIN
/* Compute the annual salary based on the
monthly salary input from the user */
v_sal := &p_monthly_sal * 12;
END;
-- This is the end of the block

17-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Comentando Cdigo
Comente cdigos para documentar cada fase e para auxiliar na depurao. Comente o cdigo
PL/SQL com dois hifens (--) se o comentrio estiver em uma nica linha ou coloque o comentrio
entre os smbolos /* e */ se o comentrio englobar vrias linhas. Os comentrios so estritamente
informativos e no impem nenhuma condio ou comportamento nos dados ou na lgica
comportamental. Os comentrios bem colocados so extremamente valiosos para a boa leitura do
cdigo e para a futura manuteno dele.
Exemplo
No exemplo no slide, a linha entre /* e */ o comentrio que explica o cdigo que a segue.

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

Funes SQL em PL/SQL


Disponvel nas instrues procedurais:
Nmero de uma nica linha
As mesmas
Caractere de uma nica linha
do SQL
Converso de tipo de dados
Data
No disponvel nas instrues procedurais:
DECODE
Funes de grupo

17-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes SQL em PL/SQL


A maioria das funes disponveis no SQL tambm so vlidas nas expresses PL/SQL:

Funes de nmeros em uma nica linha

Funes de caractere em uma nica linha

Funes de converso de tipo de dados

Funes de data

GREATEST, LEAST

Funes diversas

As funes a seguir no esto disponveis nas instrues procedurais:

DECODE

Funes de grupo: AVG, MIN, MAX, COUNT, SUM, STDDEV e VARIANCE. As funes de
grupo se aplicam a grupos de linhas em uma tabela e por isso esto disponveis apenas em
instrues SQL em um bloco PL/SQL

Exemplo
Compute o total de todos os nmeros armazenados na tabela NUMBER_TABLE do PL/SQL. Esse
exemplo produz um erro de compilao.
v_total
:= SUM(number_table);

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

Funes PL/SQL
Exemplos
Elaborar a lista de correspondncia de uma
empresa.
v_mailing_address := v_name||CHR(10)||
v_address||CHR(10)||v_state||
CHR(10)||v_zip;

Converter o nome do funcionrio para letra


minscula.
v_ename

17-8

:= LOWER(v_ename);

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes PL/SQL
O PL/SQL fornece muitas funes teis que ajudam a manipular dados. Essas funes embutidas
caem na categoria a seguir:

Relatrio de erro

Nmero

Caractere

Converso

Data

Diversos

Os exemplos de funo no slide so definidos como se segue:

Elaborar a lista de correspondncia de uma empresa.

Converter o nome para letra minscula.

CHR a funo SQL que converte um cdigo ASCII em seu caracter correspondente; 10 o cdigo
para uma alimentao de linha.
Para obter mais informaes, consulte PL/SQL Users Guide and Reference, Release 8,
"Fundamentals".

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

Converso de Tipo de Dados


Converter dados em tipos de dados
comparveis.
Os tipos de dados mistos podero resultar
em um erro e afetar o desempenho.
Funes de
converso:
TO_CHAR
TO_DATE
TO_NUMBER

DECLARE
v_date VARCHAR2(15);
BEGIN
SELECT TO_CHAR(hiredate,
INTO
FROM
WHERE
END;

'MON. DD, YYYY')


v_date
emp
empno = 7839;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

17-9

Converso de Tipo de Dados


O PL/SQL tenta converter os tipos de dados dinamicamente se estiverem misturados em uma
instruo. Por exemplo, se voc atribuir um valor NUMBER a uma varivel CHAR, o PL/SQL
traduzir dinamicamente o nmero em uma representao de caracteres para que ele possa ser
armazenado na varivel CHAR. A situao inversa tambm se aplica, contanto que a expresso do
caractere represente um valor numrico.
Desde que eles sejam compatveis, voc tambm poder atribuir caracteres s variveis DATE e
vice-versa.
Em uma expresso, voc deve certificar-se que os tipos de dados sejam os mesmos. Se ocorrerem
tipos de dados mistos em uma expresso, voc deve usar a funo de converso apropriada para
converter os dados.
Sintaxe
TO_CHAR (valor, fmt)
TO_DATE (valor, fmt)
TO_NUMBER (valor, fmt)

onde:

valor

uma string de caractere, nmero ou data

fmt

o modelo de formato usado para converter o valor

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

Converso de Tipo de Dados


Essa instruo produz um erro de
compilao, se a varivel v_date for
declarada como tipo de dados DATE.
v_date := 'January 13, 1998';

Para corrigir o erro, use a funo de


converso TO_DATE.
v_date := TO_DATE ('January 13, 1998',
'Month DD, YYYY');

17-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Converso de Tipo de Dados


Os exemplos de converso no slide so definidos como se seguem:

Armazenar uma string de caractere representando uma data em uma varivel declarada de tipo
de dados DATE. Esse cdigo causa um erro de sintaxe.

Para corrigi-lo, converta a string em uma data com a funo de converso TO_DATE.

O PL/SQL tenta a converso, se possvel, mas o xito depende das operaes que esto sendo
executadas. A execuo explcita de converses de tipo de dados um bom exerccio de
programao, porque elas podem afetar de maneira favorvel o desempenho e continuarem vlidas
mesmo com uma alterao nas verses de software.

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

Blocos Aninhados
e Escopo de Varivel
As instrues podem ser aninhadas onde
quer que uma instruo executvel seja
permitida.
Um bloco aninhado torna-se uma
instruo.
Uma seo de exceo pode conter blocos
aninhados.
O escopo de um objeto a regio do
programa que pode referir-se ao objeto.
17-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Blocos Aninhados
Uma das vantagens que o PL/SQL tem sobre o cdigo a habilidade de aninhar instrues. Voc
poder aninhar blocos onde quer que uma instruo executvel seja permitida, transformando o bloco
aninhado em uma instruo. Por isso, voc poder dividir a parte executvel de um bloco em blocos
menores. A seo de exceo poder tambm conter blocos aninhados.
Escopo da Varivel
O escopo de um objeto a regio do programa que pode referir-se ao objeto. Voc poder referenciar
a varivel declarada na seo executvel.

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

Blocos Aninhados
e Escopo de Varivel
Um identificador visvel nas regies nas
quais voc poder referenciar o identificador
no qualificado:
Um bloco poder procurar pelo bloco
delimitador acima.
Um bloco no poder procurar pelo bloco
delimitado abaixo.

17-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Identificadores
Um identificador visvel no bloco no qual ele declarado em todos os procedimentos, funes e
sub-blocos aninhados. Se o bloco no localizar o identificador declarado localmente, ele procura
acima pela seo declarativa dos blocos delimitadores (ou pais). O bloco nunca procura abaixo pelos
blocos delimitados (ou filhos) ou transversalmente por blocos irmos.
O escopo se aplica a todos os objetos declarados, incluindo variveis, cursores, excees definidas
pelo usurio e constantes.
Observao: Qualifique um identificador usando o prefixo do label do bloco.
Para obter mais informaes sobre os rtulos do bloco, consulte o PL/SQL Users Guide and
Reference, Release 8, "Fundamentals".

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

Blocos Aninhados
e Escopo de Varivel
Exemplo
...
x BINARY_INTEGER;
BEGIN
...
DECLARE
y NUMBER;
BEGIN
...
END;
...
END;
17-13

Escopo de x

Escopo de y

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Blocos Aninhados e Escopo de Varivel


No bloco aninhado mostrado no slide, a varivel nomeada de y poder referenciar a varivel nomeada
de x. A varivel x, entretanto, no poder referenciar a varivel y. Se a varivel nomeada de y no
bloco aninhado tiver o mesmo nome que a varivel nomeada de x no bloco exterior, o seu valor
vlido apenas pela durao do bloco aninhado.
Escopo
O escopo de um identificador aquela regio de uma unidade de programa (bloco, subprograma ou
pacote) no qual voc pode referenciar o identificador.
Visibilidade
Um identificador visvel apenas nas regies a partir das quais voc pode referenciar o identificador
usando um nome no qualificado.

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

Operadores em PL/SQL
Lgico
Aritmtico
Concatenao
Parnteses para
controlar a ordem
das operaes

Os mesmos
do SQL

Operador exponencial (**)

17-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Ordem das Operaes


As operaes na expresso so executadas em uma determinada ordem, dependendo de suas
precedncias (prioridade). A tabela a seguir mostra a ordem padro das operaes de cima a baixo:
Operador

Operao

**, NOT

Exponenciao, negao, lgica

+, -

Identidade, negao

*, /

Multiplicao, diviso

+, -, ||

Adio, subtrao, concatenao

=, !=, <, >, <=, >=, IS NULL, LIKE,


BETWEEN, IN

Comparao

AND

Conjuno

OR

Incluso

Observao: No necessrio usar parnteses com as expresses booleanas, mas isso facilita a
leitura do texto.
Para obter mais informaes sobre os operadores, consulte PL/SQL Users Guide and Reference,
Release 8, "Fundamentals".

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

Operadores em PL/SQL
Exemplos
Incrementar o contador para um loop.
v_count

:= v_count + 1;

Definir o valor de um sinalizador booleano.


v_equal

:= (v_n1 = v_n2);

Validar o nmero de um funcionrio se ele


contiver um valor.
v_valid

17-15

:= (v_empno IS NOT NULL);

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Operadores em PL/SQL
Ao trabalhar com nulos, evite alguns erros bastante comuns mantendo em mente as seguintes regras:

As comparaes que envolvem nulos sempre produzem NULL.

A aplicao do operador lgico NOT em um nulo produz NULL.

Em instrues de controle condicionais, se a condio produzir NULL, sua seqncia associada


de instrues no ser executada.

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

Usando Variveis de Ligao


Para referenciar uma varivel de ligao no
PL/SQL, voc dever criar um prefixo antes
do nome usando dois-pontos (:).
Exemplo
VARIABLE
DECLARE
v_sal
BEGIN
SELECT
INTO
FROM
WHERE
:g_salary
END;
/
17-16

g_salary NUMBER
emp.sal%TYPE;
sal
v_sal
emp
empno = 7369;
:= v_sal;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Imprimindo Variveis de Ligao


No SQL*Plus, voc poder exibir o valor da varivel de ligao usando o comando PRINT.
SQL>

PRINT g_salary

G_SALARY
-------800

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

Diretrizes de Programao
Facilite a manuteno do cdigo:
Documentando o cdigo com comentrios
Desenvolvendo uma conveno de
maisculas e minsculas para o cdigo
Desenvolvendo convenes de nomeao
para os identificadores e outros objetos
Melhorando a leitura por endentao

17-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes de Programao
Siga essas diretrizes de programao para produzir cdigos claros e reduzir a manuteno ao
desenvolver um bloco PL/SQL.
Convenes de Cdigos
A tabela a seguir fornece as diretrizes para a criao de cdigos em letra maiscula ou letra
minscula para ajud-lo a distinguir as palavras-chave de objetos nomeados.
Categoria

Conveno de
Maiscula/Minscula

Exemplos

Instrues SQL

Letra maiscula

SELECT, INSERT

Palavras-chave PL/SQL

Letra maiscula

DECLARE, BEGIN, IF

Tipos de dados

Letra maiscula

VARCHAR2, BOOLEAN

Identificadores e parmetros

Letra minscula

v_sal, emp_cursor, g_sal, p_empno

Tabelas e colunas de banco


de dados

Letra minscula

emp, orderdate, deptno

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

Convenes para
Nomeao de Cdigo
Evitar ambigidade:
Os nomes de variveis locais e parmetros
formais tm precedncia sobre os nomes
das tabelas de banco de dados.
Os nomes de colunas tm precedncia
sobre os nomes das variveis locais.

17-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Convenes para Nomeao de Cdigo


A tabela a seguir mostra um conjunto de prefixos e sufixos para distinguir um identificador de outro
identificadores, de um banco de dados e de outros objetos nomeados.
Identificador

Conveno de Nomeao

Exemplo

Varivel

v_name

v_sal

Constante

c_name

c_company_name

Cursor

name_cursor

emp_cursor

Exceo

e_name

e_too_many

Tipo de tabela

name_table_type

amount_table_type

Tabela

name_table

order_total_table

Tipo de registro

name_record_type

emp_record_type

Registro

name_record

customer_record

Varivel de substituio
SQL*Plus (tambm referida
como parametro de substituio)

p_name

p_sal

Varivel global SQL*Plus


(tambm referida como host ou
varivel de ligao)

g_name

g_year_sal

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

Endentando o Cdigo
Para maior clareza, endente cada nvel de cdigo.
Exemplo
BEGIN
IF x=0 THEN
y:=1;
END IF;
END;

17-19

DECLARE
v_deptno
NUMBER(2);
v_location
VARCHAR2(13);
BEGIN
SELECT deptno,
loc
INTO
v_deptno,
v_location
FROM
dept
WHERE
dname = 'SALES';
...
END;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Endentando o Cdigo
Para maior clareza e para melhor leitura, endente cada nvel de cdigo. Para mostrar a estrutura, voc
poder dividir as linhas usando o retorno de carro e endentar as linhas usando espaos e tabs.
Compare as instrues IF a seguir para obter maior facilidade de leitura:
IF x>y THEN v_max:=x;ELSE v_max:=y;END IF;

IF x > y THEN
v_max := x;
ELSE
v_max := y;
END IF;

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

Determinando o
Escopo da Varivel
Exerccio de Classe
...
DECLARE
V_SAL
V_COMM
V_MESSAGE
BEGIN ...

NUMBER(7,2) := 60000;
NUMBER(7,2) := V_SAL * .20;
VARCHAR2(255) := ' eligible for commission';

DECLARE
V_SAL
NUMBER(7,2) := 50000;
V_COMM
NUMBER(7,2) := 0;
V_TOTAL_COMP
NUMBER(7,2) := V_SAL + V_COMM;
BEGIN ...
V_MESSAGE := 'CLERK not'||V_MESSAGE;
END;
V_MESSAGE := 'SALESMAN'||V_MESSAGE;
END;
17-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exerccio de Classe
Avaliar o bloco PL/SQL no slide. Determinar cada um dos valores a seguir de acordo com as regras
de escopos:
1. O valor de V_MESSAGE no sub-bloco.
2. O valor de V_TOTAL_COMP no bloco principal.
3. O valor de V_COMM no sub-bloco.
4. O valor de V_COMM no bloco principal.
5. O valor de V_MESSAGE no bloco principal.

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

Sumrio
Estrutura de bloco PL/SQL: Regras de
aninhamento de blocos e criao de escopos
Programao em PL/SQL:
Funes
Converso de tipo de dados
Operadores

DECLARE
BEGIN

Variveis de ligao
Convenes e diretrizes

17-21

EXCEPTION
END;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Um bloco poder ter qualquer nmero de blocos aninhados definidos na parte executvel. Os
blocos definidos em um bloco so chamados de sub-blocos. Voc poder aninhar blocos apenas
em partes executveis de um bloco.
O PL/SQL fornece muitas funes teis que ajudam a manipular dados. As funes de converso
convertem um valor de um tipo de dados para outro. O PL/SQL fornece muitas funes teis que
ajudam a manipular dados. 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 o de entrada. O segundo tipo de dados o de sada.
Os operadores de comparao comparam uma expresso com outra. O resultado sempre
verdadeiro falso ou nulo. Tipicamente, voc deve usar operadores de comparao em instrues
de controle condicional e na clusula WHERE das instrues de manipulao de dados SQL.
Os operadores relacionais permitem que voc compare expresses complexas arbitrariamente.
As variveis declaradas no SQL*Plus so chamadas de variveis de ligao. Para referenciar essas
variveis em programas PL/SQL, elas devem ser precedidas por dois-pontos.

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

Viso Geral do Exerccio

Revisando as regras e aninhamento e


de criao de escopos
Desenvolvendo e testando os blocos
PL/SQL

17-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Este exerccio consolida os fundamentos sobre o PL/SQL apresentados na lio, incluindo as regras
para aninhar os blocos PL/SQL do cdigo e modo de executar e testar o seu cdigo PL/SQL.
Questes Impressas
As questes 1 e 2 so questes impressas.

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

Exerccio 17
Bloco PL/SQL
DECLARE
v_weight NUMBER(3) := 600;
v_message

VARCHAR2(255) := 'Product 10012';

BEGIN
/* SUB-BLOCK */
DECLARE
v_weight

NUMBER(3) := 1;

v_message

VARCHAR2(255) := 'Produto 11001';

v_new_locn

VARCHAR2(50) := 'Europa';

BEGIN
v_weight := v_weight + 1;
v_new_locn := 'Ocidental ' || v_new_locn;
END;
v_weight := v_weight + 1;
v_message := v_message || ' is in stock';
v_new_locn

:= 'Western ' || v_new_locn;

END;

1. Avalie o bloco PL/SQL acima e determine o tipo de dados e o valor de cada uma das variveis a seguir
de acordo com as regras de criao de escopos.
a. O valor de V_WEIGHT no sub-bloco :
b. O valor de V_NEW_LOCN no sub-bloco :
c. O valor de V_WEIGHT no bloco principal :
d. O valor de V_MESSAGE no bloco principal :
e. O valor de V_NEW_LOCN no bloco principal :

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

Exerccio 17 (continuao)
Exemplo de Escopo
DECLARE
v_customer

VARCHAR2(50) := 'Womansport';

v_credit_rating

VARCHAR2(50) := 'EXCELLENT';

BEGIN
DECLARE
v_customer
v_name

NUMBER(7) := 201;

VARCHAR2(25) := 'Unisports';

BEGIN
v_customer

v_name

v_credit_rating

v_name

v_credit_rating

END;
v_customer
END;

2. Suponha que voc tenha embutido um sub-bloco em um bloco, como mostrado acima. Voc declara
duas variveis, V_CUSTOMER e V_CREDIT_RATING, no bloco principal. Voc tambm declara
duas variveis, V_CUSTOMER e V_NAME, no sub-bloco. Determine os valores e tipos de dados
para cada um dos casos a seguir.
a. O valor de V_CUSTOMER no sub-bloco :
b. O valor de V_NAME no sub-bloco :
c. O valor de V_CREDIT_RATING no sub-bloco :
d. O valor de V_CUSTOMER no bloco principal :
e. O valor de V_NAME no bloco principal :
f. O valor de V_CREDIT_RATING no bloco principal :

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

Exerccio 17 (continuao)
3. Crie e execute um bloco PL/SQL que aceite dois nmeros atravs das variveis de substituio do
SQL*Plus. O primeiro nmero deve ser dividido pelo segundo e ter o segundo adicionado ao
resultado. O resultado deve ser armazenado em uma varivel PL/SQL e impresso na tela, ou o
resultado deve ser gravado na varivel SQL*Plus e impresso na tela.
a. Quando uma varivel PL/SQL usada:
Please enter the first number: 2
Please enter the second number: 4
4.5
PL/SQL procedure successfully completed.

b. Quando uma varivel SQL*Plus usada:


Please enter the first number: 2
Please enter the second number: 4
PL/SQL procedure successfully completed.
G_RESULT
-------4.5

4. Elabore um bloco PL/SQL que compute a remunerao total por um ano. O salrio anual e a
porcentagem do bnus anual so repassados ao bloco PL/SQL pelas variveis de substituio
SQL*Plus e os benefcios precisam ser convertidos de um nmero inteiro para um decimal
(por exemplo, 15 para 0.15). Se o salrio for nulo, defina-o para zero antes de computar a
remunerao total. Execute o bloco PL/SQL. Aviso: Use a funo NVL para tratar os valores nulos.
Observao: Para testar a funo NVL, digite NULL no prompt; o pressionamento de [Return]
resulta em um erro de expresso ausente.
Please enter the salary amount: 50000
Please enter the bonus percentage: 10
PL/SQL procedure successfully completed.
G_TOTAL
------55000

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

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

18
Interagindo com o
Oracle Server

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Criar uma instruo SELECT em PL/SQL
Declarar o tipo de dados e tamanho de uma
varivel PL/SQL dinamicamente
Criar instrues SELECT em PL/SQL
Controlar transaes em PL/SQL
Determinar o resultado das instrues DML
SQL

18-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender a incorporar instrues INSERT, UPDATE, DELETE e SELECT SQL
padres nos blocos PL/SQL. Voc tambm aprender como controlar transaes e determinar o
resultado das instrues DML SQL em PL/SQL.

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

Instrues SQL em PL/SQL


Extrair uma linha de dados de um banco de
dados usando o comando SELECT.
Apenas um nico conjunto de valores pode
ser retornado.
Fazer alteraes nas linhas no banco de
dados usando os comandos DML.
Controlar uma transao com o comando
COMMIT, ROLLBACK ou SAVEPOINT.
Determinar o resultado do DML com
cursores implcitos.
18-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral
Quando voc precisar extrair informaes ou aplicar alteraes aos bancos de dados, voc dever
usar o SQL. O PL/SQL suporta integralmente a linguagem de manipulao de dados e os comandos
de controle de transao no SQL. Voc poder usar as instrues SELECT para preencher as
variveis com os valores consultados em uma linha na tabela. Seus comandos DML (manipulao de
dados) podem processar vrias linhas.
Comparando os Tipos de Instruo SQL e PL/SQL

Um bloco PL/SQL no uma unidade de transao. Os comandos COMMIT, SAVEPOINT e


ROLLBACK so independentes dos blocos, mas voc pode emitir esses comandos em um
bloco.

O PL/SQL no suporta instrues em DDL (Data Definition Language) como, por exemplo,
CREATE TABLE, ALTER TABLE ou DROP TABLE.

O PL/SQL no suporta instrues em DCL (Data Control Language) como, por exemplo,
GRANT ou REVOKE.

Para obter mais informaes sobre o pacote DBMS_SQL, consulte o Oracle8 Server Application
Developers Guide, Release 8.

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

Instrues SELECT em PL/SQL


Recuperar dados do banco de dados com
SELECT.
Sintaxe
SELECT
INTO
FROM
WHERE

18-4

select_list
{variable_name[, variable_name]...
| record_name}
tabela
condio;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Recuperando Dados em PL/SQL


Use a instruo SELECT para recuperar dados no banco de dados.
Na sintaxe:
select_list

uma lista de pelo menos uma coluna e pode incluir funes de linhas,
de grupo ou expresses SQL

variable_name

a varivel escalar para armazenar o valor recuperado

record_name

o registro PL/SQL para armazenar os valores recuperados

tabela

especifica o nome da tabela do banco de dados

condio

composta de nomes de coluna, expresses, constantes e operadores de


comparao, incluindo as variveis PL/SQL e operadores

Aproveite a faixa completa de sintaxe do Oracle Server para a instruo SELECT.


Lembre-se que as variveis de host devem ter dois-pontos como prefixo.

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

Instrues SELECT em PL/SQL


A clusula INTO necessria.
Exemplo
DECLARE
v_deptno
v_loc
BEGIN
SELECT
INTO
FROM
WHERE
...
END;

18-5

NUMBER(2);
VARCHAR2(15);
deptno, loc
v_deptno, v_loc
dept
dname = 'SALES';

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Clusula INTO
A clusula INTO mandatria e ocorre entre as clusulas SELECT e FROM. Ela usada para
especificar os nomes das variveis que armazenaro os valores que o SQL retorna a partir da clusula
SELECT. Voc deve oferecer uma varivel para cada item selecionado e a ordem delas deve
corresponder aos itens selecionados.
Voc deve usar a clusula INTO para preencher as variveis PL/SQL ou as variveis de host.
As Consultas Devem Retornar Apenas Uma Linha
As instrues SELECT em um bloco PL/SQL caem na classificao ANSI de SQL Embutido
(Embedded SQL), para a qual se aplicam as regras a seguir: as consultas devem retornar apenas uma
linha. Mais de uma ou nenhuma linha geram mensagens de erro.
O PL/SQL lida com essas mensagens de erro destacando as excees padro, as quais voc poder
capturar na seo de excees do bloco com as excees NO_DATA_FOUND e
TOO_MANY_ROWS (o tratamento de excees abordado em uma lio posterior). Voc dever
codificar as instrues SELECT para retornar uma nica linha.

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

Recuperando Dados em PL/SQL


Recuperar a data da ordem de compra e de
entrega para a ordem especificada.
Exemplo
DECLARE
v_orderdate
ord.orderdate%TYPE;
v_shipdate
ord.shipdate%TYPE;
BEGIN
SELECT
orderdate, shipdate
INTO
v_orderdate, v_shipdate
FROM
ord
WHERE
id = 620;
...
END;

18-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes
Siga essas diretrizes para recuperar os dados em PL/SQL:

Finalize cada instruo SQL com um ponto-e-vrgula (;).

A clusula INTO obrigatria para a instruo SELECT quando ela est embutida no PL/SQL.

A clusula WHERE opcional e poder ser usada para especificar variveis de entrada,
constantes, literais ou expresses PL/SQL.

Especifique o mesmo nmero de variveis de sada na clusula INTO como colunas de banco
de dados na clusula SELECT. Certifique-se de que elas correspondam em posio e que os
seus tipos de dados sejam compatveis.

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

Recuperando Dados em PL/SQL


Retornar o total de salrios de todos os
funcionrios no departamento especificado.
Exemplo
DECLARE
v_sum_sal
v_deptno
BEGIN
SELECT
INTO
FROM
WHERE
END;

18-7

emp.sal%TYPE;
NUMBER NOT NULL := 10;
SUM(sal) -- group function
v_sum_sal
emp
deptno = v_deptno;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes (continuao)

Para garantir que os tipos de dados dos identificadores correspondam aos tipos de dados das
colunas, use o atributo %TYPE. O tipo de dados e o nmero de variveis na clusula INTO
correspondem queles na lista SELECT.

Use as funes de grupo como, por exemplo, SUM, em uma instruo SQL, porque as funes
de grupo se aplicam a grupos de linhas em uma tabela.

Observao: As funes de grupo no podero ser usadas na sintaxe do PL/SQL. Elas so usadas em
instrues SQL em um bloco PL/SQL.

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

Manipulando Dados
Usando o PL/SQL
Alterar as tabelas de banco de dados usando
os comandos DML:
INSERT
UPDATE

INSERT

DELETE
UPDATE

DELETE

18-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Manipulando Dados Usando o PL/SQL


Voc poder manipular os dados no banco de dados usando os comandos DML (manipulao de
dados). Voc poder emitir os comandos DML, por exemplo, INSERT, UPDATE e DELETE sem
restries no PL/SQL. A incluso das instrues COMMIT ou ROLLBACK no cdigo PL/SQL
libera os bloqueios de linha (e bloqueios de tabela).

A instruo INSERT adiciona novas linhas de dados tabela.

A instruo UPDATE modifica linhas existentes na tabela.

A instruo DELETE remove linhas no desejadas da tabela.

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

Inserindo Dados
Adicionar informaes sobre novos
funcionrios na tabela EMP.
Exemplo
BEGIN
INSERT INTO
VALUES

emp(empno, ename, job, deptno)


(empno_sequence.NEXTVAL, 'HARDING',
'CLERK', 10);

END;

18-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Inserindo Dados

Use as funes SQL como, por exemplo, USER e SYSDATE.

Gere valores de chaves primrias usando as seqncias de banco de dados.

Crie valores no bloco PL/SQL.

Adicione valores default de coluna.

Observao: No h possibilidade de ambigidade entre os identificadores e nomes de coluna na


instruo INSERT. Qualquer identificador na clusula INSERT deve ser um nome de coluna do
banco de dados.

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

Atualizando Dados
Aumentar o salrio de todos os funcionrios na
tabela EMP e que sejam Analistas (Analysts).
Exemplo
DECLARE
v_sal_increase
emp.sal%TYPE := 2000;
BEGIN
UPDATE
emp
SET
sal = sal + v_sal_increase
WHERE
job = 'ANALYST';
END;

18-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Atualizando e Deletando Dados


Poder haver ambigidade na clusula SET da instruo UPDATE porque, embora o identificador
esquerda do operador de atribuio seja sempre uma coluna de banco de dados, o identificador
direita podem ser uma coluna de banco de dados ou uma varivel PL/SQL.
Lembre-se de que a clusula WHERE usada para determinar que linhas so afetadas. Se nenhuma
linha for modificada, no ocorrero erros, diferente da instruo SELECT no PL/SQL.
Observao: As atribuies de varivel PL/SQL sempre usam :=, e as atribuies de coluna SQL
sempre usam =. Lembre-se de que os nomes de coluna e de identificadores so idnticos na clusula
WHERE, o Oracle Server procura primeiro pelo nome no banco de dados.

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

Deletando Dados
Deletar linhas que pertenam ao departamento
10 da tabela EMP.
Exemplo
DECLARE
v_deptno
emp.deptno%TYPE := 10;
BEGIN
DELETE FROM
emp
WHERE
deptno = v_deptno;
END;

18-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Deletando Dados
Deletar uma ordem de compra especificada.
DECLARE
v_ordid ord.ordid%TYPE := 605;
BEGIN
DELETE FROM item
WHERE
ordid = v_ordid;
END;

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

Convenes para Nomeao


Usar uma conveno de nomeao para
evitar ambigidades na clusula WHERE.
Os identificadores e as colunas de banco
de dados devem ter nomes diferentes.
Podem surgir erros de sintaxe, pois o
PL/SQL verifica primeiro a coluna no banco
de dados.

18-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Convenes para Nomeao


Evite a ambigidade na clusula WHERE aderindo a uma conveno de nomeao que distingue os
nomes de coluna do banco de dados dos nomes de varivel PL/SQL.

Os identificadores e as colunas de banco de dados devem ter nomes diferentes.

Podem surgir erros de sintaxe, pois o PL/SQL verifica primeiro a coluna na tabela.

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

Convenes para Nomeao


DECLARE
orderdate ord.orderdate%TYPE;
shipdate
ord.shipdate%TYPE;
ordid
ord.ordid%TYPE := 601;
BEGIN
SELECT
orderdate, shipdate
INTO
orderdate, shipdate
FROM
ord
WHERE
ordid = ordid;
END;
SQL> /
DECLARE
*
ERRO na linha 1(ERROR at line 1:)
ORA-01422: busca exata retornou mais linhas do que
as solicitadas (exact fetch returns more than
requested number of rows)
ORA-06512: na linha 6 (at line 6)
18-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Convenes para Nomeao (continuao)


O exemplo mostrado no slide est definido como se segue: Recuperar as datas de ordem de compra e
de entrega na tabela ord para o nmero de ordem 601. Isso gera uma exceo de tempo de execuo
no tratvel.
O PL/SQL verifica se um identificador uma coluna no banco de dados; se no, supe-se que seja
um identificador PL/SQL.
Observao: No h possibilidade de ambigidade na clusula SELECT, pois qualquer identificador
nesse clusula deve ser um nome de coluna do banco de dados. No h possibilidade de ambigidade
na clusula INTO, pois os identificadores nessa clusula devem ser variveis PL/SQL. Apenas na
clusula WHERE h essa possibilidade.
Mais informaes sobre TOO_MANY_ROWS e outras excees so abordadas em lies
subseqentes.

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

Instrues COMMIT e ROLLBACK


Iniciar uma transao com o primeiro
comando DML para seguir uma instruo
COMMIT ou ROLLBACK.
Usar instrues SQL como, por exemplo,
COMMIT e ROLLBACK, para finalizar uma
transao explicitamente.

18-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Controlando Transaes
Voc dever controlar a lgica das transaes com as instrues COMMIT e ROLLBACK SQL, tornando
permanentes as alteraes em alguns grupos de bancos de dados ao descartar outros. Assim como ocorre
com o Oracle Server, as transaes DML so iniciadas no primeiro comando seguindo uma instruo
COMMIT ou ROLLBACK e so finalizadas na prxima instruo COMMIT ou ROLLBACK correta.
Essas aes podem ocorrer em um bloco PL/SQL ou como resultado dos eventos no ambiente do host (por
exemplo, o encerramento de uma sesso SQL*Plus automaticamente compromete a transao pendente).
Para marcar um ponto intermedirio no processo de transao, use SAVEPOINT.
Sintaxe
COMMIT [WORK];
SAVEPOINT savepoint_name;
ROLLBACK [WORK];
ROLLBACK [WORK] TO [SAVEPOINT] savepoint_name;

onde:
WORK
para a adequao aos padres ANSI
Observao: Os comandos de controle de transao so todos vlidos no PL/SQL, embora o ambiente do
host possa impor algumas restries ao usurio.
Voc tambm poder incluir comandos explcitos de bloqueios (como, por exemplo, LOCK TABLE e
SELECT ... FOR UPDATE) em um bloco (uma lio subseqente abordar mais informaes sobre o
comando FOR UPDATE). Eles estaro ativos at o final da transao. Alm disso, um bloco PL/SQL no
implica necessariamente uma transao.
Introduo ao Oracle: SQL e PL/SQL 18-14

Cursor SQL
Um cursor uma rea de trabalho SQL
particular.
H dois tipos de cursores:
Cursores implcitos
Cursores explcitos

O Oracle Server usa cursores implcitos


para analisar e executar as instrues SQL.
Os cursores explcitos so declarados
especificamente pelo programador.

18-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Cursor SQL
Sempre que voc emitir uma instruo SQL, o Oracle Server abrir uma rea de memria na qual o
comando analisado e executado. Essa rea chamada de cursor.
Quando a parte executvel de um bloco emite uma instruo SQL, o PL/SQL cria um cursor
implcito, o qual tem o identificador SQL. O PL/SQL gerencia esse cursor automaticamente. O
programador declara e nomeia um cursor explcito. H quatro atributos disponveis no PL/SQL que
podero aplicar-se aos cursores.
Observao: Mais informaes sobre os cursores explcitos so abordadas em uma lio
subseqente.
Para obter mais informaes, consulte PL/SQL Users Guide and Reference, Release 8, "Interaction
with Oracle".

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

Atributos do Cursor SQL


Ao usar os atributos do cursor SQL, voc
poder testar os resultados das instrues SQL.
SQL%ROWCOUNT

Nmero de linhas afetadas pela


instruo SQL mais recente (um valor
inteiro)

SQL%FOUND

Atributo booleano avaliado para TRUE


se a instruo SQL mais recente afetar
uma ou mais linhas

SQL%NOTFOUND

Atributo booleano avaliado para TRUE


se a instruo SQL mais recente no
afetar uma ou mais linhas

SQL%ISOPEN

Sempre avaliado para FALSE porque


o PL/SQL fecha os cursores implcitos
imediatamente aps a execuo

18-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Atributos do Cursor SQL


Os atributos do cursor SQL permitem que voc avalie o que aconteceu quando o cursor implcito foi
usado pela ltima vez. Voc deve usar esses atributos nas instrues PL/SQL como, por exemplo, as
funes. Voc no poder us-las em instrues SQL.
Voc poder usar os atributos SQL%ROWCOUNT, SQL%FOUND, SQL%NOTFOUND e
SQL%ISOPEN na seo de exceo de um bloco para coletar informaes sobre a execuo de uma
instruo de manipulao de dados. Ao contrrio da instruo SELECT, que retorna uma exceo, o
PL/SQL no considera uma instruo DML que no afete linhas onde ocorreram falhas.

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

Atributos do Cursor SQL


Deletar linhas que especificaram um nmero
de ordem de compra a partir da tabela ITEM.
Imprimir o nmero de linhas deletadas.
Exemplo
VARIABLE rows_deleted VARCHAR2(30)
DECLARE
v_ordid NUMBER := 605;
BEGIN
DELETE FROM item
WHERE
ordid = v_ordid;
:rows_deleted := (SQL%ROWCOUNT ||
' rows deleted.');
END;
/
PRINT rows_deleted

18-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Atributos do Cursor SQL (continuao)


O exemplo mostrado no slide est definido como se segue: Deletar as linhas de uma tabela de ordem
de compra para a ordem nmero 605. Ao usar o atributo SQL%ROWCOUNT, voc poder imprimir
o nmero de linhas deletadas.

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

Sumrio
Embutir o SQL no bloco PL/SQL:
SELECT, INSERT, UPDATE, DELETE
Embutir as instrues de controle de
transao em um bloco PL/SQL:
COMMIT, ROLLBACK, SAVEPOINT

18-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Os comandos DML, por exemplo, INSERT, UPDATE e DELETE, podero ser usados nos
programas PL/SQL sem restries. A instruo COMMIT finaliza a transao atual e torna as
alteraes feitas durante essa transao permanente. A instruo ROLLBACK finaliza a transao
atual e desfaz quaisquer alteraes feitas durante essa transao. SAVEPOINT nomeia e marca o
ponto atual no processamento de uma transao. Usados com a instruo ROLLBACK TO, as
instrues SAVEPOINT permitem que voc desfaa partes de uma transao, em vez da transao
inteira.

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

Sumrio
H dois tipos de cursor: implcito e
explcito.
Os atributos de cursor implcitos verificam
o resultado das instrues DML:
SQL%ROWCOUNT
SQL%FOUND
SQL%NOTFOUND
SQL%ISOPEN

Os cursores explcitos so definidos pelo


programador.
18-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio (continuao)
Um cursor implcito declarado pelo PL/SQL para cada instruo de manipulao de dados SQL.
O PL/SQL fornece quatro atributos para cada cursor. Esses atributos fornecem informaes teis
sobre as operaes que so executadas com cursores. Os cursores explcitos so definidos pelo
programador.

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

Viso Geral do Exerccio


Criar um bloco PL/SQL para selecionar
dados de tabela
Criar um bloco PL/SQL para inserir dados
em uma tabela
Criar um bloco PL/SQL para atualizar
dados em uma tabela
Criar um bloco PL/SQL para deletar um
registro de uma tabela

18-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Neste exerccio, voc deve criar procedimentos para selecionar, entrar, atualizar e deletar
informaes em uma tabela, usando as instrues DML e a consulta SQL bsica em um bloco
PL/SQL.

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

Exerccio 18
1. Criar um bloco PL/SQL que seleciona o nmero mximo de departamento na tabela DEPT e o
armazena em uma varivel SQL*Plus. Imprima os resultados na tela. Salve o bloco PL/SQL em um
arquivo nomeado p18q1.sql.
G_MAX_DEPTNO
-----------40

2. Modificar o bloco PL/SQL que voc criou no exerccio 1 para inserir um novo departamento na tabela
DEPT. Salve o bloco PL/SQL em um arquivo nomeado p18q2.sql.
a. Em vez de imprimir o nmero do departamento recuperado do exerccio 1, adicione 10 a ele e
use-o como o nmero do departamento do novo departamento.
b. Use uma varivel de substituio do SQL*Plus para o nmero do departamento.
c. Deixe um valor nulo na localizao por enquanto.
d. Execute o bloco PL/SQL.
Please enter the department name: EDUCATION
PL/SQL procedure successfully completed.

e. Exiba o novo departamento criado.


DEPTNO DNAME

LOC

------ ---------- ----50 EDUCATION

3. Crie um bloco PL/SQL que atualize a localizao para um departamento existente. Salve o bloco
PL/SQL em um arquivo denominado p18q3.sql.
a. Use uma varivel de substituio do SQL*Plus para o nmero de departamento.
b. Use uma varivel de substituio do SQL*Plus para a localizao de departamento.
c. Teste o bloco PL/SQL.
Please enter the department number: 50
Please enter the department location: HOUSTON
PL/SQL procedure successfully completed.

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

Exerccio 18 (continuao)
d. Exiba o nome e o nmero do departamento, alm da localizao para o departamento atualizado.
DEPTNO DNAME
LOC
------ --------- --------------50 EDUCATION HOUSTON

e. Exiba o departamento que voc atualizou.


4. Crie um bloco PL/SQL que delete o departamento criado no exerccio 2. Salve o bloco PL/SQL em
um arquivo denominado p18q4.sql.
a. Use uma varivel de substituio do SQL*Plus para o nmero do departamento.
b. Imprima o nmero de linhas afetadas na tela.
c. Teste o bloco PL/SQL.
Please enter the department number: 50
PL/SQL procedure successfully completed.
G_RESULT
----------------------------------------------------------1 row(s) deleted.

d. O que acontece se voc informar um nmero de departamento que no existe?


Please enter the department number: 99
PL/SQL procedure successfully completed.
G_RESULT
----------------------------------------------------------0 row(s) deleted.

e. Confirme se o departamento foi deletado.


no rows selected

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

19
Criando Estruturas para
Controle

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc
poder fazer o seguinte:
Identificar os usos e tipos de estruturas
para controle
Construir uma instruo IF
Construir e identificar diferentes
instrues loop
Usar tabelas lgicas
Controlar fluxo de blocos usando loops e
labels aninhados
19-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender sobre o controle condicional dentro do bloco PL/SQL usando loops e
instrues IF.

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

Controlando o Fluxo de Execuo


PL/SQL
Pode-se alterar o fluxo lgico de
instrues usando estruturas para
controle de loop e instrues IF
condicionais.
Instrues IF condicionais:
IF-THEN-END IF
IF-THEN-ELSE-END IF
IF-THEN-ELSIF-END IF

19-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Voc pode alterar o fluxo lgico de instrues dentro do bloco PL/SQL com diversas estruturas para
controle. Esta lio aborda os dois tipos de estruturas para controle do PL/SQL: construes
condicionais com a instruo IF e estruturas para controle LOOP (abordadas posteriormente nesta lio).
Existem trs formatos de instrues IF:

IF-THEN-END IF

IF-THEN-ELSE-END IF

IF-THEN-ELSIF-END IF

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

Instrues IF
Sintaxe
IF condio THEN
instrues;
[ELSIF condio THEN
instrues;]
[ELSE
instrues;]
END IF;

Instruo IF Simples:
Definir o ID do gerente como 22 se o nome
do funcionrio for Osborne.
IF v_ename = 'OSBORNE' THEN
v_mgr := 22;
END IF;
19-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Instrues IF
A estrutura da instruo IF do PL/SQL semelhante estrutura das instrues IF em outras
linguagens procedurais. Ela permite que o PL/SQL execute aes de modo seletivo com base em
condies.
Na sintaxe:
condio

uma expresso ou varivel Booleana (TRUE, FALSE ou NULL) (Ela


est associada a uma seqncia de instrues, que ser executada somente
se a expresso produzir TRUE.)

THEN

uma clusula que associa a expresso Booleana que a precede


com a seqncia de instrues posterior

instrues

pode ser uma ou mais instrues SQL ou PL/SQL. (Elas podem incluir
mais instrues IF contendo diversos IFs, ELSEs e ELSIFs aninhados.)

ELSIF

uma palavra-chave que introduz uma expresso Booleana. (Se a primeira


condio produzir FALSE ou NULL, a palavra-chave ELSIF introduzir
condies adicionais.)

ELSE

uma palavra-chave que se for atingida pelo controle, executar a seqncia


de instrues que segue a palavra-chave

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

Instrues IF Simples
Definir o ttulo da tarefa como Salesman, o
nmero do departamento como 35 e a
comisso como 20% do salrio atual se o
sobrenome for Miller.
Exemplo
. . .
IF v_ename
v_job
v_deptno
v_new_comm
END IF;
. . .

19-5

=
:=
:=
:=

'MILLER' THEN
'SALESMAN';
35;
sal * 0.20;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Instrues IF Simples
No exemplo do slide, o PL/SQL executar essas trs aes (definindo as variveis v_job, v_deptno
e v_new_comm) somente se a condio for TRUE. Se a condio for FALSE ou NULL, o PL/SQL
as ignorar. Em ambos os casos, o controle ser reiniciado na prxima instruo do programa aps
END IF.
Diretrizes

Voc pode executar aes de maneira seletiva com base nas condies atendidas.

Ao criar um cdigo, lembre-se da grafia das palavras-chave:

ELSIF uma palavra.

END IF so duas palavras.

Se a condio Booleana para controle for TRUE, a seqncia de instrues associada ser
executada; se ela for FALSE ou NULL, a seqncia de instrues associadas ser ignorada.
permitido qualquer quantidade de clusulas ELSIF.

Pode haver no mximo uma clusula ELSE.

Endente instrues executadas condicionalmente para clareza.

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

Fluxo de Execuo da Instruo


IF-THEN-ELSE
TRUE

FALSE
IF condio

THEN aes
(incluindo IFs futuros)

19-6

ELSE aes
(incluindo IFs futuros)

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Fluxo de Execuo da Instruo IF-THEN-ELSE


Se a condio for FALSE ou NULL, voc poder usar a clusula ELSE para executar outras aes.
Assim como com a instruo IF simples, o controle reiniciar no programa a partir de END IF. Por
exemplo:
IF condio1 THEN
instruo1;
ELSE
instruo2;
END IF;
Instrues IF Aninhadas
Os dois conjuntos de aes do resultado da primeira instruo IF podem incluir mais instrues IF antes
que as aes especficas sejam executadas. As clusulas THEN e ELSE podem incluir instrues IF.
Cada instruo IF aninhada deve ser terminada com um END IF correspondente.
IF condio1 THEN
instruo1;
ELSE
IF condio2 THEN
instruo2;
END IF;
END IF;

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

Instrues IF-THEN-ELSE
Definir um indicador para pedidos quando
houver menos de cinco dias entre a data do
pedido e a data da entrega.
Exemplo
...
IF v_shipdate - v_orderdate < 5 THEN
v_ship_flag := 'Aceitvel';
ELSE
v_ship_flag := 'Inaceitvel';
END IF;
...

19-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exemplo
Defina a tarefa para Manager se o nome do funcionrio for King. Se o nome do funcionrio for
diferente de King, defina a tarefa para Clerk.
IF v_ename = 'KING' THEN
v_job
:= 'MANAGER';
ELSE
v_job := 'CLERK';
END IF;

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

Fluxo de Execuo da Instruo


IF-THEN-ELSIF
IF condio
FALSE

TRUE

ELSIF
condio

THEN aes
TRUE

THEN aes

19-8

FALSE

ELSE
aes

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Fluxo de Execuo da Instruo IF-THEN-ELSIF


Determine o bnus de um funcionrio com base em seu departamento.
...
IF v_deptno = 10 THEN
v_comm := 5000;
ELSIF v_deptno = 20 THEN
v_comm := 7500;
ELSE
v_comm := 2000;
END IF;
...

No exemplo, a varivel v_comm ser usada para atualizar a coluna COMM na tabela EMP e v_deptno
representa o nmero do departamento de um funcionrio.

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

Instrues IF-THEN-ELSIF
Para um determinado valor, calcular um
percentual desse valor com base em uma
condio.
Exemplo
. . .
IF
v_start
v_start
ELSIF v_start
v_start
ELSE
v_start
END IF;
. . .
19-9

> 100 THEN


:= 2 * v_start;
>= 50 THEN
:= .5 * v_start;
:= .1 * v_start;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Instrues IF-THEN-ELSIF
Quando possvel, use a clusula ELSIF em vez de aninhar instrues IF. O cdigo fica mais fcil de
ler e entender e a lgica identificada claramente. Se a ao na clusula ELSE consistir puramente de
outra instruo IF, ser mais conveniente usar a clusula ELSIF. Isso torna o cdigo mais claro pois
elimina a necessidade de END IFs aninhadas ao final de cada conjunto de condies e aes futuras.
Exemplo
IF condio1 THEN
instruo1;
ELSIF condio2 THEN
instruo2;
ELSIF condio3 THEN
instruo3;
END IF;
A instruo IF-THEN-ELSIF de exemplo acima definida ainda mais da seguinte forma:
Para um determinado valor, calcule um percentual do valor original. Se o valor for superior a 100, o
valor calculado ser o dobro do valor inicial. Se o valor estiver entre 50 e 100, o valor calculado ser
50% do valor inicial. Se o valor informado for menor que 50, o valor calculado ser 10% do valor
inicial.
Observao: Qualquer expresso aritmtica contendo valores nulos ser avaliada como nula.
Introduo ao Oracle: SQL e PL/SQL 19-9

Elaborando Condies Lgicas


Voc pode manipular os valores nulos com
o operador IS NULL.
Qualquer expresso aritmtica contendo
um valor nulo ser avaliada como NULL.
Expresses concatenadas com valores
nulos tratam valores nulos como uma
string vazia.

19-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Desenvolvendo Condies Lgicas


Voc pode desenvolver uma condio Booleana simples combinando expresses de data, nmeros ou
caracteres com um operador de comparao. Normalmente, manipule valores nulos com o operador
IS NULL.
Null em Expresses e Comparaes

A condio IS NULL ser avaliada como TRUE somente se a varivel que ela estiver
verificando for NULL.

Qualquer expresso contendo um valor nulo avaliada como NULL, com exceo de uma
expresso concatenada, que trata os valores nulos como uma string vazia.

Exemplos
Essas duas expresses sero avaliadas como NULL se v_sal for NULL.
v_sal > 1000
v_sal * 1.1

No exemplo a seguir, a string no ser avaliada como NULL se v_string for NULL.
'PL'||v_string||'SQL'

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

Tabelas Lgicas
Desenvolver uma condio Booleana simples
com um operador de comparao.
AND

TRUE

FALSE NULL

TRUE

TRUE

FALSE

OR

TRUE FALSE NULL

TRUE

TRUE FALSE

FALSE FALSE FALSE FALSE

FALSE TRUE FALSE NULL

FALSE TRUE

NULL

NULL

NULL

19-11

NULL

FALSE

NULL

NULL

TRUE TRUE

NOT

TRUE

TRUE

NULL

NULL

NULL

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Condies Booleanas com Operadores Lgicos


Voc pode criar uma condio Booleana complexa combinando condies Booleanas simples com os
operadores lgicos AND, OR e NOT. Nas tabelas lgicas mostradas no slide, FALSE tem
precedncia sobre uma condio AND e TRUE tem precedncia em uma condio OR. AND
retornar TRUE somente se seus dois operandos forem TRUE. OR retornar FALSE somente se seus
dois operandos forem FALSE. NULL AND TRUE sempre ser avaliado como NULL porque no se
sabe se o segundo operando ser avaliado como TRUE ou no.
Observao: A negao de NULL (NOT NULL) resulta em um valor nulo porque valores nulos so
indeterminados.

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

Condies Booleanas
Qual o valor de V_FLAG em cada caso?
v_flag := v_reorder_flag AND v_available_flag;

V_REORDER_FLAG

19-12

V_AVAILABLE_FLAG

V_FLAG

TRUE

TRUE

TRUE

TRUE

FALSE

FALSE

NULL

TRUE

NULL

NULL

FALSE

FALSE

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Desenvolvendo Condies Lgicas


A tabela lgica de AND pode ajudar voc a avaliar as possibilidades da condio Booleana no slide.

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

Controle Iterativo: Instrues


LOOP
Loops repetem uma instruo ou
seqncia de instrues vrias vezes.
Existem trs tipos de loop:
Loop bsico
Loop FOR
Loop WHILE

19-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Controle Iterativo: Instrues LOOP


O PL/SQL oferece diversos recursos para estruturar loops para repetirem uma instruo ou seqncia
de instrues vrias vezes.
As construes em loop so o segundo tipo de estrutura para controle:

Loop bsico para fornecer aes repetitivas sem condies gerais

Loops FOR para fornecer controle iterativo para aes com base em uma contagem

Loops WHILE para fornecer controle iterativo para aes com base em uma condio

Instruo EXIT para terminar loops

Para obter mais informaes, consulte PL/SQL Users Guide and Reference, Release 8, "Control
Structures".
Observao: Outro tipo de loop FOR, loop FOR de cursor, ser discutido em uma lio subseqente.

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

Loop Bsico
Sintaxe
LOOP
instruo1;
. . .
EXIT [WHEN condio];
END LOOP;

condio

onde:

19-14

-- delimitador
-- instrues
-- instruo EXIT
-- delimitador

uma varivel Booleana ou


expresso (TRUE, FALSE,
ou NULL);

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Loop Basico
O formato mais simples da instruo LOOP o loop bsico (ou infinito), que delimita uma seqncia
de instrues entre as palavras-chave LOOP e END LOOP. Sempre que o fluxo de execuo atinge a
instruo END LOOP, o controle retorna instruo LOOP correspondente acima. Um loop bsico
permite a execuo de sua instruo pelo menos uma vez, mesmo que a condio j esteja atendida
no momento em que o loop foi informado. Sem a instruo EXIT, o loop seria infinito.
A instruo EXIT
Voc pode terminar um loop usando a instruo EXIT. O controle passa para a prxima instruo
aps a instruo END LOOP. Pode-se emitir EXIT como uma ao dentro de uma instruo IF ou
como uma instruo independente dentro do loop. A instruo EXIT deve ser colocada dentro de um
loop. No segundo caso, voc pode anexar uma clusula WHEN para permitir a terminao
condicional do loop. Quando a instruo EXIT encontrada, a condio na clusula WHEN
avaliada. Se a condio produzir TRUE, o loop finalizar e o controle passar para a prxima
instruo aps o loop. Um loop bsico pode conter vrias instrues EXIT..

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

Loop Bsico
Exemplo
DECLARE
v_ordid
item.ordid%TYPE := 601;
v_counter NUMBER(2) := 1;
BEGIN
LOOP
INSERT INTO item(ordid, itemid)
VALUES(v_ordid, v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
END LOOP;
END;

19-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Loop Bsico (continuao)


O loop bsico de exemplo mostrado no slide est definido como se segue: Inserir os 10 primeiros
novos itens de linha para o nmero do pedido 601.
Observao: O loop bsico permite a execuo de sua instruo pelo menos uma vez, mesmo que a
condio j esteja atendida ao entrar com o loop, contanto que a condio esteja colocada no loop de
forma a ser verificada somente aps essas instrues. Entretanto, se a condio exit for colocada no
incio do loop, antes de qualquer outra instruo executvel, e ela for true, ocorrer a sada do loop e
as instrues jamais sero executadas.

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

Loop FOR
Sintaxe
FOR contador in [REVERSE]
lower_bound..upper_bound LOOP
instruo1;
instruo2;
. . .
END LOOP;

Usar um loop FOR para desviar o teste


para o nmero de iteraes.
No declarar o contador; ele declarado
implicitamente.

19-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Loop FOR
Os loops FOR tm a mesma estrutura geral do loop bsico. Alm disso, eles tm uma instruo para
controle no incio da palavra-chave LOOP para determinar o nmero de iteraes que o PL/SQL
executa.
Na sintaxe:
contador

um inteiro declarado implicitamente cujo valor aumenta ou diminui


automaticamente (diminuir se a palavra-chave REVERSE for usada) em 1
cada iterao do loop at o limite superior ou inferior a ser alcanado

REVERSE

faz o contador decrescer a cada iterao a partir do limite superior at o


limite inferior. (Note que o limite inferior ainda referenciado primeiro.)

limite_inferior

especifica o limite inferior da faixa de valores do contador

limite_superior

especifica o limite superior da faixa de valores do contador

No declare o contador, ele declarado implicitamente como um inteiro.


Observao: A seqncia de instrues executada sempre que o contador incrementado, conforme
determinado pelos dois limites. Os limites superior e inferior da faixa do loop podem ser literais,
variveis ou expresses, mas devem ser avaliados para inteiros. Se o limite inferior da faixa do loop for
avaliado para um inteiro maior do que o limite superior, a seqncia de instrues no ser executada.
Por exemplo, a instruo1 executada somente uma vez:
FOR i IN 3..3 LOOP instruo1; END LOOP;
Introduo ao Oracle: SQL e PL/SQL 19-16

Loop FOR
Diretrizes
Referenciar o contador dentro do loop
somente; ele indefinido fora do loop.
Usar uma expresso para referenciar o valor
existente de um contador.

No referenciar o contador como o destino


de uma atribuio.

19-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Loop FOR (continuao)


Observao: Os limites inferior e superior de uma instruo LOOP no precisam ser literais
numricas. Eles podem ser expresses que convertem para valores numricos.
Exemplo
DECLARE
v_lower NUMBER := 1;
v_upper NUMBER := 100;
BEGIN
FOR i IN v_lower..v_upper LOOP
...
END LOOP;
END;

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

Loop FOR
Inserir os 10 primeiros novos itens de linha
para o nmero do pedido 601.
Exemplo
DECLARE
v_ordid
item.ordid%TYPE := 601;
BEGIN
FOR i IN 1..10 LOOP
INSERT INTO item(ordid, itemid)
VALUES(v_ordid, i);
END LOOP;
END;

19-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Loop For
O exemplo mostrado no slide est definido como se segue: Inserir os 10 primeiros novos itens de
linha para o nmero do pedido 601. Para isso, usa-se um loop FOR.

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

Loop WHILE
Sintaxe
WHILE condio LOOP
instruo1;
instruo2;
. . .
END LOOP;

A Condio
avaliada ao
incio de
cada iterao.

Usar o loop WHILE para repetir instrues


enquanto uma condio for TRUE.

19-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Loop WHILE
Voc pode usar o loop WHILE para repetir uma seqncia de instrues at a condio para controle
no ser mais TRUE. A condio avaliada ao incio de cada iterao. O loop terminar quando a
condio for FALSE. Se a condio for FALSE no incio do loop, nenhuma iterao futura ser
executada.
Na sintaxe:
condio

uma expresso ou varivel Booleana (TRUE, FALSE, ou NULL)

instruo

pode ser uma ou mais instrues SQL ou PL/SQL

Se as variveis envolvidas nas condies no se alterarem no curso do corpo do loop, a condio


permanecer TRUE e o loop no terminar.
Observao: Se a condio produzir NULL, o loop ser ignorado e o controle passar para a prxima
instruo.

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

Loop WHILE
Exemplo
ACCEPT p_new_order PROMPT 'Incluir o nmero do pedido: '
ACCEPT p_items PROMPT 'Incluir o nmero de itens neste pedido: '
DECLARE
v_count
NUMBER(2) := 1;
BEGIN
WHILE v_count <= &p_items LOOP
INSERT INTO item (ordid, itemid)
VALUES (&p_new_order, v_count);
v_count := v_count + 1;
END LOOP;
COMMIT;
END;
/

19-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Loop WHILE (continuao)


No exemplo do slide, os itens de linha esto sendo adicionados tabela ITEM de um pedido
especificado. O usurio solicitado a fornecer o nmero do pedido (p_new_order) e o nmero de
itens desse pedido (p_items). Com cada iterao atravs do loop WHILE, um contador (v_count)
incrementado. Se o nmero de iteraes for menor ou igual ao nmero de itens do pedido, o cdigo
dentro do loop ser executado e ser inserida uma linha dentro da tabela ITEM. Quando o contador
exceder o nmero de itens do pedido, a condio que controla o loop ser avaliada como falsa e o
loop terminar.

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

Loops e Labels Aninhados


Aninhar loops para vrios nveis.
Usar labels para distinguir entre blocos e
loops.
Sair do loop externo com a instruo EXIT
referenciando o label.

19-21

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Loops e Labels Aninhados


Pode-se aninhar loops para vrios nveis. Voc pode aninhar loops bsicos, FOR e WHILE um dentro
do outro. A terminao de um loop aninhado no terminar o loop delimitado a menos que seja criada
uma exceo. Entretanto, voc pode colocar labels em loops e sair do loop externo com a instruo
EXIT.
Os nomes de label seguem as mesmas regras de outros identificadores. Um label colocado antes de
uma instruo, seja na mesma linha ou em uma linha separada. Coloque o label no loop colocando-o
antes da palavra LOOP dentro dos delimitadores de label (<<label>>).
Se for atribudo um label ao loop, o nome do label poder ser opcionalmente includo aps a
instruo END LOOP para clareza.

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

Loops e Labels Aninhados


...
BEGIN
<<Outer_loop>>
LOOP
v_counter := v_counter+1;
EXIT WHEN v_counter>10;
<<Inner_loop>>
LOOP
...
EXIT Outer_loop WHEN total_done = 'YES';
-- Leave both loops
EXIT WHEN inner_done = 'YES';
-- Leave inner loop only
...
END LOOP Inner_loop;
...
END LOOP Outer_loop;
END;
19-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Loops e Labels Aninhados


No exemplo do slide, existem dois loops. O loop externo identificado pelo label, <<Outer_Loop>>
e o loop interno identificado pelo label <<Inner_Loop>>. O loop interno est aninhado dentro do
loop externo. Os nomes de label so includos aps a instruo END LOOP para clareza.

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

Sumrio
Alterar o fluxo lgico de instrues usando
estruturas para controle.
Condicional (instruo IF)
Loops:
Loop bsico
Loop FOR
Loop WHILE
Instruo EXIT

19-23

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Uma construo para controle condicional verifica a validade de uma condio e executa uma
ao correspondente de acordo. Use a construo IF para uma execuo condicional de instrues.
Uma construo para controle iterativo executa uma seqncia de instrues repetidamente,
contanto que uma condio especificada se mantenha TRUE. Use as diversas construes de loop
para executar operaes iterativas.

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

Viso Geral do Exerccio


Executando aes condicionais usando a
instruo IF
Executando etapas iterativas usando a
estrutura de loop

19-24

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Neste exerccio, voc cria blocos PL/SQL que incorporam estruturas para controle condicional e
loops.

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

Exerccio 19
1. Execute o script lab19_1.sql para criar a tabela MESSAGES. Crie um bloco PL/SQL para
inserir nmeros na tabela MESSAGES.
a. Insira os nmeros de 1 a 10, excluindo 6 e 8.
b. Efetue um commit antes do final do bloco.
c. Realize selees na tabela MESSAGES para verificar se o bloco PL/SQL funcionou.
RESULTS
--------1
2
3
4
5
7
9
10

2. Crie um bloco PL/SQL que compute o valor da comisso de um determinado funcionrio com
base no salrio do funcionrio.
a. Execute o script lab19_2.sql para inserir um novo funcionrio na tabela EMP.
Observao: O funcionrio ter um salrio NULL.
b. Aceite o nmero do funcionrio como entrada do usurio com uma varivel de substituio
do SQL*Plus.
c. Se o salrio do funcionrio for inferior a US$ 1.000, defina o valor da comisso do
funcionrio para 10% do salrio.
d. Se o salrio do funcionrio estiver entre US$ 1.000 e US$ 1.500, defina o valor da
comisso do funcionrio para 15% do salrio.
e. Se o salrio do funcionrio exceder US$ 1.500, defina o valor da comisso do funcionrio
para 20% do salrio.
f. Se o salrio do funcionrio for NULL, defina o valor da comisso do funcionrio para 0.
g. Efetue um commit.
h. Teste o bloco PL/SQL para cada caso usando os casos de teste a seguir e verifique cada
comisso atualizada.
Nmero do Funcionrio

Salrio

Commisso Resultante

7369

800

80

7934

1300

195

7499

1600

320

8000

NULL

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

Exerccio 19 (continuao)
EMPNO
----8000
7499
7934
7369

ENAME
SAL
COMM
------ ----- --------DOE
0
ALLEN
1600
320
MILLER 1300
195
SMITH
800
80

Se voc tiver tempo, complete os exerccios abaixo:


3. Modifique o arquivo p19q4.sql para inserir o texto "Nmero mpar" ou "Nmero par",
dependendo se o valor for impar ou par, na tabela MESSAGES. Consulte a tabela MESSAGES
para determinar se o bloco PL/SQL funcionou.
RESULTS
--------------Nmero par

4. Adicione uma nova coluna chamada STARS, de tipo de dado VARCHAR2 e comprimento 50,
tabela EMP para armazenar asteriscos (*).
5. Crie um bloco PL/SQL que premie um funcionrio, anexando um asterisco coluna STARS
para cada US$ 100 do salrio do funcionrio. Salve o bloco PL/SQL em um arquivo nomeado
p19q5.sql.
a. Aceite o ID do funcionrio como entrada do usurio com uma varivel de substituio do
SQL*Plus.
b. Inicialize uma varivel que conter uma string de asteriscos.
c. Anexe um asterisco string para cada US$ 100 do salrio. Por exemplo, se o funcionrio
recebe um salrio de US$ 800, a string de asteriscos dever conter oito asteriscos. Se o
funcionrio recebe um salrio de US$ 1.250, a string de asteriscos deve conter 13 asteriscos.
d. Atualize a coluna STARS do funcionrio com a string de asteriscos.
e. Efetue um commit.
f. Teste o bloco dos funcionrios que no tm salrio e de um funcionrio que tem um salrio.
Informe o nmero do funcionrio: 7934
Procedimento PL/SQL concludo corretamente.
Informe o nmero do funcionrio: 8000
Procedimento PL/SQL concludo corretamente.
EMPNO
SAL STARS
----- ------ ---------------8000
7934
1300 *************

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

20
Trabalhando com Tipos
de Dados Compostos

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Criar registros PL/SQL definidos pelo usurio
Criar um registro com o atributo %ROWTYPE
Criar uma tabela PL/SQL
Criar uma tabela PL/SQL de registros
Descrever a diferena entre registros, tabelas
e tabelas de registros

20-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender mais sobre os tipos de dados compostos e seus usos.

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

Tipos de Dados Compostos

Tipos:
PL/SQL RECORDS
PL/SQL TABLES

Contm componentes internos


So reutilizveis

20-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

RECORDS e TABLES
Como variveis escalares, as variveis compostas tambm possuem um tipo de dados. Os tipos de
dados compostos (tambm chamados conjuntos) so RECORD, TABLE, Nested TABLE, e
VARRAY. Utilize o tipo de dados RECORD para manipular os dados relacionados, porm
diferentes, como uma unidade lgica. Utilize o tipo de dados TABLE para fazer referncia e
manipular conjuntos de dados como um objeto inteiro. Os tipos de dados Nested TABLE e
VARRAY no so abordados neste curso.
Um registro um grupo de itens de dados relacionados armazenados em campos, cada um com seu
prprio nome e tipo de dados. Uma tabela contm uma coluna e uma chave primria para fornecer a
voc acesso a linhas semelhante a array. Uma vez definidos, as tabelas e registros podem ser
reutilizados.
Para obter mais informaes, consulte o PL/SQL Users Guide and Reference, Release 8,
"Collections and Records".

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

Registros PL/SQL
Devem conter um ou mais componentes de
qualquer tipo de dados escalar, RECORD ou
PL/SQL TABLE, chamados campos
So semelhantes em estrutura a registros
em um 3GL
No so iguais a linhas em uma tabela de
banco de dados
Tratam um conjunto de campos como uma
unidade lgica
So convenientes para extrair uma linha de
dados de uma tabela para processamento
20-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Registros PL/SQL
Um registro um grupo de itens de dados relacionados armazenados em campos, cada um com seu
prprio nome e tipo de dados. Por exemplo, suponha que voc tenha tipos diferentes de dados sobre
um funcionrio, como nome, salrio, data de admisso etc. Esses dados so diferentes em tipo porm
esto relacionados logicamente. Um registro que contm campos, como o nome, o salrio e a data de
admisso de um funcionrio permite manipular os dados como uma unidade lgica. Quando voc
declara um tipo de registro para esses campos, eles podem ser manipulados como uma unidade.

Cada registro definido pode ter tantos campos quantos forem necessrios.

Os registros podem receber atribuio de valores iniciais e podem ser definidos como
NOT NULL.

Os campos sem valores iniciais so inicializados para NULL.

A palavra-chave DEFAULT tambm pode ser usada ao definir campos.

Voc pode definir tipos RECORD e declarar registros definidos pelo usurio na parte declarativa
de qualquer bloco, subprograma ou pacote.

Pode-se declarar e fazer referncia a registros aninhados. Um registro pode ser o componente de
outro registro.

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

Criando um Registro PL/SQL


Sintaxe
TYPE type_name IS RECORD
(field_declaration[, field_declaration]);
identifier
type_name;

Onde field_declaration
field_name {field_type | variable%TYPE
| tabela.coluna%TYPE | tabela%ROWTYPE}
[[NOT NULL] {:= | DEFAULT} expr]

20-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Definindo e Declarando um Registro PL/SQL


Para criar um registro, defina um tipo RECORD e, em seguida, declare registros desse tipo.
Na sintaxe:
type_name

o nome do tipo RECORD. (Esse identificador usado para declarar


registros.)

field_name

o nome de um campo dentro do registro

field_type

o tipo de dados do campo. (Ele representa qualquer tipo de dados


PL/SQL exceto REF CURSOR. Voc pode usar os atributos %TYPE
e ROWTYPE.)

expr

o field_type ou um valor inicial

A restrio NOT NULL impede a atribuio de nulos a esses campos. Certifique-se de inicializar
campos NOT NULL.

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

Criando um Registro PL/SQL


Declarar variveis para armazenar o nome, a
tarefa e o salrio de um novo funcionrio.
Exemplo
...
TYPE emp_record_type IS RECORD
(ename
VARCHAR2(10),
job
VARCHAR2(9),
sal
NUMBER(7,2));
emp_record
emp_record_type;
...

20-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando um Registro PL/SQL


Declaraes de campo so semelhantes a declaraes de varivel. Cada campo tem um nome
exclusivo e um tipo de dados especfico. No existem tipos de dados predefinidos para registros
PL/SQL, como existem para variveis escalares. Assim, voc deve primeiro criar o tipo de dados e,
em seguida, declarar um identificador usando esse tipo de dados.
O exemplo a seguir mostra que voc pode usar o atributo %TYPE para especificar um tipo de
dados de campo:
DECLARE
TYPE emp_record_type IS RECORD
(empno
NUMBER(4) NOT NULL := 100,
ename
emp.ename%TYPE,
job
emp.job%TYPE);
emp_record emp_record_type;
...

Observao: Voc pode adicionar a restrio NOT NULL a qualquer declarao de campo para
impedir a atribuio de nulos a esse campo. Lembre-se, os campos declarados como NOT NULL
devem ser inicializados.

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

Estrutura de Registro PL/SQL


Campo1
(tipo de dados)

Campo2
(tipo de dados)

Campo3
(tipo de dados)

Exemplo

20-7

Campo1
(tipo de dados)

Campo2
(tipo de dados)

empno number(4)

ename varchar2(10)

Campo3
(tipo de dados)
job varchar2(9)

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Fazendo Referncia e Inicializando Registros


Os campos em um registro so acessados por nome. Para fazer referncia ou inicializar um campo
individual, use notao em pontos e a seguinte sintaxe:
record_name.field_name

Por exemplo, voc faz referncia ao campo job no registro emp_record do seguinte modo:
emp_record.job ...

possvel, em seguida, atribuir um valor ao campo de registro do seguinte modo:


emp_record.job := 'CLERK';

Em um bloco ou subprograma, os registros definidos pelo usurio so concretizados quando voc


inclui o bloco ou subprograma e deixam de existir quando voc sai do bloco ou subprograma.
Atribuindo Valores aos Registros
Voc pode atribuir uma lista de valores comuns a um registro usando a instruo SELECT ou
FETCH. Certifique-se de que os nomes de colunas aparecem na mesma ordem dos campos no
registro. Voc tambm pode atribuir um registro a outro se eles tiverem o mesmo tipo de dados.
Um registro definido pelo usurio e um registro %ROWTYPE nunca tm o mesmo tipo de dados.
Introduo ao Oracle: SQL e PL/SQL 20-7

O Atributo %ROWTYPE
Declarar uma varivel segundo um
conjunto de colunas em uma view ou
tabela de banco de dados.
Prefixar %ROWTYPE com a tabela de
banco de dados.
Campos no registro obtm seus nomes e
tipos de dados a partir das colunas da
tabela ou view.

20-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Declarando Registros com o Atributo %ROWTYPE


Para declarar um registro com base em um conjunto de colunas em uma view ou tabela de banco de
dados, use o atributo %ROWTYPE. Os campos no registro obtm seus nomes e tipos de dados a partir
das colunas da tabela ou view. O registro tambm pode armazenar uma linha inteira de dados extrada
de um cursor ou varivel de cursor.
No exemplo a seguir, um registro declarado usando %ROWTYPE como um especificador de tipo de
dados.
DECLARE
emp_record
...

emp%ROWTYPE;

O registro, emp_record, ter uma estrutura consistindo nos campos a seguir, cada um deles
representando uma coluna na tabela EMP.
Observao: Isso no cdigo, mas simplesmente a estrutura da varivel composta.
(empno
ename
job
mgr
hiredate
sal
comm
deptno

NUMBER(4),
VARCHAR2(10),
VARCHAR2(9),
NUMBER(4),
DATE,
NUMBER(7,2),
NUMBER(7,2),
NUMBER(2))
Introduo ao Oracle: SQL e PL/SQL 20-8

Vantagens de Usar %ROWTYPE


O nmero e tipos de dados das colunas de
banco de dados subjacentes podem no
ser conhecidas.
O nmero e tipos de dados da coluna de
banco de dados subjacente pode alterar no
tempo de execuo.
O atributo til ao recuperar uma linha
com a instruo SELECT.

20-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Declarando Registros com o Atributo %ROWTYPE (continuao)


Sintaxe
DECLARE
identificador

onde:

referncia%ROWTYPE;

identificador

o nome escolhido para o registro como um todo

referncia

o nome da tabela, view, cursor ou varivel de cursor em que o


registro deve ser baseado. (Voc deve certificar-se de que essa
referncia vlida ao declarar o registro, isto , a tabela ou view
precisa existir.)

Para fazer referncia a um campo individual, use notao em pontos e a seguinte sintaxe:
record_name.field_name
Por exemplo, voc faz referncia ao campo comm no registro emp_record do seguinte modo:
emp_record.comm
Pode-se, em seguida, atribuir um valor ao campo de registro do seguinte modo:
emp_record.comm := 750;

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

O Atributo %ROWTYPE
Exemplos
Declarar uma varivel para armazenar a
mesma informao sobre um departamento
que est armazenada na tabela DEPT.
dept_record

dept%ROWTYPE;

Declarar uma varivel para armazenar a


mesma informao sobre um funcionrio que
est armazenada na tabela EMP.
emp_record

20-10

emp%ROWTYPE;

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exemplos
A primeira declarao no slide cria um registro com os mesmos nomes de campo e tipos de dados de
campo da linha na tabela DEPT. Os campos so DEPTNO, DNAME e LOCATION.
A segunda declarao cria um registro com os mesmos nomes de campo e tipos de dados de campo de
uma linha na tabela EMP. Os campos so EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM
e DEPTNO.
No exemplo a seguir, um funcionrio est se aposentando. As informaes sobre esse funcionrio so
adicionadas a uma tabela que contm informaes sobre funcionrios aposentados. O usurio fornece o
nmero do funcionrio.
DECLARE
emp_rec
emp%ROWTYPE;
BEGIN
SELECT * INTO emp_rec
FROM
emp
WHERE empno = &employee_number;
INSERT INTO retired_emps(empno, ename, job, mgr, hiredate,
leavedate, sal, comm, deptno)
VALUES (emp_rec.empno, emp_rec.ename, emp_rec.job, emp_rec.mgr,
emp_rec.hiredate, SYSDATE, emp_rec.sal, emp_rec.comm,
emp_rec.deptno);
COMMIT;
END;
Introduo ao Oracle: SQL e PL/SQL 20-10

Tabelas PL/SQL
So compostas de dois componentes:
Chave primria de tipo de dados

BINARY_INTEGER
Coluna de tipo de dados escalares ou de

registro
Crescem dinamicamente por no conter
restries

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

20-11

Tabelas PL/SQL
Os objetos do tipo TABLE so chamados tabelas PL/SQL. Eles so modelados como (mas no iguais a)
tabelas de banco de dados. As tabelas PL/SQL usam uma chave primria para fornecer a voc acesso a
linhas semelhante a array.
Uma tabela PL/SQL:

semelhante a um array

Deve conter dois componentes:

Uma chave primria do tipo de dados BINARY_INTEGER que indexa a PL/SQL TABLE

Uma coluna de um tipo de dados escalares ou de registro, que armazena os elementos de


PL/SQL TABLE

Pode crescer dinamicamente por no conter restries

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

Criando uma Tabela PL/SQL


Sintaxe
TYPE type_name IS TABLE OF
{column_type | varivel%TYPE
| tabela.coluna%TYPE} [NOT NULL]
[INDEX BY BINARY_INTEGER];
identificador type_name;

Declarar uma tabela PL/SQL para armazenar


nomes.
Exemplo
...
TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
...
20-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando uma Tabela PL/SQL


Existem duas etapas envolvidas na criao de uma tabela PL/SQL.
1. Declarar um tipo de dados TABLE.
2. Declarar uma varivel desse tipo de dados.
Na sintaxe:
type_name

o nome do tipo TABLE. (Ele um especificador de tipo usado em declaraes


subseqentes de tabelas PL/SQL.)

column_type

qualquer tipo de dados escalares (no composto), como VARCHAR2, DATE


ou NUMBER. (Voc pode usar o atributo %TYPE para fornecer o tipo de
dados da coluna.)

identificador

o nome do identificador que representa uma tabela PL/SQL inteira

A restrio NOT NULL impede que nulos sejam atribudos PL/ SQL TABLE desse tipo. No
inicialize a PL/SQL TABLE.
Declare uma tabela PL/SQL para armazenar datas.
DECLARE
TYPE date_table_type IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
date_table date_table_type;

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

Estrutura de Tabela PL/SQL

20-13

Chave primria

Coluna

...

...

Jones

Smith

Maduro

...

...

BINARY_INTEGER

Escalar

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Estrutura de Tabela PL/SQL


Da mesma forma que o tamanho de uma tabela de banco de dados, o tamanho de uma tabela PL/SQL
no tem restrio. Isto , o nmero de linhas em uma tabela PL/SQL pode aumentar dinamicamente,
assim a tabela PL/SQL pode crescer medida que novas linhas so adicionadas.
As tabelas PL/SQL podem ter uma coluna e uma chave primria, nenhum desses itens pode ser
nomeado. A coluna pode pertencer a qualquer tipo de dados escalares ou de registro, porm a chave
primria deve pertencer ao tipo BINARY_INTEGER. No possvel inicializar uma tabela PL/SQL
em sua declarao.

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

Criando uma Tabela PL/SQL


DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE hiredate_table_type IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
ename_table
ename_table_type;
hiredate_table hiredate_table_type;
BEGIN
ename_table(1) := 'CAMERON';
hiredate_table(8) := SYSDATE + 7;
IF ename_table.EXISTS(1) THEN
INSERT INTO ...
...
END;

20-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Criando uma Tabela PL/SQL


No existem tipos de dados predefinidos para tabelas PL/SQL, como existem para variveis
escalares. Portanto, voc precisa primeiro criar o tipo de dados e, em seguida, declarar um
identificador usando esse tipo de dados.
Fazendo Referncia a uma Tabela PL/SQL
Sintaxe
pl/sql_table_name(primary_key_value)

onde:

primary_key_value

pertence ao tipo BINARY_INTEGER.

Faa referncia terceira linha em uma tabela PL/SQL ename_table.


ename_table(3) ...

A faixa de magnitude de um BINARY_INTEGER 2147483647 ... 2147483647, ento o valor da


chave primria pode ser negativo. A indexao no precisa iniciar em 1.
Observao: A instruo tabela.EXISTS(i) retornar TRUE se pelo menos uma linha com ndice i
for retornada. Use a instruo EXISTS para impedir que ocorra um erro em relao a um elemento
no existente na tabela.

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

Usando Mtodos
de Tabela PL/SQL
Os mtodos a seguir facilitam o uso de
tabelas PL/SQL:
EXISTS

NEXT

COUNT

EXTEND

FIRST and LAST

TRIM

PRIOR

DELETE

20-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Um mtodo de Tabela PL/SQL uma funo ou procedimento interno que opera sobre tabelas e
chamado usando notao em pontos. Os mtodos abaixo assinalados com um asterisco esto
disponveis para tabelas PL/SQL verso 8 somente.
Sintaxe
table_name.method_name[ (parmetros) ]
Mtodo
EXISTS(n)
COUNT

Descrio
Retornar TRUE se o ensimo elemento em uma tabela PL/SQL existir.
Retorna o nmero de elementos contidos uma tabela PL/SQL atualmente.

FIRST
LAST

Retorna o primeiro e ltimo (menor e maior) nmeros de ndice de uma tabela


PL/SQL. Retornar NULL se a tabela PL/SQL estiver vazia.

PRIOR(n)

Retorna o nmero de ndice que precede o ndice n em uma tabela PL/SQL.

NEXT(n)

Retorna o nmero do ndice que sucede o ndice n em uma tabela PL/SQL.

EXTEND(n, i)*

Aumenta o tamanho de uma tabela PL/SQL.


EXTEND anexa um elemento nulo a uma tabela PL/SQL.
EXTEND(n) anexa n elementos nulos a uma tabela PL/SQL.
EXTEND(n, i) anexa n cpias do elemento i a uma tabela PL/SQL.

TRIM*

TRIM remove um elemento do final de uma tabela PL/SQL.


TRIM(n) remove n elementos do final de uma tabela PL/SQL.

DELETE

DELETE remove todos os elementos de uma tabela PL/SQL.


DELETE(n) remove o ensimo elemento de uma tabela PL/SQL.
DELETE(m, n) remove todos os elementos na faixa m ... n de uma tabela PL/SQL.
Introduo ao Oracle: SQL e PL/SQL 20-15

Tabela de Registros PL/SQL


Definir uma varivel TABLE com um tipo de
dados PL/SQL permitido.
Declarar uma varivel PL/SQL para
armazenar informaes de departamento.
Exemplo
DECLARE
TYPE dept_table_type IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_table dept_table_type;
-- Each element of dept_table is a record

20-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tabela de Registros PL/SQL


Como somente uma definio de tabela necessria para armazenar informaes sobre todos os campos
de uma tabela de banco de dados, a tabela de registros aumenta bastante a funcionalidade de tabelas
PL/SQL.
Fazendo Referncia a uma Tabela de Registros
No exemplo fornecido no slide, voc pode fazer referncia a campos no registro dept_table porque
cada elemento dessa tabela um registro.
Sintaxe
table(index).field
Exemplo
dept_table(15).loc := 'Atlanta';
LOC representa um campo em DEPT_TABLE.
Observao: Voc pode usar o atributo %ROWTYPE para declarar um registro que representa uma
linha em uma tabela de banco de dados. A diferena entre o atributo %ROWTYPE e o tipo de dados
composto RECORD que RECORD permite que voc especifique os tipos de dados de campos no
registro ou que declare campos prprios.

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

Exemplo de Tabela
de Registros PL/SQL
DECLARE
TYPE e_table_type IS TABLE OF emp.Ename%Type
INDEX BY BINARY_INTEGER;
e_tab e_table_type;
BEGIN
e_tab(1) := 'SMITH';
UPDATE emp
SET sal = 1.1 * sal
WHERE Ename = e_tab(1);
COMMIT;
END;
/

20-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exemplo de Tabela de Registros PL/SQL


O exemplo no slide declara uma tabela PL/SQL e_table_type. Usando essa tabela PL/SQL, outra
tabela, e_tab, declarada. Na seo executvel do bloco PL/SQL, a tabela e_tab usada para
atualizar o salrio do funcionrio, Smith.

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

Sumrio
Definir e fazer referncia a variveis
PL/SQL de tipos de dados compostos:
Registros PL/SQL
Tabelas PL/SQL
Tabela de registros PL/SQL

Definir um registro PL/SQL usando o


atributo %ROWTYPE.

20-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Um registro PL/SQL um conjunto de campos individuais que representam uma linha na tabela.
Eles so exclusivos e cada linha tem seu prprio nome e tipo de dados. O registro como um todo
no tem qualquer valor. Usando registros voc pode agrupar os dados em uma estrutura e, em
seguida, manipular essa estrutura para uma entidade ou unidade lgica. Isso ajuda a reduzir a
codificao e torna o cdigo mais fcil de manter e compreender.
Assim como registros PL/SQL, a tabela outro tipo de dados composto. As tabelas PL/SQL so
objetos do tipo TABLE e tm aparncia semelhante a tabelas de banco de dados, mas com uma
ligeira diferena. As tabelas PL/SQL usam uma chave primria para proporcionar a voc acesso a
linha semelhante a array. O tamanho de uma tabela PL/SQL no tem restrio. A tabela PL/SQL
pode ter uma coluna e uma chave primria, nenhum desses itens pode ser nomeado. A coluna pode
ter qualquer tipo de dados, mas a chave primria deve ser do tipo BINARY_INTEGER.
Uma tabela de registros PL/SQL aprimora a funcionalidade de tabelas PL/SQL, j que somente
uma definio de tabela necessria para armazenar informaes sobre todos os campos.
O %ROWTYPE usado para declarar uma varivel composta cujo tipo igual ao de uma linha de
uma tabela de banco de dados.

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

Viso Geral do Exerccio


Declarando tabelas PL/SQL
Processando dados usando tabelas
PL/SQL
Declarando um registro PL/SQL
Processando dados usando um registro
PL/SQL

20-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Nesta prtica, voc define, cria e usa tabelas PL/SQL e um registro PL/SQL.

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

Exerccio 20
1. Crie um bloco PL/SQL para recuperar o nome de cada departamento da tabela DEPT e imprima o
nome de cada departamento na tela, incorporando uma tabela PL/SQL.
a. Declare uma tabela PL/SQL, MY_DEPT_TABLE, para armazenar temporariamente o nome de
departamentos
b. Usando um loop, recupere o nome de todos os departamentos atualmente na tabela DEPT e
armazene-os na tabela PL/SQL. Cada nmero de departamento um mltiplo de 10.
c. Usando outro loop, recupere os nomes de departamentos da tabela PL/SQL e imprima-os
na tela, usando DBMS_OUTPUT.PUT_LINE.
SQL> START p20_1
ACCOUNTING
RESEARCH
SALES
OPERATIONS
Procedimento PL/SQL concludo corretamente.

2. Crie um bloco PL/SQL para imprimir as informaes sobre um determinado pedido.


a. Declare um registro PL/SQL com base na estrutura da tabela ORD.
b. Use uma varivel de substituio do SQL*Plus para recuperar todas as informaes sobre um
pedido especfico e armazene-as no registro PL/SQL.
c. Use DBMS_OUTPUT. PUT_LINE para imprimir informaes selecionadas sobre o pedido.
SQL> START p20_2
Informe um nmero de pedido: 614
Pedido 614 colocado em 01-FEB-87 e enviado em 05-FEB-87 para um
total de US$23,940.00
Procedimento PL/SQL concludo corretamente.

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

Exerccio 20 (continuao)
Se voc tiver tempo, complete o exerccio abaixo.
3. Modifique o bloco criado na prtica 1 para recuperar todas as informaes sobre cada
departamento da tabela DEPT e imprima as informaes na tela, incorporando uma tabela de
registros PL/SQL.
a. Declare uma tabela PL/SQL, MY_DEPT_TABLE, para armazenar temporariamente o
nmero, o nome e a localizao de todos os departamentos.
b. Usando um loop, recupere as informaes de todos os departamentos atualmente na tabela
DEPT e armazene-as na tabela PL/SQL. Cada nmero de departamento um mltiplo de 10.
c. Usando outro loop, recupere as informaes de departamento da tabela PL/SQL e imprima-as
na tela, usando DBMS_OUTPUT.PUT_LINE.
SQL> START p20_3
Dept. 10, ACCOUNTING est localizado em NEW YORK
Dept. 20, RESEARCH est localizado em DALLAS
Dept. 30, SALES est localizado em CHICAGO
Dept. 40, OPERATIONS est localizado em BOSTON
Procedimento PL/SQL concludo corretamente.

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

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

21
Criando Cursores Explcitos

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Distinguir entre um cursor implcito e um
explcito
Usar uma varivel de registro PL/SQL
Criar um loop FOR de cursor

21-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender as diferenas entre cursores implcitos e explcitos. Aprender tambm
quando e porque usar um cursor explcito.
Voc pode precisar usar uma instruo SELECT de vrias linhas no PL/SQL para processar diversas
linhas. Para isso, voc declara e controla cursores explcitos, que so usados em loops, incluindo o
loop FOR de cursor.

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

Sobre os Cursores
Cada instruo SQL executada pelo Oracle
Server tem um cursor individual associado:
Cursores implcitos: Declarados para todas
as instrues DML e PL/SQL SELECT
Cursores explcitos: Declarados e
nomeados pelo programador

21-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Cursores Implcitos e Explcitos


O Oracle Server usa reas de trabalho chamadas reas SQL particulares para executar instrues
SQL e para armazenar informaes de processamento. Voc pode usar cursores do PL/SQL para
nomear uma rea SQL particular e acessar suas informaes armazenadas. O cursor orienta todas as
fases do processamento.
Tipo de Cursor

Descrio

Implcito

Os cursores implcitos so declarados implicitamente pelo PL/SQL para


todas as instrues DML e PL/SQL SELECT, incluindo consultas que
retornam somente uma linha.

Explcito

Para consultas que retornam mais de uma linha. Os cursores explcitos so


declarados e nomeados pelo programador e manipulados atravs de
instrues especficas nas aes executveis do bloco.

Cursores Implcitos
O Oracle Server abre implicitamente um cursor a fim de processar cada instruo SQL no associada
a um cursor declarado explicitamente. O PL/SQL permite que voc consulte o cursor implcito mais
recente como o cursor SQL.
No possvel usar as instrues OPEN, FETCH e CLOSE para controlar o cursor SQL, mas voc
pode usar atributos de cursor para obter informaes sobre a instruo SQL executada mais
recentemente.
Introduo ao Oracle: SQL e PL/SQL 21-3

Funes do Cursor Explcito

Conjunto ativo

Cursor

21-4

7369

SMITH

CLERK

7566

JONES

MANAGER

7788

SCOTT

ANALYST

7876

ADAMS

CLERK

7902

FORD

ANALYST

Linha atual

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Cursores Explcitos
Use cursores explcitos para processar individualmente cada linha retornada por uma instruo
SELECT de vrias linhas.
O conjunto de linhas retornado por uma consulta de vrias linhas chamado conjunto ativo. Seu
tamanho o nmero de linhas que atende aos critrios da pesquisa. O diagrama no slide mostra como
um cursor explcito "aponta" para a linha atual do conjunto ativo. Isso permite que o programa
processe as linhas uma de cada vez.
Um programa PL/SQL abre um cursor, processa linhas retornadas por uma consulta e, em seguida,
fecha o cursor. O cursor marca a posio atual no conjunto ativo.
Funes do cursor explcito:

Pode processar alm da primeira linha retornada pela consulta, linha por linha

Controla que linha est sendo processada no momento

Permite que o programador controle as linhas manualmente no bloco PL/SQL

Observao: A extrao de um cursor implcito uma extrao de array e a existncia de uma


segunda linha ainda criar a exceo TOO_MANY_ROWS. Alm disso, voc pode usar cursores
explcitos para realizar diversas extraes e para executar novamente consultas analisadas na rea de
trabalho.

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

Controlando Cursores Explcitos


No

Sim
DECLARE

Cria uma
rea SQL
nomeada

OPEN

Identifica o
conjunto
ativo

FETCH

Carrega a
linha atual
para
variveis

EMPTY?

Testa para
linhas
existentes

CLOSE

Libera o
conjunto
ativo

Retorna
para
FETCH se
encontrar
linhas

21-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Cursores Explcitos (continuao)


Agora que voc obteve uma compreenso conceitual dos cursores, verifique as etapas para us-los.
A sintaxe de cada etapa pode ser encontrada nas pginas a seguir.
Controlando Cursores Explcitos Usando Quatro Comandos
1. Declare o cursor nomeando-o e definindo a estrutura da consulta a ser executada
dentro dele.
2. Abra o cursor. A instruo OPEN executa a consulta e vincula as variveis que estiverem
referenciadas. As linhas identificadas pela consulta so chamadas conjunto ativo e esto agora
disponveis para extrao.
3. Extraia dados do cursor. No diagrama de fluxo mostrado no slide, aps cada extrao voc
testa o cursor para qualquer linha existente. Se no existirem mais linhas para serem
processadas, voc precisar fechar o cursor.
4. Feche o cursor. A instruo CLOSE libera o conjunto ativo de linhas. Agora possvel reabrir
o cursor e estabelecer um novo conjunto ativo.

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

Controlando Cursores Explcitos


Abra o cursor.
Indicador
Cursor

Extraia uma linha do cursor.


Indicador
Cursor

Prossiga at estar vazio.


Indicador
Cursor

Feche o cursor.
21-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Cursores Explcitos (continuao)


Voc usa as instrues OPEN, FETCH e CLOSE para controlar um cursor. A instruo OPEN
executa a consulta associada ao cursor, identifica o conjunto ativo e posiciona o cursor (indicador)
antes da primeira linha. A instruo FETCH recupera a linha atual e avana o cursor para a prxima
linha. Aps o processamento da ltima linha, a instruo CLOSE desativa o cursor.

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

Declarando o Cursor
Sintaxe
CURSOR cursor_name IS
select_statement;

No inclua a clusula INTO na declarao


do cursor.
Caso seja necessrio o processamento de
linhas em uma seqncia especfica, use a
clusula ORDER BY na consulta.

21-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Declarao de Cursor Explcito


Use a instruo CURSOR para declarar um cursor explcito. Pode-se fazer referncia a variveis
dentro da consulta, mas voc deve declar-las antes da instruo CURSOR.
Na sintaxe:
cursor_name

um identificador do PL/SQL

select_statement

uma instruo SELECT sem uma clusula INTO

Observao: No inclua a clusula INTO na declarao de cursor porque ela aparecer


posteriormente na instruo FETCH.

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

Declarando o Cursor
Exemplo
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename
FROM
emp;
CURSOR dept_cursor IS
SELECT *
FROM
dept
WHERE deptno = 10;
BEGIN
...

21-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Declarao de Cursor Explcito (continuao)


Recupere os funcionrios um a um.
DECLARE
v_empno
emp.empno%TYPE;
v_ename
emp.ename%TYPE;
CURSOR emp_cursor IS
SELECT empno, ename
FROM
emp;
BEGIN
...

Observao: Pode-se fazer referncia variveis na consulta, mas voc deve declar-las antes da
instruo CURSOR.

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

Abrindo o Cursor
Sintaxe
OPEN

cursor_name;

Abra o cursor para executar a consulta e


identificar o conjunto ativo.
Se a consulta no retornar qualquer linha,
no ser criada exceo.
Use atributos de cursor para testar o
resultado aps uma extrao.

21-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Instruo OPEN
Abre o cursor para executar a consulta e identificar o conjunto ativo, que consiste em todas as linhas
que atendem aos critrios de pesquisa da consulta. O cursor aponta agora para a primeira linha do
conjunto ativo.
Na sintaxe:
cursor_name

o nome do cursor declarado anteriormente

OPEN uma instruo executvel que realiza as seguintes operaes:


1. Aloca memria dinamicamente para uma rea de contexto que finalmente conter informaes
cruciais de processamento.
2. Analisa a instruo SELECT.
3. Vincula as variveis de entrada isto , define o valor das variveis de entrada obtendo seus
endereos de memria.
4. Identifica o conjunto ativo isto , o conjunto de linhas que satisfaz os critrios de pesquisa.
As linhas no conjunto ativo no so recuperadas para variveis quando a instruo OPEN
executada. Em vez disso, a instruo FETCH recupera as linhas.
5. Posiciona o indicador imediatamente antes da primeira linha no conjunto ativo.

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

Instruo OPEN (continuao)


Observao: Se a consulta no retornar qualquer linha quando o cursor for aberto, o PL/SQL no
criar uma exceo. Entretanto, voc pode testar o status do cursor aps a extrao.
Para cursores declarados usando a clusula FOR UPDATE, a instruo OPEN tambm bloqueia essas
linhas. A clusula FOR UPDATE ser discutida em uma lio posterior.

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

Extraindo Dados do Cursor


Sintaxe
FETCH cursor_name INTO [varivel1, varivel2, ...]
| record_name];

Recuperar os valores da linha atual para


variveis.
Incluir o mesmo nmero de variveis.
Fazer a correspondncia de cada varivel
para coincidir com a posio das colunas.
Testar para verificar se o cursor possui
linhas.
21-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Instruo FETCH
A instruo FETCH recupera as linhas no conjunto ativo uma de cada vez. Aps cada extrao, o
cursor avana para a prxima linha no conjunto ativo.
Na sintaxe:
cursor_name

o nome do cursor declarado anteriormente

varivel

uma varivel de sada para armazenar os resultados

record_name

o nome do registro em que os dados recuperados so armazenados


(A varivel de registro pode ser declarada usando o atributo %ROWTYPE.)

Diretrizes

Inclua o mesmo nmero de variveis na clusula INTO da instruo FETCH do que as colunas
na instruo SELECT e certifique-se de que os tipos de dados so compatveis.

Faa a correspondncia de cada varivel para coincidir com a posio das colunas.

Como alternativa, defina um registro para o cursor e faa referncia do registro na clusula
FETCH INTO.

Teste para verificar se o cursor possui linhas. Se uma extrao no obtiver valores, no existem
linhas remanescentes para serem processadas no conjunto ativo e nenhum erro ser registrado.

Observao: A instruo FETCH realiza as seguintes operaes:


1. Avana o indicador para a prxima linha no conjunto ativo.
2. L os dados da linha atual para as variveis PL/SQL de sada.
Introduo ao Oracle: SQL e PL/SQL 21-11

Extraindo Dados do Cursor


Exemplos
FETCH emp_cursor INTO v_empno, v_ename;
...
OPEN defined_cursor;
LOOP
FETCH defined_cursor INTO defined_variables
EXIT WHEN ...;
...
-- Process the retrieved data
...
END;

21-12

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Instruo FETCH (continuao)


Use a instruo FETCH para recuperar os valores da linha ativa para variveis de sada. Aps a
extrao, voc pode manipular as variveis atravs de instrues futuras. Para cada valor de coluna
retornado pela consulta associada ao cursor, deve existir uma varivel correspondente na lista INTO.
Alm disso, seus tipos de dados devem ser compatveis.
Recupere os primeiros 10 funcionrios um por um.
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
CURSOR
emp_cursor IS
SELECT empno, ename
FROM
emp;
BEGIN
OPEN emp_cursor;
FOR i IN 1..10 LOOP
FETCH emp_cursor INTO v_empno, v_ename;
...
END LOOP;
END ;

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

Fechando o Cursor
Sintaxe
cursor_name;

CLOSE

Feche o cursor aps completar o


processamento das linhas.
Reabra o cursor, se necessrio.
No tente extrair dados de um cursor aps
ele ter sido fechado.

21-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Instruo CLOSE
A instruo CLOSE desativa o cursor e o conjunto ativo se torna indefinido. Feche o cursor aps
completar o processamento da instruo SELECT. Essa etapa permite que o cursor seja reaberto,
se necessrio. Assim, voc pode estabelecer um conjunto ativo diversas vezes.
Na sintaxe:
cursor_name

o nome do cursor declarado anteriormente.

No tente extrair dados de um cursor aps ele ter sido fechado ou ser criada a exceo
INVALID_CURSOR.
Observao: A instruo CLOSE libera a rea de contexto.
Embora seja possvel terminar o bloco PL/SQL sem fechar cursores, voc deve criar o hbito de
fechar qualquer cursor declarado explicitamente para liberar recursos.
Existe um limite mximo para o nmero de cursores abertos por usurio, que determinado pelo
parmetro OPEN_CURSORS no campo de parmetros do banco de dados. OPEN_CURSORS = 50
por default.
...
FOR i IN 1..10 LOOP
FETCH emp_cursor INTO v_empno, v_ename;
...
END LOOP;
CLOSE emp_cursor;
END;
Introduo ao Oracle: SQL e PL/SQL 21-13

Atributos do Cursor Explcito


Obter informaes de status sobre um cursor.
Atributo

Tipo

Descrio

%ISOPEN

Booleano

Ser avaliado para TRUE se o cursor


estiver aberto

%NOTFOUND

Booleano

Ser avaliado para TRUE se a


extrao mais recente no retornar
uma linha

%FOUND

Booleano

Ser avaliado para TRUE se a


extrao mais recente no retornar
uma linha; complemento de
%NOTFOUND

%ROWCOUNT

Nmero

Ser avaliado para o nmero total


de linhas retornadas at o momento

21-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Atributos do Cursor Explcito


Da mesma forma que para cursores implcitos, existem quatro atributos para obter informaes de
status sobre um cursor. Quando anexado ao nome da varivel do cursor, esses atributos retornam
informaes teis sobre a execuo de uma instruo de manipulao de dados.
Observao: No possvel fazer referncia a atributos de cursor diretamente em uma
instruo SQL.

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

Controlando Vrias Extraes


Processar diversas linhas de um cursor
explcito usando um loop.
Extrair uma linha com cada iterao.
Usar o atributo %NOTFOUND para criar um
teste para uma extrao malsucedida.
Usar atributos de cursor explcito para
testar o xito de cada extrao.

21-15

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Controlando Vrias Extraes de Cursores Explcitos


Para processar vrias linhas de um cursor explcito, voc normalmente define um loop para realizar
uma extrao em cada iterao. Finalmente todas as linhas no conjunto ativo sero processadas e uma
extrao malsucedida define o atributo %NOTFOUND para TRUE. Use os atributos de cursor
explcito para testar o xito de cada extrao antes que sejam feitas referncias futuras para o cursor.
Se voc omitir um critrio de sada, o resultado ser um loop infinito.
Para obter mais informaes, consulte o PL/SQL Users Guide and Reference, Release 8, "Interaction
With Oracle".

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

O Atributo %ISOPEN
Extrair linhas somente quando o cursor
estiver aberto.
Usar o atributo de cursor %ISOPEN antes
de executar uma extrao para testar se o
cursor est aberto.
Exemplo
IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF;
LOOP
FETCH emp_cursor...

21-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Atributos do Cursor Explcito

Voc pode extrair linhas somente quando o cursor est aberto. Use o atributo de cursor
%ISOPEN para determinar se o cursor est aberto, se necessrio.

Extraia linhas em um loop. Use atributos de cursor para determinar o momento para sair
do loop.

Use o atributo de cursor %ROWCOUNT para recuperar um nmero exato de linhas, extrair as
linhas em um loop FOR numrico ou extrair as linhas em um loop simples e determinar o
momento para sair do loop.

Observao: %ISOPEN retorna o status do cursor: TRUE se ele estiver aberto e FALSE se no
estiver. No normalmente necessrio examinar %ISOPEN.

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

Os Atributos %NOTFOUND
e %ROWCOUNT

Use o atributo de cursor %ROWCOUNT


para recuperar um nmero exato de linhas.
Use o atributo de cursor %NOTFOUND
para determinar quando sair do loop.

21-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exemplo
Recupere os primeiros 10 funcionrios um por um.
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
CURSOR emp_cursor IS
SELECT empno, ename
FROM
emp;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_empno, v_ename;
EXIT WHEN emp_cursor%ROWCOUNT > 10 OR emp_cursor%NOTFOUND;
...
END LOOP;
CLOSE emp_cursor;
END ;

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

Exemplo (continuao)
Observao: Antes da primeira extrao, %NOTFOUND avaliado para NULL. Assim, se FETCH
nunca executar com xito, jamais ocorrer sada do loop. Isso porque a instruo EXIT WHEN
executar somente se sua condio WHEN for verdadeira. Como segurana, convm usar a seguinte
instruo EXIT:
EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%NOTFOUND IS NULL;

Se usar %ROWCOUNT, adicione um teste para nenhuma linha no cursor usando o atributo
%NOTFOUND, j que a contagem de linhas no ser incrementada se a extrao no recuperar
qualquer linha.

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

Cursores e Registros
Processar convenientemente as linhas do
conjunto ativo extraindo valores para um
PL/SQL RECORD.
Exemplo
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename
FROM
emp;
emp_record
emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_record;
...

21-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Cursores e Registros
Voc j constatou que pode definir registros para usar a estrutura de colunas em uma tabela. Voc
tambm pode definir um registro com base na lista selecionada de colunas em um cursor explcito.
Isso conveniente para processar as linhas do conjunto ativo, porque voc pode simplesmente extrair
para o registro. Assim, os valores das linhas so carregados diretamente para os campos
correspondentes do registro.
Exemplo
Use um cursor para recuperar nmeros e nomes de funcionrios e preencher uma tabela de banco de
dados temporria com essas informaes.
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename
FROM
emp;
emp_record emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_record;
EXIT WHEN emp_cursor%NOTFOUND;
INSERT INTO temp_list (empid, empname)
VALUES (emp_record.empno, emp_record.ename);
END LOOP;
COMMIT;
CLOSE emp_cursor;
END ;
Introduo ao Oracle: SQL e PL/SQL 21-19

Loops FOR de Cursor


Sintaxe
FOR record_name IN cursor_name LOOP
instruo1;
instruo2;
. . .
END LOOP;

O loop FOR de cursor um atalho para


processar cursores explcitos.
Ocorrem abertura, extrao e fechamento
implcitos.
O registro declarado implicitamente.
21-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Loops FOR de Cursor


Um loop FOR de cusor processa linhas em um cursor explcito. Ele um atalho porque o cursor
aberto, linhas so extradas uma vez para cada iterao no loop e o cursor fechado automaticamente
aps o processamento de todas as linhas. O loop em si terminado automaticamente ao final da
iterao quando a ltima linha for extrada.
Na sintaxe:
record_name

o nome do registro declarado implicitamente

cursor_name

um identificador PL/SQL para o cursor declarado anteriormente

Diretrizes

No declare o registro que controla o loop. Seu escopo somente no loop.

Teste os atributos do cursor durante o loop, se necessrio.

Fornea os parmetros de um cursor, se necessrio, entre parnteses aps o nome do cursor na


instruo FOR. Mais informaes sobre parmetros de cursor so abrangidas em uma lio
subseqente.

No use um loop FOR de cursor quando as operaes do cursor precisarem ser manipuladas
manualmente.

Observao: Voc pode definir uma consulta no incio do prprio loop. A expresso da consulta
chamada subinstruo SELECT e o cursor interno para o loop FOR. Como o cursor no declarado
com um nome, no possvel testar seus atributos.
Introduo ao Oracle: SQL e PL/SQL 21-20

Loops FOR de Cursor


Recuperar funcionrios um a um at no
restar nenhum.
Exemplo
DECLARE
CURSOR emp_cursor IS
SELECT ename, deptno
FROM
emp;
BEGIN
FOR emp_record IN emp_cursor LOOP
-- implicit open and implicit fetch occur
IF emp_record.deptno = 30 THEN
...
END LOOP; -- implicit close occurs
END;

21-21

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exemplo
Recupere funcionrios um a um e imprima uma lista dos funcionrios que esto trabalhando
atualmente no departamento Sales. O exemplo do slide concludo abaixo.
SET SERVEROUTPUT ON
DECLARE
CURSOR emp_cursor IS
SELECT ename, deptno
FROM
emp;
BEGIN
FOR emp_record IN emp_cursor LOOP
--implicit open and implicit fetch occur
IF emp_record.deptno = 30 THEN
DBMS_OUTPUT.PUT_LINE ('Funcionrio ' || emp_record.ename
|| ' trabalha no Dpt de Vendas.');
END IF;
END LOOP;
--implicit close occurs
END ;
/

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

Loops FOR do Cursor


Usando Subconsultas
No necessrio declarar o cursor.
Exemplo
BEGIN
FOR emp_record IN (SELECT ename, deptno
FROM
emp) LOOP
-- implicit open and implicit fetch occur
IF emp_record.deptno = 30 THEN
...
END LOOP; -- implicit close occurs
END;

21-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Loops FOR do Cursor Usando Subconsultas


Voc no precisa declarar um cursor porque o PL/SQL permite substituio por uma subconsulta. Este
exemplo realiza o mesmo do exemplo na pgina anterior. Ele o cdigo completo do slide acima.
SET SERVEROUTPUT ON
BEGIN
FOR emp_record IN (SELECT ename, deptno
FROM
emp) LOOP
--implicit open and implicit fetch occur
IF emp_record.deptno = 30 THEN
DBMS_OUTPUT.PUT_LINE ('Funcionario ' || emp_record.ename
|| ' trabalha no Dept. de Vendas. ');
END IF;
END LOOP;
--implicit close occurs
END ;
/

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

Sumrio
Tipos de cursor:
Cursores implcitos: Usados em todas as

instrues DML e consultas de linha nica.


Cursores explcitos: Usados para

consultas de zero, uma ou mais linhas.


possvel manipular cursores explcitos.
possvel avaliar o status do cursor usando
atributos de cursor.
possvel usar loops FOR de cursor.

21-23

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Um cursor implcito declarado pelo PL/SQL para cada instruo de manipulao de dados SQL.
O PL/SQL permite que voc consulte o cursor implcito mais recente como o cursor SQL. O
PL/SQL fornece quatro atributos para cada cursor. Esses atributos proporcionam a voc
informaes teis sobre as operaes executadas com cursores. Pode-se usar o atributo de cursor
anexando-o ao nome de um cursor explcito. Voc pode usar esses atributos somente em
instrues PL/SQL.
O PL/SQL permite que voc processe linhas retornadas por uma consulta de vrias linhas. Para
processar individualmente uma linha em um conjunto de uma ou mais linhas retornadas por uma
consulta, voc pode declarar um cursor explcito.

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

Exemplo
Recupere os 5 primeiros itens de linha de um pedido um por um. medida que cada produto
processado para o pedido, calcule o novo total do pedido e imprima-o na tela.
SET SERVEROUTPUT ON
ACCEPT p_ordid PROMPT 'Insira o nmero do pedido: '
DECLARE
v_prodid
item.prodid%TYPE;
v_item_total
NUMBER (11,2);
v_order_total NUMBER (11,2) := 0;
CURSOR item_cursor IS
SELECT prodid, actualprice * qty
FROM
item
WHERE
ordid = &p_ordid;
BEGIN
OPEN item_cursor;
LOOP
FETCH item_cursor INTO v_prodid, v_item_total;
EXIT WHEN item_cursor%ROWCOUNT > 5 OR
item_cursor%NOTFOUND;
v_order_total := v_order_total + v_item_total;
DBMS_OUTPUT.PUT_LINE ('Nmero do produto ' || TO_CHAR (v_prodid) ||
' totaliza este pedido em ' ||
TO_CHAR (v_order_total, 'US$ 999,999.99'));
END LOOP;
CLOSE item_cursor;
END;
/

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

Viso Geral do Exerccio


Declarando e usando cursores explcitos
para consultar linhas de uma tabela
Usando um loop FOR de cursor
Aplicando atributos de cursor para testar
o status do cursor

21-25

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Este exerccio aplica o seu conhecimento sobre cursores para processar um nmero de linhas de uma
tabela e preencher outra tabela com os resultados usando um loop FOR de cursor.

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

Exerccio 21
1. Execute o script lab21_1.sql para criar uma nova tabela para armazenar funcionrios e seus
salrios.
SQL> CREATE TABLE
2 (name
3
salary

top_dogs
VARCHAR2(25),
NUMBER(11,2));

2. Crie um bloco PL/SQL que determine os funcionrios com os maiores salrios.


a. Aceite um nmero n como entrada de usurio com um parmetro de substituio do SQL*Plus.
b. Em um loop, obtenha os sobrenomes e salrios das n pessoas com maiores salrios da
tabela EMP.
c. Armazene os nomes e salrios na tabela TOP_DOGS.
d. Pressuponha que no existam dois funcionrios com salrios iguais.
e. Teste diversos casos especiais, como n = 0 ou onde n seja maior do que o nmero
de funcionrios na tabela EMP. Esvazie a tabela TOP_DOGS depois de cada teste.
Please enter the number of top money makers: 5
NAME

SALARY

----------- -----KING
5000
FORD
3000
SCOTT
3000
JONES
2975
BLAKE
2850

3. Considere o caso em que vrios funcionrios recebem o mesmo salrio. Se uma pessoa estiver
listada, todos que tiverem o mesmo salrio tambm devero estar listados.
a. Por exemplo, se o usurio informar um valor 2 para n, King, Ford e Scott devero ser
exibidos. (Esses funcionrios so reunidos pelo segundo maior salrio.)
b. Se o usurio informar um valor 3, King, Ford, Scott e Jones devero ser exibidos.
c. Delete todas as linhas de TOP_DOGS e teste o exerccio.
Please enter the number of top money makers : 2
NAME
SALARY
------------ -----KING
5000
FORD
3000
SCOTT
3000

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

Exerccio 21 (continuao)
Please enter the number of top money makers : 3
NAME
SALARY
------------ -----KING
5000
FORD
3000
SCOTT
3000
JONES
2975

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

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

22
Conceitos de Cursor
Explcito Avanados

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Criar um cursor que utilize parmetros
Determinar quando uma clusula FOR
UPDATE em um cursor necessria
Determinar quando usar a clusula
WHERE CURRENT OF
Criar um cursor que utiliza uma
subconsulta

22-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender mais sobre como criar cursores explcitos, especificamente sobre como
criar cursores que utilizam parmetros.

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

Cursores com Parmetros


Sintaxe
CURSOR
CURSOR cursor_name
cursor_name
[(
parameter_name
[(parameter_name tipo
...)]
tipo de
de dados
dados,, ...)]
IS
IS
select_statement
select_statement;;

Passar valores de parmetro para um


cursor quando ele for aberto e a consulta
for executada.
Abrir um cursor explcito diversas vezes
com um conjunto ativo diferente a
cada vez.
22-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Cursores com Parmetros


Parmetros permitem que valores sejam passados para um cursor quando ele aberto e sejam usados
na consulta quando ela executada. Isso significa que voc pode abrir e fechar um cursor explcito
vrias vezes em um bloco, retornando um conjunto ativo diferente em cada ocasio.
Cada parmetro formal na declarao do cursor deve ter um parmetro real correspondente na
instruo OPEN. Os tipos de dados de parmetro so iguais aos das variveis escalares, porm voc
no define tamanhos para eles. Os nomes de parmetro so para referncia na expresso de consulta do
cursor.
Na sintaxe:
cursor_name

um identificador PL/SQL para o cursor declarado anteriormente

parameter_name

o nome de um parmetro (Parmetro representa a


sintaxe a seguir.)

cursor_parameter_name

[IN]

tipo de dados

[{:= | DEFAULT} expr]

tipo de dados

um tipo de dados escalares do parmetro

select_statement

uma instruo SELECT sem a clusula INTO

Quando o cursor aberto, voc passa valores para cada parmetro por posio. Pode-se passar valores
de variveis PL/SQL ou de host e tambm de literais.
Observao: A notao de parmetro no oferece maior funcionalidade, ela simplesmente permite que
voc especifique valores de entrada de maneira fcil e clara. Isso especialmente til quando feito
referncia ao mesmo cursor repetidamente.
Introduo ao Oracle: SQL e PL/SQL 22-3

Cursores com Parmetros


Passar o nome do departamento e o ttulo do
cargo para a clusula WHERE.
Exemplo
DECLARE
CURSOR emp_cursor
(p_deptno NUMBER, p_job VARCHAR2) IS
SELECT
empno, ename
FROM
emp
WHERE
deptno = v_deptno
AND
job = v_job;
BEGIN
OPEN emp_cursor(10, 'CLERK');
...

22-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Os tipos de dados de parmetro so iguais aos das variveis escalares, porm voc no define
tamanhos para eles. Os nomes de parmetro so para referncias na consulta do cursor.
No exemplo a seguir, duas variveis e um cursor so declarados. O cursor definido com dois
parmetros.
DECLARE
v_emp_job emp.job%TYPE := 'CLERK';
v_ename
emp.ename%TYPE;
CURSOR emp_cursor(p_deptno NUMBER, p_job VARCHAR2) IS
SELECT ...

Qualquer das instrues a seguir abre o cursor:


OPEN emp_cursor(10, v_emp_job);
OPEN emp_cursor(20, 'ANALYST');

Voc pode passar parmetros para o cursor usado em um loop FOR de cursor:
DECLARE
CURSOR emp_cursor(p_deptno NUMBER, p_job VARCHAR2) IS
SELECT ...
BEGIN
FOR emp_record IN emp_cursor(10, 'ANALYST') LOOP ...

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

A Clusula FOR UPDATE


Sintaxe
SELECT ...
FROM
...
FOR UPDATE [OF column_reference][NOWAIT];

O bloqueio explcito permite que voc


negue acesso pela durao de uma
transao.
Bloqueie as linhas antes de atualizar ou
deletar.
22-5

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Clusula FOR UPDATE


Convm bloquear linhas antes de efetuar atualizao ou excluso de linhas. Adicione a clusula FOR
UPDATE consulta de cursor para bloquear as linhas afetadas quando o cursor for aberto. Como o
Oracle Server libera bloqueios ao final da transao, voc no deve efetuar commit entre extraes a
partir de um cursor explcito se a clusula FOR UPDATE for usada.
Na sintaxe:
column_reference

uma coluna na tabela na qual a consulta realizada


(Uma lista de colunas tambm pode ser usada.)

NOWAIT

retornar um erro do Oracle se as linhas estiverem bloqueadas por


outra sesso

A clusula FOR UPDATE a ltima clusula em uma instruo SELECT, inclusive posterior a
ORDER BY, se ela existir.
Ao consultar vrias tabelas, voc pode usar a clusula FOR UPDATE para confinar o bloqueio de
linhas a determinadas tabelas. As linhas em uma tabela sero bloqueadas somente se a clusula FOR
UPDATE se referir a uma coluna nessa tabela.
Os bloqueios exclusivos de linha so obtidos no conjunto ativo antes de OPEN retornar quando a
clusula FOR UPDATE usada.

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

A Clusula FOR UPDATE


Recuperar os funcionrios que trabalham no
departamento 30.
Exemplo
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename, sal
FROM
emp
WHERE deptno = 30
FOR UPDATE OF sal NOWAIT;

22-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Clusula FOR UPDATE (continuao)


Observao: Se o Oracle Server no puder obter os bloqueios sobre as linhas de que ele necessita em
uma instruo SELECT FOR UPDATE, ele aguardar indefinidamente. Voc pode usar a clusula
NOWAIT na instruo SELECT FOR UPDATE para testar para cdigo de erro retornado devido a
falha na obteno de bloqueios em um loop. Portanto, voc pode tentar abrir novamente o cursor n
vezes antes de terminar o bloco PL/SQL. Se tiver uma tabela grande, voc ter melhor desempenho
usando a instruo LOCK TABLE para bloquear todas as linhas na tabela. Entretanto, ao usar LOCK
TABLE, voc no pode usar a clusula WHERE CURRENT OF e deve usar a notao WHERE
coluna = identificador.
No obrigatrio que a clusula FOR UPDATE OF se refira a uma coluna, mas recomendado para
melhor legibilidade e manuteno.

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

A Clusula WHERE CURRENT OF


Sintaxe
WHERE CURRENT OF cursor ;

Usar cursores para atualizar ou deletar a


linha atual.
Incluir a clusula FOR UPDATE na consulta
de cursor para primeiro bloquear as linhas.
Usar a clusula WHERE CURRENT OF para
fazer referncia linha atual a partir de um
cursor explcito.
22-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Clusula WHERE CURRENT OF


Ao fazer referncia linha atual de um cursor explcito, use a clusula WHERE CURRENT OF. Isso
permite que voc aplique atualizaes e delees linha que est sendo tratada no momento, sem
necessidade de fazer referncia explcita a ROWID. Voc deve incluir a clusula FOR UPDATE na
consulta do cursor para que as linhas sejam bloqueadas em OPEN.
Na sintaxe:
cursor

o nome de um cursor declarado (O cursor deve ter sido declarado com


a clusula FOR UPDATE.)

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

A Clusula WHERE CURRENT OF


Exemplo
DECLARE
CURSOR sal_cursor IS
SELECT
sal
FROM
emp
WHERE
deptno = 30
FOR UPDATE OF sal NOWAIT;
BEGIN
FOR emp_record IN sal_cursor LOOP
UPDATE
emp
SET
sal = emp_record.sal * 1.10
WHERE CURRENT OF sal_cursor;
END LOOP;
COMMIT;
END;
22-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

A Clusula WHERE CURRENT OF (continuao)


Voc pode atualizar linhas com base em critrios de um cursor.
Alm disso, pode criar a instruo DELETE ou UPDATE para conter a clusula WHERE CURRENT
OF cursor_name para fazer referncia linha mais recente processada pela instruo FETCH. Ao utilizar
essa clusula, o cursor ao qual voc faz referncia precisa existir e deve conter a clusula FOR UPDATE
na consulta do cursor; caso contrrio receber um erro. Essa clusula permite aplicar atualizaes e
delees linha atual sem que seja necessrio fazer referncia explcita pseudocoluna ROWID.
Exemplo
O slide de exemplo efetua loop por cada funcionrio no departamento 30, elevando cada salrio em 10%.
A clusula WHERE CURRENT OF na instruo UPDATE refere-se ao registro extrado no momento.

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

Cursores com Subconsultas


Exemplo
DECLARE
CURSOR my_cursor IS
SELECT t1.deptno, t1.dname, t2.STAFF
FROM
dept t1, (SELECT deptno,
count(*) STAFF
FROM
emp
GROUP BY deptno) t2
WHERE t1.deptno = t2.deptno
AND
t2.STAFF >= 5;

22-9

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Subconsultas
Uma subconsulta uma consulta (geralmente entre parnteses) que aparece dentro de outra instruo
de manipulao de dados SQL. Quando avaliada, a subconsulta fornece um valor ou conjunto de
valores para a instruo.
As subconsultas so freqentemente usadas na clusula WHERE de uma instruo SELECT. Elas
tambm podem ser usadas na clusula FROM, criando uma origem de dados temporria para essa
consulta. Neste exemplo, a subconsulta cria uma origem de dados consistindo em nmeros de
departamentos e contagem de funcionrios em cada departamento (conhecido pelo apelido STAFF).
Um apelido de tabela, t2, refere-se a essa origem de dados temporria na clusula FROM. Quando
esse cursor for aberto, o conjunto ativo conter o nmero do departamento, nome do departamento e
a contagem de funcionrios dos departamentos que sejam iguais ou superiores a 5.
possvel usar uma subconsulta ou subconsulta correlacionada.

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

Sumrio
possvel retornar diferentes conjuntos
ativos usando cursores com parmetros.
possvel definir cursores com
subconsultas e subconsultas
correlacionadas.
possvel manipular cursores explcitos
com comandos:
Clusula FOR UPDATE
Clusula WHERE CURRENT OF

22-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
Um cursor explcito pode conter parmetros. Em uma consulta, voc pode especificar um parmetro
de cursor sempre que uma constante possa aparecer. Uma vantagem de usar parmetros que voc
pode decidir o conjunto ativo no tempo de execuo. O PL/SQL oferece um mtodo para modificar as
linhas que foram recuperadas pelo cursor. O mtodo consiste em duas partes. A clusula FOR
UPDATE na declarao do cursor e a clusula WHERE CURRENT OF em uma instruo UPDATE
ou DELETE.

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

Viso Geral do Exerccio

Declarando e usando cursores explcitos


com parmetros
Usando um cursor FOR UPDATE

22-11

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Este exerccio aplica o seu conhecimento sobre cursores com parmetros para processar diversas
linhas de vrias tabelas.

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

Exerccio 22
1. Use um cursor para recuperar o nmero e o nome do departamento a partir da tabela
DEPT. Passe o nmero do departamento para outro cursor recuperar os detalhes
sobre o nome do funcionrio, cargo, data de admisso e salrio de todos os
funcionrios que trabalham naquele departamento a partir da tabela EMP.
Department Number : 10
KING
CLARK
MILLER

PRESIDENT

17-NOV-81

MANAGER

FORD

CLERK

SCOTT

ANALYST

ADAMS

CLERK

MARTIN
ALLEN
TURNER
JAMES

17-DEC-80

WARD

12-JAN-83

3000
800
3000
1100

Department Name : SALES

01-MAY-81

SALESMAN
SALESMAN

2850

28-SEP-81
20-FEB-81

SALESMAN
SALESMAN

2975

09-DEC-82

MANAGER

CLERK

Department Name : RESEARCH

03-DEC-81

Department Number : 30
BLAKE

1300

02-APR-81

ANALYST
CLERK

2450

23-JAN-82

MANAGER

SMITH

5000

09-JUN-81

Department Number : 20
JONES

Department Name : ACCOUNTING

1250
1600

08-SEP-81

03-DEC-81
22-FEB-81

Department Number : 40

1500

950
1250

Department Name : OPERATIONS

2. Modifique o p19q5.sql para incorporar a funcionalidade de FOR UPDATE e


WHERE CURRENT OF no processamento do cursor.
EMPNO
SAL STARS
----- ------ --------------------8000
7900
950 **********
7844
1500 ***************

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

23
Tratando Excees

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivos
Depois de completar esta lio, voc poder
fazer o seguinte:
Definir excees PL/SQL
Reconhecer excees no tratveis
Listar e usar diferentes tipos de handlers de
exceo PL/SQL
Capturar erros inesperados
Descrever o efeito da propagao de
exceo em blocos aninhados
Personalizar mensagens de exceo PL/SQL
23-2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Objetivo da Lio
Nesta lio, voc aprender o que so excees PL/SQL e como lidar com elas usando handlers de
exceo predefinidos, no predefinidos e definidos pelo usurio.

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

Tratando Excees com


Cdigo PL/SQL
O que uma exceo?
Identificador em PL/SQL que criado durante
a execuo
Como a exceo criada?
Quando ocorre um erro do Oracle.
Quando voc a cria explicitamente.

Como voc trata a exceo?


Capture-a com um handler.
Propaga-a para o ambiente de chamada.
23-3

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral
Uma exceo um identificador em PL/SQL, criado durante a execuo de um bloco que termina seu
corpo principal de aes. Um bloco sempre termina quando o cdigo PL/SQL cria uma exceo, mas
voc especifica um handler de excees para executar aes finais.
Dois Mtodos para Criar uma Exceo

Ocorre um erro do Oracle e a exceo associada criada automaticamente. Por exemplo, se


ocorrer o erro ORA-01403 quando nenhuma linha for recuperada do banco de dados em uma
instruo SELECT, em seguida, o cdigo PL/SQL criar a exceo NO_DATA_FOUND.

Crie uma exceo explicitamente emitindo a instruo RAISE dentro do bloco. A exceo
criada pode ser definida ou predefinida pelo usurio.

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

Tratando Excees
Capturar a exceo

Propagar a exceo

DECLARE

DECLARE

BEGIN

BEGIN

EXCEPTION

EXCEPTION

END;

END;

A exceo
criada

A exceo
capturada

A exceo
criada

A exceo no
capturada
A exceo propaga
para o ambiente de
chamada

23-4

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Capturando uma Exceo


Se a exceo for criada na seo executvel do bloco, o processamento desviado para o handler de
exceo correspondente na seo de exceo do bloco. Se o cdigo PL/SQL tratar a exceo com
xito, a exceo no propagar para o ambiente ou bloco delimitado. O bloco PL/SQL concludo
com xito.
Propagando uma Exceo
Se a exceo for criada na seo executvel do bloco e no houver handler de exceo
correspondente, o bloco PL/SQL terminar com falha e a exceo ser propagada para o ambiente de
chamada.

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

Tipos de Exceo
Predefinida pelo Oracle Server
No predefinida pelo
Oracle Server
Definida pelo usurio

23-5

Criada
implicitamente

Criada explicitamente

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Tipos de Exceo
Voc pode programar excees a fim de evitar transtornos no tempo de execuo. H trs tipos de
excees.
Exceo

Descrio

Orientaes para Tratamento

Erro predefinido pelo


Oracle Server

Um dos cerca de 20 erros que


ocorrem com mais freqncia
no cdigo do PL/SQL

No declare e permita que o Oracle


Server crie as excees
implicitamente

Erro no predefinido
pelo Oracle Server

Qualquer outro erro padro do


Oracle Server

Declare dentro da seo declarativa e


permita que o Oracle Server crie as
excees de forma implcita

Erro definido pelo


usurio

Uma condio que o


desenvolvedor determina que
seja anormal.

Declare dentro da seo declarativa e


crie excees de forma explcita

Observao: Algumas ferramentas de aplicao com cdigo PL/SQL cliente, como o Oracle
Developer Forms, tm suas prprias excees.

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

Capturando Excees
Sintaxe
EXCEPTION
WHEN exceo1 [OR exceo2 . . .] THEN
instruo1;
instruo2;
. . .
[WHEN exceo3 [OR exceo4 . . .] THEN
instruo1;
instruo2;
. . .]
[WHEN OTHERS THEN
instruo1;
instruo2;
. . .]

23-6

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Capturando Excees
Voc pode capturar qualquer erro incluindo uma rotina correspondente dentro da seo de tratamento
de excees do bloco PL/SQL. Cada handler consiste em uma clusula WHEN, que especifica uma
exceo, seguida por uma seqncia de instrues a serem executadas quando essa exceo for
criada.
Na sintaxe:
exceo

o nome padro de uma exceo predefinida ou o nome de uma exceo


definida pelo usurio declarada na seo declarativa

instruo

uma ou mais instrues PL/SQL ou SQL

OTHERS

uma clusula de manipulao de exceo opcional que captura excees


no especificadas.

Handler de Exceo WHEN OTHERS


A seo de tratamento de exceo captura somente as excees especificadas; quaisquer outras
excees no sero capturadas exceto se voc usar o handler de exceo OTHERS. Esse handler
captura qualquer exceo que ainda no esteja tratada. Por essa razo, OTHERS o ltimo handler
de exceo definido.
O handler OTHERS captura todas as excees ainda no capturadas. Algumas ferramentas Oracle
tm suas prprias excees predefinidas que voc pode criar para provocar eventos na aplicao.
OTHERS tambm captura essas excees.
Introduo ao Oracle: SQL e PL/SQL 23-6

Diretrizes para a Captura


de Excees
WHEN OTHERS a ltima clusula.
A palavra-chave EXCEPTION inicia a seo
de tratamento de excees.
So permitidos vrios handlers de exceo.
Somente um handler processado antes de
se sair do bloco.

23-7

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Diretrizes

Inicie a seo de tratamento de excees do bloco com a palavra-chave EXCEPTION.

Defina vrios handlers de exceo para o bloco, cada um deles com o seu prprio conjunto
de aes.

Quando ocorre uma exceo, o cdigo PL/SQL processa somente um handler antes de sair
do bloco.

Coloque a clusula OTHERS aps todas as outras clusulas de tratamento de exceo.

Voc pode ter no mximo uma clusula OTHERS.

As excees no podem aparecer em instrues de atribuio ou instrues SQL.

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

Capturando Erros Predefinidos do


Oracle Server
Fazer referncia ao nome padro na rotina
de tratamento de exceo.
Excees predefinidas de exemplo:
NO_DATA_FOUND
TOO_MANY_ROWS
INVALID_CURSOR
ZERO_DIVIDE
DUP_VAL_ON_INDEX
23-8

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Capturando Erros Predefinidos do Oracle Server


Capture um erro predefinido do Oracle Server fazendo referncia ao seu nome padro dentro da
rotina de tratamento de exceo correspondente.
Para obter uma lista completa de excees predefinidas, consulte o PL/SQL Users Guide and
Reference, Release 8, "Error Handling".
Observao: O cdigo PL/SQL declara excees predefinidas no pacote STANDARD.
bom sempre levar em considerao as excees NO_DATA_FOUND e TOO_MANY_ROWS, que
so as mais comuns.

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

Excees Predefinidas

Nome da Exceo

Nmero
do Erro
do Oracle
Server

ACCESS_INTO_NULL

ORA-06530

Tentativa de atribuir valores aos atributos de um


objeto no inicializado

COLLECTION_IS_NULL

ORA-06531

Tentativa de aplicao de mtodos de conjunto


diferentes de EXISTS para um varray ou tabela
aninhada no inicializada

CURSOR_ALREADY_OPEN

ORA-06511

Tentativa de abertura de um cursor j aberto

DUP_VAL_ON_INDEX

ORA-00001

Tentativa de insero de um valor duplicado

INVALID_CURSOR

ORA-01001

Ocorreu operao ilegal de cursor

INVALID_NUMBER

ORA-01722

Falha da converso de string de caracteres para


nmero

LOGIN_DENIED

ORA-01017

Estabelecendo login com o Oracle com um


nome de usurio ou senha invlida

NO_DATA_FOUND

ORA-01403

SELECT de linha nica no retornou dados

NOT_LOGGED_ON

ORA-01012

O programa PL/SQL emite uma chamada de


banco de dados sem estar conectado ao Oracle

PROGRAM_ERROR

ORA-06501

O cdigo PL/SQL tem um problema interno

ROWTYPE_MISMATCH

ORA-06504

Varivel de cursor de host e varivel de cursor


PL/SQL envolvidas em uma atribuio tm
tipos de retorno incompatveis

STORAGE_ERROR

ORA-06500

O PL/SQL esgotou a memria ou a memria


est corrompida

SUBSCRIPT_BEYOND_COUNT

ORA-06533

Feita referncia ao elemento de varray ou tabela


aninhada usando um nmero de ndice maior do
que o nmero de elementos no conjunto

SUBSCRIPT_OUTSIDE_LIMIT

ORA-06532

Feita referncia a um elemento de varray ou


tabela aninhada usando um nmero de ndice
fora da faixa legal (1, por exemplo)

TIMEOUT_ON_RESOURCE

ORA-00051

Ocorreu timeout enquanto o Oracle est


aguardando por um recurso

TOO_MANY_ROWS

ORA-01422

SELECT de uma nica linha retornou mais de


uma linha

VALUE_ERROR

ORA-06502

Ocorreu erro aritmtico, de converso,


truncamento ou restrio de tamanho

ZERO_DIVIDE

ORA-01476

Tentativa de diviso por zero

Descrio

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

Exceo Predefinida
Sintaxe
BEGIN
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;
WHEN TOO_MANY_ROWS THEN
statement1;
WHEN OTHERS THEN
statement1;
statement2;
statement3;
END;

23-10

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Capturando Excees Predefinidas do Oracle Server


Somente uma exceo criada e tratada a qualquer momento.

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

Capturando Erros No
Predefinidos do Oracle Server

Declarar

Associar

Seo declarativa

Nomeie a
exceo

23-11

Referncia
Seo de tratamento
de exceo

Codifique o PRAGMA

Trate a

EXCEPTION_INIT

exceo
criada

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Capturando Erros No Predefinidos do Oracle Server


Voc captura um erro no predefinido do Oracle Server declarando-o primeiro ou usando o handler
OTHERS. A exceo declarada criada implicitamente. Em PL/SQL, o PRAGMA
EXCEPTION_INIT informa o compilador para associar um nome de exceo a um nmero de erro
do Oracle. Isso permite que voc consulte qualquer exceo interna por nome e crie um handler
especfico para ela.
Observao: PRAGMA (tambm chamado pseudo-instrues) uma palavra-chave que significa
que a instruo uma diretiva de compilador, que no processada ao executar o bloco PL/SQL.
Em vez disso, ela orienta o compilador do PL/SQL para interpretar todas as ocorrncias do nome da
exceo dentro do bloco como o nmero de erro do Oracle Server associado.

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

Erro No Predefinido
Capturar por nmero de erro do Oracle Server
2292, uma violao de restrio de integridade.
DECLARE
e_emps_remaining EXCEPTION;
EXCEPTION;
e_emps_remaining
PRAGMA
PRAGMA EXCEPTION_INIT
EXCEPTION_INIT ((
e_emps_remaining,-2292);
-2292);
e_emps_remaining,
v_deptno
dept.deptno%TYPE := &p_deptno;
BEGIN
DELETE FROM dept
WHERE
deptno = v_deptno;
COMMIT;
EXCEPTION
WHEN e_emps_remaining THEN
DBMS_OUTPUT.PUT_LINE ('Cannot remove dept ' ||
TO_CHAR(v_deptno) || '. Employees exist. ');
END;
23-12

1
2

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Capturando uma Exceo No Predefinida do Oracle Server


1. Declare o nome para a exceo na seo declarativa.
Sintaxe
exceo EXCEPTION;
onde:

exceo

o nome da exceo.

2. Associe a exceo declarada ao nmero de erro padro do Oracle Server usando a instruo
PRAGMA EXCEPTION_INIT.
Sintaxe
PRAGMA EXCEPTION_INIT(exceo, error_number);
onde:

exceo

a exceo declarada anteriormente.

error_number

um nmero de erro padro do Oracle Server.

3. Faa referncia exceo declarada dentro da rotina de tratamento de exceo correspondente.


Exemplo
Se existirem funcionrios em um departamento, imprima uma mensagem para o usurio informando
que esse departamento no pode ser removido.
Para obter mais informaes, consulte o Oracle Server Messages, Release 8.

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

Funes para Captura


de Excees
SQLCODE
Retorna o valor numrico do cdigo de erro
SQLERRM
Retorna a mensagem associada ao nmero
de erro

23-13

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes para Captura de Erro


Quando ocorre uma exceo, voc pode identificar o cdigo ou a mensagem de erro associado
usando duas funes. Com base nos valores do cdigo ou mensagem, voc pode decidir qual ao
subseqente tomar com base no erro.
SQLCODE retorna o nmero do erro do Oracle para excees internas. Voc pode passar um nmero
de erro para SQLERRM, que ento retorna a mensagem associada ao nmero do erro.
Funo

Descrio

SQLCODE

Retorna o valor numrico do cdigo de erro (Voc pode atribu-lo a


uma varivel NUMBER.)

SQLERRM

Retorna os dados de caracteres que contm a mensagem associada ao


nmero do erro

Exemplo de Valores SQLCODE


Valor SQLCODE

Descrio

Nenhuma exceo encontrada

Exceo definida pelo usurio

+100

Exceo NO_DATA_FOUND

nmero negativo

Outro nmero de erro do Oracle Server

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

Funes para Captura de Excees


Exemplo
DECLARE
v_error_code
v_error_message
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_code :=
v_error_message

NUMBER;
VARCHAR2(255);

SQLCODE ;
:= SQLERRM ;

INSERT INTO errors


VALUES(v_error_code, v_error_message);
END;
23-14

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Funes para Captura de Erro


Quando uma exceo capturada no handler de exceo WHEN OTHERS, voc pode usar um
conjunto de funes genricas para identificar esses erros.
O exemplo no slide ilustra os valores de SQLCODE e SQLERRM sendo atribudos a variveis e, em
seguida, essas variveis sendo usadas em uma instruo SQL.
Trunque o valor de SQLERRM para um tamanho conhecido antes de tentar grav-lo para uma
varivel.

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

Capturando Excees Definidas


pelo Usurio

Declarar

Criar

Referncia

Seo
declarativa

Seo
executvel

Seo de tratamento
de exceo

Nomeie a
exceo

23-15

Crie explicitamente

Trate a

a exceo usando a
instruo RAISE

exceo
criada

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Capturando Excees Definidas pelo Usurio


O PL/SQL permite que voc defina suas prprias excees. As excees PL/SQL definidas pelo
usurio devem ser:

Declaradas na seo de declarao de um bloco PL/SQL

Criadas explicitamente com instrues RAISE

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

Exceo Definida pelo Usurio


Exemplo
DECLARE
e_invalid_product EXCEPTION;
EXCEPTION;
BEGIN
UPDATE
product
SET
descrip = '&product_description'
WHERE
prodid = &product_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_product;
END IF;
COMMIT;
EXCEPTION
e_invalid_product THEN
WHEN e_invalid_product
DBMS_OUTPUT.PUT_LINE('Invalid product number.');
END;

23-16

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Capturando Excees Definidas pelo Usurio (continuao)


Voc captura uma exceo definida pelo usurio declarando e criando a exceo de forma explcita.
1. Declare o nome da exceo definida pelo usurio dentro da seo declarativa.
Sintaxe
EXCEPTION;
exceo
onde:
exceo
o nome da exceo
2. Use a instruo RAISE para criar a exceo explicitamente dentro da seo executvel.
Sintaxe
RAISE exceo;
onde:
exceo
a exceo declarada anteriormente
3. Faa referncia exceo declarada dentro da rotina de tratamento de exceo correspondente.
Exemplo
Esse bloco atualiza a descrio de um produto. O usurio fornece o nmero do produto e a nova
descrio. Se o usurio incluir um nmero de produto inexistente, nenhuma linha ser atualizada na
tabela PRODUCT. Crie uma exceo e imprima uma mensagem para o usurio alertando-os de que
foi includo um nmero de produto invlido.
Observao: Use a instruo RAISE sozinha em um handler de exceo para criar a mesma exceo
de volta no ambiente de chamada.

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

Ambientes de Chamada
SQL*Plus

Exibe a mensagem e o nmero do erro


na tela

Procedure
Builder

Exibe a mensagem e o nmero do erro


na tela

Oracle
Developer
Forms

Acessa a mensagem e o nmero do erro


em um gatilho por meio das funes
includas ERROR_CODE e ERROR_TEXT

Aplicao prcompiladora

Acessa nmero de exceo atravs


da estrutura de dados SQLCA

Um bloco
PL/SQL
delimitado

Captura a exceo em rotina de


tratamento de exceo de bloco
delimitado

23-17

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Propagando Excees
No lugar de capturar uma exceo dentro do bloco PL/SQL, propague a exceo para permitir que ela
seja tratada pelo ambiente de chamada. Cada ambiente de chamada tem seu prprio modo de exibir e
acessar erros.

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

Propagando Excees
DECLARE
. . .
e_no_rows
exception;
e_integrity
exception;
PRAGMA EXCEPTION_INIT (e_integrity, -2292);
BEGIN
FOR c_record IN emp_cursor LOOP

Os sub-blocos podem
tratar uma exceo ou
passar a exceo para
o bloco delimitado.

BEGIN
SELECT ...
UPDATE ...
IF SQL%NOTFOUND THEN
RAISE e_no_rows;
END IF;
EXCEPTION
WHEN e_integrity THEN ...
WHEN e_no_rows THEN ...
END;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN . . .
WHEN TOO_MANY_ROWS THEN . . .
END;

23-18

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Propagando uma Exceo para um Sub-bloco


Quando um sub-bloco trata uma exceo, ele termina normalmente e o controle retorna ao bloco
delimitado imediatamente aps a instruo END do sub-bloco.
Entretanto, se o cdigo PL/SQL criar uma exceo e o bloco atual no tiver um handler para essa
exceo, a exceo propagar em blocos delimitados sucessivos at localizar um handler. Se nenhum
desses blocos tratar a exceo, o resultado ser uma exceo no tratvel no ambiente de host.
Quando a exceo propaga para um bloco delimitado, as aes executveis restantes desse bloco so
ignoradas.
Uma vantagem desse comportamento que voc pode delimitar instrues que exigem seus prprios
tratamentos de erro exclusivos em seu prprio bloco, enquanto deixa o tratamento de exceo mais
geral para o bloco delimitado.

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

Procedimento
RAISE_APPLICATION_ERROR
Sintaxe
raise_application_error (error_number,
mensagem[, {TRUE | FALSE}]);

Um procedimento que permite que voc


emita mensagens de erro definidas pelo
usurio a partir de subprogramas
armazenados
Chamado somente a partir de um
subprograma armazenado em execuo
23-19

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Procedimento RAISE_APPLICATION_ERROR
Use o procedimento RAISE_APPLICATION_ERROR para comunicar uma exceo predefinida
interativamente retornando um cdigo ou uma mensagem de erro no padronizada. Com
RAISE_APPLICATION_ERROR, voc pode relatar erros para a aplicao e evitar o retorno de
excees no tratveis.
Na sintaxe:
error_number

um nmero especificado pelo usurio para a exceo entre 20000


e 20999.

mensagem

a mensagem especificada pelo usurio para a exceo. Trata-se de


uma string de caracteres com at 2.048 bytes.
um parmetro Booleano opcional (Se TRUE, o erro ser colocado
na pilha de erros anteriores. Se FALSE, o default, o erro substituir
todos os erros anteriores.)

TRUE | FALSE

Exemplo
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20201,
'Manager is not a valid employee.');
END;
Introduo ao Oracle: SQL e PL/SQL 23-19

Procedimento
RAISE_APPLICATION_ERROR
Usado em dois locais diferentes:
Seo executvel
Seo de exceo

Retorna condies de erro para o usurio


de maneira consistente com outros erros
do Oracle Server

23-20

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Exemplo
...
DELETE FROM emp
WHERE mgr = v_mgr;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20202,'This is not a valid manager');
END IF;
...

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

Sumrio
Tipos de Exceo:
Erro predefinido do Oracle Server
Erro no predefinido do Oracle Server
Erro definido pelo usurio
Captura de exceo
Tratamento de exceo:
Capturar a exceo dentro do bloco
PL/SQL.
Propagar a exceo.

23-21

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Sumrio
O cdigo PL/SQL implementa o tratamento de erros atravs de excees e handlers de exceo.
As excees predefinidas so condies de erro definidas pelo Oracle Server. As excees no
predefinidas so quaisquer outros erros padro do Oracle Server. As excees especficas da
aplicao ou que voc pode prever durante a criao da aplicao so excees definidas pelo
usurio.
Uma vez ocorrido o erro, (ao ser criada uma exceo) o controle transferido para a parte de
tratamento de excees do bloco PL/SQL. Se uma exceo associada estiver na parte de tratamento
de exceo, o cdigo especificado com o handler de exceo ser executado. Se no for localizado
um handler de exceo associado ao bloco atual e esse bloco estiver aninhado, o controle propagar
para o bloco externo, se houver. Se tambm no for localizado um handler de exceo nos blocos
externos, o cdigo PL/SQL relatar um erro.

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

Viso Geral do Exerccio


Tratando excees nomeadas
Criando e chamando excees definidas
pelo usurio

23-22

Copyright Oracle Corporation, 1999. Todos os direitos reservados.

Viso Geral do Exerccio


Neste exerccio, voc cria handlers de exceo para situaes especficas.

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

Exerccio 23
1. Crie um bloco PL/SQL para selecionar o nome do funcionrio com um determinado salrio.
a. Se o salrio informado retornar mais de uma linha, trate a exceo com um
handler de exceo apropriado e insira na tabela MESSAGES a mensagem "More than one
employee with a salary <salary>".
b. Se o salrio informado no retornar qualquer linha, trate a exceo com um
handler de exceo apropriado e insira na tabela MESSAGES a mensagem "No employee
with a salary of <salary>".
c. Se o salrio informado retornar somente uma linha, insira na tabela MESSAGES o
nome do funcionrio e o valor do salrio.
d. Trate quaisquer outras excees com um handler de exceo apropriado e insira na
tabela MESSAGES a mensagem "Some other error ocurred".
e. Teste o bloco para uma variedade de casos de teste.
RESULTS
-------------------------------------------SMITH - 800
More than one employee with a salary of 3000
No employee with a salary of 6000

2. Modifique o p18q3.sql para adicionar um handler de exceo.


a. Crie um handler de exceo para o erro passar uma mensagem ao usurio de que o
departamento especificado no existe.
b. Execute o bloco PL/SQL informando um departamento que no existe.
Please enter the department number: 50
Please enter the department location: HOUSTON
PL/SQL procedure successfully completed.
G_MESSAGE
-------------------------------------Department 50 is an invalid department

3. Crie um bloco PL/SQL que imprima o nmero de funcionrios que recebem mais ou menos
US$ 100 do salrio fornecido.
a. Se no houver funcionrio nessa faixa de salrio, imprima uma mensagem para o usurio
indicando que esse o caso. Use uma exceo para esse caso.
b. Se houver um ou mais funcionrios dentro dessa faixa, a mensagem dever indicar
quantos funcionrios esto naquela faixa salarial.
c. Trate quaisquer outras excees com um handler de exceo apropriado. A mensagem deve
indicar que ocorreu algum outro erro.

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

Exerccio 23 (continuao)
Please enter the salary: 800
PL/SQL procedure successfully completed.
G_MESSAGE
---------------------------------------------------------There is/are 1 employee(s) with a salary between 700 and 900
Please enter the salary: 3000
PL/SQL procedure successfully completed.
G_MESSAGE
---------------------------------------------------------There is/are 3 employee(s) with a salary between 2900 and 3100
Please enter the salary: 6000
PL/SQL procedure successfully completed.
G_MESSAGE
------------------------------------------------There is no employee salary between 5900 and 6100

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

A
Solues de Exerccios

Solues de Exerccios 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.
Falso
3. A instruo SELECT ser executada corretamente?
Verdadeiro
SQL> SELECT
2 FROM

ename, job, sal Salary


emp;

4. A instruo SELECT ser executada corretamente?


Verdadeiro
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;

A tabela EMP no contm uma coluna chamada salary. A coluna chamada sal.

O operador de multiplicao *, no x, como mostrado na linha 2.

O apelido ANNUAL SALARY no pode incluir espaos. O apelido deve ser


ANNUAL_SALARY ou estar entre aspas duplas.

Falta uma vrgula aps a coluna ENAME.

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


SQL> DESCRIBE dept
SQL> SELECT *
2 FROM
dept;

7. Mostre a estrutura da tabela EMP. Crie uma consulta para exibir o nome, o cargo, a data de
admisso e o nmero de cada funcionrio, com o nmero do funcionrio aparecendo
primeiro. Salve a instruo SQL em um arquivo nomeado p1q7.sql.
SQL> DESCRIBE emp
SQL> SELECT empno, ename, job, hiredate
2 FROM
emp;
SQL> SAVE p1q7.sql
Created file p1q7.sql

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

Solues de Exerccios 1 (continuao)


8. Execute a consulta no arquivo p1q7.sql.
SQL> START p1q7.sql

9. Crie uma consulta para exibir os cargos exclusivos a partir da tabela EMP.
SQL> SELECT DISTINCT job
2 FROM
emp;

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.
SQL>
1
2*
SQL>
SQL>
2i
3i

GET p1q7.sql
SELECT empno, ename, job, hiredate
FROM
emp
1 SELECT
empno "Emp #", ename "Employee",
i
job "Job", hiredate "Hire Date"

SQL> SAVE p1q7.sql REPLACE


Created file p1q7.sql
SQL> START p1q7.sql

11. Exiba o nome concatenado com o cargo, separado por uma vrgula e espao, e nomeie
a coluna Employee and Title.
SQL> SELECT
2 FROM

ename||', '||job "Employee and Title"


emp;

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

Solues de Exerccios 1 (continuao)


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.
SQL> SELECT empno || ',' || ename || ','|| job || ',' ||
2
mgr || ',' || hiredate || ',' || sal || ',' ||
3
comm || ',' || deptno THE_OUTPUT
4 FROM
emp;

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

Solues de Exerccios 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 nomeado p2q1.sql. Execute a consulta.
SQL> SELECT
2 FROM
3 WHERE

ename, sal
emp
sal > 2850;

SQL> SAVE p2q1.sql


Created file p2q1.sql

2. Crie uma consulta para exibir o nome do funcionrio e o nmero do departamento relativos ao
nmero de funcionrio 7566.
SQL> SELECT
2 FROM
3 WHERE

ename, deptno
emp
empno = 7566;

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.
SQL> EDIT p2q1.sql
SELECT
FROM
WHERE
/

ename, sal
emp
sal NOT BETWEEN 1500 AND 2850

SQL> START p2q3.sql

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.
SQL> SELECT
2 FROM
3 WHERE

ename, job, hiredate


emp
hiredate BETWEEN

TO_DATE('20-Feb-1981','DD-MON-YYYY') AND

TO_DATE('01-May-1981','DD-MON-YYYY')

ORDER BY hiredate;

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

Solues de Exerccios 2 (continuao)


5. Exiba o nome do funcionrio e o nmero do departamento de todos os funcionrios dos
departamentos 10 e 30 em ordem alfabtica de nome.
SQL>
2
3
4

SELECT
FROM
WHERE
ORDER BY

ename, deptno
emp
deptno IN (10, 30)
ename;

6. Modifique o arquivo p2q3.sql para listar o nome e o salrio dos funcionrios que recebem
mais que US$1.500 e trabalham no departamento 10 ou 30. Coloque um label nas colunas
Employee e Monthly Salary, respectivamente. Salve novamente a instruo SQL em um
arquivo nomeado p2q6.sql. Execute novamente a consulta.
SQL> EDIT p2q3.sql
SELECT
FROM
WHERE
AND
/

ename "Employee", sal "Monthly Salary"


emp
sal > 1500
deptno IN (10, 30)

SQL> START p2q6.sql

7. Exiba o nome e a data de admisso de todos os funcionrios admitidos em 1982.


SQL> SELECT
2 FROM
3 WHERE

ename, hiredate
emp
hiredate LIKE '%82';

8. Exiba o nome e o cargo de todos os funcionrios sem um gerente.


SQL> SELECT
2 FROM
3 WHERE

ename, job
emp
mgr IS NULL;

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


Classifique os dados em ordem decrescente de salrio e comisso.
SQL>
2
3
4

SELECT
FROM
WHERE
ORDER BY

ename, sal, comm


emp
comm IS NOT NULL
sal DESC, comm DESC;

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

Solues de Exerccios 2 (continuao)


Se voc tiver tempo, complete os exerccios abaixo.
10. Exiba os nomes de todos os funcionrios cuja terceira letra do nome seja A.
Observao: H dois sublinhados (_) antes de A na clusula WHERE.
SQL> SELECT
2 FROM
3 WHERE

ename
emp
ename LIKE '__A%';

11. Exiba os nomes de todos os funcionrios cujo nome tem duas letras L no departamento 30
ou cujo gerente seja 7782.
SQL>
2
3
4
5

SELECT
FROM
WHERE
AND
OR

ename
emp
ename LIKE '%L%L%'
deptno = 30
mgr = 7782;

Se voc quiser mais desafios, complete os exerccios a seguir.


12. Exiba o nome, o cargo e o salrio de todos os funcionrios cujo cargo seja Clerk ou Analyst e
cujo salrio seja diferente de US$1.000, US$3.000 ou US$5.000.
SQL>
2
3
4

SELECT
FROM
WHERE
AND

ename, job, sal


emp
job IN ('CLERK', 'ANALYST')
sal NOT IN (1000, 3000, 5000);

13. Modifique o arquivo p2q6.sql para exibir o nome, o salrio e a comisso de todos os
funcionrios cujo valor da comisso maior que o salrio acrescido por 10%. Execute
novamente a consulta. Salve novamente a consulta como p2q13.sql.
SQL> EDIT p2q6.sql
SELECT
ename "Employee", sal "Monthly Salary", comm
FROM
emp
WHERE
comm > sal * 1.1
/
SQL> START p2q13.sql

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

Solues de Exerccios 3
1. Crie uma consulta para exibir a data atual. Coloque um label na coluna Date.
SQL> SELECT sysdate "Date"
2 FROM
dual;

2. Exiba o nmero do funcionrio, o nome, o salrio e o aumento salarial de 15% expresso como
inteiro. Coloque um label na coluna New Salary. Salve a instruo SQL em um arquivo
nomeado p3q2.sql.
SQL> SELECT empno, ename, sal,
2
ROUND(sal * 1.15, 0) "New Salary"
3 FROM
emp;
SQL> SAVE p3q2.sql
Created file p3q2.sql

3. Execute a consulta no arquivo p3q2.sql.


SQL> START p3q2.sql

4. Modifique a consulta no arquivo p3q2.sql para adicionar uma coluna que subtrair o salrio
anterior do novo salrio. Coloque um label na coluna Increase. Execute novamente a consulta.
SQL> EDIT p3q2.sql
SELECT empno, ename, sal,
ROUND(sal * 1.15, 0) "New Salary",
ROUND(sal * 1.15, 0) - sal "Increase"
FROM
emp
/
SQL> START p3q2.sql

5. Exiba o nome do funcionrio, a data de admisso e a data de reviso do salrio, que a


primeira segunda-feira aps seis meses de servio. Coloque um label na coluna REVIEW.
Formate as datas para que sejam exibidas em formato semelhante a "Sunday, the Seventh of
September, 1981".
SQL> SELECT ename, hiredate,
2
TO_CHAR(NEXT_DAY(ADD_MONTHS(hiredate, 6),
3
'MONDAY'),
4
'fmDay, "the" Ddspth "of" Month, YYYY') REVIEW
5 FROM
emp;

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

Solues de Exerccios 3 (continuao)


6. Exiba o nome de cada funcionrio e calcule o nmero de meses entre a data atual e a data em
que o funcionrio foi admitido. Coloque um label na coluna MONTHS_WORKED. Ordene os
resultados pelo nmero de meses desde a data de admisso. Arredonde o nmero de meses para
o inteiro mais prximo.
SQL> SELECT
2
3 FROM
4 ORDER BY

ename, ROUND(MONTHS_BETWEEN
(SYSDATE, hiredate)) MONTHS_WORKED
emp
MONTHS_BETWEEN(SYSDATE, hiredate);

7. Crie uma consulta que produza as seguintes informaes para cada funcionrio:
<nome do funcionrio> earns <salrio> monthly but wants <salrio multiplicado por 3>.
Coloque um label na coluna Dream Salaries.
SQL> SELECT
2
3
4
5
6 FROM

ename || ' earns '


|| TO_CHAR(sal, 'fm$99,999.00')
|| ' monthly but wants '
|| TO_CHAR(sal * 3, 'fm$99,999.00')
|| '.' "Dream Salaries"
emp;

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.
SQL> SELECT
2
3 FROM

ename,
LPAD(sal, 15, '$') SALARY
emp;

9. Crie uma consulta que exibir o nome do funcionrio com a primeira letra em maiscula e
todas as outras letras em minsculas, alm do tamanho do nome, para todos os funcionrios
cujo nome comea por J, A ou M. Fornea um label apropriado para cada coluna.
SQL>
2
3
4
5
6

SELECT
FROM
WHERE
OR
OR

INITCAP(ename) "Name",
LENGTH(ename) "Length"
emp
ename LIKE 'J%'
ename LIKE 'M%'
ename LIKE 'A%';

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

Solues de Exerccios 3 (continuao)


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
Monday.
SQL> SELECT
2
3 FROM
4 ORDER BY

ename, hiredate,
TO_CHAR(hiredate, 'DAY') DAY
emp
TO_CHAR(hiredate - 1, 'd');

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.
SQL> SELECT
2
3 FROM

ename,
NVL(TO_CHAR(comm), 'No Commission') COMM
emp;

12. Crie uma consulta que exiba os nomes dos funcionrios e indique o valor dos 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.
SQL> SELECT
rpad(ename, 8) ||' '|| rpad(' ', sal/100+1, '*')
2
EMPLOYEE_AND_THEIR_SALARIES
3 FROM
emp
4 ORDER BY sal DESC;

13. Crie uma consulta que exiba a classe de todos os funcionrios com base no valor da coluna
JOB, de acordo com a tabela mostrada abaixo
JOB

GRADE

PRESIDENT

MANAGER

ANALYST

SALESMAN

CLERK

None of the above

SQL> SELECT job, decode (job,'CLERK',


2
'SALESMAN',
3
'ANALYST',
4
'MANAGER',
5
'PRESIDENT',
6
7 FROM emp;

'E',
'D',
'C',
'B',
'A',
'0')GRADE

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

Solues de Exerccios 4
1. Crie uma consulta para exibir o nome, o nmero do departamento e o nome do departamento
de todos os funcionrios.
SQL> SELECT
2 FROM
3 WHERE

e.ename, e.deptno, d.dname


emp e, dept d
e.deptno = d.deptno;

2. Crie uma lista nica de todos os cargos existentes no departamento 30. Inclua a localizao
do departamento 30 na sada.
SQL>
2
3
4

SELECT
FROM
WHERE
AND

DISTINCT e.job, d.loc


emp e, dept d
e.deptno = d.deptno
e.deptno = 30;

3. Crie uma consulta para exibir o nome do funcionrio, o nome do departamento e a


localizao de todos os funcionrios que recebem comisso.
SQL>
2
3
4

SELECT
FROM
WHERE
AND

e.ename, d.dname, d.loc


emp e, dept d
e.deptno = d.deptno
e.comm IS NOT NULL;

4. Exiba o nome do funcionrio e o nome do departamento de todos os funcionrios que tm A


no nome. Salve a instruo SQL no arquivo nomeado p4q4.sql.
SQL>
2
3
4

SELECT
FROM
WHERE
AND

e.ename, d.dname
emp e, dept d
e.deptno = d.deptno
e.ename LIKE '%A%';

5. Crie uma consulta para exibir o nome, o cargo, o nmero do departamento e o nome do
departamento de todos os funcionrios que trabalham em DALLAS.
SQL>
2
3
4

SELECT
FROM
WHERE
AND

e.ename, e.job, e.deptno, d.dname


emp e, dept d
e.deptno = d.deptno
d.loc = 'DALLAS';

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

Solues de Exerccios 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 chamado p4q6.sql.
SQL> SELECT
e.ename "Employee", e.empno "Emp#",
2
m.ename "Manager", m.empno "Mgr#"
3
FROM
emp e, emp m
4
WHERE
e.mgr = m.empno;
SQL> SAVE p4q6.sql
Created file p4q6.sql

7. Modifique o p4q6.sql para exibir todos os funcionrios incluindo King, que no possui um
gerente. Salve-o novamente como p4q7.sql. Execute o p4q7.sql.
SQL> EDIT p4q6.sql
SELECT e.ename
m.ename
FROM
emp e,
WHERE
e.mgr =
/
SQL> START p4q7.sql

"Employee", e.empno "Emp#",


"Manager", m.empno "Mgr#"
emp m
m.empno(+)

Se voc tiver tempo, complete os exerccios abaixo.


8. Crie uma consulta que exibir o nome do funcionrio, o nmero do departamento e todos os
funcionrios que trabalham no mesmo departamento que um determinado funcionrio. Fornea
a cada coluna um label apropriado.
SQL>
2
3
4
5
6

SELECT

e.deptno department, e.ename employee,


c.ename colleague
FROM
emp e, emp c
WHERE
e.deptno = c.deptno
AND
e.empno <> c.empno
ORDER BY e.deptno, e.ename, c.ename;

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

Solues de Exerccios 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.
SQL> DESCRIBE salgrade
SQL>
2
3
4

SELECT
FROM
WHERE
AND

e.ename, e.job, d.dname, e.sal, s.grade


emp e, dept d, salgrade s
e.deptno = d.deptno
e.sal BETWEEN s.losal AND s.hisal;

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.
SQL>
2
3
4

SELECT
FROM
WHERE
AND

emp.ename, emp.hiredate
emp, emp blake
blake.ename = 'BLAKE'
blake.hiredate < emp.hiredate;

11. Exiba os nomes e as datas de admisso de todos os funcionrios junto com o nome do gerente e
a data de admisso de todos os funcionrios admitidos antes dos respectivos gerentes. Coloque
um label nas colunas Employee, Emp Hiredate, Manager e Mgr Hiredate, respectivamente.
SQL>
2
3
4
5

SELECT e.ename "Employee", e.hiredate "Emp Hiredate",


m.ename "Manager", m.hiredate "Mgr Hiredate"
FROM
emp e, emp m
WHERE e.mgr = m.empno
AND
e.hiredate < m.hiredate;

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

Solues de Exerccios 5
Determine a validade das seguintes instrues. Marque Verdadeiro ou Falso.
1. As funes de grupo trabalham com vrias linhas para produzir um resultado.
Verdadeiro
2. As funes de grupo incluem nulos nos clculos.
Falso. As funes de grupo ignoram valores nulos. Se voc quiser incluir valores nulos,
use a funo NVL.
3. A clusula WHERE restringe as linhas antes da incluso em um clculo de grupo.
Verdadeiro
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.
SQL> SELECT
2
3
4
5 FROM

ROUND(MAX(sal),0)
ROUND(MIN(sal),0)
ROUND(SUM(sal),0)
ROUND(AVG(sal),0)
emp;

"Maximum",
"Minimum",
"Sum",
"Average"

SQL> SAVE p5q4.sql


Created file p5q4.sql

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.
SQL> EDIT p5q6.sql
SELECT
job, ROUND(MAX(sal),0) "Maximum",
ROUND(MIN(sal),0) "Minimum",
ROUND(SUM(sal),0) "Sum",
ROUND(AVG(sal),0) "Average"
FROM
emp
GROUP BY job
/
SQL> START p5q5.sql

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

Solues de Exerccios 5 (continuao)


6. Crie uma consulta para exibir o nmero de pessoas com o mesmo cargo.
SQL> SELECT
job, COUNT(*)
2 FROM
emp
3 GROUP BY job;

7. Determine o nmero de gerentes sem list-los. Coloque um label na coluna Number of


Managers.
SQL> SELECT
2 FROM

COUNT(DISTINCT mgr) "Number of Managers"


emp;

8. Crie uma consulta para exibir a diferena entre os maiores e menores salrios. Coloque um
label na coluna DIFFERENCE.
SQL> SELECT
2 FROM

MAX(sal) - MIN(sal) DIFFERENCE


emp;

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 qualquer grupo cujo
salrio mnimo seja menor que US$1.000. Classifique a sada em ordem decrescente de
salrio.
SQL>
2
3
4
5
6

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

mgr, MIN(sal)
emp
mgr IS NOT NULL
mgr
MIN(sal) > 1000
MIN(sal) DESC;

10. Crie uma consulta para exibir o nome do departamento, o nome da localizao, o nmero de
funcionrios e o salrio mdio de todos os funcionrios do departamento. Coloque um label
nas colunas dname, loc, Number of People e Salary, respectivamente. Arredonde o salrio
mdio para duas casas decimais apenas.
SQL>
2
3
4
5

SELECT

d.dname, d.loc, COUNT(*) "Number of People",


ROUND(AVG(sal),2) "Salary"
FROM
emp e, dept d
WHERE
e.deptno = d.deptno
GROUP BY d.dname, d.loc;

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

Solues de Exerccios 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.
SQL> SELECT COUNT(*) total,
2
SUM(DECODE(TO_CHAR(hiredate, 'YYYY'),
3
1980,1,0))"1980",
4
SUM(DECODE(TO_CHAR(hiredate, 'YYYY'),
5
1981,1,0))"1981",
6
SUM(DECODE(TO_CHAR(hiredate, 'YYYY'),
7
1982,1,0))"1982",
8
SUM(DECODE(TO_CHAR(hiredate, 'YYYY'),
9
1983,1,0))"1983"
10 FROM
emp;

12. Crie uma consulta de matriz para exibir o cargo, o salrio relativo a esse cargo com base no
nmero do departamento e o total dos salrios do cargo em todos os departamentos, fornecendo
um cabealho apropriado a cada coluna.
SQL> SELECT
2
3
4
5
6 FROM
7 GROUP BY

job "Job",
SUM(DECODE(deptno, 10, sal)) "Dept 10",
SUM(DECODE(deptno, 20, sal)) "Dept 20",
SUM(DECODE(deptno, 30, sal)) "Dept 30",
SUM(sal) "Total"
emp
job;

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

Solues de Exerccios 6
1. Crie uma consulta para exibir o nome do funcionrio e a data de admisso de todos os
funcionrios do mesmo departamento que Blake. Exclua Blake.
SQL>
2
3
4
5
6

SELECT
FROM
WHERE

AND

ename, hiredate
emp
deptno = (SELECT
FROM
WHERE
ename != 'BLAKE';

deptno
emp
ename = 'BLAKE')

2. Crie uma consulta para exibir o nmero e o nome de todos os funcionrios que recebem mais
que o salrio mdio. Classifique os resultados, por salrio, em ordem decrescente.
SQL>
2
3
4
5

SELECT
FROM
WHERE

empno, ename
emp
sal > (SELECT AVG(sal)
FROM emp)
ORDER BY sal DESC;

3. Crie uma consulta que exibir o nome e o nmero de todos os funcionrios que trabalham em
um departamento com qualquer funcionrio cujo nome contenha um T. Salve a instruo SQL
em um arquivo chamado p6q3.sql.
SQL> SELECT
2 FROM
3 WHERE
4
5

empno, ename
emp
deptno IN (SELECT
FROM
WHERE

deptno
emp
ename LIKE '%T%');

SQL> SAVE p6q3.sql


Created file p6q3.sql

4. Exiba o nome do funcionrio, o nmero do departamento e o cargo do funcionrio cuja


localizao do departamento seja Dallas.
SQL> SELECT
2 FROM
3 WHERE
4
5

ename, deptno, job


emp
deptno IN (SELECT
FROM
WHERE

deptno
dept
loc = 'DALLAS');

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

Solues de Exerccios 6 (continuao)


5. Exiba o nome e o salrio dos funcionrios que se reportam a King.
SQL> SELECT ename, sal
2 FROM emp
3 WHERE mgr = (SELECT empno
4
FROM
emp
5
WHERE
ename = 'KING');

6. Exiba o nmero do departamento, o nome e o cargo de todos os funcionrios do departamento


de Vendas.
SQL> SELECT deptno, ename, job
2 FROM
emp
3 WHERE deptno IN (SELECT deptno
4
FROM
dept
5
WHERE
dname = 'SALES');

Se voc tiver tempo, complete o exerccio abaixo:


7. Modifique p6q3.sql para exibir o nome, o nmero e o salrio de todos os funcionrios que
recebem mais que o salrio mdio e trabalham com qualquer funcionrio que tenha a letra T
no nome. Salve novamente como p6q7.sql. Execute novamente a consulta.
SQL> EDIT p6q3.sql
SELECT empno, ename, sal
FROM
emp
WHERE sal > (SELECT AVG(sal)
FROM emp)
AND deptno IN (SELECT deptno
FROM
emp
WHERE
ename LIKE '%T%')
/
SQL> START p6q7.sql

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

Solues de Exerccios 7
1. Crie uma consulta para exibir o nome, o nmero do departamento e o salrio de qualquer
funcionrio cujo nmero do departamento e o salrio correspondem ao nmero do
departamento e ao salrio de qualquer funcionrio que receba comisso.
SQL> SELECT
2 FROM
3 WHERE
4
5
6

ename, deptno, sal


emp
(sal, deptno) IN
(SELECT
FROM
WHERE

sal, deptno
emp
comm IS NOT NULL);

2. Exiba o nome, o nome do departamento e o salrio de qualquer funcionrio cujo salrio e a


comisso correspondam ao salrio e comisso de qualquer funcionrio localizado em Dallas.
SQL>
2
3
4
5
6
7
8

SELECT
FROM
WHERE
AND

ename, dname, sal


emp e, dept d
e.deptno = d.deptno
(sal, NVL(comm,0)) IN
(SELECT
FROM
WHERE
AND

sal, NVL(comm,0)
emp e, dept d
e.deptno = d.deptno
d.loc = 'DALLAS');

3. Crie uma consulta para exibir o nome, a data de admisso e o salrio de todos os funcionrios
que recebem o mesmo salrio e a mesma comisso que Scott.
SQL>
2
3
4
5
6
7

SELECT
FROM
WHERE

AND

ename, hiredate, sal


emp
(sal, NVL(comm,0)) IN
(SELECT
sal, NVL(comm,0)
FROM
emp
WHERE
ename = 'SCOTT')
ename != 'SCOTT';

4. Crie uma consulta para exibir os funcionrios que recebem um salrio maior que o salrio
de todos os escriturrios. Classifique os resultados sobre salrios do maior para o menor.
SQL>
2
3
4
5
6

SELECT
FROM
WHERE

ename, job, sal


emp
sal > ALL (SELECT sal
FROM
emp
WHERE job = 'CLERK')
ORDER BY sal DESC;

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

Solues de Exerccios 8
Determine se as instrues a seguir so verdadeiras ou falsas:
1. Uma varivel de substituio de "e" comercial nico pedida no mximo uma vez.
Falso
Entretanto, se for definida, a varivel de substituio de "e" comercial no ser
pedida. Na verdade, ela assumir o valor da varivel predefinida.
2. O comando ACCEPT um comando SQL.
Falso
O ACCEPT um comando SQL*Plus. Ele emitido no prompt SQL.
3. Crie um arquivo de script para exibir o nome, o cargo e a data de admisso de todos os
funcionrios admitidos em um intervalo especfico. Concatene o nome e o cargo, separados
por um espao e uma vrgula e coloque um label na coluna Employees. Solicite os dois
intervalos ao usurio usando o comando ACCEPT. Use o formato MM/DD/YYYY. Salve o
arquivo de script como p8q3.sql.
SET ECHO OFF
SET VERIFY OFF
ACCEPT low_date DATE FORMAT 'MM/DD/YYYY' PROMPT 'Please enter the low date range (''MM/DD/YYYY''): '
ACCEPT high_date DATE FORMAT 'MM/DD/YYYY' PROMPT 'Please enter the high date range (''MM/DD/YYYY''): '
COLUMN EMPLOYEES FORMAT A25
SELECT
ename ||', '|| job EMPLOYEES, hiredate
FROM
emp
WHERE
hiredate BETWEEN
TO_DATE('&low_date', 'MM/DD/YYYY')
AND TO_DATE('&high_date', 'MM/DD/YYYY')
/
UNDEFINE low_date
UNDEFINE high_date
COLUMN EMPLOYEES CLEAR
SET VERIFY ON
SET ECHO ON
SQL> START p8q3.sql;

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

Solues de Exerccios 8 (continuao)


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 que faam distino
entre maisculas e minsculas para a localizao do departamento. Salve o arquivo de script
como p8q4.sql.
SET ECHO OFF
SET VERIFY OFF
ACCEPT p_location PROMPT 'Please enter the location name: '
COLUMN ename HEADING "EMPLOYEE NAME" FORMAT A15
COLUMN dname HEADING "DEPARTMENT NAME" FORMAT A15
SELECT e.ename, e.job, d.dname
FROM
emp e, dept d
WHERE e.deptno = d.deptno
AND
LOWER(d.loc) LIKE LOWER('%&p_location%')
/
UNDEFINE p_location
COLUMN ename CLEAR
COLUMN dname CLEAR
SET VERIFY ON
SET ECHO ON
SQL> START p8q4.sql

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

Solues de Exerccios 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 todos os funcionrios de uma
determinada localizao. Pea a localizao ao usurio. Coloque um label nas colunas
DEPARTMENT NAME, EMPLOYEE NAME, START DATE, SALARY e ANNUAL
SALARY, posicionando os labels em vrias linhas. Salve novamente o script como
p8q5.sql.
SET ECHO OFF
SET FEEDBACK OFF
SET VERIFY OFF
BREAK ON dname
ACCEPT p_location PROMPT 'Please enter the location name: '
COLUMN dname HEADING "DEPARTMENT|NAME" FORMAT A15
COLUMN ename HEADING "EMPLOYEE|NAME" FORMAT A15
COLUMN hiredate HEADING "START|DATE" FORMAT A15
COLUMN sal HEADING "SALARY" FORMAT $99,990.00
COLUMN asal HEADING "ANNUAL|SALARY" FORMAT $99,990.00
SELECT
d.dname, e.ename, e.hiredate,
e.sal,
e.sal * 12 asal
FROM
emp e,
dept d
WHERE
e.deptno = d.deptno
AND
LOWER(d.loc) LIKE LOWER('%&p_location%')
ORDER BY dname
/
UNDEFINE p_location
COLUMN dname CLEAR
COLUMN ename CLEAR
COLUMN hiredate CLEAR
COLUMN sal CLEAR
COLUMN asal CLEAR
CLEAR BREAK
SET VERIFY ON
SET FEEDBACK ON
SET ECHO ON
SQL> START p8q5.sql

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

Solues de Exerccios 9
Insira os dados na tabela MY_EMPLOYEE.
1. Execute o script lab9_1.sql para elaborar a tabela MY_EMPLOYEE que ser usada para
o label.
SQL> START lab9_1.sql

2. Descreva a estrutura da tabela MY_EMPLOYEE para identificar os nomes de coluna.


SQL> DESCRIBE my_employee

3. Adicione a primeira linha de dados tabela MY_EMPLOYEE a partir dos dados de 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

SQL> INSERT INTO my_employee


2 VALUES (1, 'Patel', 'Ralph', 'rpatel', 795);

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.
SQL> INSERT INTO my_employee (id, last_name, first_name,
2
userid, salary)
3 VALUES (2, 'Dancs', 'Betty', 'bdancs', 860);

5. Confirme a adio tabela.


SQL> SELECT
2 FROM

*
my_employee;

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

Solues de Exerccios 9 (continuao)


6. Crie um script nomeado loademp.sql para acrescentar linhas tabela MY_EMPLOYEE
interativamente. Pea ao usurio o ID, 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 o ID do usurio.
SET ECHO OFF
SET VERIFY OFF
ACCEPT p_id PROMPT 'Please enter the employee number: '
ACCEPT p_first_name PROMPT 'Please enter the employee''s first name: '
ACCEPT p_last_name PROMPT 'Please enter the employee''s last name: '
ACCEPT p_salary PROMPT 'Please enter the employee''s salary:'
INSERT INTO
my_employee
VALUES
(&p_id, '&p_last_name', '&p_first_name',
lower(substr('&p_first_name', 1, 1) ||
substr('&p_last_name', 1, 7)), &p_salary)
/
SET VERIFY ON
SET ECHO ON

7. Preencha a tabela com as duas linhas de dados de exemplo a seguir, executando o script que
voc criou.
SQL> START loademp.sql
SQL> START loademp.sql

8. Confirme as adies tabela.


SQL> SELECT
2 FROM

*
my_employee;

9. Torne essas adies permanentes.


SQL> COMMIT;

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

Solues de Exerccios 9 (continuao)


Atualize e delete os dados da tabela MY_EMPLOYEE.
10. Altere o sobrenome do funcionrio 3 para Drexler.
SQL> UPDATE my_employee
2 SET
last_name = 'Drexler'
3 WHERE id = 3;

11. Altere o salrio de todos os funcionrios que ganham menos de 900 para 1000.
SQL> UPDATE my_employee
2 SET
salary = 1000
3 WHERE salary < 900;

12. Verifique as alteraes na tabela.


SQL> SELECT last_name, salary
2 FROM
my_employee;

13. Delete Betty Dancs da tabela MY_EMPLOYEE.


SQL>
2
3
4

DELETE
FROM
my_employee
WHERE last_name = 'Dancs'
AND
first_name = 'Betty';

14. Confirme as alteraes na tabela.


SQL> SELECT *
2 FROM
my_employee;

15. Faa um commit de todas as alteraes pendentes.


SQL> COMMIT;

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.
SQL> START loademp.sql

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

Solues de Exerccios 9 (continuao)


17. Confirme a adio tabela.
SQL> SELECT *
2 FROM
my_employee;

18. Marque um ponto intermedirio no processamento da transao.


SQL> SAVEPOINT a;

19. Esvazie a tabela inteira.


SQL> DELETE
2 FROM
my_employee;

20. Confirme se a tabela est vazia.


SQL> SELECT *
2 FROM
my_employee;

21. Descarte a operao DELETE mais recente sem descartar a operao INSERT anterior.
SQL> ROLLBACK TO SAVEPOINT a;

22. Confirme se a nova linha ainda est inalterada.


SQL> SELECT *
2 FROM
my_employee;

23. Torne a adio de dados permanente.


SQL> COMMIT;

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

Solues de Exerccios 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

SQL> EDIT p10q1.sql


CREATE TABLE department
(id NUMBER(7),
name VARCHAR2(25))
/
SQL> START p10q1.sql
SQL> DESCRIBE department

2. Preencha a tabela DEPARTMENT com os dados a partir da tabela DEPT. Inclua somente as
colunas necessrias.
SQL> INSERT INTO department
2 SELECT
deptno, dname
3 FROM
dept;

3. 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

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

Solues de Exerccios 10 (continuao)


CREATE TABLE employee
(id
NUMBER(7),
last_name
VARCHAR2(25),
first_name
VARCHAR2(25),
dept_id
NUMBER(7))
/
SQL> START p10q3.sql
SQL> DESCRIBE employee

4. Modifique a tabela EMPLOYEE para aceitar os sobrenomes longos dos funcionrios.


Confirme as modificaes.
SQL> ALTER TABLE employee
2 MODIFY (last_name
VARCHAR2(50));
SQL> DESCRIBE employee

5. Confirme se as tabelas DEPARTMENT e EMPLOYEE esto armazenadas no


dicionrio de dados. (Dica: USER_TABLES)
SQL> SELECT
2 FROM
3 WHERE

table_name
user_tables
table_name IN ('DEPARTMENT', 'EMPLOYEE');

6. Crie a tabela EMPLOYEE2 de acordo com a estrutura da tabela EMP. Inclua somente as
colunas EMPNO, ENAME e DEPTNO. Nomeie as colunas da nova tabela como ID,
LAST_NAME e DEPT_ID, respectivamente.
SQL> CREATE TABLE employee2 AS
2 SELECT
empno id, ename last_name, deptno dept_id
3 FROM
emp;

7. Elimine a tabela EMPLOYEE.


SQL> DROP TABLE

employee;

8. Renomeie a tabela EMPLOYEE2 para EMPLOYEE.


SQL> RENAME employee2 TO employee;

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

Solues de Exerccios 10 (continuao)


9. Adicione um comentrio s definies das tabelas DEPARTMENT e EMPLOYEE,
descrevendo as tabelas. Confirme as adies ao dicionrio de dados.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4

COMMENT ON TABLE employee IS 'Employee Information';


COMMENT ON TABLE department IS 'Department Information';
COLUMN table_name FORMAT A15
COLUMN table_type FORMAT A10
COLUMN comments FORMAT A40
SELECT *
FROM
user_tab_comments
WHERE table_name = 'DEPARTMENT'
OR
table_name = 'EMPLOYEE';

10. Elimine a coluna LAST_NAME da tabela EMPLOYEE. Confirme as modificaes,


verificando a descrio da tabela.
SQL>
2
SQL>

ALTER TABLE employee


DROP COLUMN LAST_NAME;
DESCRIBE employee

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 da tabela
EMPLOYEE2 como UNSUED. Confirme a modificao, verificando a descrio da tabela.
SQL>
2
3
4
SQL>
2
SQL>

CREATE TABLE
employee2 AS
SELECT empno id, ename last_name, deptno dept_id
FROM
emp
/
ALTER TABLE employee2
SET
UNUSED (dept_id);
DESCRIBE employee2;

12. Elimine todas as colunas UNUSED da tabela EMPLOYEE2. Confirme as modificaes,


verificando a descrio da tabela.
SQL>
2
SQL>

ALTER TABLE employee2


DROP UNUSED COLUMNS;
DESCRIBE employee2

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

Solues de Exerccios 11
1. Adicione uma restrio no nvel de tabela PRIMARY KEY tabela EMPLOYEE, usando a
coluna ID. A restrio deve ser ativada na criao.
SQL> ALTER TABLE
2 ADD CONSTRAINT

employee
employee_id_pk PRIMARY KEY (id);

2. Crie uma restrio PRIMARY KEY na tabela DEPARTMENT usando a coluna ID. A
restrio deve ser ativada na criao.
SQL> ALTER TABLE
2 ADD CONSTRAINT

department
department_id_pk PRIMARY KEY(id);

3. Adicione uma referncia chave estrangeira tabela EMPLOYEE para garantir que o
funcionrio no seja atribudo a um departamento inexistente.
SQL> ALTER TABLE
employee
2 ADD CONSTRAINT employee_dept_id_fk FOREIGN KEY (dept_id)
3
REFERENCES department(id);

4. Confirme se as restries foram adicionadas, consultando USER_CONSTRAINTS. Note os


tipos e nomes das restries. Salve o texto da instruo em um arquivo chamado
p11q4.sql.
SQL>
2
3
SQL>

SELECT
constraint_name, constraint_type
FROM
user_constraints
WHERE
table_name IN ('EMPLOYEE', 'DEPARTMENT');
SAVE p11q4.sql

5. Exiba os tipos e nomes de objeto na view do dicionrio de dados USER_OBJECTS para as


tabelas EMPLOYEE e DEPARTMENT. Voc pode desejar formatar as colunas para
torn-las mais legveis. Note que as novas tabelas e o novo ndice foram criados.
SQL>
SQL>
SQL>
2
3
4

COLUMN
COLUMN
SELECT
FROM
WHERE
OR

object_name FORMAT A30


object_type FORMAT A30
object_name, object_type
user_objects
object_name LIKE 'EMPLOYEE%'
object_name LIKE 'DEPARTMENT%';

Se voc tiver tempo, complete o exerccio abaixo:


6. Modifique a tabela EMPLOYEE. Adicione uma coluna SALARY do tipo de dados
NUMBER, preciso 7.
SQL> ALTER TABLE employee
2 ADD (salary NUMBER(7));

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

Solues de Exerccios 12
1. Crie uma view chamada EMP_VU com base no nmero de funcionrios, nome dos
funcionrios e nmero dos departamentos da tabela EMP. Altere o cabealho do nome do
funcionrio para EMPLOYEE.
SQL> CREATE VIEW emp_vu AS
2 SELECT
empno, ename employee, deptno
3 FROM
emp;

2. Exiba o contedo da view EMP_VU.


SQL> SELECT
2 FROM

*
emp_vu;

3. Selecione o texto e o nome da view no dicionrio de dados USER_VIEWS.


SQL>
SQL>
SQL>
2

COLUMN view_name FORMAT A30


COLUMN text FORMAT A50
SELECT
view_name, text
FROM
user_views;

4. Usando a view EMP_VU, informe uma consulta para exibir os nomes de todos os
funcionrios e nmeros dos departamentos.
SQL> SELECT
2 FROM

employee, deptno
emp_vu;

5. Crie uma view chamada DEPT20 que contenha o nmero e o nome do funcionrio e o nmero
do departamento de todos os funcionrios do departamento 20. Coloque um label nas colunas
da view EMPLOYEE_ID, EMPLOYEE e DEPARTMENT_ID. No permita que um
funcionrio seja reatribudo a outro departamento atravs da view.
SQL>
2
3
4
5
6

CREATE VIEW dept20 AS


SELECT
empno employee_id, ename employee,
deptno department_id
FROM
emp
WHERE
deptno = 20
WITH CHECK OPTION CONSTRAINT emp_dept_20;

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

Solues de Exerccios 12 (continuao)


6. Exiba a estrutura e o contedo da view DEPT20.
SQL> DESCRIBE dept20
SQL> SELECT *
2 FROM
dept20;

7. Tente reatribuir Smith ao departamento 30.


SQL> UPDATE dept20
2 SET
department_id = 30
3 WHERE employee = 'SMITH';

Se voc tiver tempo, complete o exerccio abaixo:


8. Crie uma view chamada SALARY_VU com base no nome do funcionrio, nome do
departamento, salrio e classe de salrio de todos os funcionrios. Coloque um label nas
colunas Employee, Department, Salary e Grade, respectivamente.
SQL>
2
3
4
5
6

CREATE VIEW salary_vu AS


SELECT ename employee, dname department,
sal
salary,
grade
FROM
emp e, dept d, salgrade s
WHERE e.deptno = d.deptno
AND
e.sal between s.losal and s.hisal;

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

Solues de Exerccios 13
1. Crie uma seqncia para ser usada como a coluna de chave primria da tabela
DEPARTMENT. A seqncia deve iniciar em 60 e ter um valor mximo de 200. O incremento
da seqncia deve ser de dez nmeros. Nomeie a seqncia DEPT_ID_SEQ.
SQL>
2
3
4

CREATE SEQUENCE dept_id_seq


START WITH 60
INCREMENT BY 10
MAXVALUE 200;

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.
SQL> EDIT p13q2.sql
SELECT
sequence_name, max_value,
increment_by, last_number
FROM
user_sequences
/
SQL> START p13q2.sql

3. Crie um script interativo para inserir uma linha na tabela DEPARTMENT. Nomeie o script
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 nomeados Education e Administration. Confirme as adies.
SQL> EDIT p13q3.sql
SET ECHO OFF
SET VERIFY OFF
ACCEPT name PROMPT 'Please enter the department name: '
INSERT INTO
department (id, name)
VALUES
(dept_id_seq.NEXTVAL, '&name')
/
SET VERIFY ON
SET ECHO ON
SQL> START p13q3.sql
SQL> SELECT
*
2 FROM
department;

4. Crie um ndice no-exclusivo na coluna de chave estrangeira (dept_id) na tabela EMPLOYEE.


SQL> CREATE INDEX employee_dept_id_idx ON employee (dept_id);

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

Solues de Exerccios 13 (continuao)


5. Exiba os ndices e as exclusividades existentes no dicionrio de dados para a tabela
EMPLOYEE. Salve a instruo em um script nomeado p13q5.sql.
SQL>
2
3
SQL>

SELECT index_name, table_name, uniqueness


FROM
user_indexes
WHERE table_name = 'EMPLOYEE';
SAVE p13q5.sql

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

Solues de Exerccios 14
1. Qual o privilgio que um usurio deve receber para efetuar login no Oracle Server? um
privilgio de objeto ou sistema?
O privilgio de sistema CREATE SESSION
2. Qual o privilgio que um usurio deve receber para criar tabelas?
O privilgio CREATE TABLE
3. Se voc criar uma tabela, quem poder passar privilgios para outros usurios sobre sua
tabela?
Voc ou qualquer pessoa qual tenha concedido esses privilgios usando WITH
GRANT OPTION.
4. Voc o DBA. Voc est criando muitos usurios que esto exigindo os mesmos privilgios
de sistema. O que faria para tornar seu trabalho mais fcil?
Crie uma funo que contenha os privilgios do sistema e conceda-a aos usurios
5. Que comando voc usa para alterar sua senha?
A instruo ALTER USER
6. Conceda acesso tabela DEPT a outro usurio. Faa com que o usurio conceda a voc o
acesso de consulta tabela dele.
A equipe 2 executa a instruo GRANT.
SQL> GRANT
2 ON
3 TO

select
dept
<usurio1>;

A equipe 1 executa a instruo GRANT.


SQL> GRANT
2 ON
3 TO

select
dept
<usurio2>;

WHERE usurio1 is the name of team 1 and usurio2 is the name


of team 2.

7. Consulte todas as linhas na tabela DEPT.


SQL> SELECT
2 FROM

*
dept;

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

Solues de Exerccios 14 (continuao)


8. Adicione uma nova linha tabela DEPT. A equipe 1 deve adicionar Education como o
departamento nmero 50. A equipe 2 deve adicionar Administration como o departamento
nmero 50. Torne as alteraes permanentes.
A equipe 1 executa esta instruo INSERT.
SQL> INSERT INTO dept(deptno, dname)
2 VALUES (50, 'Education');
SQL> COMMIT;

A equipe 2 executa esta instruo INSERT.


SQL> INSERT INTO dept(deptno, dname)
2 VALUES (50, 'Administration');
SQL> COMMIT;

9. Crie um sinnimo para a tabela DEPT da outra equipe.


A equipe 1 cria um sinnimo chamado team2.
SQL> CREATE SYNONYM team2
2 FOR <usurio2>.DEPT;

A equipe 2 cria um sinnimo chamado team1.


SQL> CREATE SYNONYM team1
2 FOR <usurio1>.DEPT;

10. Consulte todas as linhas na tabela DEPT da outra equipe, usando o sinnimo.
A equipe 1 executa esta instruo SELECT.
SQL> SELECT *
2 FROM
team2;
A equipe 2 executa esta instruo SELECT.
SQL> SELECT *
2 FROM
team1;

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

Solues de Exerccios 14 (continuao)


11. Consulte o dicionrio de dados USER_TABLES para ver as informaes sobre as tabelas que
voc possui.
SQL> SELECT table_name
2 FROM
user_tables;

12. Consulte a view do dicionrio de dados ALL_TABLES para ver as informaes sobre todas as
tabelas que voc pode acessar. Exclua as tabelas que pertencem a voc.
SQL> SELECT table_name, owner
2 FROM
all_tables
3 WHERE owner != <sua conta>;

13. Revogue o privilgio SELECT da outra equipe.


A equipe 1 revoga o privilgio.
SQL> REVOKE select
2 ON
dept
3 FROM
usurio2;

A equipe 2 revoga o privilgio.


SQL> REVOKE select
2 ON
dept
3 FROM
usurio1;

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

Solues de Exerccios 15
1. Crie as tabelas de acordo com as tabelas de exemplo a seguir. Escolha os tipos de dados
apropriados e certifique-se de adicionar restries de integridade.
a. Nome da tabela: MEMBER
Column_
Name

MEMBER_
ID

Key
Type

PK

Null/
Unique

NN,U

LAST_
NAME

FIRST_
NAME

ADDRESS

CITY

PHONE

NN

JOIN_
DATE

NN

System
Date

Default
Value
Datatype

Number

VARCHAR2

VARCHAR2

VARCHAR2

VARCHAR2

VARCHAR2

Length

10

25

25

100

30

15

CREATE TABLE member


(member_id
last_name
first_name
address
city
phone
join_date

NUMBER(10)
CONSTRAINT member_member_id_pk PRIMARY KEY,
VARCHAR2(25)
CONSTRAINT member_last_name_nn NOT NULL,
VARCHAR2(25),
VARCHAR2(100),
VARCHAR2(30),
VARCHAR2(15),
DATE DEFAULT SYSDATE
CONSTRAINT member_join_date_nn NOT NULL);

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

Date

Solues de Exerccios 15 (continuao)


b. Nome da tabela: TITLE
Column_
Name

TITLE_
ID

Key
Type

PK

Null/
Unique

NN,U

TITLE

DESCRIPTION

NN

NN

RATING

CATEGORY

RELEASE_
DATE

G, PG, R,
NC17, NR

Date

Datatype

Number

VARCHAR2

VARCHAR2

VARCHAR2

DRAMA,
COMEDY,
ACTION,
CHILD,
SCIFI,
DOCUMEN
TARY
VARCHAR2

Length

10

60

400

20

Check

CREATE TABLE title


(title_id
NUMBER(10)
CONSTRAINT title_title_id_pk PRIMARY KEY,
title
VARCHAR2(60)
CONSTRAINT title_title_nn NOT NULL,
description VARCHAR2(400)
CONSTRAINT title_description_nn NOT NULL,
rating
VARCHAR2(4)
CONSTRAINT title_rating_ck CHECK
(rating IN ('G', 'PG', 'R', 'NC17', 'NR')),
category
VARCHAR2(20),
CONSTRAINT title_category_ck CHECK
(category IN ('DRAMA', 'COMEDY', 'ACTION',
'CHILD', 'SCIFI', 'DOCUMENTARY')),
release_date
DATE);

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

Solues de Exerccios 15 (continuao)


c. Nome da tabela: TITLE_COPY

Column Name

COPY_ID

TITLE_ID

Key Type

PK

PK,FK

Null/Unique

NN,U

NN,U

STATUS

NN
AVAILABLE,
DESTROYED,
RENTED,
RESERVED

Check

FK Ref Table

TITLE

FK Ref Col

TITLE_ID

Datatype

Number

Number

VARCHAR2

Length

10

10

15

CREATE TABLE title_copy


(copy_id
NUMBER(10),
title_id
NUMBER(10)
CONSTRAINT title_copy_title_if_fk REFERENCES title(title_id),
status
VARCHAR2(15)
CONSTRAINT title_copy_status_nn NOT NULL
CONSTRAINT title_copy_status_ck CHECK (status IN
('AVAILABLE', 'DESTROYED','RENTED', 'RESERVED')),
CONSTRAINT title_copy_copy_id_title_id_pk
PRIMARY KEY (copy_id, title_id));

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

Solues de Exerccios 15 (continuao)


d. Nome da tabela: RENTAL
Column
Name

BOOK_
DATE

MEMBER_
ID

COPY_
ID

Key
Type

PK

PK,FK1

PK,FK2

Default
Value

System
Date

ACT_RET_
DATE

EXP_RET_
DATE

TITLE_ID
PK,FK2

2 days after
book date

FK Ref
Table

MEMBER

TITLE_
COPY

TITLE_
COPY

FK Ref
Col

MEMBER_
ID

COPY_ID

TITLE_ID

Number

Number

10

10

Datatype
Length

Date

Date

Date

Number
10

CREATE TABLE rental


(book_date
DATE DEFAULT SYSDATE,
member_id
NUMBER(10)
CONSTRAINT rental_member_id_fk
REFERENCES member(member_id),
copy_id
NUMBER(10),
act_ret_date DATE,
exp_ret_date DATE DEFAULT SYSDATE + 2,
title_id
NUMBER(10),
CONSTRAINT rental_book_date_copy_title_pk
PRIMARY KEY (book_date, member_id,
copy_id,title_id),
CONSTRAINT rental_copy_id_title_id_fk
FOREIGN KEY (copy_id, title_id)
REFERENCES title_copy(copy_id, title_id));

Introduo ao Oracle: SQL e PL/SQL A-41

Solues de Exerccios 15 (continuao)


e. Nome da tabela: RESERVATION
Column_Name

RES_DATE

MEMBER_ID

TITLE_ID

Key
Type

PK

PK,FK1

PK,FK2

Null/
Unique

NN,U

NN,U

NN

FK Ref
Table

MEMBER

TITLE

FK Ref
Column

MEMBER_ID

TITLE_ID

Number

Number

10

10

Datatype
Length

Date

CREATE TABLE reservation


(res_date
DATE,
member_id NUMBER(10)
CONSTRAINT reservation_member_id
REFERENCES member(member_id),
title_id
NUMBER(10)
CONSTRAINT reservation_title_id
REFERENCES title(title_id),
CONSTRAINT reservation_resdate_mem_tit_pk PRIMARY KEY
(res_date, member_id, title_id));

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

Solues de Exerccios 15 (continuao)


2. Verifique se as tabelas e as restries foram criadas adequadamente, verificando o dicionrio
de dados.
SQL> SELECT
2 FROM
3 WHERE
4

table_name
user_tables
table_name IN ('MEMBER', 'TITLE', 'TITLE_COPY',
'RENTAL', 'RESERVATION');

SQL> COLUMN
SQL> COLUMN
SQL> SELECT
2
3
FROM
4
WHERE
5

constraint_name FORMAT A30


table_name FORMAT A15
constraint_name, constraint_type,
table_name
user_constraints
table_name IN ('MEMBER', 'TITLE', 'TITLE_COPY',
'RENTAL', 'RESERVATION');

3. Crie seqncias para identificar exclusivamente cada linha das tabelas MEMBER e TITLE.
a. Nmero de membro para tabela MEMBER: inicie com 101; no permita o armazenamento
em cache dos valores. Nomeie a seqncia member_id_seq.
SQL> CREATE SEQUENCE member_id_seq
2 START WITH 101
3 NOCACHE;

b. Nmero de ttulo para a tabela TITLE: inicie com 92; no permita o armazenamento em
cache. Nomeie a seqncia title_id_seq.
SQL> CREATE SEQUENCE title_id_seq
2 START WITH 92
3 NOCACHE;

c. Verifique a existncia das seqncias no dicionrio de dados.


SQL> SELECT
2 FROM
3 WHERE
4

sequence_name, increment_by, last_number


user_sequences
sequence_name IN ('MEMBER_ID_SEQ',
'TITLE_ID_SEQ');

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

Solues de Exerccios 15 (continuao)


4. Adicione dados s tabelas. Crie um script para cada conjunto de dados a adicionar.
a. Adicione ttulos de filmes tabela TITLE. Crie um script para fornecer as informaes sobre
os filmes. Salve o script como p15q4a.sql. Use as seqncias para identificar
exclusivamente cada ttulo. Informe as datas de lanamento no formato DD-MON-YYYY.
Lembre-se que as aspas simples em um campo de caracteres devem ser tratadas de forma
especial. Verifique as adies.
SQL> EDIT p15q4a.sql
SET ECHO OFF
INSERT INTO title(title_id, title, description, rating,
category, release_date)
VALUES (title_id_seq.NEXTVAL, 'Willie and Christmas Too',
'All of Willie''s friends make a Christmas list for
Santa, but Willie has yet to add his own wish list.',
'G', 'CHILD', TO_DATE('05-OCT-1995','DD-MON-YYYY')
/
INSERT INTO title(title_id , title, description, rating,
category, release_date)
VALUES (title_id_seq.NEXTVAL, 'Alien Again', 'Yet another
installment of science fiction history. Can the
heroine save the planet from the alien life form?',
'R', 'SCIFI', TO_DATE( '19-MAY-1995','DD-MON-YYYY'))
/
INSERT INTO title(title_id, title, description, rating,
category, release_date)
VALUES (title_id_seq.NEXTVAL, 'The Glob', 'A meteor crashes
near a small American town and unleashes carnivorous
goo in this classic.', 'NR', 'SCIFI',
TO_DATE( '12-AUG-1995','DD-MON-YYYY'))
/
INSERT INTO title(title_id, title, description, rating,
category, release_date)
VALUES (title_id_seq.NEXTVAL, 'My Day Off', 'With a little
luck and a lot ingenuity, a teenager skips school for
a day in New York.', 'PG', 'COMEDY',
TO_DATE( '12-JUL-1995','DD-MON-YYYY'))
/
...
COMMIT
/
SET ECHO ON
SQL> SELECT
2 FROM

title
title;

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

Solues de Exerccios 15 (continuao)


Title

Description

Rating

Category

Release_date

Willie and
Christmas
Too

All of Willies friends


make a Christmas list for
Santa, but Willie has yet to
add his own wish list.

CHILD

05-OCT-1995

Alien Again

Yet another installation of


science fiction history. Can
the heroine save the planet
from the alien life form?

SCIFI

19-MAY-1995

The Glob

A meteor crashes near a


small American town and
unleashes carnivorous goo
in this classic.

NR

SCIFI

12-AUG-1995

My Day Off

With a little luck and a lot


of ingenuity, a teenager
skips school for a day in
New York

PG

COMEDY

12-JUL-1995

Miracles on
Ice

A six-year-old has doubts


about Santa Claus, but she
discovers that miracles
really do exist.

PG

DRAMA

12-SEP-1995

Soda Gang

After discovering a cache


of drugs, a young couple
find themselves pitted
against a vicious gang.

NR

ACTION

01-JUN-1995

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

Solues de Exerccios 15 (continuao)


b. Adicione dados tabela MEMBER. Crie um script nomeado p15q4b.sql para pedir
informaes aos usurios. Execute o script. Certifique-se de usar a seqncia para
adicionar os nmeros dos membros.
First_
Name

Last_Name

Address

City

Phone

Join_Date

Carmen

Velasquez

283 King Street

Seattle

206-899-6666

08-MAR-1990

LaDoris

Ngao

5 Modrany

Bratislava

586-355-8882

08-MAR-1990

Midori

Nagayama

68 Via Centrale

Sao Paolo

254-852-5764

17-JUN-1991

Mark

Quick-toSee

6921 King
Way

Lagos

63-559-7777

07-APR-1990

Audry

Ropeburn

86 Chu Street

Hong Kong

41-559-87

18-JAN-1991

Molly

Urguhart

3035 Laurier

Quebec

418-542-9988

18-JAN-1991

SQL> EDIT p15q4b.sql


SET ECHO OFF
SET VERIFY OFF
INSERT INTO member(member_id, first_name, last_name, address,
city, phone, join_date)
VALUES (member_id_seq.NEXTVAL, '&first_name', '&last_name',
'&address', '&city', '&phone', TO_DATE('&join_date',
'DD-MM-YYYY')
/
COMMIT
/
SET VERIFY ON
SET ECHO ON
SQL> START p15q4b.sql

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

Solues de Exerccios 15 (continuao)


c. Adicione as seguintes cpias de filmes tabela TITLE_COPY:
Observao: Obtenha os nmeros de title_id para este exerccio.
Title
Copy_Id
Willie and Christmas Too 1
Alien Again
1
2
The Glob
1
My Day Off
1
2
3
Miracles on Ice
1
Soda Gang
1
SQL>
2
SQL>
2
SQL>
2
SQL>
2
SQL>
2

INSERT
VALUES
INSERT
VALUES
INSERT
VALUES
INSERT
VALUES
INSERT
VALUES

Status
AVAILABLE
AVAILABLE
RENTED
AVAILABLE
AVAILABLE
AVAILABLE
RENTED
AVAILABLE
AVAILABLE

INTO title_copy(copy_id,
(1, 92, 'AVAILABLE');
INTO title_copy(copy_id,
(1, 93, 'AVAILABLE');
INTO title_copy(copy_id,
(2, 93, 'RENTED');
INTO title_copy(copy_id,
(1, 94, 'AVAILABLE');
INTO title_copy(copy_id,
(1, 95, 'AVAILABLE');

title_id, status)
title_id, status)
title_id, status)
title_id, status)
title_id, status)

SQL> INSERT INTO title_copy(copy_id, title_id,status)


2 VALUES (2, 95, 'AVAILABLE');
SQL> INSERT INTO title_copy(copy_id, title_id,status)
2 VALUES (3, 95, 'RENTED');
SQL> INSERT INTO title_copy(copy_id, title_id,status)
2 VALUES (1, 96, 'AVAILABLE');
SQL> INSERT INTO title_copy(copy_id, title_id,status)
2 VALUES (1, 97, 'AVAILABLE');

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

Solues de Exerccios 15 (continuao)


d. Adicione os seguintes aluguis tabela RENTAL:
Observao: O nmero do ttulo pode ser diferente, dependendo do nmero da seqncia.
Title_
Id

Copy_
Id

Member_
Id

Book_date

Exp_Ret_Date

Act_Ret_Date

92

101

3 days ago

1 day ago

2 days ago

93

101

1 day ago

1 day from now

95

102

2 days ago

Today

97

106

4 days ago

2 days ago

2 days ago

SQL> INSERT INTO rental(title_id, copy_id, member_id,


2
book_date, exp_ret_date, act_ret_date)
3 VALUES (92, 1, 101, sysdate-3, sysdate-1, sysdate-2);
SQL> INSERT INTO rental(title_id, copy_id, member_id,
2
book_date, exp_ret_date, act_ret_date)
3

VALUES (93, 2, 101, sysdate-1, sysdate-1, NULL);

SQL> INSERT INTO rental(title_id, copy_id, member_id,


2
book_date, exp_ret_date, act_ret_date)
3 VALUES (95, 3, 102, sysdate-2, sysdate, NULL);
SQL> INSERT INTO rental(title_id, copy_id, member_id,
2
book_date, exp_ret_date,act_ret_date)
3 VALUES (97, 1, 106, sysdate-4, sysdate-2, sysdate-2);
SQL> COMMIT;

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

Solues de Exerccios 15 (continuao)


5. Crie uma view nomeada TITLE_AVAIL para mostrar os ttulos dos filmes e a disponibilidade de
cada cpia e a data esperada de devoluo, caso esteja alugado. Consulte todas as linhas da view.
Ordene os resultados por ttulo.
SQL> CREATE VIEW title_avail AS
2
SELECT
t.title, c.copy_id, c.status, r.exp_ret_date
3
FROM
title t, title_copy c, rental r
4
WHERE
t.title_id = c.title_id
5
AND
c.copy_id = r.copy_id(+)
6
AND
c.title_id = r.title_id(+);
SQL> COLUMN title FORMAT A30
SQL>
2
3

SELECT
FROM
ORDER BY

*
title_avail
title, copy_id;

6. Faa alteraes nos dados das tabelas.


a. Adicione um novo ttulo. O filme "Interstellar Wars", classificado como PG e
filme de fico cientfica. O lanamento 07-JUL-77. A descrio "Futuristic interstellar
action movie. Can the rebels save the humans from the evil empire?" Certifique-se de
adicionar um registro de cpia do ttulo para duas cpias.
INSERT INTO title(title_id, title, description, rating,
category, release_date)
VALUES (title_id_seq.NEXTVAL, 'Interstellar Wars',
'Futuristic interstellar action movie. Can the
rebels save the humans from the evil Empire?',
'PG', 'SCIFI', '07-JUL-77')
/
INSERT INTO title_copy (copy_id, title_id, status)
VALUES (1, 98, 'AVAILABLE')
/
INSERT INTO title_copy (copy_id, title_id, status)
VALUES (2, 98, 'AVAILABLE')
/

b. Informe duas reservas. Uma reserva para Carmen Velasquez, que deseja alugar
"Interstellar Wars". Outra para Mark Quick-to-See, que deseja alugar "Soda Gang".
SQL>
2
SQL>
2

INSERT
VALUES
INSERT
VALUES

INTO reservation (res_date, member_id, title_id)


(SYSDATE, 101, 98);
INTO reservation (res_date, member_id, title_id)
(SYSDATE, 104, 97);

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

Solues de Exerccios 15 (continuao)


c. A cliente Carmen Velasquez aluga o filme "Interstellar Wars", cpia 1. Remova sua
reserva do filme. Registre as informaes sobre o aluguel. Use o valor padro para a data
de devoluo esperada. Verifique se o aluguel foi registrado usando a view criada.
SQL>
2
SQL>
2
3
4
SQL>
2
3

INSERT INTO rental(title_id, copy_id, member_id)


VALUES (98,1,101);
UPDATE
title_copy
SET
status= 'RENTED'
WHERE
title_id = 98
AND
copy_id = 1;
DELETE
FROM
reservation
WHERE
member_id = 101;

SQL> SELECT
2 FROM
3 ORDER BY

*
title_avail
title, copy_id;

7. Faa uma modificao em uma das tabelas.


a. Adicione uma coluna PRICE tabela TITLE para registrar o preo de compra do vdeo.
A coluna deve ter um comprimento total de oito dgitos e duas casas decimais. Verifique
as modificaes.
SQL> ALTER TABLE title
2 ADD
(price NUMBER(8,2));
SQL> DESCRIBE
title

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

Solues de Exerccios 15 (continuao)


b. Crie um script chamado p15q7b.sql para atualizar o preo de cada vdeo de acordo
com a lista a seguir.
Observao: Obtenha os nmeros de title_id para este exerccio.
Title

Price

Willie and Christmas Too


Alien Again
The Glob
My Day Off
Miracles on Ice
Soda Gang
Interstellar Wars

25
35
35
35
30
35
29

SET ECHO OFF


SET VERIFY OFF
UPDATE
title
SET
price = &price
WHERE
title_id = &title_id
/
SET VERIFY OFF
SET ECHO OFF
SQL> START p15q7b.sql

c. Certifique-se de que, no futuro, todos os ttulos contero um valor de preo. Verifique


a restrio.
SQL>
2
SQL>
2
3
4

ALTER TABLE title


MODIFY (price CONSTRAINT title_price_nn NOT NULL);
SELECT
constraint_name, constraint_type,
search_condition
FROM
user_constraints
WHERE
table_name = 'TITLE';

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

Solues de Exerccios 15 (continuao)


8. Crie um relatrio intitulado Customer History Report. Esse relatrio conter o histrico de
aluguel de vdeos de cada cliente. Certifique-se de incluir o nome do cliente, o filme alugado,
as datas de retirada e durao dos aluguis. Some o nmero de aluguis de todos os clientes
durante o perodo do relatrio. Salve o script em um arquivo nomeado p15q8.sql.
SQL> EDIT p15q8.sql
SET ECHO OFF
SET VERIFY OFF
SET PAGESIZE 30
COLUMN
member FORMAT A17
COLUMN
title FORMAT A25
COLUMN
book_date FORMAT A9
COLUMN
duration FORMAT 9999999
TTITLE 'Customer History Report'
BREAK ON member SKIP 1 ON REPORT
SELECT
m.first_name||' '||m.last_name MEMBER, t.title,
r.book_date, r.act_ret_date - r.book_date DURATION
FROM
member m, title t, rental r
WHERE
r.member_id = m.member_id
AND
r.title_id = t.title_id
ORDER BY
member
/
CLEAR BREAK
COLUMN member CLEAR
COLUMN title CLEAR
COLUMN book_date CLEAR
COLUMN duration CLEAR
TTITLE OFF
SET VERIFY ON
SET PAGESIZE 24
SET ECHO ON

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

Solues de Exerccios 16
1. Avalie cada uma das declaraes a seguir. Determine quais delas no so legais e explique
por qu.
a. DECLARE
v_id

NUMBER(4);

Legal
b. DECLARE
v_x, v_y, v_z VARCHAR2(10);
Ilegal pois permitido apenas um identificador por declarao
c. DECLARE
v_birthdate

DATE NOT NULL;

Ilegal pois a varivel NOT NULL deve ser inicializada


d. DECLARE
v_in_stock

BOOLEAN := 1;

Ilegal pois 1 no uma expresso Booleana

Introduo ao Oracle: SQL e PL/SQL A-53

Solues de Exerccios 16 (continuao)


2. Em cada uma das seguintes atribuies, determine o tipo de dados da expresso resultante.
a. v_days_to_go

:= v_due_date - SYSDATE;

Nmero
b. v_sender

:= USER || ': ' || TO_CHAR(v_dept_no);

String de caracteres
c. v_sum

:= $100,000 + $250,000;

Ilegal; o PL/SQL no consegue converter smbolos especiais como VARCHAR2 em


NMEROS
d. v_flag

:= TRUE;

Booleano
e. v_n1

:= v_n2 > (2 * v_n3);

Booleano
f.

v_value

:= NULL;

Qualquer tipo de dados escalares


3. Crie um bloco annimo para a sada da frase "My PL/SQL Block Works" na tela.
VARIABLE g_message VARCHAR2(30)
BEGIN
:g_message := 'My PL/SQL Block Works';
END;
/
PRINT g_message
SQL> START p16q3.sql
G_MESSAGE
-----------------------------------------------------My PL/SQL Block Works

Introduo ao Oracle: SQL e PL/SQL A-54

Solues de Exerccios 16 (continuao)


Se voc tiver tempo, complete o exerccio abaixo:
4. Crie um bloco que declare duas variveis. Atribua o valor dessas variveis PL/SQL
s variveis de host SQL*Plus e imprima os resultados das variveis PL/SQL na tela. Execute
o bloco PL/SQL. Salve o bloco PL/SQL em um arquivo nomeado p16q4.sql.
V_CHAR Charactere (variable lenght)
V_NUM Number

Atribua valores a essas variveis do seguinte modo:


Variable

Value

---------- ---------------------------------------V_CHAR

The literal '42 is the answer'

V_NUM

The first two characters from V_CHAR

VARIABLE g_char VARCHAR2(30)


VARIABLE g_num NUMBER
DECLARE
v_char VARCHAR2(30);
v_num NUMBER(11,2);
BEGIN
v_char := '42 is the answer';
v_num := TO_NUMBER(SUBSTR(v_char,1,2));
:g_char := v_char;
:g_num := v_num;
END;
/
PRINT g_char
PRINT g_num
SQL> START p16q4.sql
G_CHAR
--------------------42 is the answer
G_NUM
--------42

Introduo ao Oracle: SQL e PL/SQL A-55

Solues de Exerccios 17
PL/SQL Block
DECLARE
v_weight NUMBER(3) := 600;
v_message VARCHAR2(255) := 'Product 10012';
BEGIN
/*SUBBLOCK*/
DECLARE
v_weight
NUMBER(3) := 1;
v_message VARCHAR2(255) := 'Product 11001';
v_new_locn VARCHAR2(50) := 'Europe';
BEGIN
v_weight := v_weight + 1;
v_new_locn := 'Western ' || v_new_locn;
END;
v_weight := v_weight + 1;
v_message := v_message || ' is in stock';
v_new_locn := 'Western ' || v_new_locn;
END;

Introduo ao Oracle: SQL e PL/SQL A-56

Solues de Exerccios 17 (continuao)


1. Avalie o bloco PL/SQL da pgina anterior e determine o tipo de dados e o valor de cada uma
das seguintes variveis de acordo com as regras de escopo.
a. O valor de V_WEIGHT no sub-bloco :
"2" e o tipo de dados NUMBER.
b. O valor de V_NEW_LOCN no sub-bloco :
"Western Europe" e o tipo de dados VARCHAR2.
c. O valor de V_WEIGHT no bloco principal :
"601" e o tipo de dados NUMBER.
d. O valor de V_MESSAGE no bloco principal :
"Product 10012 is in stock" e o tipo de dados VARCHAR2.
e. O valor de V_NEW_LOCN no bloco principal :
Ilegal pois v_new_locn no visvel fora do sub-bloco.

Introduo ao Oracle: SQL e PL/SQL A-57

Solues de Exerccios 17 (continuao)


Exemplo de Escopo
DECLARE
v_customer
v_credit_rating

VARCHAR2(50) := 'Womansport';
VARCHAR2(50) := 'EXCELLENT';

BEGIN
DECLARE
v_customer NUMBER(7) := 201;
v_name VARCHAR2(25) := 'Unisports';
BEGIN
v_customer

v_name

v_credit_rating

v_name

v_credit_rating

END;
v_customer
END;

Introduo ao Oracle: SQL e PL/SQL A-58

Solues de Exerccios 17 (continuao)


2. Vamos supor que voc incorpore um sub-bloco a um bloco, como mostrado na pgina
anterior. Voc declara duas variveis, V_CUSTOMER e V_CREDIT_RATING, no bloco
principal. Declara tambm duas variveis, V_CUSTOMER e V_NAME, no sub-bloco.
Determine os valores e tipos de dados para cada um dos casos a seguir.
a. O valor de V_CUSTOMER no sub-bloco :
"201" e o tipo de dados NUMBER.
b. O valor de V_NAME no sub-bloco :
"Unisports" e o tipo de dados VARCHAR2.
c. O valor de V_CREDIT_RATING no sub-bloco :
"EXCELLENT" e o tipo de dados VARCHAR2.
d. O valor de V_CUSTOMER no bloco principal :
"Womansport" e o tipo de dados VARCHAR2.
e. O valor de V_NAME no bloco principal :
V_NAME no est visvel no bloco principal e voc ver um erro.
f. O valor de V_CREDIT_RATING no bloco principal :
"EXCELLENT" e o tipo de dados VARCHAR2.

Introduo ao Oracle: SQL e PL/SQL A-59

Solues de Exerccios 17 (continuao)


3. Crie e execute um bloco PL/SQL que aceite dois nmeros atravs das variveis de substituio
do SQL*Plus. O primeiro nmero deve ser dividido pelo segundo e este deve ser adicionado ao
resultado. O resultado deve ser armazenado em uma varivel PL/SQL e impresso na tela, ou o
resultado deve ser gravado na varivel do SQL*Plus e impresso na tela.
a. Quando uma varivel PL/SQL usada:
SET ECHO OFF
SET VERIFY OFF
SET SERVEROUTPUT ON
ACCEPT p_num1 PROMPT 'Please enter the first number: '
ACCEPT p_num2 PROMPT 'Please enter the second number: '
DECLARE
v_num1

NUMBER(9,2) := &p_num1;

v_num2

NUMBER(9,2) := &p_num2;

v_result

NUMBER(9,2) ;

BEGIN
v_result :=

(v_num1/v_num2) + v_num2;

/* Printing the PL/SQL variable */


DBMS_OUTPUT.PUT_LINE (v_result);
END;
/
SET SERVEROUTPUT OFF
SET VERIFY ON
SET ECHO ON

Observao: A soluo continua na prxima pgina.

Introduo ao Oracle: SQL e PL/SQL A-60

Solues de Exerccios 17 (continuao)


b. Quando uma varivel do SQL*Plus usada:
SET ECHO OFF
SET VERIFY OFF
VARIABLE g_result NUMBER
ACCEPT p_num1 PROMPT 'Please enter the first number: '
ACCEPT p_num2 PROMPT 'Please enter the second number: '
DECLARE
v_num1

NUMBER(9,2) := &p_num1;

v_num2

NUMBER(9,2) := &p_num2;

BEGIN
:g_result := (v_num1/v_num2) + v_num2;
END;
/
PRINT g_result /* Printing the SQL*Plus variable */
SET VERIFY ON
SET ECHO ON

Introduo ao Oracle: SQL e PL/SQL A-61

Solues de Exerccios 17 (continuao)


4. Elabore um bloco PL/SQL que calcule a remunerao total por um ano. O salrio anual e o
percentual de bnus anual so passados ao bloco PL/SQL atravs das variveis de substituio
do SQL*Plus e o bnus precisa ser convertido de um nmero inteiro em um nmero decimal
(por exemplo, 15 em ,15). Se o salrio for nulo, defina-o como zero antes de calcular a
remunerao total. Execute o bloco PL/SQL. Aviso: Use a funo NVL para tratar valores
nulos.
Observao: Para testar a funo NVL, digite NULL no prompt; o pressionamento de [Return]
resulta em um erro de expresso faltando.
a. Quando uma varivel PL/SQL usada:
SET VERIFY OFF
VARIABLE g_total NUMBER
ACCEPT p_salary PROMPT 'Please enter the salary amount: '
ACCEPT p_bonus PROMPT 'Please enter the bonus percentage: '
DECLARE
v_salary NUMBER := &p_salary;
v_bonus NUMBER := &p_bonus;
BEGIN
:g_total := NVL(v_salary, 0) * (1 + NVL(v_bonus, 0) / 100);
END;
/
PRINT g_total
SET VERIFY ON
SQL> START p17q4.sql

b. Quando uma varivel do SQL*Plus usada:


SET VERIFY OFF
SET SERVEROUTPUT ON
ACCEPT p_salary PROMPT 'Please enter the salary amount: '
ACCEPT p_bonus PROMPT 'Please enter the bonus percentage: '
DECLARE
v_salary NUMBER := &p_salary;
v_bonus NUMBER := &p_bonus;
BEGIN
dbms_output.put_line(TO_CHAR(NVL(v_salary, 0) *
(1 + NVL(v_bonus, 0) / 100)));
END;
/
SET VERIFY ON
SET SERVEROUTPUT OFF

Introduo ao Oracle: SQL e PL/SQL A-62

Solues de Exerccios 18
1. Crie um bloco PL/SQL que selecione o nmero mximo de departamento na tabela DEPT e
armazene-o em uma varivel do SQL*Plus. Imprima os resultados na tela. Salve o bloco
PL/SQL em um arquivo nomeado p18q1.sql.
VARIABLE g_max_deptno NUMBER
DECLARE
v_max_deptno NUMBER;
BEGIN
SELECT
MAX(deptno)
INTO
v_max_deptno
FROM
dept;
:g_max_deptno := v_max_deptno;
END;
/
PRINT g_max_deptno
SQL> START p18q1.sql
DECLARE
v_max_deptno NUMBER;
BEGIN
SELECT
MAX(deptno)
INTO
v_max_deptno
FROM
dept;
dbms_output.put_line(TO_CHAR(v_max_deptno));
END;
/

2. Modifique o bloco PL/SQL criado no exerccio 1 para inserir uma nova linha na tabela DEPT.
Salve o bloco PL/SQL em um arquivo nomeado p18q2.sql.
a. Em vez de imprimir o nmero do departamento recuperado do exerccio 1, adicione 10 a
esse nmero e use-o como o nmero do novo departamento.
b. Use um parmetro de substituio do SQL*Plus para o nome do departamento.
c. Deixe um valor nulo na localizao por enquanto.

Introduo ao Oracle: SQL e PL/SQL A-63

Solues de Exerccios 18 (continuao)


SET ECHO OFF
SET VERIFY OFF
ACCEPT p_dept_name PROMPT 'Please enter the department name: '
DECLARE
v_max_deptno dept.deptno%TYPE;
BEGIN
SELECT
MAX(deptno)+10
INTO
v_max_deptno
FROM
dept;
INSERT INTO dept (deptno, dname, loc)
VALUES
(v_max_deptno, '&p_dept_name', NULL);
COMMIT;
END;
/
SET ECHO ON
SET VERIFY ON
d. Execute o bloco PL/SQL.
SQL> START p18q2.sql

e. Exiba o novo departamento criado.


SELECT *
FROM
dept
WHERE deptno = :g_max_deptno + 10;

3. Crie um bloco PL/SQL que atualize a localizao de um departamento existente. Salve o bloco
PL/SQL em um arquivo nomeado p18q3.sql.
a. Use um parmetro de substituio do SQL*Plus para o nmero do departamento.
b. Use um parmetro de substituio do SQL*Plus para a localizao do departamento.
c. Teste o bloco PL/SQL.
d. Exiba o nome e o nmero do departamento, alm da localizao do departamento atualizado.
SET VERIFY OFF
ACCEPT p_deptno PROMPT 'Please enter the department number: '
ACCEPT p_loc PROMPT 'Please enter the department location: '
BEGIN
UPDATE dept
SET loc = '&p_loc'
WHERE deptno = &p_deptno;
COMMIT;
END;
/
SET VERIFY ON
SQL> START p18q3.sql
Introduo ao Oracle: SQL e PL/SQL A-64

Solues de Exerccios 18 (continuao)


e. Exiba o departamento atualizado.
SQL> SELECT *
2 FROM
dept
3 WHERE deptno = &p_deptno;

4. Crie um bloco PL/SQL que delete o departamento criado no exerccio 2. Salve o bloco
PL/SQL em um arquivo nomeado p18q4.sql.
a. Use um parmetro de substituio do SQL*Plus para o nmero do departamento.
b. Imprima na tela o nmero de linhas afetadas.
c. Teste o bloco PL/SQL.
SET VERIFY OFF
VARIABLE g_result VARCHAR2(40)
ACCEPT p_deptno PROMPT 'Please enter the department number: '
DECLARE
v_result NUMBER(2);
BEGIN
DELETE
FROM
dept
WHERE
deptno = &p_deptno;
v_result := SQL%ROWCOUNT;
:g_result := (TO_CHAR(v_result) || ' row(s) deleted.');
COMMIT;
END;
/
PRINT g_result
SET VERIFY ON
SQL> START p18q4.sql
ACCEPT p_deptno PROMPT 'Please enter the department number: '
DECLARE
v_result NUMBER(2);
BEGIN
DELETE
FROM
dept
WHERE
deptno = &p_deptno;
v_result := SQL%ROWCOUNT;
dbms_output.put_line(TO_CHAR(v_result)||
' row(s) deleted.');
COMMIT;
END;
/

Introduo ao Oracle: SQL e PL/SQL A-65

Solues de Exerccios 18 (continuao)


d. O que acontece se voc informar um nmero de departamento inexistente?
Se o operador informar um nmero de departamento inexistente, o bloco PL/SQL
ser concludo com xito, pois no constitui uma exceo.
e. Confirme que o departamento foi deletado.
SQL> SELECT
2
FROM
3
WHERE

*
dept
deptno = 50;

Introduo ao Oracle: SQL e PL/SQL A-66

Solues de Exerccios 19
1. Execute o script lab19_1.sql para criar a tabela MESSAGES. Crie um bloco PL/SQL para
inserir nmeros na tabela MESSAGES.
CREATE TABLE messages (results VARCHAR2 (60))
/

a. Insira os nmeros de 1 a 10, excluindo 6 e 8.


b. Faa um commit antes do final do bloco.
BEGIN
FOR i IN 1..10 LOOP
IF i = 6 or i = 8 THEN
null;
ELSE
INSERT INTO messages(results)
VALUES (i);
END IF;
COMMIT;
END LOOP;
END;
/

c. Faa selees na tabela MESSAGES para verificar se o bloco PL/SQL funcionou.


SQL> SELECT
*
2 FROM messages;

2. Crie um bloco PL/SQL que calcule a comisso de um determinado funcionrio de acordo


com o salrio dele.
a. Execute o script lab19_2.sql para inserir um novo funcionrio na tabela EMP.
Observao: O funcionrio ter um salrio NULL.
SQL> START lab19_2.sql

b. Aceite o nmero do funcionrio como entrada do usurio com uma varivel de substituio
do SQL*Plus.
c. Se o salrio do funcionrio for menor que US$1.000, defina o valor da comisso do
funcionrio como 10% do salrio.
d. Se o salrio do funcionrio estiver entre US$1.000 e US$1.500, defina o valor da comisso
do funcionrio como 15% do salrio.
e. Se o salrio do funcionrio exceder US$1.500, defina o valor da comisso do funcionrio
como 20% do salrio.
f. Se o salrio do funcionrio for NULL, defina o valor da comisso do funcionrio como 0.
g. Faa um commit.

Introduo ao Oracle: SQL e PL/SQL A-67

Solues de Exerccios 19 (continuao)


ACCEPT p_empno PROMPT 'Please enter employee number: '
DECLARE
v_empno
emp.empno%TYPE := &p_empno;
v_sal
emp.sal%TYPE;
v_comm
emp.comm%TYPE;
BEGIN
SELECT sal
INTO v_sal
FROM emp
WHERE empno = v_empno;
IF v_sal < 1000 THEN
v_comm := .10;
ELSIF v_sal BETWEEN 1000 and 1500 THEN
v_comm := .15;
ELSIF v_sal > 1500 THEN
v_comm := .20;
ELSE
v_comm := 0;
END IF;
UPDATE emp
SET comm = NVL(sal,0) * v_comm
WHERE empno = v_empno;
COMMIT;
END;
/

h. Teste o bloco PL/SQL para cada caso usando os casos de teste a seguir e verifique cada
comisso atualizada.
Employee Number

Salary

Resulting Commission

7369

800

80

7934

1300

195

7499

1600

320

8000

NULL

Introduo ao Oracle: SQL e PL/SQL A-68

Solues de Exerccios 19 (continuao)


SQL>
2
3
4

SELECT
FROM
WHERE
ORDER BY

empno, sal, comm


emp
empno IN (7369, 7934,7499, 8000)
comm;

Se voc tiver tempo, complete os exerccios abaixo:


3. Modifique o arquivo p16q4.sql para inserir o texto "O nmero mpar" ou "O nmero
par", dependendo de o valor ser mpar ou par, na tabela MESSAGES. Consulte a tabela
MESSAGES para determinar se o bloco PL/SQL funcionou.
DECLARE
v_char VARCHAR2(30);
v_num NUMBER(11,2);
BEGIN
v_char := '42 is the answer';
v_num := TO_NUMBER(SUBSTR(v_char,1,2));
IF mod(v_num, 2) = 0 THEN
INSERT INTO messages (results)
VALUES ('Number is even');
ELSE
INSERT INTO messages (results)
VALUES ('Number is odd');
END IF;
END;
/
SQL> SELECT *
2 FROM messages;

4. Adicione uma nova coluna, STARS de tipo de dados VARCHAR2 e o comprimento 50 tabela
EMP para armazenamento de asterisco (*).
SQL> ALTER TABLE emp
2 ADD stars
VARCHAR2(50);

5. Crie um bloco PL/SQL que premie um funcionrio, anexando um asterisco coluna STARS
para cada US$100 do salrio do funcionrio. Salve o bloco PL/SQL em um arquivo nomeado
p19q5.sql.
a. Aceite o ID do funcionrio como entrada do usurio com uma varivel de substituio do
SQL*Plus.
b. Inicialize uma varivel que conter uma string de asteriscos.
c. Anexe um asterisco string para cada US$100 do salrio. Por exemplo, se o funcionrio
recebe um salrio de US$800, a string de asteriscos deve conter oito asteriscos. Se o
funcionrio recebe um salrio de US$1.250, a string de asteriscos deve conter 13 asteriscos.
d. Atualize a coluna STARS do funcionrio com a string de asteriscos.

Introduo ao Oracle: SQL e PL/SQL A-69

Solues de Exerccios 19 (continuao)


e. Faa um commit.
f. Teste o bloco para os funcionrios sem salrio e para um funcionrio com salrio.
SET VERIFY OFF
ACCEPT p_empno PROMPT 'Please enter the employee number: '
DECLARE
v_empno
emp.empno%TYPE := &p_empno;
v_asterisk
emp.stars%TYPE := NULL;
v_sal
emp.sal%TYPE;
BEGIN
SELECT NVL(ROUND(sal/100), 0)
INTO v_sal
FROM emp
WHERE empno = v_empno;
FOR i IN 1..v_sal LOOP
v_asterisk := v_asterisk ||'*';
END LOOP;
UPDATE emp
SET stars = v_asterisk
WHERE empno = v_empno;
COMMIT;
END;
/
SET VERIFY ON
SQL> START p19q5.sql
SQL> SELECT empno, sal, stars
2 FROM
emp
3 WHERE empno IN (7934, 8000);

Introduo ao Oracle: SQL e PL/SQL A-70

Solues de Exerccios 20
1. Crie um bloco PL/SQL para recuperar o nome de cada departamento da tabela DEPT e
imprima o nome de cada departamento na tela, incorporando uma tabela PL/SQL.
a. Declare uma tabela PL/SQL, MY_DEPT_TABLE, para armazenar temporariamente o
nome do departamento.
b. Usando um loop, recupere o nome de todos os departamentos que constam atualmente da
tabela DEPT e armazene-os na tabela PL/SQL. Cada nmero de departamento um
mltiplo de 10.
c. Usando outro loop, recupere os nomes dos departamentos da tabela PL/SQL e imprima-os
na tela, usando DBMS_OUTPUT.PUT_LINE.
SET SERVEROUTPUT ON
DECLARE
TYPE dept_table_type is table of dept.dname%TYPE
INDEX BY BINARY_INTEGER;
my_dept_table dept_table_type;
v_count
NUMBER (2);
BEGIN
SELECT COUNT(*)
INTO v_count
FROM dept;
FOR i IN 1..v_count LOOP
SELECT dname
INTO my_dept_table(i)
FROM dept
WHERE deptno = i*10;
END LOOP;
FOR i IN 1..v_count LOOP
DBMS_OUTPUT.PUT_LINE (my_dept_table(i));
END LOOP;
END;
/

2. Crie um bloco PL/SQL para imprimir as informaes sobre um determinado pedido.


a. Declare um registro PL/SQL de acordo com a estrutura da tabela ORD.
b. Use uma varivel de substituio do SQL*Plus para recuperar todas as informaes sobre
um pedido especfico e armazene-as no registro PL/SQL.
c. Use DBMS_OUTPUT. PUT_LINE e imprima informaes selecionadas sobre o pedido.

Introduo ao Oracle: SQL e PL/SQL A-71

Solues de Exerccios 20 (continuao)


SET SERVEROUTPUT ON
SET VERIFY OFF
ACCEPT p_ordid PROMPT 'Please enter an order number: '
DECLARE
ord_record
ord%ROWTYPE;
BEGIN
SELECT *
INTO ord_record
FROM ord
WHERE ordid = &p_ordid;
DBMS_OUTPUT.PUT_LINE ('Order ' || TO_CHAR(ord_record.ordid)
|| ' was placed on ' || TO_CHAR(ord_record.orderdate)
|| ' and shipped on ' || TO_CHAR(ord_record.shipdate) ||
' for a total of ' ||
TO_CHAR(ord_record.total,'$99,999.99'));
END;
/

Se voc tiver tempo, complete os exerccios abaixo.


3. Modifique o bloco criado no exerccio 1 para recuperar todas as informaes sobre cada
departamento da tabela DEPT e imprima as informaes na tela, incorporando uma tabela
PL/SQL de registros.
a. Declare uma tabela PL/SQL, MY_DEPT_TABLE, para armazenar temporariamente o
nmero, o nome e a localizao de todos os departamentos.
b. Usando um loop, recupere todas as informaes sobre departamentos que constam
atualmente na tabela DEPT e armazene-as na tabela PL/SQL. Cada nmero de
departamento um mltiplo de 10.
c. Usando outro loop, recupere as informaes sobre departamentos da tabela PL/SQL e
imprima-as na tela, usando DBMS_OUTPUT.PUT_LINE.

Introduo ao Oracle: SQL e PL/SQL A-72

Solues de Exerccios 20 (continuao)


SET SERVEROUTPUT ON
DECLARE
TYPE dept_table_type is table of dept%ROWTYPE
INDEX BY BINARY_INTEGER;
my_dept_table dept_table_type;
v_count
NUMBER (2);
BEGIN
SELECT COUNT(*)
INTO
v_count
FROM
dept;
FOR i IN 1..v_count
LOOP
SELECT *
INTO my_dept_table(i)
FROM dept
WHERE deptno = i*10;
END LOOP;
FOR i IN 1..v_count
LOOP
DBMS_OUTPUT.PUT_LINE ('Dept. ' || my_dept_table(i).deptno || ', '
|| my_dept_table(i).dname || ' is located in ' ||
my_dept_table(i).loc);
END LOOP;
END;
/

Introduo ao Oracle: SQL e PL/SQL A-73

Solues de Exerccios 21
1. Execute o script lab21_1.sql para criar uma nova tabela de armazenamento de funcionrios e
salrios.
SQL> CREATE TABLE top_dogs
2 (name
VARCHAR2(25),
3
salary
NUMBER(11,2));

2. Crie um bloco PL/SQL que determine os funcionrios com os maiores salrios.


a. Aceite um nmero n como entrada de usurio com um parmetro de substituio do
SQL*Plus.
b. Em um loop, obtenha os sobrenomes e salrios dos n funcionrios com os maiores salrios na
tabela EMP.
c. Armazene os nomes e os salrios na tabela TOP_DOGS.
d. Suponha que nenhum dos funcionrios tenha salrio igual ao do outro.
e. Teste vrios casos especiais, como n = 0 ou em que n seja maior que o nmero
de funcionrios na tabela EMP. Esvazie a tabela TOP_DOGS depois de cada teste.
DELETE FROM top_dogs;
SET ECHO OFF
ACCEPT p_num PROMPT 'Please enter the number of top money makers: '
DECLARE
v_num
NUMBER(3) := &p_num;
v_ename
emp.ename%TYPE;
v_sal
emp.sal%TYPE;
CURSOR
emp_cursor IS
SELECT
ename, sal
FROM
emp
WHERE
sal IS NOT NULL
ORDER BY
sal DESC;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_ename, v_sal;
WHILE emp_cursor%ROWCOUNT <= v_num AND
emp_cursor%FOUND LOOP
INSERT INTO top_dogs (name, salary)
VALUES (v_ename, v_sal);
FETCH emp_cursor INTO v_ename, v_sal;
END LOOP;
CLOSE emp_cursor;
COMMIT;
END;
/
SELECT * FROM top_dogs;
SET ECHO ON
Introduo ao Oracle: SQL e PL/SQL A-74

Solues de Exerccios 21 (continuao)


3. Considere o caso em que vrios funcionrios recebem o mesmo salrio. Se uma pessoa estiver
listada, todas as pessoas com o mesmo salrio tambm devero estar listadas.
a. Por exemplo, se o usurio informar um valor 2 para n, King, Ford e Scott devero ser
exibidos. (Esses funcionrios so reunidos pelo segundo maior salrio.)
b. Se o usurio informar um valor 3, King, Ford, Scott e Jones devero ser exibidos.
c. Delete todas as linhas da tabela TOP_DOGS e teste o exerccio.
DELETE FROM top_dogs;
ACCEPT p_num PROMPT 'Please enter the number of top money makers: '
DECLARE
v_num
NUMBER(3) := &p_num;
v_ename
emp.ename%TYPE;
v_current_sal
emp.sal%TYPE;
v_last_sal
emp.sal%TYPE;
CURSOR emp_cursor IS
SELECT
ename, sal
FROM
emp
WHERE
sal IS NOT NULL
ORDER BY
sal DESC;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_ename, v_current_sal;
WHILE emp_cursor%ROWCOUNT <= v_num AND emp_cursor%FOUND LOOP
INSERT INTO top_dogs (name, salary)
VALUES (v_ename, v_current_sal);
v_last_sal := v_current_sal;
FETCH emp_cursor INTO v_ename, v_current_sal;
IF v_last_sal = v_current_sal THEN
v_num := v_num + 1;
END IF;
END LOOP;
CLOSE emp_cursor;
COMMIT;
END;
/
SELECT * FROM top_dogs;

Introduo ao Oracle: SQL e PL/SQL A-75

Solues de Exerccios 22
1. Use um cursor para recuperar o nmero e o nome de departamento a partir da tabela DEPT.
Passe o nmero do departamento para outro cursor recuperar os detalhes sobre o nome do
funcionrio, o cargo, a data de admisso e salrio de todos os funcionrios que trabalham
naquele departamento a partir da tabela EMP.
SET SERVEROUTPUT ON
DECLARE
CURSOR dept_cursor IS
SELECT deptno,dname
FROM dept
ORDER BY
deptno;
CURSOR emp_cursor(v_deptno NUMBER) IS
SELECT ename,job,hiredate,sal
FROM emp
WHERE
deptno = v_deptno;
v_current_deptno dept.deptno%TYPE;
v_current_dname dept.dname%TYPE;
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
v_mgr emp.mgr%TYPE;
v_hiredate emp.hiredate%TYPE;
v_sal emp.sal%TYPE;
v_line varchar2(100);
BEGIN
v_line := '
OPEN dept_cursor;
LOOP
FETCH dept_cursor INTO
v_current_deptno,v_current_dname;
EXIT WHEN dept_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ('Department Number : ' ||
v_current_deptno || ' Department Name : ' ||
v_current_dname);
DBMS_OUTPUT.PUT_LINE(v_line);
IF emp_cursor%ISOPEN THEN
CLOSE emp_cursor;
END IF;

Observao: A soluo continua na prxima pgina.

Introduo ao Oracle: SQL e PL/SQL A-76

';

Solues de Exerccios 22 (continuao)


OPEN emp_cursor (v_current_deptno);
LOOP
FETCH emp_cursor INTO v_ename,v_job,v_hiredate,v_sal;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (v_ename || '
' || v_job || '
|| v_hiredate || '
' || v_sal);
END LOOP;
IF emp_cursor%ISOPEN THEN
CLOSE emp_cursor;
END IF;
DBMS_OUTPUT.PUT_LINE(v_line);
END LOOP;
IF emp_cursor%ISOPEN THEN
CLOSE emp_cursor;
END IF;
CLOSE dept_cursor;
END;
/
SET SERVEROUTPUT OFF

Introduo ao Oracle: SQL e PL/SQL A-77

'

Solues de Exerccios 22 (continuao)


2. Modifique o p19q5.sql para incorporar a funcionalidade FOR UPDATE e WHERE
CURRENT OF no processamento do cursor.
SET VERIFY OFF
ACCEPT p_empno PROMPT 'Please enter the employee number: '
DECLARE
v_empno
emp.empno%TYPE := &p_empno;
v_asterisk emp.stars%TYPE := NULL;
CURSOR emp_cursor IS
SELECT empno, NVL(ROUND(sal/100), 0) sal
FROM
emp
WHERE
empno = v_empno
FOR UPDATE;
BEGIN
FOR emp_record IN emp_cursor LOOP
FOR i IN 1..emp_record.sal LOOP
v_asterisk := v_asterisk ||'*';
END LOOP;
UPDATE emp
SET stars = v_asterisk
WHERE CURRENT OF emp_cursor;
v_asterisk := NULL;
END LOOP;
COMMIT;
END;
/
SET VERIFY ON
SQL> START p22q2.sql
SQL> SELECT empno, sal, stars
2 FROM
emp
3 WHERE empno IN (7844, 7900, 8000);

Introduo ao Oracle: SQL e PL/SQL A-78

Solues de Exerccios 23
1. Crie um bloco PL/SQL para selecionar o nome do funcionrio com um determinado salrio.
a. Se o salrio informado retornar mais de uma linha, trate a exceo com um handler de
exceo apropriado e insira, na tabela MESSAGES, a mensagem "More than one
employee with a salary of <salrio>".
b. Se o salrio informado no retornar qualquer linha, trate a exceo com um handler de
exceo apropriado e insira, na tabela MESSAGES, a mensagem "No employee with a
salary of <salrio>".
c. Se o salrio informado retornar apenas uma linha, insira, na tabela MESSAGES, o
nome do funcionrio e o valor do salrio.
d. Trate qualquer outra exceo com um handler de exceo apropriado e insira, na
tabela MESSAGES, a mensagem "Some other error occurred".
e. Teste o bloco para vrios casos.
SET VERIFY OFF
ACCEPT p_sal PROMPT 'Please enter the salary value: '
DECLARE
v_ename emp.ename%TYPE;
v_sal
emp.sal%TYPE := &p_sal;
BEGIN
SELECT
ename
INTO
v_ename
FROM
emp
WHERE
sal = v_sal;
INSERT INTO messages (results)
VALUES (v_ename || ' - ' || v_sal);
EXCEPTION
WHEN no_data_found THEN
INSERT INTO messages (results)
VALUES ('No employee with a salary of '|| TO_CHAR(v_sal));
WHEN too_many_rows THEN
INSERT INTO messages (results)
VALUES ('More than one employee with a salary of '||
TO_CHAR(v_sal));
WHEN others THEN
INSERT INTO messages (results)
VALUES ('Some other error occurred.');
END;
/
SET VERIFY ON
SQL> START p23q1.sql
SQL> START p23q1.sql
SQL> START p23q1.sql

Introduo ao Oracle: SQL e PL/SQL A-79

Solues de Exerccios 23 (continuao)


2. Modifique o p18q3.sql para adicionar um handler de exceo.
a. Crie um handler de exceo para o erro a fim de passar uma mensagem ao usurio
informando que o departamento especificado no existe.
b. Execute o bloco PL/SQL informando um departamento que no existe.
SET VERIFY OFF
VARIABLE g_message VARCHAR2(40)
ACCEPT p_deptno PROMPT 'Please enter the department number: '
ACCEPT p_loc PROMPT 'Please enter the department location: '
DECLARE
e_invalid_dept
EXCEPTION;
v_deptno
dept.deptno%TYPE := &p_deptno;
BEGIN
UPDATE dept
SET loc = '&p_loc'
WHERE deptno = v_deptno;
IF SQL%NOTFOUND THEN
raise e_invalid_dept;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_dept THEN
:g_message := 'Department '|| TO_CHAR(v_deptno) ||
' is an invalid department';
END;
/
SET VERIFY ON
PRINT g_message
SQL> START p23q2.sql

Introduo ao Oracle: SQL e PL/SQL A-80

Solues de Exerccios 23 (continuao)


SET VERIFY OFF
ACCEPT p_deptno PROMPT 'Please enter the department number: '
ACCEPT p_loc PROMPT 'Please enter the department location: '
DECLARE
e_invalid_dept EXCEPTION;
v_deptno
dept.deptno%TYPE := &p_deptno;
BEGIN
UPDATE dept
SET loc = '&p_loc'
WHERE deptno = v_deptno;
IF SQL%NOTFOUND THEN
raise e_invalid_dept;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_dept THEN
dbms_output.put_line('Department '|| TO_CHAR(v_deptno) ||
' is an invalid department');
END;
/
SET VERIFY ON

Introduo ao Oracle: SQL e PL/SQL A-81

Solues de Exerccios 23 (continuao)


3. Crie um bloco PL/SQL que imprima o nmero de funcionrios que recebem mais ou menos
que US$100 do salrio informado.
a. Se no houver funcionrios nessa faixa salarial, imprima uma mensagem para o usurio
indicando que o caso. Use uma exceo para esse caso.
b. Se houver um ou mais funcionrios nessa faixa, a mensagem dever indicar
quantos funcionrios esto naquela faixa salarial.
c. Trate qualquer outra exceo com um handler de exceo apropriado. A mensagem deve
indicar que ocorreu um erro.
VARIABLE g_message VARCHAR2(100)
SET VERIFY OFF
ACCEPT p_sal PROMPT 'Please enter the salary: '
DECLARE
v_sal
emp.sal%TYPE := &p_sal;
v_low_sal
emp.sal%TYPE := v_sal - 100;
v_high_sal
emp.sal%TYPE := v_sal + 100;
v_no_emp
NUMBER(7);
e_no_emp_returned EXCEPTION;
e_more_than_one_emp
EXCEPTION;
BEGIN
SELECT
count(ename)
INTO
v_no_emp
FROM
emp
WHERE
sal between v_low_sal and v_high_sal;
IF v_no_emp = 0 THEN
RAISE e_no_emp_returned;
ELSIF v_no_emp > 0 THEN
RAISE e_more_than_one_emp;
END IF;
EXCEPTION
WHEN e_no_emp_returned THEN
:g_message := 'There is no employee salary between '||
TO_CHAR(v_low_sal) || ' and '||
TO_CHAR(v_high_sal);
WHEN e_more_than_one_emp THEN
:g_message := 'There is/are '|| TO_CHAR(v_no_emp) ||
' employee(s) with a salary between '||
TO_CHAR(v_low_sal) || ' and '||
TO_CHAR(v_high_sal);
END;
/
SET VERIFY ON
PRINT g_message
SQL> START p23q3.sql

Introduo ao Oracle: SQL e PL/SQL A-82

Solues de Exerccios 23 (continuao)


SET VERIFY OFF
ACCEPT p_sal PROMPT 'Please enter the salary: '
DECLARE
v_sal
emp.sal%TYPE := &p_sal;
v_low_sal
emp.sal%TYPE := v_sal - 100;
v_high_sal
emp.sal%TYPE := v_sal + 100;
v_no_emp
NUMBER(7);
e_no_emp_returned
EXCEPTION;
e_more_than_one_emp EXCEPTION;
BEGIN
SELECT
count(ename)
INTO
v_no_emp
FROM
emp
WHERE
sal between v_low_sal and v_high_sal;
IF v_no_emp = 0 THEN
RAISE e_no_emp_returned;
ELSIF v_no_emp > 0 THEN
RAISE e_more_than_one_emp;
END IF;
EXCEPTION
WHEN e_no_emp_returned THEN
dbms_output.put_line('There is no employee salary
between '|| TO_CHAR(v_low_sal) || ' and '||
TO_CHAR(v_high_sal));
WHEN e_more_than_one_emp THEN
dbms_output.put_line('There is/are '|| TO_CHAR(v_no_emp) ||
' employee(s) with a salary between '||
TO_CHAR(v_low_sal) || ' and '||
TO_CHAR(v_high_sal));
WHEN others THEN
dbms_output.put_line('Some other error occurred.');
END;
/
SET VERIFY ON

Introduo ao Oracle: SQL e PL/SQL A-83

Introduo ao Oracle: SQL e PL/SQL A-84

B
Descries da
Tabela e Dados

Tabela EMP
SQL> DESCRIBE emp

Name
------------------------------EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO

Null?
Type
-------- ---NOT NULL NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NOT NULL NUMBER(2)

SQL> SELECT * FROM emp;

EMPNO
------7839
7698
7782
7566
7654
7499
7844
7900
7521
7902
7369
7788
7876
7934

ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
-------- ----------- -------- --------- --------- -------- ------KING
PRESIDENT
17-NOV-81
5000
10
BLAKE
MANAGER
7839 01-MAY-81
2850
30
CLARK
MANAGER
7839 09-JUN-81
2450
10
JONES
MANAGER
7839 02-APR-81
2975
20
MARTIN
SALESMAN
7698 28-SEP-81
1250
1400
30
ALLEN
SALESMAN
7698 20-FEB-81
1600
300
30
TURNER
SALESMAN
7698 08-SEP-81
1500
0
30
JAMES
CLERK
7698 03-DEC-81
950
30
WARD
SALESMAN
7698 22-FEB-81
1250
500
30
FORD
ANALYST
7566 03-DEC-81
3000
20
SMITH
CLERK
7902 17-DEC-80
800
20
SCOTT
ANALYST
7566 09-DEC-82
3000
20
ADAMS
CLERK
7788 12-JAN-83
1100
20
MILLER
CLERK
7782 23-JAN-82
1300
10

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

Tabela DEPT
SQL> DESCRIBE dept

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

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

SQL> SELECT * FROM dept;

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

LOC

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

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

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

Tabela SALGRADE
SQL> DESCRIBE salgrade

Name
Null?
------------------------------- -------GRADE
LOSAL
HISAL

Type
---NUMBER
NUMBER
NUMBER

SQL> SELECT * FROM salgrade;

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

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

Tabela ORD
SQL> DESCRIBE ord

Name
------------------------------ORDID
ORDERDATE
COMMPLAN
CUSTID
SHIPDATE
TOTAL

Null?
Type
-------- ---NOT NULL NUMBER(4)
DATE
VARCHAR2(1)
NOT NULL NUMBER(6)
DATE
NUMBER(8,2)

SQL> SELECT * FROM ord;

ORDID
--------610
611
612
601
602
604
605
606
609
607
608
603
620
613
614
616
619
617
615
618
621

ORDERDATE
--------07-JAN-87
11-JAN-87
15-JAN-87
01-MAY-86
05-JUN-86
15-JUN-86
14-JUL-86
14-JUL-86
01-AUG-86
18-JUL-86
25-JUL-86
05-JUN-86
12-MAR-87
01-FEB-87
01-FEB-87
03-FEB-87
22-FEB-87
05-FEB-87
01-FEB-87
15-FEB-87
15-MAR-87

C
CUSTID SHIPDATE
TOTAL
- --------- --------- --------A
101 08-JAN-87
101.4
B
102 11-JAN-87
45
C
104 20-JAN-87
5860
A
106 30-MAY-86
2.4
B
102 20-JUN-86
56
A
106 30-JUN-86
698
A
106 30-JUL-86
8324
A
100 30-JUL-86
3.4
B
100 15-AUG-86
97.5
C
104 18-JUL-86
5.6
C
104 25-JUL-86
35.2
102 05-JUN-86
224
100 12-MAR-87
4450
108 01-FEB-87
6400
102 05-FEB-87
23940
103 10-FEB-87
764
104 04-FEB-87
1260
105 03-MAR-87
46370
107 06-FEB-87
710
A
102 06-MAR-87
3510.5
A
100 01-JAN-87
730

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

Tabela PRODUCT
SQL> DESCRIBE product

Name
Null?
------------------------------- -------PRODID
NOT NULL
DESCRIP

Type
---NUMBER(6)
VARCHAR2(30)

SQL> SELECT * FROM product;

PRODID DESCRIP
--------100860
100861
100870
100871
100890
101860
101863
102130
200376
200380

-----------------------------ACE TENNIS RACKET I


ACE TENNIS RACKET II
ACE TENNIS BALLS-3 PACK
ACE TENNIS BALLS-6 PACK
ACE TENNIS NET
SP TENNIS RACKET
SP JUNIOR RACKET
RH: "GUIDE TO TENNIS"
SB ENERGY BAR-6 PACK
SB VITA SNACK-6 PACK

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

Tabela ITEM
SQL> DESCRIBE item

Name
------------------------------ORDID
ITEMID
PRODID
ACTUALPRICE
QTY
ITEMTOT

Null?
-------NOT NULL
NOT NULL

Type
----------NUMBER(4)
NUMBER(4)
NUMBER(6)
NUMBER(8,2)
NUMBER(8)
NUMBER(8,2)

SQL> SELECT * FROM item;

ORDID
ITEMID
PRODID ACTUALPRICE
QTY
ITEMTOT
--------- --------- --------- ----------- --------- --------610
3
100890
58
1
58
611
1
100861
45
1
45
612
1
100860
30
100
3000
601
1
200376
2.4
1
2.4
602
1
100870
2.8
20
56
604
1
100890
58
3
174
604
2
100861
42
2
84
604
3
100860
44
10
440
603
2
100860
56
4
224
610
1
100860
35
1
35
610
2
100870
2.8
3
8.4
613
4
200376
2.2
200
440
614
1
100860
35
444
15540
614
2
100870
2.8
1000
2800
612
2
100861
40.5
20
810
612
3
101863
10
150
1500
620
1
100860
35
10
350
620
2
200376
2.4
1000
2400
620
3
102130
3.4
500
1700
613
1
100871
5.6
100
560
613
2
101860
24
200
4800
613
3
200380
4
150
600
619
3
102130
3.4
100
340
617
1
100860
35
50
1750
617
2
100861
45
100
4500
614
3
100871
5.6
1000
5600

Continuao na prxima pgina


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

Tabela ITEM (continuao)


ORDID
ITEMID
PRODID ACTUALPRICE
QTY
ITEMTOT
------ ---------- ---------- ------------ ---------- ----------

616
616
616
616
616
619
619
615
607
615
617
617
617
617
617
617
617
617
609
609
618
618
618
621
621
615
608
608
609
606
605
605
605
605
605
605
612
619

1
2
3
4
5
1
2
1
1
2
3
4
5
6
7
8
9
10
2
3
1
2
3
1
2
3
1
2
1
1
1
2
3
4
5
6
4
4

100861
100870
100890
102130
200376
200380
200376
100861
100871
100870
100870
100871
100890
101860
101863
102130
200376
200380
100870
100890
100860
100861
100870
100861
100870
100871
101860
100871
100861
102130
100861
100870
100890
101860
101863
102130
100871
100871

45
2.8
58
3.4
2.4
4
2.4
45
5.6
2.8
2.8
5.6
58
24
12.5
3.4
2.4
4
2.5
50
35
45.11
45
45
2.8
5
24
5.6
35
3.4
45
2.8
58
24
9
3.4
5.5
5.6

10
50
2
10
10
100
100
4
1
100
500
500
500
100
200
100
200
300
5
1
23
50
10
10
100
50
1
2
1
1
100
500
5
50
100
10
100
50

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

450
140
116
34
24
400
240
180
5.6
280
1400
2800
29000
2400
2500
340
480
1200
12.5
50
805
2255.5
450
450
280
250
24
11.2
35
3.4
4500
1400
290
1200
900
34
550
280

Tabela CUSTOMER
SQL> DESCRIBE customer

Name
------------------------------CUSTID
NAME
ADDRESS
CITY
STATE
ZIP
AREA
PHONE
REPID
CREDITLIMIT
COMMENTS

Null?
Type
-------- ---NOT NULL NUMBER(6)
VARCHAR2(45)
VARCHAR2(40)
VARCHAR2(30)
VARCHAR2(2)
VARCHAR2(9)
NUMBER(3)
VARCHAR2(9)
NOT NULL NUMBER(4)
NUMBER(9,2)
LONG

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

Tabela CUSTOMER (continuao)


SQL> SELECT * FROM customer;

CUSTID
-----100
101
102
103
104
105
106
107
108

NAME
-----------------------------------------JOCKSPORTS
TKB SPORT SHOP
VOLLYRITE
JUST TENNIS
EVERY MOUNTAIN
K + T SPORTS
SHAPE UP
WOMENS SPORTS
NORTH WOODS HEALTH AND FITNESS SUPPLY CENTER

CITY
------------BELMONT
REDWOOD CITY
BURLINGAME
BURLINGAME
CUPERTINO
SANTA CLARA
PALO ALTO
SUNNYVALE
HIBBING

ST
-CA
CA
CA
CA
CA
CA
CA
CA
MN

ADDRESS
---------------345 VIEWRIDGE
490 BOLI RD.
9722 HAMILTON
HILLVIEW MALL
574 SURRY RD.
3476 EL PASEO
908 SEQUOIA
VALCO VILLAGE
98 LONE PINE WAY

ZIP
AREA PHONE
REPID CREDITLIMIT
--------- --------- --------- --------- ----------96711
415 598-6609
7844
5000
94061
415 368-1223
7521
10000
95133
415 644-3341
7654
7000
97544
415 677-9312
7521
3000
93301
408 996-2323
7499
10000
91003
408 376-9966
7844
5000
94301
415 364-9777
7521
6000
93301
408 967-4398
7499
10000
55649
612 566-9123
7844
8000

COMMENTS
--------------------------------------------------------------------Very friendly people to work with -- sales rep likes to be called Mike.
Rep called 5/8 about change in order - contact shipping.
Company doing heavy promotion beginning 10/89. Prepare for large orders
during orders during winter
Contact rep about new line of tennis rackets.
Customer with high market share (23%) due to aggressive advertising.
Tends to order large amounts of merchandise at once. Accounting is
considering raising their credit limit
Support intensive. Orders small amounts (< 800) of merchandise at a time.
First sporting goods store geared exclusively towards women. Unusual
promotional style

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

Tabela PRICE
SQL> DESCRIBE price

Name
Null?
------------------------------- -------PRODID
NOT NULL
STDPRICE
MINPRICE
STARTDATE
ENDDATE

Type
---NUMBER(6)
NUMBER(8,2)
NUMBER(8,2)
DATE
DATE

SQL> SELECT * FROM price;

PRODID STDPRICE MINPRICE STARTDATE ENDDATE


--------- --------- --------- --------- --------100871
4.8
3.2 01-JAN-85 01-DEC-85
100890
58
46.4 01-JAN-85
100890
54
40.5 01-JUN-84 31-MAY-84
100860
35
28 01-JUN-86
100860
32
25.6 01-JAN-86 31-MAY-86
100860
30
24 01-JAN-85 31-DEC-85
100861
45
36 01-JUN-86
100861
42
33.6 01-JAN-86 31-MAY-86
100861
39
31.2 01-JAN-85 31-DEC-85
100870
2.8
2.4 01-JAN-86
100870
2.4
1.9 01-JAN-85 01-DEC-85
100871
5.6
4.8 01-JAN-86
101860
24
18 15-FEB-85
101863
12.5
9.4 15-FEB-85
102130
3.4
2.8 18-AUG-85
200376
2.4
1.75 15-NOV-86
200380
4
3.2 15-NOV-86

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

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

ndice

Smbolo
# 3-34
% 2-13
&& 8-10
& 8-4
(+) 4-17
*

1-6

1-5

%NOTFOUND 21-14
%ROWCOUNT 21-14
%ROWTYPE 20-8
: 16-33
:= 16-17
A
ACCEPT 8-11
ADD_MONTHS

3-20

ALL 6-16
ALTER SEQUENCE 13-13
TABLE 10-15
USER 14-11
Anlise "Top-N" 12-21
AND 2-16
ANY 6-15
Apelido

1-16

Apelidos de tabela 4-12


AS 1-17
ASC 2-22
Atributo I-9
Introduo ao Oracle: ndice do SQL e PL/SQL - 1

Atributo %TYPE 16-26


atributos de cursor 21-14
Loop FOR 21-20
Autojuno 4-19
AVG 5-6
B
Banco de dados I-5
Banco de dados relacional I-7
BETWEEN 2-10
BFILE 16-15
BINARY_INTEGER 20-11
BLOB 16-15
Blocos aninhados 17-11
Blocos annimos 16-5
Bloqueios 9-37
BREAK 8-23
BTITLE 8-24
Buffer do SQL 1-5
C
cabealho de coluna 1-8
CACHE 13-5
Campo I-14, 20-4
CASCADE CONSTRAINTS 11-25
Ciclo de vida de desenvolvimento do sistema I-3
Clusula ADD. 11-17
Clusula DISABLE 11-20
Introduo ao Oracle: ndice do SQL e PL/SQL - 2

Clusula DROP 11-19


COLUMN 10-19
INDEX 13-23
SEQUENCE 13-15
TABLE 10-22
VIEW 12-19
Clusula ENABLE 11-21
Clusula FOR UPDATE 22-5
Clusula INTO 18-5
Clusula WHERE CURRENT OF 22-7
CLOB 16-30
CLOSE 21-13
COLUMN 8-21
COMMENT 10-25, 17-6
COMMIT 9-27, 18-14
Comparaes aos pares 7-6
Comparaes que no sejam aos pares 7-6
condio booleana 19-10
expresses 16-28
conjunto 16-29
Conjunto ativo 21-4
Consistncia de leitura 9-35
Conveno de nomeao 18-13
converso 17-9
converso de tipo de dados 3-23
COUNT 5-8
Introduo ao Oracle: ndice do SQL e PL/SQL - 3

CREATE INDEX 13-18


SEQUENCE 13-7
SYNONYM 13-24
TABLE 10-5
USER 14-6
VIEW 12-8
CURRVAL 13-9
cursor 18-15
Cursor implcito 18-15
Cursores explcitos 21-4
CYCLE 13-6
D
Datas 3-17
DBMS_OUTPUT 16-34
DDL 10-5
DDL (Data Definition Language) 10-5
DD-MON-YY 3-17
Declarar um cursor explcito 21-7
DECODE 3-39
DEFAULT 10-7, 16-16
DEFINE 8-11
DELETE 9-20, 18-11
Delimitadores 17-3
DESC 2-22
DESCRIBE 1-28
dicionrio de dados 10-9
Introduo ao Oracle: ndice do SQL e PL/SQL - 4

Diretrizes de programao 17-17


DISTINCT 1-23
DML 9-3
DML (Data Manipulation Language) 9-3
E
"e" comercial duplo 8-10
ELSIF 19-5
END IF 19-5
Entidade I-9
ER (relacionamento de entidades) I-9
Erro no predefinido do Oracle Server 23-11
Erro predefinido do Oracle Server 23-8
ESCAPE 2-13
Escopo 17-11
Esquema 10-6
Estruturas para controle de LOOP 19-3
Exceo 23-3
Exceo definida pelo usurio 23-16
F
FETCH 21-11
FOREIGN KEY 11-13
Formato de data RR 3-36
Funo 14-9
Funes 3-3
Funes aninhadas 3-42
Funes de grupo 5-3

Introduo ao Oracle: ndice do SQL e PL/SQL - 5

Funes de linha nica 3-5


Funes de vrias linhas 3-4
Funes numricas 3-13
G
GRANT 14-8
GROUP BY 5-12
H
Handlers de exceo OTHERS 23-6
HAVING 5-21
I
Identificadores 17-4
IN 2-11
INCREMENT BY 13-5
ndice 13-16
INITCAP 3-9
INSERT 9-5, 18-9
Instruo EXIT 19-14
Instruo IF 19-3
Instruo SELECT 18-4
Integridade referencial 11-13
IS NULL 2-14
J
Juno 4-4
juno externa 4-17
Juno no-idntica 4-14
Junes idnticas 4-8
Introduo ao Oracle: ndice do SQL e PL/SQL - 6

L
LAST_DAY 3-20
LENGTH 3-11
LIKE 2-12
Literal 1-20
LOB 16-13
Locators 16-9
login.sql 8-18
loop bsico 19-14
Loop WHILE 19-19
Loops aninhados 19-21
Loops FOR 29-16
LOWER 3-9
LPAD 3-11
M
MAX 5-7
MAXVALUE 13-5
Mtodo de tabela do PL/SQL 20-15
MIN 5-7
MINVALUE 13-5
MOD 3-16
Modelo de formato 3-29
Modelos de formato COLUMN 8-22
MODIFY 10-18
MONTHS_BETWEEN 3-20

Introduo ao Oracle: ndice do SQL e PL/SQL - 7

N
NCLOB 16-30
NEXT_DAY 3-20
NEXTVAL 13-9
NOT 2-18
NOT NULL 16-16
NVL 3-37
O
ON DELETE CASCADE 11-15
OPEN 21-9
Operador de atribuio 16-16
operador de concatenao 1-18
operadores aritmticos 1-9
Operadores de comparao 2-7
Operadores lgicos 2-15
OR 2-17
Ordem de precedncia 1-12
ORDER BY 2-22
P
Parmetro na declarao de cursor 22-3
PL/SQL I-3
Ponteiros 16-9
PRAGMA 23-11
PRIMARY KEY 11-11
PRINT 17-16
Privilgio de sistema 14-4
Privilgio do objeto 14-4

Introduo ao Oracle: ndice do SQL e PL/SQL - 8

Privilgios 14-4
Produto cartesiano 4-5
Propagar a exceo 23-17
PUBLIC 14-16
R
RAISE_APPLICATION_ERROR 23-19
RDBMSs (Relational database management systems) I-6
Recursos procedurais I-7
REFERENCES 11-15
Registro 20-3
Relacionamento I-9
Relatrios 8-3
RENAME 10-23
Restrio CHECK 11-16
Restrio NOT NULL 11-7
Restrio UNIQUE KEY 11-9
restries 11-3
REVOKE 14-18
ROLLBACK 9-27, 18-14
Rollback no nvel do demonstrativo 9-34
ROUND 3-14
ROWNUM 12-22
RPAD 3-11
S
SAVEPOINT 9-27, 18-14
Seo de declarao 16-12
Introduo ao Oracle: ndice do SQL e PL/SQL - 9

Segurana de bancos de dados 14-3


SELECT 1-3
Seqncia 13-4
SET UNUSED 10-20
SET VERIFY 8-6
Sinnimo 13-24
SQL I-17
SQL*Plus 1-24
SQLCODE 23-13
SQLERRM 23-13
START WITH 13-5
Subconsulta 6-4, 22-9
Subconsulta de linha nica 6-8
Subconsulta na clusula FROM 7-10
Subconsultas de linha nica 6-7
Subconsultas de vrias colunas 6-7
Subconsultas de vrias linhas 6-7
Subprogramas 16-5
SUBSTR 3-11
SUM 5-6
SYSDATE 3-17
T
tabela base 12-5
Tabela de registros 20-16
Tabelas 20-3
Tabelas do PL/SQL 20-11
Introduo ao Oracle: ndice do SQL e PL/SQL - 10

tipo de dados 1-29


Tipo de dados escalar 16-17
Tipos de dados compostos 16-29
Variveis 20-3
TO_CHAR 3-33
TO_DATE 3-35, 9-9
TO_NUMBER 3-35
Transao 9-3
TRIM 3-11
TRUNC 3-15
TRUNCATE TABLE 10-24
TTITLE 8-24
Tupla I-13
U
UNDEFINE 8-14
UPDATE 9-14, 18-10
UPPER 3-9
USER_CONS_COLUMNS 1-28
USER_CONSTRAINTS 11-4
USER_IND_COLUMNS 13-21
USER_INDEXES 13-21
USER_SEQUENCES 13-8
V
Valor nulo I-14
Variveis 16-7
Variveis de host de referncia 16-33
Introduo ao Oracle: ndice do SQL e PL/SQL - 11

varivel de ligao 16-10


View

12-5

View complexa 12-7


View Em Linha 12-20
View simples 12-7
W
WHEN OTHERS 23-14
WHERE 2-4
WITH CHECK OPTION 12-17
GRANT OPTION 14-13
READ ONLY 12-18

Introduo ao Oracle: ndice do SQL e PL/SQL - 12

Você também pode gostar