Escolar Documentos
Profissional Documentos
Cultura Documentos
Introducao Oracle SQLPLSQL Vol2 PT PDF
Introducao Oracle SQLPLSQL Vol2 PT PDF
e PL/SQL
Guia do Estudante Volume 2
41010BP13
Produo 1.3
Fevereiro de 2000
M08945-BP
Autores Copyright Oracle Corporation, 1998, 1999. Todos os direitos reservados e de
titularidade da Oracle Corporation, inclusive aqueles referentes traduo para
Neena Kochhar o idioma portugus - Brasil.
Ellen Gravina
Esta documentao contm informaes de propriedade da Oracle Corporation.
Priya Nathan fornecida sob um contrato de licena que contm restries sobre seu uso e sua
divulgao, sendo tambm protegida pela legislao de direitos autorais. No
permitida a engenharia reversa dos programas de computador. Se esta
documentao for entregue/distribuda a uma Agncia do Departamento de Defesa
Colaboradores Tcnicos do Governo dos Estados Unidos da Amrica do Norte, ser ento entregue/distribuda
com Direitos Restritos e a seguinte legenda ser aplicvel:
e Revisores
Legenda de Direitos Restritos
Claire Bennet
Christa Miethaner O uso, duplicao ou divulgao por aquele Governo esto sujeitos s restries
Tony Hickman aplicveis aos programas comerciais de computadores e sero considerados como
programas de computador com Direitos Restritos de acordo com a legislao federal
Sherin Nassa daquele Governo, conforme descrito no subpargrafo da legislao norte-americana
Nancy Greenberg (c) (1) (ii) de DFARS 252.227-7013, Direitos sobre Dados Tcnicos e Programas de
Hazel Russell Computador (outubro de 1988).
Kenneth Goetz
Proibida a reproduo total ou parcial desta documentao sem a expressa
Piet van Zon autorizao prvia por escrito da Oracle Corporation ou da Oracle do Brasil Sistemas
Ulrike Dietrich Ltda. A cpia deste material, de qualquer forma ou por qualquer meio, eletrnico,
Helen Robertson mecnico ou de outra natureza, inclusive atravs de processos xerogrficos, de
Thomas Nguyen fotocpia e de gravao, constitui violao da legislao de direitos autorais e ser
punida civil e-ou criminalmente na forma da lei.
Lisa Jansson
Kuljit Jassar Se esta documentao for entregue / distribuda a uma Agncia do Governo dos
Estados Unidos da Amrica do Norte que no esteja subordinada ao Departamento
de Defesa, ser ento entregue / distribuda com "Direitos Restritos", conforme
definido no FAR 52.227-14, Direitos sobre Dados - Geral, inclusive a Alternativa III
Editor (junho de 1987).
Jerry Brosnan As informaes contidas neste documento esto sujeitas a alteraes sem aviso
prvio. Se voc encontrar algum problema na documentao, envie a Products
Education - Oracle Corporation ou a Education - Oracle do Brasil Sistemas Ltda. uma
descrio de tal problema por escrito.
Education Products, Oracle Corporation, 500 Oracle Parkway, Box SB-6, Redwood
Shores, CA 94065.
Distribuidor no Brasil: Oracle do Brasil Sistemas Ltda.
Rua Jos Guerra, 127, So Paulo, SP - 04719-030 -
Brasil
CGC: 59.456.277/0001-76.
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
iii
Precedncia do Operador 1-11
Usando Parnteses 1-13
Definindo um Valor Nulo 1-14
Valores Nulos nas Expresses Aritmticas 1-15
Definindo um Apelido de Coluna 1-16
Usando Apelidos de Coluna 1-17
Operador de Concatenao 1-18
Usando um Operador de Concatenao 1-19
Strings Literais de Caracteres 1-20
Usando Strings Literais de Caracteres 1-21
Linhas Duplicadas 1-22
Eliminando Linhas Duplicadas 1-23
Interao SQL e SQL*Plus 1-24
Instrues SQL Versus Comandos SQL*Plus 1-25
Viso Geral do SQL*Plus 1-26
Estabelecendo Login no SQL*Plus 1-27
Exibindo a Estrutura de Tabela 1-28
Comandos de Edio do SQL*Plus 1-30
Comandos de Arquivo do SQL*Plus 1-32
Sumrio 1-33
Viso Geral do Exerccio 1-34
iv
Classificando em Ordem Decrescente 2-23
Classificando por Apelido de Coluna 2-24
Classificando por Vrias Colunas 2-25
Sumrio 2-26
Viso Geral do Exerccio 2-27
vi
Aninhando Funes de Grupo 5-24
Sumrio 5-25
Viso Geral do Exerccio 5-26
6 Subconsultas
Objetivos 6-2
Usando uma Subconsulta para Resolver um Problema 6-3
Subconsultas 6-4
Usando uma Subconsulta 6-5
Diretrizes para o Uso de Subconsultas 6-6
Tipos de Subconsultas 6-7
Subconsultas de uma nica Linha 6-8
Executando Subconsultas de uma nica Linha 6-9
Usando Funes de Grupo em uma Subconsulta 6-10
Clusula HAVING com Subconsultas 6-11
O Que H de Errado com esta Instruo? 6-12
Esta Instruo Ir Funcionar? 6-13
Subconsultas de Vrias Linhas 6-14
Usando o Operador ANY em Subconsultas de Vrias Linhas 6-15
Usando o Operador ALL em Subconsultas de Vrias Linhas 6-16
Sumrio 6-17
Viso Geral do Exerccio 6-18
vii
Especificando Nomes de Coluna, Expresses e Texto no Tempo de Execuo 8-8
Usando a Varivel de Substituio && 8-10
Definindo as Variveis de Usurio 8-11
O Comando ACCEPT 8-12
Usando o Comando ACCEPT 8-13
Comandos DEFINE e UNDEFINE 8-14
Usando o Comando DEFINE 8-15
Personalizando o Ambiente SQL*Plus 8-16
Variveis do Comando SET 8-17
Salvando as Personalizaes no Arquivo login.sql 8-18
Comandos de Formato do SQL*Plus 8-19
O Comando COLUMN 8-20
Usando o Comando COLUMN 8-21
Modelos de Formato COLUMN 8-22
Usando o Comando BREAK 8-23
Usando os Comandos TTITLE e BTITLE 8-24
Criando um Arquivo de Script para Executar um Relatrio 8-25
Exemplo de Relatrio 8-27
Sumrio 8-28
Viso Geral do Exerccio 8-29
9 Manipulao de Dados
Objetivos 9-2
DML (Data Manipulation Language) 9-3
Adicionando uma Nova Linha em uma Tabela 9-4
A Instruo INSERT 9-5
Inserindo Novas Linhas 9-6
Inserindo Linhas com Valores Nulos 9-7
Inserindo Valores Especiais 9-8
Inserindo Valores Espec'ificos de Data 9-9
Inserindo Valores Usando Variveis de Substituio 9-10
Criando um Script com Prompts Personalizados 9-11
Copiando Linhas a partir de Outra Tabela 9-12
Alterando os Dados em uma Tabela 9-13
A Instruo UPDATE 9-14
Atualizando Linhas em uma Tabela 9-15
Atualizando com Subconsulta de Vrias Colunas 9-16
Atualizando Linhas Baseadas em Outra Tabela 9-17
Atualizando Linhas: Erro de Restrio de Integridade 9-18
Removendo uma Linha de uma Tabela 9-19
A Instruo DELETE 9-20
viii
Deletando Linhas de uma Tabela 9-21
Deletando Linhas Baseadas em Outra Tabela 9-22
Deletando Linhas: Erro de Restrio de Integridade 9-23
Transaes de Banco de Dados 9-24
Vantagens das Instrues COMMIT e ROLLBACK 9-26
Controlando Transaes 9-27
Processando Transaes Implcitas 9-28
Estado dos Dados Antes do COMMIT ou ROLLBACK 9-29
Estado dos Dados Aps COMMIT 9-30
Submetendo Dados a Commit 9-31
Estado dos Dados Aps ROLLBACK 9-32
Fazendo Roll Back de Alteraes para um Marcador 9-33
Rollback no Nvel da Instruo 9-34
Consistncia na Leitura 9-35
Implementao da Consistncia na Leitura 9-36
Bloqueando 9-37
Sumrio 9-38
Viso Geral do Exerccio 9-39
12 Criando Views
Objetivos 12-2
Objetos de Banco de Dados 12-4
O Que uma View? 12-5
Por Que Usar Views? 12-6
Views Simples e Views Complexas 12-7
Criando uma View 12-8
Recuperando Dados de uma View 12-11
Consultando uma View 12-12
Modificando uma View 12-13
Criando uma View Complexa 12-14
Regras para Executar Operaes DML em uma View 12-15
Usando a Clusula WITH CHECK OPTION 12-17
Negando Operaes DML 12-18
Removendo uma View 12-19
Views Em Linha 12-20
Anlise "Top-N 12-21
Executando a Anlise Top-N 12-22
Exemplo de Anlise Top-N 12-23
Sumrio 12-24
Viso Geral do Exerccio 12-26
x
13 Outros Objetos do Banco de Dados
Objetivos 13-2
Objetos do Banco de Dados 13-3
O Que uma Seqncia? 13-4
A Instruo CREATE SEQUENCE 13-5
Criando uma Seqncia 13-7
Confirmando Seqncias 13-8
Pseudocolunas NEXTVAL e CURRVAL 13-9
Usando uma Seqncia 13-11
Modificando uma Seqncia 13-13
Diretrizes para Modificar uma Seqncia 13-14
Removendo uma Seqncia 13-15
O Que um ndice? 13-16
Como os ndices so Criados? 13-17
Criando um ndice 13-18
Quando Criar um ndice 13-19
Quando No Criar um ndice 13-20
Confirmando ndices 13-21
ndices Baseados em Funo 13-22
Removendo um ndice 13-23
Sinnimos 13-24
Criando e Removendo Sinnimos 13-25
Sumrio 13-26
Viso Geral do Exerccio 13-27
xi
Revogando Privilgios de Objeto 14-18
Sumrio 14-19
Viso Geral do Exerccio 14-20
15 SQL Workshop
Viso Geral do Workshop 15-2
16 Declarando Variveis
Objetivos 16-2
Sobre PL/SQL 16-3
Benefcios da Linguagem PL/SQL 16-4
Estrutura de Bloco PL/SQL 16-6
Tipos de Bloco 16-8
Construes de Programa 16-9
Uso de Variveis 16-11
Tratando Variveis em PL/SQL 16-12
Tipos de Variveis 16-13
Declarando Variveis PL/SQL 16-16
Regras para Nomeao 16-18
Atribuindo Valores s Variveis 16-19
Palavras-chave e Inicializao de Variveis 16-20
Tipos de Dados Escalares 16-22
Tipos de Dados Escalares Bsicos 16-23
Declarando Variveis Escalares 16-25
O Atributo %TYPE 16-26
Declarando Variveis com o Atributo %TYPE 16-27
Declarando Variveis Booleanas 16-28
Estrutura de Registro PL/SQL 16-29
Variveis de Tipo de Dados LOB 16-30
Variveis de Ligao 16-31
Referenciando Variveis No-PL/SQL 16-33
DBMS_OUTPUT.PUT_LINE 16-34
Sumrio 16-35
Viso Geral do Exerccio 16-37
xii
Blocos Aninhados e Escopo de Varivel 17-11
Operadores em PL/SQL 17-14
Usando Variveis de Ligao 17-16
Diretrizes de Programao 17-17
Convenes para Nomeao de Cdigo 17-18
Endentando o Cdigo 17-19
Determinando o Escopo da Varivel 17-20
Sumrio 17-21
Viso Geral do Exerccio 17-22
xiii
Loop WHILE 19-19
Loops e Labels Alinhados 19-21
Sumrio 19-23
Viso Geral do Exerccio 19-24
xiv
22 Conceitos de Cursor Explcito Avanados
Objetivos 22-2
Cursores com Parmetros 22-3
A Clusula FOR UPDATE 22-5
A Clusula WHERE CURRENT OF 22-7
Cursores com Subconsultas 22-9
Sumrio 22-10
Viso Geral do Exerccio 22-11
23 Tratando Excees
Objetivos 23-2
Tratando Excees com Cdigo PL/SQL 23-3
Tratando Excees 23-4
Tipos de Exceo 23-5
Capturando Excees 23-6
Diretrizes para a Captura de Excees 23-7
Capturando Erros Predefinidos do Oracle Server 23-8
Exceo Predefinida 23-10
Capturando Erros No Predefinidos do Oracle Server 23-11
Erro No Predefinido 23-12
Funes para Captura de Excees 23-13
Capturando Excees Definidas pelo Usurio 23-15
Exceo Definida pelo Usurio 23-16
Ambientes de Chamada 23-17
Propagando Excees 23-18
Procedimento RAISE_APPLICATION_ERROR 23-19
Sumrio 23-21
Viso Geral do Exerccio 23-22
A Solues de Exerccios
ndice
xv
xvi
14
Controlando o
Acesso do Usurio
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.
Administrador
do banco de dados
Privilgios
de usurio e senha
Usurios
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 para usurios e funes. Os privilgios de sistema so
tipicamente fornecidos pelo administrador do banco de dados.
Privilgios de DBA Tpicos
Privilgio de Sistema Operaes Autorizadas
CREATE USER Permite que o cedente crie outros usurios Oracle
(um privilgio requerido para uma funo DBA)
DROP USER Elimina um outro usurio
DROP ANY TABLE Elimina uma tabela em qualquer esquema
BACKUP ANY TABLE Faz back up de tabela nos esquemas com o utilitrio de
exportao
Criando um Usurio
O DBA cria o usurio executando a instruo CREATE USER. O usurio no possui privilgios
nesse ponto. O DBA pode ento conceder um nmero de privilgios quele usurio. Esses privilgios
determinam o que o usurio pode fazer no nvel de banco de dados.
O slide fornece a sintaxe resumida para criar um usurio.
Na sintaxe:
usurio o nome do usurio a ser criado
senha especifica que o usurio deve estabelecer login com essa senha
Para obter mais informaes, consulte o Oracle Server SQL Reference, Release 8, "GRANT"
(System Privileges and Roles) e "CREATE USER".
Na sintaxe:
privilgio o privilgio de sistema a ser concedido
usurio o nome do usurio
Usurios
Gerenciador
Privilgios
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.
Diretrizes
Para conceder privilgios sobre um objeto, ele deve estar no seu prprio esquema ou voc deve
ter recebido os privilgios de objeto WITH GRANT OPTION.
Um proprietrio de objeto pode conceder qualquer privilgio de objeto sobre o objeto para
qualquer outro usurio ou funo do banco de dados.
O proprietrio de um objeto adquire automaticamente todos os privilgios de objeto sobre aquele
objeto.
O primeiro exemplo no slide concede aos usurios Sue e Rich o privilgio de consultar a tabela EMP.
O segundo exemplo concede privilgios UPDATE sobre colunas especficas na tabela DEPT a Scott e
funo de gerente.
Se Sue ou Rich tiverem que selecionar dados da tabela emp, a sintaxe que eles tero de usar :
SQL> SELECT *
2 FROM scott.emp;
Outra alternativa criar um sinnimo para a tabela e selecionar no sinnimo.
SQL> CREATE SYNONYM emp FOR scott.emp
SQL> SELECT * FROM emp;
Observao: Os DBAs geralmente alocam privilgios de sistema e qualquer usurio que possua um
objeto pode conceder privilgios de objeto.
Sumrio
Os DBAs estabelecem segurana de banco de dados inicial para usurios atribuindo privilgios aos
outros usurios.
O DBA cria usurios que devem ter uma senha. O DBA tambm responsvel por estabelecer
os privilgios de sistema iniciais dos usurios.
Quando o usurio tiver criado um objeto, o usurio pode passar quaisquer privilgios de objeto
disponveis a outros usurios ou para todos os usurios usando a instruo GRANT.
Um DBA pode criar funes usando a instruo CREATE ROLE para passar um conjunto de
privilgios de sistema ou de objeto a vrios usurios. As funes tornam a concesso e a
revogao de privilgios mais fceis de manter.
Os usurios podem alterar sua senha usando a instruo ALTER USER.
Voc pode remover privilgios de usurios usando a instruo REVOKE.
As views do dicionrio de dados permitem que os usurios vejam os privilgios concedidos a
eles e aqueles que so concedidos sobre os seus objetos.
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.
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.
TABLE_NAME OWNER
---------- -----------
DEPT <user2>
Length 10 25 25 100 30 15
CONSTRAINT_NAME C TABLE_NAME
------------------------------ - --------------
MEMBER_LAST_NAME_NN C MEMBER
MEMBER_JOIN_DATE_NN C MEMBER
MEMBER_MEMBER_ID_PK P MEMBER
RENTAL_BOOK_DATE_COPY_TITLE_PK P RENTAL
RENTAL_MEMBER_ID_FK R RENTAL
RENTAL_COPY_ID_TITLE_ID_FK R RENTAL
RESERVATION_RESDATE_MEM_TIT_PK P RESERVATION
RESERVATION_MEMBER_ID R RESERVATION
RESERVATION_TITLE_ID R RESERVATION
...
17 rows selected.
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.
First_
Name Last_Name Address City Phone Join_Date
Carmen Velasquez 283 King Seattle 206-899-6666 08-MAR-1990
Street
LaDoris Ngao 5 Modrany Bratislava 586-355-8882 08-MAR-1990
Midori Nagayama 68 Via Sao Paolo 254-852-5764 17-JUN-1991
Centrale
Mark Quick-to- 6921 King Lagos 63-559-7777 07-APR-1990
See Way
Audry Ropeburn 86 Chu Street Hong 41-559-87 18-JAN-1991
Kong
Molly Urguhart 3035 Laurier Quebec 418-542-9988 18-JAN-1991
CONSTRAINT_NAME C SEARCH_CONDITION
------------------ -- -----------------
TITLE_PRICE_NN 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.
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 (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.
Integrao
Aplicao
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.
SQL
SQL Outros
Aplicao
SQL DBMSs
SQL
SQL
IF...THEN
SQL Oracle com
Aplicao ELSE PL/SQL
SQL
END IF;
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.
A linguagem PL/SQL tambm pode cooperar com as ferramentas de desenvolvimento de
aplicao do Oracle Server como, por exemplo, Oracle Developer Forms e Reports. Ao
adicionar recursos de processamento procedural a essas ferramentas, a linguagem PL/SQL
aumenta o desempenho.
Observao: Os procedimentos e as funes declaradas como parte de uma aplicao do Developer
so distintos daqueles armazenados no banco de dados, embora as suas estruturas gerais sejam as
mesmas. Os subprogramas armazenados so objetos de banco de dados e esto armazenados no
dicionrio de dados. Eles podem ser acessados por qualquer nmero de aplicaes, incluindo as
aplicaes do Developer.
DECLARE Opcional
Variveis, cursores, excees definidas
pelo usurio
BEGIN Obrigatrio
Instrues SQL
Instrues PL/SQL
EXCEPTION Opcional
Aes a serem desempenhadas quando DECLARE
ocorrem erros
END; Obrigatrio BEGIN
EXCEPTION
END;
DECLARE
v_variable VARCHAR2(5);
BEGIN
SELECT column_name
INTO v_variable
FROM table_name;
EXCEPTION
WHEN exception_name THEN DECLARE
...
END; BEGIN
EXCEPTION
END;
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.
Procedimento/
Bloco
funo
annimo
armazenado(a)
DECLARE
BEGIN Procedimento/
Gatilho
funo
de aplicao
de aplicao
EXCEPTION
Construes de Programa
A tabela a seguir descreve em linhas gerais uma variedade de construes de programa PL/SQL que
usam o bloco PL/SQL bsico. Eles esto disponveis de acordo com o ambiente no qual eles so
executados.
Construo de
Programa Descrio Disponibilidade
Bloco annimo O bloco PL/SQL no nomeado incorporado Todos os ambientes PL/SQL
em uma aplicao ou emitido interativamente
Stored
Procedimento/
Anonymous
Bloco
procedure/
funo
block
annimo armazenado(a)
DECLARE function
BEGIN Application
Procedimento/
Application
Gatilho
procedure/
funo
detrigger
aplicao
de aplicao
function
EXCEPTION
Uso de Variveis
Com o cdigo PL/SQL, voc poder declarar variveis e depois us-las em instrues procedurais e
SQL onde uma expresso possa ser usada.
Armazenamento temporrio de dados
Os dados podem ser armazenados temporariamente em uma ou mais variveis para uso quando
na validao da entrada de dados para processamento posterior no processo de fluxo de dados.
Manipulao de valores armazenados
As variveis podem ser usadas para clculo e manipulao de outros dados sem acessar o banco
de dados.
Reutilizao
Quando declaradas, as variveis podem ser usadas repetidamente em uma aplicao
simplesmente referenciando-as em outras instrues, incluindo outras instrues declarativas.
De fcil manuteno
Ao usar %TYPE e %ROWTYPE (mais informaes sobre %ROWTYPE so abordadas em
uma lio subseqente), voc declara variveis, baseando as declaraes nas definies das
colunas de banco de dados. As variveis PL/SQL ou variveis de cursor anteriormente
declaradas no escopo atual podero usar tambm os atributos %TYPE e %ROWTYPE como
especificadores de tipos de dados. Se uma definio subjacente for alterada, a declarao de
varivel se altera de acordo durante a execuo. Isso permite a independncia dos dados, reduz
custos de manuteno e permite que os programas se adaptem, conforme o banco de dados for
alterado, para atender s novas necessidades comerciais.
Variveis PL/SQL:
Escalar
Composta
Referncia
LOB (objetos grandes)
Variveis No-PL/SQL: Variveis de
ligao e de host
Variveis PL/SQL:
Escalar
Composta
Referncia
LOB (objetos grandes)
Variveis No-PL/SQL: Variveis de
ligao e de host
Atlanta
Tipos de Variveis
O slide ilustra os seguintes tipos de dados de varivel:
TRUE representa um valor booleano.
25-OCT-99 representa uma varivel DATE (data).
A fotografia representa uma varivel BLOB.
O texto de um discurso representa uma varivel LONG RAW.
256120.08 representam um tipo de dados NUMBER com preciso e escala.
O filme representa uma varivel BFILE.
O nome da cidade representa uma varivel VARCHAR2.
Sintaxe
identificador [CONSTANT] tipo de dados [NOT NULL]
[:= | DEFAULT expr];
Exemplos
Declare
v_hiredate DATE;
v_deptno NUMBER(2) NOT NULL := 10;
v_location VARCHAR2(13) := 'Atlanta';
c_comm CONSTANT NUMBER := 1400;
Diretrizes
Seguir as convenes de nomeao.
Inicializar as variveis designadas como
NOT NULL e CONSTANT.
Inicializar os identificadores usando o
operador de atribuio (:=) ou a palavra
reservada DEFAULT.
Declarar no mximo um identificador por
linha.
Diretrizes
A expresso atribuda pode ser uma literal, uma outra varivel ou uma expresso que envolve
operadores e funes.
Nomeie o identificador de acordo com as mesmas regras usadas por objetos SQL.
Voc poder usar convenes de nomeao por exemplo, v_name para representar uma
varivel e c_name e representar uma varivel constante.
Inicialize a varivel em uma expresso com o operador de atribuio (:=) ou, equivalentemente,
com a palavra reservada DEFAULT. Se voc no atribuir um valor inicial, a nova varivel
conter NULL por default at que voc o atribua mais tarde.
Se voc usar a restrio NOT NULL, voc deve atribuir um valor.
A declarao de apenas um identificador por linha torna o cdigo mais fcil de ler e de manter.
Em declaraes constantes, a palavra-chave CONSTANT deve preceder o especificador de
tipo. A declarao a seguir nomeia a constante NUMBER, subtipo REAL e atribui o valor de
50000 constante. Uma constante deve ser inicializada em sua declarao; seno, voc obter
uma mensagem de erro de compilao quando a declarao for elaborada (compilada).
v_sal CONSTANT REAL := 50000.00;
Exemplos
Determine uma data de admisso predefinida
para novos empregados.
v_hiredate := '31-DEC-98';
Usando:
Operador de atribuio (:=)
Palavra-chave DEFAULT
Restrio NOT NULL
As variveis so inicializadas toda vez que um bloco ou subprograma for informado. Por default, as
variveis so inicializadas em NULL. A no ser que voc expressamente inicialize uma varivel, os
seus valores so indefinidos.
Use o operador de atribuio (:=) para as variveis que no tm valor tpico.
v_hiredate := '15-SEP-1999'
Observao: Essa atribuio possvel apenas em Oracle8i. As verses anteriores podem requerer
o uso da funo TO_DATE.
Como o formato de data default definido no Oracle Server pode diferir de banco de dados para
banco de dados, voc poder querer atribuir valores de data de uma maneira genrica, como no
exemplo anterior.
DEFAULT: Voc poder usar a palavra-chave DEFAULT em vez do operador de atribuio
para inicializar as variveis. Use DEFAULT para as variveis que tm um valor tpico.
g_mgr NUMBER(4) DEFAULT 7839;
NOT NULL: Imponha a restrio NOT NULL quando a varivel tiver que conter um valor.
Voc no poder atribuir valores nulos a uma varivel definida como NOT NULL. A restrio
NOT NULL deve ser seguida por uma clusula de inicializao.
v_location VARCHAR2(13) NOT NULL := 'CHICAGO';
25-OCT-99
"Four score and seven years
ago our fathers brought
forth upon this continent, a
TRUE
new nation, conceived in
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.
Exemplos
v_job VARCHAR2(9);
v_count BINARY_INTEGER := 0;
v_total_sal NUMBER(9,2) := 0;
v_orderdate DATE := SYSDATE + 7;
c_tax_rate CONSTANT NUMBER(3,2) := 8.25;
v_valid BOOLEAN NOT NULL := TRUE;
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.
Exemplos
...
v_ename emp.ename%TYPE;
v_balance NUMBER(7,2);
v_min_balance v_balance%TYPE := 10;
...
...
v_ename emp.ename%TYPE;
...
Declare as variveis para armazenar o saldo de uma conta corrente bancria, assim como um saldo
mnimo, que inicie em 10.
...
v_balance NUMBER(7,2);
v_min_balance 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.
1 SMITH 1 5000
2 JONES 2 2345
3 NANCY 3 12
4 TIM 4 3456
VARCHAR2 NUMBER
BINARY_INTEGER BINARY_INTEGER
Foto
(BLOB)
Filme
(BFILE)
NCLOB
Varivel
de ligao S/O
Servidor
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.
DECLARE
v_sal NUMBER(9,2) := &p_annual_sal;
BEGIN
:g_monthly_sal := v_sal/12;
END;
/
PRINT g_monthly_sal
DECLARE
v_sal NUMBER(9,2) := &p_annual_sal;
BEGIN
v_sal := v_sal/12;
DBMS_OUTPUT.PUT_LINE ('The monthly salary is ' || TO_CHAR(v_sal));
END;
/
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.
Identificadores PL/SQL:
So definidos na seo declarativa
Podem ser tipo de dados escalares,
compostos, referenciais ou LOB
Podem ser baseados em estruturas de
uma outra varivel ou objeto de banco
de dados
Podem ser inicializados
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.
b. DECLARE
v_x, v_y, v_z VARCHAR2(10);
c. DECLARE
v_birthdate DATE NOT NULL;
d. DECLARE
v_in_stock BOOLEAN := 1;
d. v_flag := TRUE;
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
Variable Value
-------- -------------------------------------
V_CHAR The literal '42 is the answer'
V_NUM The first two characters from V_CHAR
G_CHAR
---------------------
42 is the answer
G_NUM
---------
42
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.
Para obter mais informaes, consulte PL/SQL Users Guide and Reference, Release 8, "Fundamentals".
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".
Literais
Uma literal um valor booleano, um valor numrico explcito, um caractere ou uma string no
representados por um identificador.
As literais de caracteres incluem todos os caracteres imprimveis no conjunto de
caracteres do PL/SQL: letras, numerais, espaos e smbolos especiais.
As literais numricas podero ser representadas por um valor simples (por exemplo,
32.5) ou por uma notao cientfica (por exemplo, 2E5, significando 2* (10 potncia
de 5) = 200000).
Um bloco PL/SQL finalizado por uma barra ( / ) em uma linha sozinha.
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.
}
Nmero de uma nica linha
Caractere de uma nica linha As mesmas
Converso de tipo de dados do SQL
Data
No disponvel nas instrues procedurais:
DECODE
Funes de grupo
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;
Funes PL/SQL
O PL/SQL fornece muitas funes teis que ajudam a manipular dados. Essas funes embutidas
caem na categoria a seguir:
Relatrio de erro
Nmero
Caractere
Converso
Data
Diversos
Os exemplos de funo no slide so definidos como se segue:
Elaborar a lista de correspondncia de uma empresa.
Converter o nome para letra minscula.
CHR a funo SQL que converte um cdigo ASCII em seu caracter correspondente; 10 o cdigo
para uma alimentao de linha.
Para obter mais informaes, consulte PL/SQL Users Guide and Reference, Release 8,
"Fundamentals".
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.
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".
Lgico
Aritmtico
Concatenao
Parnteses para
controlar a ordem
das operaes
Operador exponencial (**)
} Os mesmos
do SQL
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
Ao trabalhar com nulos, evite alguns erros bastante comuns mantendo em mente as seguintes regras:
As comparaes que envolvem nulos sempre produzem NULL.
A aplicao do operador lgico NOT em um nulo produz NULL.
Em instrues de controle condicionais, se a condio produzir NULL, sua seqncia associada
de instrues no ser executada.
G_SALARY
--------
800
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 Exemplos
Maiscula/Minscula
Instrues SQL Letra maiscula SELECT, INSERT
Palavras-chave PL/SQL Letra maiscula DECLARE, BEGIN, IF
Tipos de dados Letra maiscula VARCHAR2, BOOLEAN
Identificadores e parmetros Letra minscula v_sal, emp_cursor, g_sal, p_empno
Tabelas e colunas de banco Letra minscula emp, orderdate, deptno
de dados
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.
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;
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;
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
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.
Bloco PL/SQL
DECLARE
v_weight NUMBER(3) := 600;
v_message VARCHAR2(255) := 'Product 10012';
BEGIN
/* SUB-BLOCK */
DECLARE
v_weight NUMBER(3) := 1;
v_message VARCHAR2(255) := 'Produto 11001';
v_new_locn VARCHAR2(50) := 'Europa';
BEGIN
v_weight := v_weight + 1;
v_new_locn := 'Ocidental ' || v_new_locn;
END;
v_weight := v_weight + 1;
v_message := v_message || ' is in stock';
v_new_locn := 'Western ' || v_new_locn;
END;
1. Avalie o bloco PL/SQL acima e determine o tipo de dados e o valor de cada uma das variveis a seguir
de acordo com as regras de criao de escopos.
a. O valor de V_WEIGHT no sub-bloco :
Exemplo de Escopo
DECLARE
v_customer VARCHAR2(50) := 'Womansport';
v_credit_rating VARCHAR2(50) := 'EXCELLENT';
BEGIN
DECLARE
v_customer NUMBER(7) := 201;
v_name VARCHAR2(25) := 'Unisports';
BEGIN
v_customer v_name v_credit_rating
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 :
G_RESULT
--------
4.5
4. Elabore um bloco PL/SQL que compute a remunerao total por um ano. O salrio anual e a
porcentagem do bnus anual so repassados ao bloco PL/SQL pelas variveis de substituio
SQL*Plus e os benefcios precisam ser convertidos de um nmero inteiro para um decimal
(por exemplo, 15 para 0.15). Se o salrio for nulo, defina-o para zero antes de computar a
remunerao total. Execute o bloco PL/SQL. Aviso: Use a funo NVL para tratar os valores nulos.
Observao: Para testar a funo NVL, digite NULL no prompt; o pressionamento de [Return]
resulta em um erro de expresso ausente.
G_TOTAL
-------
55000
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
Um bloco PL/SQL no uma unidade de transao. Os comandos COMMIT, SAVEPOINT e
ROLLBACK so independentes dos blocos, mas voc pode emitir esses comandos em um
bloco.
O PL/SQL no suporta instrues em DDL (Data Definition Language) como, por exemplo,
CREATE TABLE, ALTER TABLE ou DROP TABLE.
O PL/SQL no suporta instrues em DCL (Data Control Language) como, por exemplo,
GRANT ou REVOKE.
Para obter mais informaes sobre o pacote DBMS_SQL, consulte o Oracle8 Server Application
Developers Guide, Release 8.
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.
Diretrizes
Siga essas diretrizes para recuperar os dados em PL/SQL:
Finalize cada instruo SQL com um ponto-e-vrgula (;).
A clusula INTO obrigatria para a instruo SELECT quando ela est embutida no PL/SQL.
A clusula WHERE opcional e poder ser usada para especificar variveis de entrada,
constantes, literais ou expresses PL/SQL.
Especifique o mesmo nmero de variveis de sada na clusula INTO como colunas de banco
de dados na clusula SELECT. Certifique-se de que elas correspondam em posio e que os
seus tipos de dados sejam compatveis.
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.
DELETE
Inserindo Dados
Use as funes SQL como, por exemplo, USER e SYSDATE.
Gere valores de chaves primrias usando as seqncias de banco de dados.
Crie valores no bloco PL/SQL.
Adicione valores default de coluna.
Observao: No h possibilidade de ambigidade entre os identificadores e nomes de coluna na
instruo INSERT. Qualquer identificador na clusula INSERT deve ser um nome de coluna do
banco de dados.
Deletando Dados
Deletar uma ordem de compra especificada.
DECLARE
v_ordid ord.ordid%TYPE := 605;
BEGIN
DELETE FROM item
WHERE ordid = v_ordid;
END;
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];
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".
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 (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.
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.
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
G_RESULT
-----------------------------------------------------------
1 row(s) deleted.
G_RESULT
-----------------------------------------------------------
0 row(s) deleted.
no rows selected
Objetivo da Lio
Nesta lio, voc aprender sobre o controle condicional dentro do bloco PL/SQL usando loops e
instrues IF.
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
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;
Instrues IF
A estrutura da instruo IF do PL/SQL semelhante estrutura das instrues IF em outras
linguagens procedurais. Ela permite que o PL/SQL execute aes de modo seletivo com base em
condies.
Na sintaxe:
condio uma expresso ou varivel Booleana (TRUE, FALSE ou NULL) (Ela
est associada a uma seqncia de instrues, que ser executada somente
se a expresso produzir TRUE.)
THEN uma clusula que associa a expresso Booleana que a precede
com a seqncia de instrues posterior
instrues pode ser uma ou mais instrues SQL ou PL/SQL. (Elas podem incluir
mais instrues IF contendo diversos IFs, ELSEs e ELSIFs aninhados.)
ELSIF uma palavra-chave que introduz uma expresso Booleana. (Se a primeira
condio produzir FALSE ou NULL, a palavra-chave ELSIF introduzir
condies adicionais.)
ELSE uma palavra-chave que se for atingida pelo controle, executar a seqncia
de instrues que segue a palavra-chave
Instrues IF Simples
No exemplo do slide, o PL/SQL executar essas trs aes (definindo as variveis v_job, v_deptno
e v_new_comm) somente se a condio for TRUE. Se a condio for FALSE ou NULL, o PL/SQL
as ignorar. Em ambos os casos, o controle ser reiniciado na prxima instruo do programa aps
END IF.
Diretrizes
Voc pode executar aes de maneira seletiva com base nas condies atendidas.
Ao criar um cdigo, lembre-se da grafia das palavras-chave:
ELSIF uma palavra.
END IF so duas palavras.
Se a condio Booleana para controle for TRUE, a seqncia de instrues associada ser
executada; se ela for FALSE ou NULL, a seqncia de instrues associadas ser ignorada.
permitido qualquer quantidade de clusulas ELSIF.
Pode haver no mximo uma clusula ELSE.
Endente instrues executadas condicionalmente para clareza.
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;
ELSIF
condio
THEN aes
TRUE FALSE
ELSE
THEN aes
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
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;
v_sal * 1.1
No exemplo a seguir, a string no ser avaliada como NULL se v_string for NULL.
'PL'||v_string||'SQL'
TRUE TRUE FALSE NULL TRUE TRUE TRUE TRUE TRUE FALSE
FALSE FALSE FALSE FALSE FALSE TRUE FALSE NULL FALSE TRUE
NULL NULL FALSE NULL NULL TRUE NULL NULL NULL NULL
Sintaxe
LOOP -- delimitador
instruo1; -- instrues
. . .
EXIT [WHEN condio]; -- instruo EXIT
END LOOP; -- 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..
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;
Loop FOR
Os loops FOR tm a mesma estrutura geral do loop bsico. Alm disso, eles tm uma instruo para
controle no incio da palavra-chave LOOP para determinar o nmero de iteraes que o PL/SQL
executa.
Na sintaxe:
contador um inteiro declarado implicitamente cujo valor aumenta ou diminui
automaticamente (diminuir se a palavra-chave REVERSE for usada) em 1
cada iterao do loop at o limite superior ou inferior a ser alcanado
REVERSE faz o contador decrescer a cada iterao a partir do limite superior at o
limite inferior. (Note que o limite inferior ainda referenciado primeiro.)
limite_inferior especifica o limite inferior da faixa de valores do contador
limite_superior especifica o limite superior da faixa de valores do contador
No declare o contador, ele declarado implicitamente como um inteiro.
Observao: A seqncia de instrues executada sempre que o contador incrementado, conforme
determinado pelos dois limites. Os limites superior e inferior da faixa do loop podem ser literais,
variveis ou expresses, mas devem ser avaliados para inteiros. Se o limite inferior da faixa do loop for
avaliado para um inteiro maior do que o limite superior, a seqncia de instrues no ser executada.
Por exemplo, a instruo1 executada somente uma vez:
FOR i IN 3..3 LOOP instruo1; END LOOP;
Diretrizes
Referenciar o contador dentro do loop
somente; ele indefinido fora do loop.
Usar uma expresso para referenciar o valor
existente de um contador.
No referenciar o contador como o destino
de uma atribuio.
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;
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.
Sintaxe
WHILE condio LOOP A Condio
instruo1; avaliada ao
instruo2; incio de
. . . cada iterao.
END LOOP;
Loop WHILE
Voc pode usar o loop WHILE para repetir uma seqncia de instrues at a condio para controle
no ser mais TRUE. A condio avaliada ao incio de cada iterao. O loop terminar quando a
condio for FALSE. Se a condio for FALSE no incio do loop, nenhuma iterao futura ser
executada.
Na sintaxe:
condio uma expresso ou varivel Booleana (TRUE, FALSE, ou NULL)
instruo pode ser uma ou mais instrues SQL ou PL/SQL
Se as variveis envolvidas nas condies no se alterarem no curso do corpo do loop, a condio
permanecer TRUE e o loop no terminar.
Observao: Se a condio produzir NULL, o loop ser ignorado e o controle passar para a prxima
instruo.
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.
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 0
RESULTS
---------------
Nmero par
4. Adicione uma nova coluna chamada STARS, de tipo de dado VARCHAR2 e comprimento 50,
tabela EMP para armazenar asteriscos (*).
5. Crie um bloco PL/SQL que premie um funcionrio, anexando um asterisco coluna STARS
para cada US$ 100 do salrio do funcionrio. Salve o bloco PL/SQL em um arquivo nomeado
p19q5.sql.
a. Aceite o ID do funcionrio como entrada do usurio com uma varivel de substituio do
SQL*Plus.
b. Inicialize uma varivel que conter uma string de asteriscos.
c. Anexe um asterisco string para cada US$ 100 do salrio. Por exemplo, se o funcionrio
recebe um salrio de US$ 800, a string de asteriscos dever conter oito asteriscos. Se o
funcionrio recebe um salrio de US$ 1.250, a string de asteriscos deve conter 13 asteriscos.
d. Atualize a coluna STARS do funcionrio com a string de asteriscos.
e. Efetue um commit.
f. Teste o bloco dos funcionrios que no tm salrio e de um funcionrio que tem um salrio.
Informe o nmero do funcionrio: 7934
Procedimento PL/SQL concludo corretamente.
Informe o nmero do funcionrio: 8000
Procedimento PL/SQL concludo corretamente.
Objetivo da Lio
Nesta lio, voc aprender mais sobre os tipos de dados compostos e seus usos.
Tipos:
PL/SQL RECORDS
PL/SQL TABLES
Contm componentes internos
So reutilizveis
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
Um registro um grupo de itens de dados relacionados armazenados em campos, cada um com seu
prprio nome e tipo de dados. Por exemplo, suponha que voc tenha tipos diferentes de dados sobre
um funcionrio, como nome, salrio, data de admisso etc. Esses dados so diferentes em tipo porm
esto relacionados logicamente. Um registro que contm campos, como o nome, o salrio e a data de
admisso de um funcionrio permite manipular os dados como uma unidade lgica. Quando voc
declara um tipo de registro para esses campos, eles podem ser manipulados como uma unidade.
Cada registro definido pode ter tantos campos quantos forem necessrios.
Os registros podem receber atribuio de valores iniciais e podem ser definidos como
NOT NULL.
Os campos sem valores iniciais so inicializados para NULL.
A palavra-chave DEFAULT tambm pode ser usada ao definir campos.
Voc pode definir tipos RECORD e declarar registros definidos pelo usurio na parte declarativa
de qualquer bloco, subprograma ou pacote.
Pode-se declarar e fazer referncia a registros aninhados. Um registro pode ser o componente de
outro registro.
Sintaxe
TYPE type_name IS RECORD
(field_declaration[, field_declaration]);
identifier type_name;
Onde field_declaration
field_name {field_type | variable%TYPE
| tabela.coluna%TYPE | tabela%ROWTYPE}
[[NOT NULL] {:= | DEFAULT} expr]
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.
Exemplo
Campo1 Campo2 Campo3
(tipo de dados) (tipo de dados) (tipo de dados)
empno number(4) ename varchar2(10) job varchar2(9)
Por exemplo, voc faz referncia ao campo job no registro emp_record do seguinte modo:
emp_record.job ...
DECLARE
identificador referncia%ROWTYPE;
Exemplos
Declarar uma varivel para armazenar a
mesma informao sobre um departamento
que est armazenada na tabela DEPT.
dept_record dept%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
Tabelas PL/SQL
Os objetos do tipo TABLE so chamados tabelas PL/SQL. Eles so modelados como (mas no iguais a)
tabelas de banco de dados. As tabelas PL/SQL usam uma chave primria para fornecer a voc acesso a
linhas semelhante a array.
Uma tabela PL/SQL:
semelhante a um array
Deve conter dois componentes:
Uma chave primria do tipo de dados BINARY_INTEGER que indexa a PL/SQL TABLE
Uma coluna de um tipo de dados escalares ou de registro, que armazena os elementos de
PL/SQL TABLE
Pode crescer dinamicamente por no conter restries
1 Jones
2 Smith
3 Maduro
... ...
BINARY_INTEGER Escalar
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 Descrio
EXISTS(n) Retornar TRUE se o ensimo elemento em uma tabela PL/SQL existir.
COUNT Retorna o nmero de elementos contidos uma tabela PL/SQL atualmente.
FIRST Retorna o primeiro e ltimo (menor e maior) nmeros de ndice de uma tabela
LAST PL/SQL. Retornar NULL se a tabela PL/SQL estiver vazia.
PRIOR(n) Retorna o nmero de ndice que precede o ndice n em uma tabela PL/SQL.
NEXT(n) Retorna o nmero do ndice que sucede o ndice n em uma tabela PL/SQL.
EXTEND(n, i)* Aumenta o tamanho de uma tabela PL/SQL.
EXTEND anexa um elemento nulo a uma tabela PL/SQL.
EXTEND(n) anexa n elementos nulos a uma tabela PL/SQL.
EXTEND(n, i) anexa n cpias do elemento i a uma tabela PL/SQL.
TRIM* TRIM remove um elemento do final de uma tabela PL/SQL.
TRIM(n) remove n elementos do final de uma tabela PL/SQL.
DELETE DELETE remove todos os elementos de uma tabela PL/SQL.
DELETE(n) remove o ensimo elemento de uma tabela PL/SQL.
DELETE(m, n) remove todos os elementos na faixa m ... n de uma tabela PL/SQL.
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.
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.
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.
Conjunto ativo
Cursores Explcitos
Use cursores explcitos para processar individualmente cada linha retornada por uma instruo
SELECT de vrias linhas.
O conjunto de linhas retornado por uma consulta de vrias linhas chamado conjunto ativo. Seu
tamanho o nmero de linhas que atende aos critrios da pesquisa. O diagrama no slide mostra como
um cursor explcito "aponta" para a linha atual do conjunto ativo. Isso permite que o programa
processe as linhas uma de cada vez.
Um programa PL/SQL abre um cursor, processa linhas retornadas por uma consulta e, em seguida,
fecha o cursor. O cursor marca a posio atual no conjunto ativo.
Funes do cursor explcito:
Pode processar alm da primeira linha retornada pela consulta, linha por linha
Controla que linha est sendo processada no momento
Permite que o programador controle as linhas manualmente no bloco PL/SQL
Observao: A extrao de um cursor implcito uma extrao de array e a existncia de uma
segunda linha ainda criar a exceo TOO_MANY_ROWS. Alm disso, voc pode usar cursores
explcitos para realizar diversas extraes e para executar novamente consultas analisadas na rea de
trabalho.
No
Sim
DECLARE OPEN FETCH EMPTY? CLOSE
Cursor
Extraia uma linha do cursor.
Indicador
Cursor
Prossiga at estar vazio.
Indicador
Cursor
Feche o cursor.
Exemplo
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename
FROM emp;
CURSOR dept_cursor IS
SELECT *
FROM dept
WHERE deptno = 10;
BEGIN
...
Observao: Pode-se fazer referncia variveis na consulta, mas voc deve declar-las antes da
instruo CURSOR.
Instruo OPEN
Abre o cursor para executar a consulta e identificar o conjunto ativo, que consiste em todas as linhas
que atendem aos critrios de pesquisa da consulta. O cursor aponta agora para a primeira linha do
conjunto ativo.
Na sintaxe:
cursor_name o nome do cursor declarado anteriormente
OPEN uma instruo executvel que realiza as seguintes operaes:
1. Aloca memria dinamicamente para uma rea de contexto que finalmente conter informaes
cruciais de processamento.
2. Analisa a instruo SELECT.
3. Vincula as variveis de entrada isto , define o valor das variveis de entrada obtendo seus
endereos de memria.
4. Identifica o conjunto ativo isto , o conjunto de linhas que satisfaz os critrios de pesquisa.
As linhas no conjunto ativo no so recuperadas para variveis quando a instruo OPEN
executada. Em vez disso, a instruo FETCH recupera as linhas.
5. Posiciona o indicador imediatamente antes da primeira linha no conjunto ativo.
Instruo FETCH
A instruo FETCH recupera as linhas no conjunto ativo uma de cada vez. Aps cada extrao, o
cursor avana para a prxima linha no conjunto ativo.
Na sintaxe:
cursor_name o nome do cursor declarado anteriormente
varivel uma varivel de sada para armazenar os resultados
record_name o nome do registro em que os dados recuperados so armazenados
(A varivel de registro pode ser declarada usando o atributo %ROWTYPE.)
Diretrizes
Inclua o mesmo nmero de variveis na clusula INTO da instruo FETCH do que as colunas
na instruo SELECT e certifique-se de que os tipos de dados so compatveis.
Faa a correspondncia de cada varivel para coincidir com a posio das colunas.
Como alternativa, defina um registro para o cursor e faa referncia do registro na clusula
FETCH INTO.
Teste para verificar se o cursor possui linhas. Se uma extrao no obtiver valores, no existem
linhas remanescentes para serem processadas no conjunto ativo e nenhum erro ser registrado.
Observao: A instruo FETCH realiza as seguintes operaes:
1. Avana o indicador para a prxima linha no conjunto ativo.
2. L os dados da linha atual para as variveis PL/SQL de sada.
Exemplos
FETCH emp_cursor INTO v_empno, v_ename;
...
OPEN defined_cursor;
LOOP
FETCH defined_cursor INTO defined_variables
EXIT WHEN ...;
...
-- Process the retrieved data
...
END;
Sintaxe
CLOSE cursor_name;
Instruo CLOSE
A instruo CLOSE desativa o cursor e o conjunto ativo se torna indefinido. Feche o cursor aps
completar o processamento da instruo SELECT. Essa etapa permite que o cursor seja reaberto,
se necessrio. Assim, voc pode estabelecer um conjunto ativo diversas vezes.
Na sintaxe:
cursor_name o nome do cursor declarado anteriormente.
No tente extrair dados de um cursor aps ele ter sido fechado ou ser criada a exceo
INVALID_CURSOR.
Observao: A instruo CLOSE libera a rea de contexto.
Embora seja possvel terminar o bloco PL/SQL sem fechar cursores, voc deve criar o hbito de
fechar qualquer cursor declarado explicitamente para liberar recursos.
Existe um limite mximo para o nmero de cursores abertos por usurio, que determinado pelo
parmetro OPEN_CURSORS no campo de parmetros do banco de dados. OPEN_CURSORS = 50
por default.
...
FOR i IN 1..10 LOOP
FETCH emp_cursor INTO v_empno, v_ename;
...
END LOOP;
CLOSE emp_cursor;
END;
Introduo ao Oracle: SQL e PL/SQL 21-13
Atributos do Cursor Explcito
Obter informaes de status sobre um cursor.
Atributo Tipo Descrio
%ISOPEN Booleano Ser avaliado para TRUE se o cursor
estiver aberto
%NOTFOUND Booleano Ser avaliado para TRUE se a
extrao mais recente no retornar
uma linha
%FOUND Booleano Ser avaliado para TRUE se a
extrao mais recente no retornar
uma linha; complemento de
%NOTFOUND
%ROWCOUNT Nmero Ser avaliado para o nmero total
de linhas retornadas at o momento
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 ;
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
Voc j constatou que pode definir registros para usar a estrutura de colunas em uma tabela. Voc
tambm pode definir um registro com base na lista selecionada de colunas em um cursor explcito.
Isso conveniente para processar as linhas do conjunto ativo, porque voc pode simplesmente extrair
para o registro. Assim, os valores das linhas so carregados diretamente para os campos
correspondentes do registro.
Exemplo
Use um cursor para recuperar nmeros e nomes de funcionrios e preencher uma tabela de banco de
dados temporria com essas informaes.
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename
FROM emp;
emp_record emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_record;
EXIT WHEN emp_cursor%NOTFOUND;
INSERT INTO temp_list (empid, empname)
VALUES (emp_record.empno, emp_record.ename);
END LOOP;
COMMIT;
CLOSE emp_cursor;
END ;
Introduo ao Oracle: SQL e PL/SQL 21-19
Loops FOR de Cursor
Sintaxe
FOR record_name IN cursor_name LOOP
instruo1;
instruo2;
. . .
END LOOP;
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 ;
/
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.
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;
/
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
Objetivo da Lio
Nesta lio, voc aprender mais sobre como criar cursores explcitos, especificamente sobre como
criar cursores que utilizam parmetros.
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 ...
Sintaxe
SELECT ...
FROM ...
FOR UPDATE [OF column_reference][NOWAIT];
Sintaxe
WHERE CURRENT OF cursor ;
Exemplo
DECLARE
CURSOR my_cursor IS
SELECT t1.deptno, t1.dname, t2.STAFF
FROM dept t1, (SELECT deptno,
count(*) STAFF
FROM emp
GROUP BY deptno) t2
WHERE t1.deptno = t2.deptno
AND t2.STAFF >= 5;
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
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.
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
Ocorre um erro do Oracle e a exceo associada criada automaticamente. Por exemplo, se
ocorrer o erro ORA-01403 quando nenhuma linha for recuperada do banco de dados em uma
instruo SELECT, em seguida, o cdigo PL/SQL criar a exceo NO_DATA_FOUND.
Crie uma exceo explicitamente emitindo a instruo RAISE dentro do bloco. A exceo
criada pode ser definida ou predefinida pelo usurio.
DECLARE DECLARE
BEGIN BEGIN
A exceo A exceo
criada criada
EXCEPTION EXCEPTION
A exceo A exceo no
capturada END; END; capturada
A exceo propaga
para o ambiente de
chamada
Tipos de Exceo
Voc pode programar excees a fim de evitar transtornos no tempo de execuo. H trs tipos de
excees.
Exceo Descrio Orientaes para Tratamento
Erro predefinido pelo Um dos cerca de 20 erros que No declare e permita que o Oracle
Oracle Server ocorrem com mais freqncia Server crie as excees
no cdigo do PL/SQL implicitamente
Erro no predefinido Qualquer outro erro padro do Declare dentro da seo declarativa e
pelo Oracle Server Oracle Server permita que o Oracle Server crie as
excees de forma implcita
Erro definido pelo Uma condio que o Declare dentro da seo declarativa e
usurio desenvolvedor determina que crie excees de forma explcita
seja anormal.
Observao: Algumas ferramentas de aplicao com cdigo PL/SQL cliente, como o Oracle
Developer Forms, tm suas prprias excees.
Capturando Excees
Voc pode capturar qualquer erro incluindo uma rotina correspondente dentro da seo de tratamento
de excees do bloco PL/SQL. Cada handler consiste em uma clusula WHEN, que especifica uma
exceo, seguida por uma seqncia de instrues a serem executadas quando essa exceo for
criada.
Na sintaxe:
exceo o nome padro de uma exceo predefinida ou o nome de uma exceo
definida pelo usurio declarada na seo declarativa
instruo uma ou mais instrues PL/SQL ou SQL
Diretrizes
Inicie a seo de tratamento de excees do bloco com a palavra-chave EXCEPTION.
Defina vrios handlers de exceo para o bloco, cada um deles com o seu prprio conjunto
de aes.
Quando ocorre uma exceo, o cdigo PL/SQL processa somente um handler antes de sair
do bloco.
Coloque a clusula OTHERS aps todas as outras clusulas de tratamento de exceo.
Voc pode ter no mximo uma clusula OTHERS.
As excees no podem aparecer em instrues de atribuio ou instrues SQL.
Nmero
do Erro
do Oracle
Nome da Exceo Server Descrio
ACCESS_INTO_NULL ORA-06530 Tentativa de atribuir valores aos atributos de um
objeto no inicializado
COLLECTION_IS_NULL ORA-06531 Tentativa de aplicao de mtodos de conjunto
diferentes de EXISTS para um varray ou tabela
aninhada no inicializada
CURSOR_ALREADY_OPEN ORA-06511 Tentativa de abertura de um cursor j aberto
DUP_VAL_ON_INDEX ORA-00001 Tentativa de insero de um valor duplicado
INVALID_CURSOR ORA-01001 Ocorreu operao ilegal de cursor
INVALID_NUMBER ORA-01722 Falha da converso de string de caracteres para
nmero
LOGIN_DENIED ORA-01017 Estabelecendo login com o Oracle com um
nome de usurio ou senha invlida
NO_DATA_FOUND ORA-01403 SELECT de linha nica no retornou dados
NOT_LOGGED_ON ORA-01012 O programa PL/SQL emite uma chamada de
banco de dados sem estar conectado ao Oracle
PROGRAM_ERROR ORA-06501 O cdigo PL/SQL tem um problema interno
ROWTYPE_MISMATCH ORA-06504 Varivel de cursor de host e varivel de cursor
PL/SQL envolvidas em uma atribuio tm
tipos de retorno incompatveis
STORAGE_ERROR ORA-06500 O PL/SQL esgotou a memria ou a memria
est corrompida
SUBSCRIPT_BEYOND_COUNT ORA-06533 Feita referncia ao elemento de varray ou tabela
aninhada usando um nmero de ndice maior do
que o nmero de elementos no conjunto
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Feita referncia a um elemento de varray ou
tabela aninhada usando um nmero de ndice
fora da faixa legal (1, por exemplo)
TIMEOUT_ON_RESOURCE ORA-00051 Ocorreu timeout enquanto o Oracle est
aguardando por um recurso
TOO_MANY_ROWS ORA-01422 SELECT de uma nica linha retornou mais de
uma linha
VALUE_ERROR ORA-06502 Ocorreu erro aritmtico, de converso,
truncamento ou restrio de tamanho
ZERO_DIVIDE ORA-01476 Tentativa de diviso por zero
SQLCODE
Retorna o valor numrico do cdigo de erro
SQLERRM
Retorna a mensagem associada ao nmero
de erro
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.
Procedimento RAISE_APPLICATION_ERROR
Use o procedimento RAISE_APPLICATION_ERROR para comunicar uma exceo predefinida
interativamente retornando um cdigo ou uma mensagem de erro no padronizada. Com
RAISE_APPLICATION_ERROR, voc pode relatar erros para a aplicao e evitar o retorno de
excees no tratveis.
Na sintaxe:
error_number um nmero especificado pelo usurio para a exceo entre 20000
e 20999.
mensagem a mensagem especificada pelo usurio para a exceo. Trata-se de
uma string de caracteres com at 2.048 bytes.
TRUE | FALSE um parmetro Booleano opcional (Se TRUE, o erro ser colocado
na pilha de erros anteriores. Se FALSE, o default, o erro substituir
todos os erros anteriores.)
Exemplo
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20201,
'Manager is not a valid employee.');
END;
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
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.
RESULTS
--------------------------------------------
SMITH - 800
More than one employee with a salary of 3000
No employee with a salary of 6000
G_MESSAGE
--------------------------------------
Department 50 is an invalid department
3. Crie um bloco PL/SQL que imprima o nmero de funcionrios que recebem mais ou menos
US$ 100 do salrio fornecido.
a. Se no houver funcionrio nessa faixa de salrio, imprima uma mensagem para o usurio
indicando que esse o caso. Use uma exceo para esse caso.
b. Se houver um ou mais funcionrios dentro dessa faixa, a mensagem dever indicar
quantos funcionrios esto naquela faixa salarial.
c. Trate quaisquer outras excees com um handler de exceo apropriado. A mensagem deve
indicar que ocorreu algum outro erro.
G_MESSAGE
----------------------------------------------------------
There is/are 1 employee(s) with a salary between 700 and 900
G_MESSAGE
----------------------------------------------------------
There is/are 3 employee(s) with a salary between 2900 and 3100
G_MESSAGE
-------------------------------------------------
There is no employee salary between 5900 and 6100
SQL> SELECT *
2 FROM salgrade;
A tabela EMP no contm uma coluna chamada salary. A coluna chamada sal.
O operador de multiplicao *, no x, como mostrado na linha 2.
O apelido ANNUAL SALARY no pode incluir espaos. O apelido deve ser
ANNUAL_SALARY ou estar entre aspas duplas.
Falta uma vrgula aps a coluna ENAME.
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.
9. Crie uma consulta para exibir os cargos exclusivos a partir da tabela EMP.
SQL> SELECT DISTINCT job
2 FROM emp;
11. Exiba o nome concatenado com o cargo, separado por uma vrgula e espao, e nomeie
a coluna Employee and Title.
SQL> SELECT ename||', '||job "Employee and Title"
2 FROM emp;
2. Crie uma consulta para exibir o nome do funcionrio e o nmero do departamento relativos ao
nmero de funcionrio 7566.
SQL> SELECT ename, deptno
2 FROM emp
3 WHERE 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
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 ename, job, hiredate
2 FROM emp
3 WHERE hiredate BETWEEN
4 TO_DATE('20-Feb-1981','DD-MON-YYYY') AND
5 TO_DATE('01-May-1981','DD-MON-YYYY')
6 ORDER BY hiredate;
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 ename "Employee", sal "Monthly Salary"
FROM emp
WHERE sal > 1500
AND deptno IN (10, 30)
/
SQL> START p2q6.sql
11. Exiba os nomes de todos os funcionrios cujo nome tem duas letras L no departamento 30
ou cujo gerente seja 7782.
SQL> SELECT ename
2 FROM emp
3 WHERE ename LIKE '%L%L%'
4 AND deptno = 30
5 OR mgr = 7782;
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
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;
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
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 ename || ' earns '
2 || TO_CHAR(sal, 'fm$99,999.00')
3 || ' monthly but wants '
4 || TO_CHAR(sal * 3, 'fm$99,999.00')
5 || '.' "Dream Salaries"
6 FROM 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> SELECT INITCAP(ename) "Name",
2 LENGTH(ename) "Length"
3 FROM emp
4 WHERE ename LIKE 'J%'
5 OR ename LIKE 'M%'
6 OR ename LIKE 'A%';
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.
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 A
MANAGER B
ANALYST C
SALESMAN D
CLERK E
None of the above O
2. Crie uma lista nica de todos os cargos existentes no departamento 30. Inclua a localizao
do departamento 30 na sada.
SQL> SELECT DISTINCT e.job, d.loc
2 FROM emp e, dept d
3 WHERE e.deptno = d.deptno
4 AND e.deptno = 30;
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> SELECT e.ename, e.job, e.deptno, d.dname
2 FROM emp e, dept d
3 WHERE e.deptno = d.deptno
4 AND d.loc = 'DALLAS';
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 "Employee", e.empno "Emp#",
m.ename "Manager", m.empno "Mgr#"
FROM emp e, emp m
WHERE e.mgr = m.empno(+)
/
SQL> START p4q7.sql
Se voc tiver tempo, complete os exerccios abaixo.
8. Crie uma consulta que exibir o nome do funcionrio, o nmero do departamento e todos os
funcionrios que trabalham no mesmo departamento que um determinado funcionrio. Fornea
a cada coluna um label apropriado.
SQL> SELECT e.deptno department, e.ename employee,
2 c.ename colleague
3 FROM emp e, emp c
4 WHERE e.deptno = c.deptno
5 AND e.empno <> c.empno
6 ORDER BY e.deptno, e.ename, c.ename;
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> SELECT e.ename "Employee", e.hiredate "Emp Hiredate",
2 m.ename "Manager", m.hiredate "Mgr Hiredate"
3 FROM emp e, emp m
4 WHERE e.mgr = m.empno
5 AND e.hiredate < m.hiredate;
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 MAX(sal) - MIN(sal) DIFFERENCE
2 FROM emp;
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> SELECT d.dname, d.loc, COUNT(*) "Number of People",
2 ROUND(AVG(sal),2) "Salary"
3 FROM emp e, dept d
4 WHERE e.deptno = d.deptno
5 GROUP BY d.dname, d.loc;
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 job "Job",
2 SUM(DECODE(deptno, 10, sal)) "Dept 10",
3 SUM(DECODE(deptno, 20, sal)) "Dept 20",
4 SUM(DECODE(deptno, 30, sal)) "Dept 30",
5 SUM(sal) "Total"
6 FROM emp
7 GROUP BY job;
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> SELECT empno, ename
2 FROM emp
3 WHERE sal > (SELECT AVG(sal)
4 FROM emp)
5 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 empno, ename
2 FROM emp
3 WHERE deptno IN (SELECT deptno
4 FROM emp
5 WHERE ename LIKE '%T%');
SQL> SAVE p6q3.sql
Created file p6q3.sql
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> SELECT ename, hiredate, sal
2 FROM emp
3 WHERE (sal, NVL(comm,0)) IN
4 (SELECT sal, NVL(comm,0)
5 FROM emp
6 WHERE ename = 'SCOTT')
7 AND ename != 'SCOTT';
4. Crie uma consulta para exibir os funcionrios que recebem um salrio maior que o salrio
de todos os escriturrios. Classifique os resultados sobre salrios do maior para o menor.
SQL> SELECT ename, job, sal
2 FROM emp
3 WHERE sal > ALL (SELECT sal
4 FROM emp
5 WHERE job = 'CLERK')
6 ORDER BY sal DESC;
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
1 Patel Ralph rpatel 795
2 Dancs Betty bdancs 860
3 Biri Ben bbiri 1100
4 Newman Chad cnewman 750
5 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);
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
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;
SQL> COMMIT;
21. Descarte a operao DELETE mais recente sem descartar a operao INSERT anterior.
SQL> ROLLBACK TO SAVEPOINT a;
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.
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;
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.
2. Crie uma restrio PRIMARY KEY na tabela DEPARTMENT usando a coluna ID. A
restrio deve ser ativada na criao.
SQL> ALTER TABLE department
2 ADD CONSTRAINT 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);
SQL> SELECT *
2 FROM emp_vu;
4. Usando a view EMP_VU, informe uma consulta para exibir os nomes de todos os
funcionrios e nmeros dos departamentos.
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> CREATE VIEW dept20 AS
2 SELECT empno employee_id, ename employee,
3 deptno department_id
4 FROM emp
5 WHERE deptno = 20
6 WITH CHECK OPTION CONSTRAINT emp_dept_20;
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;
10. Consulte todas as linhas na tabela DEPT da outra equipe, usando o sinnimo.
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>;
Key PK
Type
Null/ NN,U NN NN
Unique
Default System
Value Date
Length 10 25 25 100 30 15
Length 10 60 400 4 20
Length 10 10 10
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;
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> INSERT INTO reservation (res_date, member_id, title_id)
2 VALUES (SYSDATE, 101, 98);
SQL> INSERT INTO reservation (res_date, member_id, title_id)
2 VALUES (SYSDATE, 104, 97);
G_MESSAGE
------------------------------------------------------
My PL/SQL Block Works
Variable Value
---------- ----------------------------------------
V_CHAR The literal '42 is the answer'
V_NUM The first two characters from V_CHAR
G_CHAR
---------------------
42 is the answer
G_NUM
---------
42
v_weight := v_weight + 1;
v_message := v_message || ' is in stock';
v_new_locn := 'Western ' || v_new_locn;
END;
DECLARE
v_customer VARCHAR2(50) := 'Womansport';
v_credit_rating VARCHAR2(50) := 'EXCELLENT';
BEGIN
DECLARE
v_customer NUMBER(7) := 201;
v_name VARCHAR2(25) := 'Unisports';
BEGIN
v_customer v_name v_credit_rating
END;
END;
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.
SELECT *
FROM dept
WHERE deptno = :g_max_deptno + 10;
3. Crie um bloco PL/SQL que atualize a localizao de um departamento existente. Salve o bloco
PL/SQL em um arquivo nomeado p18q3.sql.
a. Use um parmetro de substituio do SQL*Plus para o nmero do departamento.
b. Use um parmetro de substituio do SQL*Plus para a localizao do departamento.
c. Teste o bloco PL/SQL.
d. Exiba o nome e o nmero do departamento, alm da localizao do departamento atualizado.
SQL> SELECT *
2 FROM dept
3 WHERE deptno = &p_deptno;
4. Crie um bloco PL/SQL que delete o departamento criado no exerccio 2. Salve o bloco
PL/SQL em um arquivo nomeado p18q4.sql.
a. Use um parmetro de substituio do SQL*Plus para o nmero do departamento.
b. Imprima na tela o nmero de linhas afetadas.
c. Teste o bloco PL/SQL.
SQL> SELECT *
2 FROM dept
3 WHERE deptno = 50;
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 0
DECLARE
v_char VARCHAR2(30);
v_num NUMBER(11,2);
BEGIN
v_char := '42 is the answer';
v_num := TO_NUMBER(SUBSTR(v_char,1,2));
IF mod(v_num, 2) = 0 THEN
INSERT INTO messages (results)
VALUES ('Number is even');
ELSE
INSERT INTO messages (results)
VALUES ('Number is odd');
END IF;
END;
/
SQL> SELECT *
2 FROM messages;
4. Adicione uma nova coluna, STARS de tipo de dados VARCHAR2 e o comprimento 50 tabela
EMP para armazenamento de asterisco (*).
SQL> ALTER TABLE emp
2 ADD stars VARCHAR2(50);
5. Crie um bloco PL/SQL que premie um funcionrio, anexando um asterisco coluna STARS
para cada US$100 do salrio do funcionrio. Salve o bloco PL/SQL em um arquivo nomeado
p19q5.sql.
a. Aceite o ID do funcionrio como entrada do usurio com uma varivel de substituio do
SQL*Plus.
b. Inicialize uma varivel que conter uma string de asteriscos.
c. Anexe um asterisco string para cada US$100 do salrio. Por exemplo, se o funcionrio
recebe um salrio de US$800, a string de asteriscos deve conter oito asteriscos. Se o
funcionrio recebe um salrio de US$1.250, a string de asteriscos deve conter 13 asteriscos.
d. Atualize a coluna STARS do funcionrio com a string de asteriscos.
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;
/
SET SERVEROUTPUT ON
DECLARE
CURSOR dept_cursor IS
SELECT deptno,dname
FROM dept
ORDER BY deptno;
CURSOR emp_cursor(v_deptno NUMBER) IS
SELECT ename,job,hiredate,sal
FROM emp
WHERE deptno = v_deptno;
v_current_deptno dept.deptno%TYPE;
v_current_dname dept.dname%TYPE;
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
v_mgr emp.mgr%TYPE;
v_hiredate emp.hiredate%TYPE;
v_sal emp.sal%TYPE;
v_line varchar2(100);
BEGIN
v_line := ' ';
OPEN dept_cursor;
LOOP
FETCH dept_cursor INTO
v_current_deptno,v_current_dname;
EXIT WHEN dept_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ('Department Number : ' ||
v_current_deptno || ' Department Name : ' ||
v_current_dname);
DBMS_OUTPUT.PUT_LINE(v_line);
IF emp_cursor%ISOPEN THEN
CLOSE emp_cursor;
END IF;
Observao: A soluo continua na prxima pgina.
EXCEPTION
WHEN e_invalid_dept THEN
dbms_output.put_line('Department '|| TO_CHAR(v_deptno) ||
' is an invalid department');
END;
/
SET VERIFY ON
PRODID DESCRIP
--------- ------------------------------
100860 ACE TENNIS RACKET I
100861 ACE TENNIS RACKET II
100870 ACE TENNIS BALLS-3 PACK
100871 ACE TENNIS BALLS-6 PACK
100890 ACE TENNIS NET
101860 SP TENNIS RACKET
101863 SP JUNIOR RACKET
102130 RH: "GUIDE TO TENNIS"
200376 SB ENERGY BAR-6 PACK
200380 SB VITA SNACK-6 PACK
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
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
ACCEPT 8-11
ADD_MONTHS 3-20
ALL 6-16
TABLE 10-15
USER 14-11
AND 2-16
ANY 6-15
Apelido 1-16
AS 1-17
ASC 2-22
Atributo I-9
Autojuno 4-19
AVG 5-6
BETWEEN 2-10
BFILE 16-15
BINARY_INTEGER 20-11
BLOB 16-15
Bloqueios 9-37
BREAK 8-23
BTITLE 8-24
CACHE 13-5
COLUMN 10-19
INDEX 13-23
SEQUENCE 13-15
TABLE 10-22
VIEW 12-19
CLOB 16-30
CLOSE 21-13
COLUMN 8-21
expresses 16-28
conjunto 16-29
converso 17-9
COUNT 5-8
SEQUENCE 13-7
SYNONYM 13-24
TABLE 10-5
USER 14-6
VIEW 12-8
CURRVAL 13-9
cursor 18-15
CYCLE 13-6
Datas 3-17
DBMS_OUTPUT 16-34
DDL 10-5
DD-MON-YY 3-17
DECODE 3-39
DEFINE 8-11
Delimitadores 17-3
DESC 2-22
DESCRIBE 1-28
DISTINCT 1-23
DML 9-3
ELSIF 19-5
END IF 19-5
Entidade I-9
ESCAPE 2-13
Escopo 17-11
Esquema 10-6
Exceo 23-3
FETCH 21-11
Funo 14-9
Funes 3-3
GRANT 14-8
GROUP BY 5-12
HAVING 5-21
Identificadores 17-4
IN 2-11
INCREMENT BY 13-5
ndice 13-16
INITCAP 3-9
Instruo IF 19-3
IS NULL 2-14
Juno 4-4
LAST_DAY 3-20
LENGTH 3-11
LIKE 2-12
Literal 1-20
LOB 16-13
Locators 16-9
login.sql 8-18
LOWER 3-9
LPAD 3-11
M
MAX 5-7
MAXVALUE 13-5
MIN 5-7
MINVALUE 13-5
MOD 3-16
MODIFY 10-18
MONTHS_BETWEEN 3-20
NCLOB 16-30
NEXT_DAY 3-20
NEXTVAL 13-9
NOT 2-18
NVL 3-37
OPEN 21-9
OR 2-17
ORDER BY 2-22
PL/SQL I-3
Ponteiros 16-9
PRAGMA 23-11
PRINT 17-16
PUBLIC 14-16
RAISE_APPLICATION_ERROR 23-19
REFERENCES 11-15
Registro 20-3
Relacionamento I-9
Relatrios 8-3
RENAME 10-23
restries 11-3
REVOKE 14-18
ROUND 3-14
ROWNUM 12-22
RPAD 3-11
SELECT 1-3
Seqncia 13-4
Sinnimo 13-24
SQL I-17
SQL*Plus 1-24
SQLCODE 23-13
SQLERRM 23-13
Subprogramas 16-5
SUBSTR 3-11
SUM 5-6
SYSDATE 3-17
Tabelas 20-3
Variveis 20-3
TO_CHAR 3-33
TO_NUMBER 3-35
Transao 9-3
TRIM 3-11
TRUNC 3-15
TTITLE 8-24
Tupla I-13
UNDEFINE 8-14
UPPER 3-9
USER_CONS_COLUMNS 1-28
USER_CONSTRAINTS 11-4
USER_IND_COLUMNS 13-21
USER_INDEXES 13-21
USER_SEQUENCES 13-8
Variveis 16-7
View 12-5
WHERE 2-4