Escolar Documentos
Profissional Documentos
Cultura Documentos
Introducao Oracle SQLPLSQL Vol2 PT
Introducao Oracle SQLPLSQL Vol2 PT
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
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
iii
4-11
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
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
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
xi
xiii
xv
xvi
14
Controlando o
Acesso do Usurio
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
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.
Privilgios
de usurio e senha
Usurios
14-3
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.
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
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".
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
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
DROP USER
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
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
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".
Operaes Autorizadas
CREATE SESSION
CREATE TABLE
CREATE SEQUENCE
CREATE VIEW
CREATE PROCEDURE
Na sintaxe:
privilgio
usurio
o nome do usurio
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
Usurios
Gerenciador
Privilgios
Alocando privilgios
sem uma funo
14-9
Alocando privilgios
com uma funo
onde:
ROLE
funo
funo;
Agora que a funo foi criada, o DBA pode usar a instruo GRANT para atribuir usurios s funes
e privilgios funo.
Criando e Concedendo
Privilgios a uma Funo
SQL> CREATE ROLE manager;
Role created.
14-10
14-11
onde:
usurio
o nome do usurio
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".
Privilgios de Objeto
Privilgio
de Objeto
Tabela
ALTER
DELETE
View
Seqncia
EXECUTE
INDEX
INSERT
REFERENCES
SELECT
UPDATE
14-12
Procedimento
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.
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];
ALL
colunas
ON objeto
TO
PUBLIC
14-14
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 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;
Descrio
ROLE_SYS_PRIVS
ROLE_TAB_PRIVS
USER_ROLE_PRIVS
USER_TAB_PRIVS_MADE
USER_TAB_PRIVS_RECD
USER_COL_PRIVS_MADE
USER_COL_PRIVS_RECD
14-16
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.
14-17
CONSTRAINTS
Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "REVOKE".
14-18
Sumrio
Instruo
Ao
CREATE USER
GRANT
CREATE ROLE
ALTER USER
REVOKE
14-19
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.
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.
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
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.
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>
15
SQL Workshop
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
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
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
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
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
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
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.
Exerccio 15 (continuao)
Title
Description
Rating
Category
Release_date
Willie and
Christmas
Too
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
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
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
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
2 days ago
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
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
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
Null?
--------NOT NULL
NOT NULL
NOT NULL
Type
----NUMBER(10)
VARCHAR2(60)
VARCHAR2(400)
VARCHAR2(4)
VARCHAR2(20)
DATE
NUMBER(8,2)
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 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
16
Declarando Variveis
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
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.
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
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.
Aplicao
Biblioteca
compartilhada
16-4
Oracle Server
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
Aplicao
SQL
Outros
DBMSs
SQL
SQL
Aplicao
16-5
SQL
IF...THEN
SQL
ELSE
SQL
END IF;
SQL
Oracle com
PL/SQL
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.
BEGIN Obrigatrio
Instrues SQL
Instrues PL/SQL
EXCEPTION Opcional
Aes a serem desempenhadas quando
ocorrem erros
END; Obrigatrio
DECLARE
BEGIN
EXCEPTION
END;
16-6
Descrio
Incluso
Declarativa
Opcional
Executvel
Obrigatria
Tratamento de
exceo
Opcional
DECLARE
BEGIN
EXCEPTION
END;
16-7
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.
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
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
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
Funo ou
procedimento
armazenado
Oracle Server
Funo ou
procedimento de
aplicao
Componentes do Oracle
Developer por exemplo,
Forms
Pacote
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
Descrio
Disponibilidade
Gatilho de banco
de dados
Oracle Server
Gatilho de
aplicao
Componentes do Oracle
Developer por exemplo,
Forms
Uso de Variveis
Usar variveis para:
Armazenamento temporrio de dados
Manipulao de valores armazenados
Reutilizao
Facilidade de manuteno
16-11
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.
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
16-12
Tipos de Variveis
Variveis PL/SQL:
Escalar
Composta
Referncia
LOB (objetos grandes)
16-13
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.
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".
Tipos de Variveis
Variveis PL/SQL:
Escalar
Composta
Referncia
LOB (objetos grandes)
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
Atlanta
16-15
Tipos de Variveis
O slide ilustra os seguintes tipos de dados de varivel:
Exemplos
Declare
v_hiredate
v_deptno
v_location
c_comm
16-16
DATE;
NUMBER(2) NOT NULL := 10;
VARCHAR2(13) := 'Atlanta';
CONSTANT NUMBER := 1400;
o nome da varivel
CONSTANT
tipo de dados
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
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.
A declarao de apenas um identificador por linha torna o cdigo mais fcil de ler e de manter.
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
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.
Exemplos
Determine uma data de admisso predefinida
para novos empregados.
v_hiredate := '31-DEC-98';
16-19
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
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.
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.
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
(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'.
25-OCT-99
"Four score and seven years
ago our fathers brought
TRUE
256120.08
16-22
Atlanta
Descrio
VARCHAR2
(maximum_length)
NUMBER
[(preciso, escala)]
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)]
LONG
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
PLS_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.
16-25
VARCHAR2(9);
BINARY_INTEGER := 0;
NUMBER(9,2) := 0;
DATE := SYSDATE + 7;
CONSTANT NUMBER(3,2) := 8.25;
BOOLEAN NOT NULL := TRUE;
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.
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
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.
16-27
emp.ename%TYPE;
NUMBER(7,2);
v_balance%TYPE := 10;
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.
23-DEC-98
1
2
3
4
SMITH
JONES
NANCY
TIM
ATLANTA
1
2
3
4
5000
2345
12
3456
VARCHAR2
BINARY_INTEGER
16-29
NUMBER
BINARY_INTEGER
NCLOB
16-30
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.
Variveis de Ligao
Varivel
de ligao S/O
Servidor
16-31
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.
Referenciando Variveis
No-PL/SQL
Armazenar o salrio anual em uma varivel
de host SQL*Plus.
:g_monthly_sal := v_sal / 12;
16-33
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
DBMS_OUTPUT.PUT_LINE
16-34
Sumrio
Os blocos PL/SQL so compostos
pelas seguintes sees:
Declarativa (opcional)
Executvel (necessria)
Tratamento de exceo
(opcional)
DECLARE
BEGIN
EXCEPTION
END;
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.
Sumrio
Identificadores PL/SQL:
So definidos na seo declarativa
Podem ser tipo de dados escalares,
16-36
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.
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);
DECLARE
v_in_stock
BOOLEAN := 1;
Exerccio 16 (continuao)
2. Em cada uma das seguintes atribuies, determine o tipo de dados da expresso resultante.
a.
b.
c.
d.
v_flag := TRUE;
e.
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
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
G_CHAR
--------------------42 is the answer
G_NUM
--------42
17
Criando Instrues
Executveis
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
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.
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
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
/*
*/
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
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".
Diretrizes e Sintaxe
de Bloco PL/SQL
Literais
Caracteres e literais de data devem estar
17-5
Literais
Uma literal um valor booleano, um valor numrico explcito, um caractere ou uma string no
representados por um identificador.
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).
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
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.
17-7
Funes de data
GREATEST, LEAST
Funes diversas
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);
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;
17-8
:= LOWER(v_ename);
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
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".
DECLARE
v_date VARCHAR2(15);
BEGIN
SELECT TO_CHAR(hiredate,
INTO
FROM
WHERE
END;
17-9
onde:
valor
fmt
17-10
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.
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
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.
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
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".
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
Operadores em PL/SQL
Lgico
Aritmtico
Concatenao
Parnteses para
controlar a ordem
das operaes
Os mesmos
do SQL
17-14
Operao
**, NOT
+, -
Identidade, negao
*, /
Multiplicao, diviso
+, -, ||
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".
Operadores em PL/SQL
Exemplos
Incrementar o contador para um loop.
v_count
:= v_count + 1;
:= (v_n1 = v_n2);
17-15
Operadores em PL/SQL
Ao trabalhar com nulos, evite alguns erros bastante comuns mantendo em mente as seguintes regras:
g_salary NUMBER
emp.sal%TYPE;
sal
v_sal
emp
empno = 7369;
:= v_sal;
PRINT g_salary
G_SALARY
-------800
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
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
Letra minscula
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
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
g_name
g_year_sal
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;
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;
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
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.
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;
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.
17-22
Exerccio 17
Bloco PL/SQL
DECLARE
v_weight NUMBER(3) := 600;
v_message
BEGIN
/* SUB-BLOCK */
DECLARE
v_weight
NUMBER(3) := 1;
v_message
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
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 :
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 :
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.
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
18
Interagindo com o
Oracle Server
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
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.
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
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.
18-4
select_list
{variable_name[, variable_name]...
| record_name}
tabela
condio;
uma lista de pelo menos uma coluna e pode incluir funes de linhas,
de grupo ou expresses SQL
variable_name
record_name
tabela
condio
18-5
NUMBER(2);
VARCHAR2(15);
deptno, loc
v_deptno, v_loc
dept
dname = 'SALES';
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.
18-6
Diretrizes
Siga essas diretrizes para recuperar os dados em PL/SQL:
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.
18-7
emp.sal%TYPE;
NUMBER NOT NULL := 10;
SUM(sal) -- group function
v_sum_sal
emp
deptno = v_deptno;
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.
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
Inserindo Dados
Adicionar informaes sobre novos
funcionrios na tabela EMP.
Exemplo
BEGIN
INSERT INTO
VALUES
END;
18-9
Inserindo Dados
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
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
Deletando Dados
Deletar uma ordem de compra especificada.
DECLARE
v_ordid ord.ordid%TYPE := 605;
BEGIN
DELETE FROM item
WHERE
ordid = v_ordid;
END;
18-12
Podem surgir erros de sintaxe, pois o PL/SQL verifica primeiro a coluna na tabela.
18-14
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
18-15
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".
SQL%FOUND
SQL%NOTFOUND
SQL%ISOPEN
18-16
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
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.
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
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.
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.
LOC
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.
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
19
Criando Estruturas para
Controle
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
Objetivo da Lio
Nesta lio, voc aprender sobre o controle condicional dentro do bloco PL/SQL usando loops e
instrues IF.
19-3
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
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
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
THEN
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
ELSE
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;
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.
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.
FALSE
IF condio
THEN aes
(incluindo IFs futuros)
19-6
ELSE aes
(incluindo IFs futuros)
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
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;
TRUE
ELSIF
condio
THEN aes
TRUE
THEN aes
19-8
FALSE
ELSE
aes
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.
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
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
19-10
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'
Tabelas Lgicas
Desenvolver uma condio Booleana simples
com um operador de comparao.
AND
TRUE
FALSE NULL
TRUE
TRUE
FALSE
OR
TRUE
TRUE FALSE
FALSE TRUE
NULL
NULL
NULL
19-11
NULL
FALSE
NULL
NULL
TRUE TRUE
NOT
TRUE
TRUE
NULL
NULL
NULL
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
19-13
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
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.
Loop Bsico
Sintaxe
LOOP
instruo1;
. . .
EXIT [WHEN condio];
END LOOP;
condio
onde:
19-14
-- delimitador
-- instrues
-- instruo EXIT
-- delimitador
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..
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
Loop FOR
Sintaxe
FOR contador in [REVERSE]
lower_bound..upper_bound LOOP
instruo1;
instruo2;
. . .
END LOOP;
19-16
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
REVERSE
limite_inferior
limite_superior
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.
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
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.
Loop WHILE
Sintaxe
WHILE condio LOOP
instruo1;
instruo2;
. . .
END LOOP;
A Condio
avaliada ao
incio de
cada iterao.
19-19
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
instruo
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
19-21
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
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.
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
Exerccio 19 (continuao)
EMPNO
----8000
7499
7934
7369
ENAME
SAL
COMM
------ ----- --------DOE
0
ALLEN
1600
320
MILLER 1300
195
SMITH
800
80
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 *************
20
Trabalhando com Tipos
de Dados Compostos
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
Objetivo da Lio
Nesta lio, voc aprender mais sobre os tipos de dados compostos e seus usos.
Tipos:
PL/SQL RECORDS
PL/SQL TABLES
20-3
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".
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
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.
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.
Onde field_declaration
field_name {field_type | variable%TYPE
| tabela.coluna%TYPE | tabela%ROWTYPE}
[[NOT NULL] {:= | DEFAULT} expr]
20-5
field_name
field_type
expr
A restrio NOT NULL impede a atribuio de nulos a esses campos. Certifique-se de inicializar
campos NOT NULL.
20-6
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.
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)
Por exemplo, voc faz referncia ao campo job no registro emp_record do seguinte modo:
emp_record.job ...
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
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
20-9
onde:
referncia%ROWTYPE;
identificador
referncia
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;
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;
20-10
emp%ROWTYPE;
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
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
Uma chave primria do tipo de dados BINARY_INTEGER que indexa a PL/SQL TABLE
column_type
identificador
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;
20-13
Chave primria
Coluna
...
...
Jones
Smith
Maduro
...
...
BINARY_INTEGER
Escalar
20-14
onde:
primary_key_value
Usando Mtodos
de Tabela PL/SQL
Os mtodos a seguir facilitam o uso de
tabelas PL/SQL:
EXISTS
NEXT
COUNT
EXTEND
TRIM
PRIOR
DELETE
20-15
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
PRIOR(n)
NEXT(n)
EXTEND(n, i)*
TRIM*
DELETE
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
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
20-18
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.
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.
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.
21
Criando Cursores Explcitos
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
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.
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
Descrio
Implcito
Explcito
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
Conjunto ativo
Cursor
21-4
7369
SMITH
CLERK
7566
JONES
MANAGER
7788
SCOTT
ANALYST
7876
ADAMS
CLERK
7902
FORD
ANALYST
Linha atual
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
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
Feche o cursor.
21-6
Declarando o Cursor
Sintaxe
CURSOR cursor_name IS
select_statement;
21-7
um identificador do PL/SQL
select_statement
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
Observao: Pode-se fazer referncia variveis na consulta, mas voc deve declar-las antes da
instruo CURSOR.
Abrindo o Cursor
Sintaxe
OPEN
cursor_name;
21-9
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
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
varivel
record_name
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.
21-12
Fechando o Cursor
Sintaxe
cursor_name;
CLOSE
21-13
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
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
Tipo
Descrio
%ISOPEN
Booleano
%NOTFOUND
Booleano
%FOUND
Booleano
%ROWCOUNT
Nmero
21-14
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
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.
Os Atributos %NOTFOUND
e %ROWCOUNT
21-17
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 ;
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.
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
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
cursor_name
Diretrizes
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
21-21
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 ;
/
21-22
Sumrio
Tipos de cursor:
Cursores implcitos: Usados em todas as
21-23
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.
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;
/
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));
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
Exerccio 21 (continuao)
Please enter the number of top money makers : 3
NAME
SALARY
------------ -----KING
5000
FORD
3000
SCOTT
3000
JONES
2975
22
Conceitos de Cursor
Explcito Avanados
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
Objetivo da Lio
Nesta lio, voc aprender mais sobre como criar cursores explcitos, especificamente sobre como
criar cursores que utilizam parmetros.
parameter_name
cursor_parameter_name
[IN]
tipo de dados
tipo de dados
select_statement
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
22-4
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 ...
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 ...
NOWAIT
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.
22-6
22-9
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.
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
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.
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
01-MAY-81
SALESMAN
SALESMAN
2850
28-SEP-81
20-FEB-81
SALESMAN
SALESMAN
2975
09-DEC-82
MANAGER
CLERK
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
1250
1600
08-SEP-81
03-DEC-81
22-FEB-81
Department Number : 40
1500
950
1250
23
Tratando Excees
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
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.
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
Crie uma exceo explicitamente emitindo a instruo RAISE dentro do bloco. A exceo
criada pode ser definida ou predefinida pelo usurio.
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
Tipos de Exceo
Predefinida pelo Oracle Server
No predefinida pelo
Oracle Server
Definida pelo usurio
23-5
Criada
implicitamente
Criada explicitamente
Tipos de Exceo
Voc pode programar excees a fim de evitar transtornos no tempo de execuo. H trs tipos de
excees.
Exceo
Descrio
Erro no predefinido
pelo Oracle Server
Observao: Algumas ferramentas de aplicao com cdigo PL/SQL cliente, como o Oracle
Developer Forms, tm suas prprias excees.
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
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
instruo
OTHERS
23-7
Diretrizes
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.
Excees Predefinidas
Nome da Exceo
Nmero
do Erro
do Oracle
Server
ACCESS_INTO_NULL
ORA-06530
COLLECTION_IS_NULL
ORA-06531
CURSOR_ALREADY_OPEN
ORA-06511
DUP_VAL_ON_INDEX
ORA-00001
INVALID_CURSOR
ORA-01001
INVALID_NUMBER
ORA-01722
LOGIN_DENIED
ORA-01017
NO_DATA_FOUND
ORA-01403
NOT_LOGGED_ON
ORA-01012
PROGRAM_ERROR
ORA-06501
ROWTYPE_MISMATCH
ORA-06504
STORAGE_ERROR
ORA-06500
SUBSCRIPT_BEYOND_COUNT
ORA-06533
SUBSCRIPT_OUTSIDE_LIMIT
ORA-06532
TIMEOUT_ON_RESOURCE
ORA-00051
TOO_MANY_ROWS
ORA-01422
VALUE_ERROR
ORA-06502
ZERO_DIVIDE
ORA-01476
Descrio
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
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
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
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
error_number
23-13
Descrio
SQLCODE
SQLERRM
Descrio
+100
Exceo NO_DATA_FOUND
nmero negativo
NUMBER;
VARCHAR2(255);
SQLCODE ;
:= SQLERRM ;
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
23-16
Ambientes de Chamada
SQL*Plus
Procedure
Builder
Oracle
Developer
Forms
Aplicao prcompiladora
Um bloco
PL/SQL
delimitado
23-17
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.
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
Procedimento
RAISE_APPLICATION_ERROR
Sintaxe
raise_application_error (error_number,
mensagem[, {TRUE | FALSE}]);
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
mensagem
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
23-20
Exemplo
...
DELETE FROM emp
WHERE mgr = v_mgr;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20202,'This is not a valid manager');
END IF;
...
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
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.
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
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.
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
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
empno, ename
salary x 12 ANNUAL SALARY
emp;
A tabela EMP no contm uma coluna chamada salary. A coluna chamada sal.
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
9. Crie uma consulta para exibir os cargos exclusivos a partir da tabela EMP.
SQL> SELECT DISTINCT job
2 FROM
emp;
GET p1q7.sql
SELECT empno, ename, job, hiredate
FROM
emp
1 SELECT
empno "Emp #", ename "Employee",
i
job "Job", hiredate "Hire Date"
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
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;
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
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
TO_DATE('20-Feb-1981','DD-MON-YYYY') AND
TO_DATE('01-May-1981','DD-MON-YYYY')
ORDER BY hiredate;
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, hiredate
emp
hiredate LIKE '%82';
ename, job
emp
mgr IS NULL;
SELECT
FROM
WHERE
ORDER BY
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;
SELECT
FROM
WHERE
AND
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
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
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
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,
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%';
ename, hiredate,
TO_CHAR(hiredate, 'DAY') DAY
emp
TO_CHAR(hiredate - 1, 'd');
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
'E',
'D',
'C',
'B',
'A',
'0')GRADE
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
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
SELECT
FROM
WHERE
AND
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
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
SELECT
SELECT
FROM
WHERE
AND
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
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"
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
8. Crie uma consulta para exibir a diferena entre os maiores e menores salrios. Coloque um
label na coluna DIFFERENCE.
SQL> SELECT
2 FROM
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
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;
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%');
deptno
dept
loc = 'DALLAS');
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
sal, deptno
emp
comm IS NOT NULL);
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
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
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;
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
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
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);
*
my_employee;
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
*
my_employee;
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;
DELETE
FROM
my_employee
WHERE last_name = 'Dancs'
AND
first_name = 'Betty';
21. Descarte a operao DELETE mais recente sem descartar a operao INSERT anterior.
SQL> ROLLBACK TO SAVEPOINT a;
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
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
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;
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;
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);
SELECT
constraint_name, constraint_type
FROM
user_constraints
WHERE
table_name IN ('EMPLOYEE', 'DEPARTMENT');
SAVE p11q4.sql
COLUMN
COLUMN
SELECT
FROM
WHERE
OR
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;
*
emp_vu;
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
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
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;
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>;
select
dept
<usurio2>;
*
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;
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>;
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
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);
Date
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
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
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
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
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
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;
title
title;
Description
Rating
Category
Release_date
Willie and
Christmas
Too
CHILD
05-OCT-1995
Alien Again
SCIFI
19-MAY-1995
The Glob
NR
SCIFI
12-AUG-1995
My Day Off
PG
COMEDY
12-JUL-1995
Miracles on
Ice
PG
DRAMA
12-SEP-1995
Soda Gang
NR
ACTION
01-JUN-1995
Last_Name
Address
City
Phone
Join_Date
Carmen
Velasquez
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
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)
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
95
102
2 days ago
Today
97
106
4 days ago
2 days ago
2 days ago
SELECT
FROM
ORDER BY
*
title_avail
title, copy_id;
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
SQL> SELECT
2 FROM
3 ORDER BY
*
title_avail
title, copy_id;
Price
25
35
35
35
30
35
29
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
BOOLEAN := 1;
:= v_due_date - SYSDATE;
Nmero
b. v_sender
String de caracteres
c. v_sum
:= $100,000 + $250,000;
:= TRUE;
Booleano
e. v_n1
Booleano
f.
v_value
:= NULL;
Value
---------- ---------------------------------------V_CHAR
V_NUM
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;
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;
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;
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
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.
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
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;
/
*
dept
deptno = 50;
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))
/
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.
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
SELECT
FROM
WHERE
ORDER BY
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.
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;
/
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));
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;
';
'
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
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)
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
Tabela DEPT
SQL> DESCRIBE dept
Name
Null?
------------------------------- -------DEPTNO
NOT NULL
DNAME
LOC
Type
---NUMBER(2)
VARCHAR2(14)
VARCHAR2(13)
DEPTNO DNAME
--------10
20
30
40
LOC
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
------------NEW YORK
DALLAS
CHICAGO
BOSTON
Tabela SALGRADE
SQL> DESCRIBE salgrade
Name
Null?
------------------------------- -------GRADE
LOSAL
HISAL
Type
---NUMBER
NUMBER
NUMBER
GRADE
LOSAL
HISAL
--------- --------- --------1
700
1200
2
1201
1400
3
1401
2000
4
2001
3000
5
3001
9999
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)
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
Tabela PRODUCT
SQL> DESCRIBE product
Name
Null?
------------------------------- -------PRODID
NOT NULL
DESCRIP
Type
---NUMBER(6)
VARCHAR2(30)
PRODID DESCRIP
--------100860
100861
100870
100871
100890
101860
101863
102130
200376
200380
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)
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
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
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
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
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
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
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
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
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
12-5