Sei sulla pagina 1di 65

Introduo programao

PL/SQL



Maio 2009


















Marcus William
marcuswlima@gmail.com




Todos os direitos de cpia reservados. No permitida a distribuio fsica ou eletrnica deste material
sem a permisso expressa do autor.






I
Sumrio
Apresentao ______________________________________________________ IV
Organizao Trabalho _____________________________________________________ IV
Autor ___________________________________________________________________ IV
Perfil Programador PL/SQL _______________________________________________ V
Arquitetura Banco de Dados Oracle _________________________________________ V

Parte I - Comandos SQL
1 Comandos SQL__________________________________________________ 7
2 Implementando consultas SQL simples _______________________________ 8
2.1 Construo Bsica ___________________________________________________ 8
2.2 Colunas ___________________________________________________________ 8
2.3 Expresses Aritmticas (Operadores aritmticos) _________________________ 9
2.4 Operador de Concatenao ___________________________________________ 9
3 Restringindo e ordenando dados ___________________________________ 10
3.1 Clusula WHERE __________________________________________________ 10
3.2 Operadores de comparao __________________________________________ 10
3.3 Operadores Lgicos ________________________________________________ 11
3.4 Precedncia _______________________________________________________ 11
3.5 Order By _________________________________________________________ 11
4 Funes de uma linha ___________________________________________ 12
4.1 Funes de Caracter ________________________________________________ 12
4.2 Funes Numricas _________________________________________________ 13
4.3 Funes de Data ___________________________________________________ 13
4.4 Funes de Converso ______________________________________________ 14
4.4.1 TO_CHAR(X[,format_model ]) _________________________________________ 14
4.4.2 TO_DATE( stri ng, formatao) ________________________________________ 15
4.5 Expresses Condicionais Gerais ______________________________________ 16
4.5.1 NVL __________________________________________________________________ 16
4.5.2 DECODE _____________________________________________________________ 16
4.5.3 CASE ________________________________________________________________ 16
5 Mostrando dados de vrias tabelas __________________________________ 18
5.1 Produto Cartesiano _________________________________________________ 18
5.2 Alias de Tabela ____________________________________________________ 19
5.3 Outer-JOIN _______________________________________________________ 20
5.4 Self-JOIN _________________________________________________________ 20
6 Funes de grupo _______________________________________________ 21
7 Subconsultas __________________________________________________ 23
7.1 Operador IN ______________________________________________________ 24


II
7.2 Operador ANY ____________________________________________________ 24
7.3 Operador ALL ____________________________________________________ 24
8 Manipulando dados (DML) _______________________________________ 25
8.1 INSERT __________________________________________________________ 25
8.2 UPDATE _________________________________________________________ 25
8.3 DELETE _________________________________________________________ 26
9 Controle de transao____________________________________________ 27

Parte II - Programao PL/SQL
10 Bloco PL/SQL _________________________________________________ 28
11 Programao PL/SQL ___________________________________________ 30
11.1 Comentrios ______________________________________________________ 30
11.2 Declaraes (seo de declarao) _____________________________________ 30
11.3 Tipos de Dados ____________________________________________________ 31
11.4 Assinalar Valores __________________________________________________ 32
11.5 Controle de Fluxo __________________________________________________ 32
11.5.1 IF-THEN ____________________________________________________________ 33
11.5.2 IF-THEN-ELSE ______________________________________________________ 33
11.5.3 IF-THEN-ELSIF _____________________________________________________ 33
11.6 Controle de Repetio_______________________________________________ 34
11.6.1 LOOP Si mples ______________________________________________________ 34
11.6.2 WHILE-LOOP _______________________________________________________ 34
11.6.3 FOR - LOOP ________________________________________________________ 35
11.7 Labels ____________________________________________________________ 35
11.8 Cursores __________________________________________________________ 36
11.8.1 Controlando Cursores Explcitos ____________________________________ 36
11.8.2 Decl arando um Cursor (DECLARE)___________________________________ 36
11.8.3 Abrindo um Cursor (OPEN) __________________________________________ 37
11.8.4 Extraindo dados do Cursor (FETCH) _________________________________ 37
11.8.5 Fechando do Cursor (CLOSE) _______________________________________ 37
11.8.6 Atri butos do Cursor Explcito ________________________________________ 38
11.8.7 LOOP Si mples X Cursor _____________________________________________ 39
11.8.8 LOOP Whil e X Cursor _______________________________________________ 39
11.8.9 LOOP For X Cursor _________________________________________________ 39
11.8.10 LOOP For Implcitos ________________________________________________ 40
11.8.11 Cursores Implcitos _________________________________________________ 40
12 Tratamento de Exceo __________________________________________ 41
12.1 Tratando X Propagando_____________________________________________ 41
12.2 Tratamento de Excees _____________________________________________ 42
12.3 Excees PL/SQL Pr-definidas ou internas ____________________________ 43
12.4 Excees PL/SQL definidas pelo Usurio _______________________________ 44
12.5 Comando RAISE_APLLICATION_ERROR ___________________________ 44
12.6 Pragma EXCEPTION_INIT _________________________________________ 45
12.7 SQLCODE, SQLERRM _____________________________________________ 45


III

Parte III - Objetos Procedurais
13 Stored Subprograms _____________________________________________ 47
13.1 Stored Procedure __________________________________________________ 47
13.1.1 Parmetros Stored Procedures ______________________________________ 48
13.1.2 Especi ficando val ores de parmetros ________________________________ 49
13.2 Stored Function ____________________________________________________ 50
13.2.1 Locais permitidos para uso de Functions _____________________________ 51
14 Package ______________________________________________________ 52
15 Database Trigger _______________________________________________ 55
15.1 Elementos _________________________________________________________ 55
15.2 Predicado Condicional ______________________________________________ 56
15.3 Trigger de Linha ___________________________________________________ 56
15.3.1 Qualificadores (:new, :old) __________________________________________ 56
15.3.2 Clusul a WHEN_____________________________________________________ 58

Parte IV - Apndices
A Oracle Net _____________________________________________________ 59
A.1 - Arquitetura _________________________________________________________ 59
A.2 - Configurao ________________________________________________________ 60
A.3 - Principais Problemas _________________________________________________ 61
B Schema HR (Human Resource) ____________________________________ 63



IV
Apresentao

Este material tem a inteno de mostrar quais so os mnimos
conhecimentos necessrios para a construo dos primeiros objetos escritos em
linguagem PL/SQL como procedures, functons, packages e triggers.
Os livros disponveis no mercado voltados para programao Oracle,
inclusive a documententao oficial, so abrangentes e neles contm uma grande
quantidade de informaes, que num primeiro momento podem dificultar o
aprendizado da linguagem PL/SQL. Neste material, sem dvida, temos apenas o
essencial para a iniciao na programao PL/SQL, para que esta experincia seja
rpida e direta.
O leitor dever ter conhecimentos fundamentados em lgica de
programao, e iniciais de banco de dados relacional, tendo em vista que o
material mostrar como as estruturas de programao so aplicadas
programao PL/SQL quanto a sintaxe.
O material foi concebido luz de vrios anos de experincia atuando em
desenvolvimento para Oracle e apresenta as informaes em uma seqncia
pensada adequada para o objetivo do material. Faz parte tambm do material um
arquivo simples de texto com todos os exemplos listados na apostila para evitar
redigitao dos mesmos.

Organizao Trabal ho

Parte I
Abordaremos a construo das primeiras instrues SQL, manipulando os
dados obtidos atravs de funes de linhas e funes de grupo. Consultas
complexas com vrias tabelas sero abordadas, assim como subqueries,
manipulao de dados (insert, update, delete) e controle de transao.
Parte II
Iniciaremos a programao, e ser apresentado como as estruturas de
programao se comportam no PL/SQL, como se d a manipulao dos famosos
cursores PL/SQL e finalizando com tratamento de erros. Todas essas atividades
se daro em blocos PL/SQL annimos que so a unidade bsica da programao
PL/SQL.
Parte III
Continuando a programao, abordaremos a criao e compilao dos
principais objetos procedurais (procedures, function, package, triggers), conhecer
as suas especificidades e suas finalidades.
Parte IV
Como apndice, porm no menos importante, sero mostrados os conceitos
para uma correta configurao de um software Oracle Client.

Autor

Marcus William, Tecnlogo em Processamento de Dados, com mais de 10
anos na rea de TI, convive h mais de sete anos com produtos Oracle, autodidata
no aprendizado da programao PL/SQL, foi coordenador dos programadores
PL/SQL em 2000 no DETRAN-PA e atualmente chefia da Diviso de Banco de
Dados do TJ E-PA.



V
Perfil Programador PL/SQL

O programador PL/SQL o profissional da rea de TI especializado em
criar e manter as construes procedurais de um SGDB ORACLE, estes escritos
em linguagem PL/SQL. O PL/SQL no um produto separado, sim uma
tecnologia integrada ao SGDB Oracle e est disponvel desda verso 6.
Uma das principais finalidades da linguagem PL/SQL a construo de
Stored Procedures, que so unidades de manipulao de dados com scopo
definido de aes, e estaro disponveis aos usurios do SGDB segundo uma
poltica de acesso e privilgios customizada. A principal finalidade das Stored
Procedures prover procedimentos armazenados no SGDB de fcil utilizao,
aliviando assim, a carga de processamento no cliente. Os principais tipos de
Stored Procedure se do na forma de procedure, function e package.
Para se criar ou compilar um objeto no Oracle, o programador dever
submeter ao banco o comando de criao deste objeto, comando este que conter
todos os atributos e inclusive a lgica prevista para o objeto. Se o programador
tem o privilgio de criar os seus objetos, ele o far, caso contrrio essa tarefa
responsabilidade do DBA (DataBase Administrator). Uma forma de facilitar este
trabalho registrar o comando de criao em scripts para fcil recriao quando
necessrio.
comum escutar Vamos alterar a procedure. A rigor um objeto procedural
no alterado e sim recriado ou recompilado. Se a alterao consiste em apenas
na adio de uma linha, ento todo o comando de compilao, adicionado da nova
linha, dever ser reapreciado/compilado pelo Oracle.
Existem alguns excelentes aplicativos IDE (Integrated Development
Environment) que auxiliam a gerncia dos scripts de construo de objetos
procedurais.

Produt o Fabri cant e URL
PL/SQL Developer Allroundautomations www.allroundautomations.com/plsqldev.html
SQL Developer Oracle www.oracle.com/technology/products/database/sql_developer/index.html
SQL Navigator Quest www.quest.com/sql_navigator

Obs.:O programa PL/SQL Developer de prefrncia do autor, no por achar mais eficiente e sim por
estar acostumado.

Arquitetura Banco de Dados Oracle

necessrio para o programador PL/SQL entender a estrutura de
armazenamento de objetos disponveis no Oracle a fim de executar suas
atividades.
Vamos comear a entender a diferena entre Banco de Dados e
Instncia. Em um SGDB Oracle, a rigor, o termo Banco de Dados se aplica aos
arquivos fsicos que integram o mesmo. Assim sendo, em uma conversa com o
suporte Oracle o atendente entender banco de dados como os arquivos
formadores do Oracle.
Instncia o conjunto de processos de memria armazenados em forma
voltil, que so responsveis pela gerncia de todas as atividades incidente e
consequente no banco de dados (arquivos fsicos). Quando um usurio cria uma
conexo no banco, na realidade ele est se conectando a uma instncia, que lhe
servir de ponte de trabalho ao banco de dados.
O schema uma representao lgica organizacional que aglutina uma
poro de objetos do banco de dados. Quando criamos um usurio estamos
tambm criando um schema inicialmente vazio. Em geral, convencionado que

VI
um ou mais schemas contemplem os objetos de produo de um determinado
sistema e que os demais usurios criados sejam utilizados apenas para fins de
conexo e uso dos objetos dos schemas de produo. Para que isso acontea,
uma poltica de privilgios dever ser implementada.



Toda essa arquitetura de responsabilidade do Administrador de Banco de
Dados - DBA. E no dia-a-dia, estas definies se confundem. No difcil
encontrar algum usando o termo banco de dados para uma instncia ou um
schema. Isso no um pecado. O que se deve ter em mente a real diferena
entre estes conceitos.
Um programador PL/SQL dever receber as seguintes informaes do DBA
para dar incio s suas atividades:
host ou endereo IP servidor de banco de dados;
usurio de banco de dados;
senha de acesso;
identificao do servio ou nome do banco de dados.
Com estas informaes, o programador dever saber configurar o software
Oracle Client instalado na sua estao de trabalho a fim de acessar o banco de
dados informado pelo DBA. O usurio de banco de dados informado dever ter
privilgios de compilao e recompilao de objetos procedurais seguindo a
politica de privilgios imposta ao banco de dados. boa prtica, o DBA informar
um banco de desenvolvimento ao invz de um banco de produo.

Obs:. No apndice A so apresentados os aspectos mais profundos quanto configurao de
clientes Oracle.



_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
7 Comandos SQL

Parte I - Comandos SQL


1 Comandos SQL

Structured Query Language (SQL) um conjunto de instrues com as
quais os programas e usurios acessam as informaes dos bancos de dados
relacionais, como o Oracle. As aplicaes permitem aos usurios manipulao nos
dados sem o efetivo uso de instrues SQL, no entanto essas aplicaes
seguramente usam SQL para executar as requisies dos usurios.
O Dr. E.F. Codd em J unho de 1970 publicou o estudo "A Relational Model
of Data for Large Shared Data Banks". Este modelo de banco proposto agora
aceito como definitivo pelos grandes softwares gerenciadores de banco de dados
(SGDB). A linguagem SEQUEL (Structured English Query Language) foi
desenvolvida pela IBM aproveitando o modelo de Codd, em seguida se
transformou SQL. Em 1979 a empresa Rational Software (atualmente Oracle
Corporation) lanou a primeira implementao de banco de dados relacional vivel
comercialmente.
Existem comits que trabalham no sentido de padronizar como a indstria
de software ir considerar o SQL em termos de sintaxe. Os principais comits so
ANSI (American National Standards Institute) e o ISO/IEC (International
Organization for Standardization/ International Electrotechnical Commission). A
Oracle se esfora para estar de acordo com os padres sugeridos e participa
ativamente deste comits de padro SQL. As verses Oracle10g(Enterprise,
Standard, Express, Standard One) foram projetadas para estarem em
conformidade ao pado ANSI-2003. Verifique a tabela de confirmidade em :
http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/ap_standard_sql.htm#g21788

Obs: Sero apresentados apenas os comandos SQL de consulta e manipulao de dados, os
comandos de manuteno das estruturas (CREATE , ALTER) no pertencem ao escopo deste
curso.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
8 Implementando consultas SQL simples
2 Implementando consultas SQL simples

Para extrairmos e consultarmos dados das tabelas de um banco relacional,
usamos a instruo SELECT, que faz uma pesquisa nas estruturas relacionais do
banco de dados e retorna valores na forma de linhas e colunas. Uma consulta SQL
pode tambm ser nominada simplesmente como query.

2.1 Construo Bsica


SELECT {*| col una1 [ apel i do] , col una2 [ apel i do] }
FROM t abel a

Figura 2.1 Sintaxe Select

Di ret ri zes:
SQL no fazem distino entre maisculas e minsculas;
SQL podem estar em uma ou mais linhas;
As palavras reservadas no podem ser abreviadas;
Normalmente as clausulas so colocadas em linhas diferentes (boa prtica);
Guias e identaes so usadas para aumentar a legibilidade.

2.2 Colunas

Quanto s colunas temos duas alternativas a primeira selecionar todas as
colunas em uma nica consulta SQL, a outra mais elegante selecionar apenas
as colunas interessantes, cada coluna pode ter um alias associado. Alis so muito
teis para clculos matemticos.


SQL>sel ect *
2 f r omdepar t ment s
3 /

DEPARTMENT_I D DEPARTMENT_NAME MANAGER_I D LOCATI ON_I D
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10 Admi ni st r at i on 200 1700
20 Mar ket i ng 201 1800


SQL>sel ect f i r st _name, sal ar y sal ar i o_mensal
2 f r omempl oyees
3 /

FI RST_NAME SALARI O_MENSAL
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
St even 26400
St even 24000

Exemplo 2.1 Select Colunas


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
9 Implementando consultas SQL simples
2.3 Expresses Aritmticas (Operadores aritmticos)

possvel criar expresses com colunas do tipo NUMBER e DATE usando
operadores aritmticos, na seguinte procedncia ( *, /, +, - ).


SQL>sel ect f i r st _name, sal ar y , ( sal ar y * 20) / 100 por cent agem
2 f r omempl oyees
3 /

FI RST_NAME SALARY PORCENTAGEM
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
St even 26400 5280
Neena 17000 3400

Exemplo 2.2 Expresses

Para adicionarmos 1(um) dia ao valor de um coluna do tipo DATE devemos
utilizar o operador + da seguinte forma valor_data+1, e para adicionar uma hora a
seguinte sintaxe valor_data+(1/24)


SQL>sel ect f i r st _name, hi r e_dat e, hi r e_dat e+365 dat a_exame
2 f r omempl oyees
3 /

FI RST_NAME HI RE_DATE DATA_EXAME
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
St even 17- J UN- 1987 16- J UN- 1988
St even 17- J UN- 1987 16- J UN- 1988

Exemplo 2.3 Expresses Data

Obs.: Um valor nulo no o mesmo que zero ou um espao em branco. **QUALQUER VALOR
OPERACIONADO COM NULO RESULTA NULO**. Este problema remediado pela funo NVL
ver(4.5.1)

2.4 Operador de Concatenao

No Oracle o operador || executa contatenao de dois strings de caracteres,
e poder ser usado nas clusulas SELECT, WHER e ORDER BY. Utilizada na
clusula SELECT de uma consulta SQL, resultar em um campo do tipo caracter.


SQL>sel ect f i r st _name| | ' ' | | l ast _name nome_compl et o
2 f r omempl oyees
3 /

NOME_COMPLETO
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
St even Ki ng
Neena Kochhar

Exemplo 2.4 Concatenao


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
10 Restringindo e ordenando dados
3 Restringindo e ordenando dados

3.1 Clusula WHERE

possvel restringir as linhas retornadas da consulta SQL utilizando a
clusula WHERE. As linhas da tabela s estaro no retorno da consulta SQL se a
condio da clusula WHERE aplicada linha for atendida com sucesso. A
clusula WHERE seguida de uma expresso condicional. O Oracle aplica
condio s linhas da(s) tabela(s) de clusula FROM. Cada aplicao de linha
gera um valor boolean. As linhas que geram valores TRUE formaro o dataset de
retorno


SQL>sel ect f i r st _name, j ob_i d, depar t ment _i d
2 f r omempl oyees
3 wher e j ob_i d = ' ST_CLERK'
4 /

FI RST_NAME J OB_I D DEPARTMENT_I D
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Tr enna ST_CLERK 50
Cur t i s ST_CLERK 50

Exemplo 3.1 Clusula WHERE

3.2 Operadores de comparao

Operadores de comparao comparam dois valores ou expresses e
retornando um resultado de valor Boolean. A tabela 3.1 ilustra os operadores de
comparao mais recorrentes. Geralmente os operadores so usados na clusula
WHERE.

Tabela 3.1. Operadores de Comparao.
Operador Si gnifi cado Exempl o
= Igual a
SELECT *
FROM EMPLOYEES
WHERE LAST_NAME= SCOOT
> Maior que
SELECT LAST_NAME
FROM EMPLOYEES
WHERE SALARY > 2000
>= Maior ou igual a
SELECT FI RST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY >= 2000
< Menor que
SELECT LAST_NAME
FROM EMPLOYEES
WHERE SALARY < 2000
<= Menor ou igual a
SELECT FI RST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY <= 2000
<>, !=, ^= Diferente de
SELECT *
FROM EMPLOYEES
WHERE FI RST_NAME! = TI GER
BETWEEN ...AND... Entre dois valores (inclusive)
SELECT LAST_NAME
FROM EMPLOYEES
WHERE SALARY BETWEEN 5000 AND 10000
IN(lista) Vincula qualquer um de uma lista
valores
SELECT LAST_NAME, SALARY
FROM EMPLOYEES
WHERE FI RST_NAME I N
( St even , Pet er , El l en , Mar cus )
LIKE Vincula um padro de caracter
SELECT LAST_NAME
FROM EMPLOYEES
WHERE FI RST_NAME LI KE C%
IS NULL um valor nulo
SELECT LAST_NAME| | | | FI RST_NAME
FROM EMPLOYEES
WHERE COMMI SSI ON_PCT I S NULL

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
11 Restringindo e ordenando dados
3.3 Operadores Lgicos

Operadores lgicos so usados para combinar ou alterar o resultado de
uma ou mais comparaes (ver 3.2). O produto desta operao ser um valor
booleano e no escopo deste curso ser utilizado para determinar quais linhas
estaro no resultado da consulta.

Tabela 3.2. Operadores Lgicos
Operador Si gni fi cado Exempl o
NOT Retorna TRUE se a condio seguinte for FALSE
SELECT *
FROM EMPLOYEES
WHERE NOT ( SALARY < 10000)
AND Retorna TRUE se a condio de componentes forem
TRUE
SELECT *
FROM EMPLOYEES
WHERE SALARY > 10000
AND LAST_NAME LI KE H%
OR Retorna TRUE se cada condio de componentes
forem TRUE
SELECT FI RST_NAME, SALARY
FROM EMPLOYEES
WHERE LAST_NAME = THOMAS
OR LAST_NAME = J ACOB

3.4 Precedncia

Mltiplos operadores podem formar uma expresso vlida. Os operadores
com maior precedncia sero avaliados antes dos operadores de menor
precedncia, seguindo a tabela 3.3.

Tabela 3.3. Precedncia de Operadores.
Operador Propsi to
*, / Multiplicao, diviso
+, -, || Adio, subtrao, concatenao
=, !=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN Comparao
NOT Negao
AND Conjuno
OR Disjuno
Obs.: Parnteses podero ser utilizados para alterar a precedncia de avaliao.

3.5 Order By

A ordem das linhas retornadas em um resultado de consulta indefinida. A
clusula ORDER BY pode ser utilizada para classificar as linhas. A clusula
ORDER BY deve ser colocada aps a clusula WHERE. Por definio o resultado
ser exibido de forma crescente e atravs da palavra-chave DESC a ordem
invertida. O resultado pode tambm ser ordenado por vrias colunas


SQL>sel ect f i r st _name, j ob_i d, depar t ment _i d
2 f r omempl oyees
3 or der by depar t ment _i d, sal ar y DESC
4 /

FI RST_NAME J OB_I D DEPARTMENT_I D
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
J enni f er AD_ASST 10
Mi chael MK_MAN 20

Exemplo 3.2 Clusula Order BY

Obs.: Sem o uso da clucula ORDER BY o resultado da consulta incerto.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
12 Funes de uma linha
4 Funes de uma linha

Em instrues SQL as funes de uma linha so usadas principalmente
para manipular os valores que sero apresentados. Estas aceitam um ou mais
argumentos e retornam um ou nico valor para cada linha do dataset gerado pela
consulta. Um argumento pode ser um dos seguintes itens, constantes, valor
varivel, nome de coluna, expresso.

Quanto aos recursos de funes de uma linha
Atua em cada linha retornada da consulta.
Retorna um resultado por linha.
Podem receber zero, um ou mais argumentos.
Podem ser usados em clusulas SELECT, WHERE, ORDER BY.

Obs.: Funes de Linha podem ser usadas em instrues DMLs ver(8).

4.1 Funes de Caracter

Tabela 3.4. Funes Caracter
Funo Obj eti vo
Lower ( st r i ng)
Converte valores de caracteres alfabticos para letras maisculas
Upper ( st r i ng)
Converte valores de caracteres alfabticos para letras maisculas
I ni t cap( st r i ng)
Converte os valores de caracteres alfabtico para usar maiscula na
primeira letra de cada palavra e todas as outras letras em minsculas
Concat ( st r i ng1, st r i ng2)
Contatena o primeiro valor com o segundo valor. Equivalente ao operador
||
Subst r ( st r i ng, m, [ n] )
Retorna caracteres especficos a partir do valor de caractere comeando
na posio m, at n caracteres depois (Se m for nagativo, a conta inicia
no final do valor de caracterres. Se n for omitido, so retornados todos
caracteres at, o final da string)
Lengt h( char )
Retorna o nmero de caracteres
I nst r ( st r i ng , subst r i ng)
Retorna a posio numria do substring
l pad( st r i ng, n, st r i ng )
Preenche o valor de caracteres justificando direita a uma largura total
de n posies de caracter


Tabela 3.4. Funes Caracter - Resultados
Funo Resutado
LOWER( ' SQL Cour se' ) sql cour se
UPPER( ' SQL Cour se' ) SQL COURSE
I NI TCAP( ' SQL Cour se' ) Sql Cour se
CONCAT( ' Hel l o' , ' Wor l d' ) Hel l oWor l d
SUBSTR( ' Hel l oWor l d' , 1, 5) Hel l o
LENGTH( ' Hel l oWor l d' ) 10
I NSTR( ' Hel l oWor l d' , ' W' ) 6
LPAD( sal ar y, 10, ' *' ) *****24000
RPAD( sal ar y, 10, ' *' ) 24000*****


SQL>SELECT empl oyee_i d, CONCAT( f i r st _name, l ast _name) NAME,
2 j ob_i d, LENGTH ( l ast _name) ,
3 I NSTR( l ast _name, ' a' ) "Cont ai ns ' a' ?"
4 FROM empl oyees
5 /

EMPLOYEE_I D NAME J OB_I D LENGTH( LAST_NAME) Cont ai ns ' a' ?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
100 St evenKi ng AD_PRES 4 0
101 NeenaKochhar AD_VP 7 6
102 LexDe Haan AD_VP 7 5

Exemplo 4.1 Funes de linha


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
13 Funes de uma linha
4.2 Funes Numricas

Tabela 3.4. Funes Numricas
Funo Obj eti vo Argumento(s) Resul tado
ROUND Arredonda valor para determinado decimal (45.926,2) 45.93
TRUNC Trunca valor para determinado decimal (45.926,2) 45.92
MOD Retorna o restante da diviso (1600,300) 100


SQL>SELECT ROUND( 45. 923, 2) , ROUND( 45. 923, 0) ,
2 ROUND( 45. 923, - 1)
3 FROM DUAL;

ROUND( 45. 923, 2) ROUND( 45. 923, 0) ROUND( 45. 923, - 1)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
45, 92 46 50

1 l i nha sel eci onada.

SQL>SELECT TRUNC( 45. 923, 2) , TRUNC( 45. 923) ,
2 TRUNC( 45. 923, - 2)
3 FROM DUAL;

TRUNC( 45. 923, 2) TRUNC( 45. 923) TRUNC( 45. 923, - 2)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
45, 92 45 0

1 l i nha sel eci onada.

SQL>SELECT l ast _name, sal ar y, MOD( sal ar y, 5000)
2 FROM empl oyees
3 WHERE j ob_i d = ' SA_REP' ;

LAST_NAME SALARY MOD( SALARY, 5000)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Abel 11000 1000
Tayl or 8600 3600
Gr ant 7000 2000

3 l i nhas sel eci onadas.

Exemplo 4.2 Funes Numricas

Tabela DUAL
Em todos os bancos de dados Oracle existe uma tabela chamada DUAL, aparentemente
irrelevante. No entento, ela til quando se deseja retornar um valor pontual, sendo principalmente
usada para a execuo de instrues SQL que no necessitam de tabela base.

4.3 Funes de Data

Tabela 3.4. Funes Data
Funo Obj eti vo Argument o(s) Resultado
Months_between Nmero de meses entre duas datas (01-SET-95,11-J AN-94) 19.674194
add_months Adiciona meses de calendrio para a
data
(11-J AN-94,6) 11-J UL-94
last_day ltimo dia do ms (01-SET-95) 30-SET-95
Round Data de arredondamento (25-J UL-95,mm)
(25-J UL-95,yy)
01-AGO-95
01-J AN-95
Trunc Data para truncada (25-J UL-95,mm)
(25-J UL-95,yy)
01-J UL-95
01-J AN-95

Devemos saber informar ao ambiente de trabalho como todas essas
informaes sero apresentadas, segundo as nossas necessidades. Uma das
formas atravs dos seguintes comandos.


ALTER SESSI ON SET NLS_DATE_LANGUAGE= PORTUGUESE ;
ALTER SESSI ON SET NLS_DATE_FORMAT= DD- MON- YYYY ;

Figura 4.1 Configurando o ambiente


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
14 Funes de uma linha
Para manipular valores do tipo DATE em um formato diferente do padro
estabelecido pelo ambiente de trabalho, se faz necessrio o uso da funo
TO_CHAR com os elementos de Format Model corretos.
Para o curso ser utilizado o Format Model DD-MON-YYYY. Verifique em
http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34924
todos os Format Model disponveis valores do tipo DATE.

4.4 Funes de Converso

4.4.1 TO_CHAR(X[,format_model ])
Onde X um valor do tipo DATE ou NUMBER e format_model uma
string que descreve o formato de como o argumento X ser apresentado. Existem
formataes especficas para o tipo DATE e outras para o tipo NUMBER.

Tabela 3.5. Principais Format Model para tipo DATE
El emento Descri o
yyyy Ano com 4 dgitos
mm Ms (01-12)
dd Dia do ms (1-31)
hh24 Hora do dia (0-23)
mi Minuto(0-59)
ss Segundo(0-59)
day dia semana por extenso
mon Abreviao do ms
month Nome extenso do ms


SQL>SELECT
2 SYSDATE dat a1,
3 TO_CHAR( SYSDATE, ' DD/ MM/ YYYY hh24: mi : ss' ) dat a2,
4 TO_CHAR( SYSDATE, ' DD/ Mon/ YYYY' ) dat a3,
5 TO_CHAR( SYSDATE, ' f m" Bel m, "DD" de " mont h" de " yyyy' ) dat a4
6 FROM DUAL
7 /

DATA1 DATA2 DATA3 DATA4
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
27- OUT- 2006 27/ 10/ 2006 19: 58: 09 27/ Out / 2006 Bel m, 27 de out ubr o de 2006

1 l i nha sel eci onada.

Exemplo 4.3 Funes TO_CHAR

Di ret ri zes para datas:
O Format Model deve estar entre aspas simples e fazer distino entre maisculas e
minsculas.
O Format Model e o valor do argumento devem estar separados por vrgula.
Para remover os espaos em branco ou suprimir os zeros esquerda, use o modo
de preenchimento fm.
Qualquer string pode ser adicionada ao Format Model delimitado por aspas duplas.

Quando aos valores do tipo NUMBER, se necessrio, deveremos informar
ao ambiente o separador de milhar e decimal do padro brasileiro, atravs do
comando:


ALTER SESSI ON SET SET NLS_NUMERI C_CHARACTERS=' , . ' ;

Figura 4.2 Configurando o ambiente


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
15 Funes de uma linha
Tabela 3.5. Principais Format Model para tipo NUMBER
El ement o Descri o
9 Represnta um nmero
0 Fora que um Zero seja mostrado
G Separador de Milhar
D Separador de decimal
RN Nmero Romano


SQL>sel ect t o_char ( 1234. 5) ,
2 t o_char ( 1234. 5, ' 99999. 00' ) ,
3 t o_char ( 1234. 5, ' 99g999d00' ) ,
4 t o_char ( 1234. 5, ' RN' )
5 f r omdual
6 /

TO_CHA TO_CHAR( 1 TO_CHAR( 12 TO_CHAR( 1234. 5,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1234, 5 1234. 50 1. 234, 50 MCCXXXV

1 l i nha sel eci onada.

Exemplo 4.4 Funes TO_CHAR

4.4.2 TO_DATE( string,formatao)
Onde string a informao que se deseja transformar para valor do tipo
DATE e formatao o FORMAT MODEL que indica com como o Oracle dever
reconhecer a string apresentada no primeiro parmetro.


SQL>sel ect FI RST_NAME, HI RE_DATE
2 f r omempl oyees
3 wher e HI RE_DATE = t o_dat e( ' 07/ 06/ 1994' , ' dd/ mm/ yyyy' )
4 /

FI RST_NAME HI RE_DATE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Shel l ey 07- J UN- 1994
Wi l l i am 07- J UN- 1994

2 l i nhas sel eci onadas.

SQL>i nser t i nt o j ob_hi st or y
2 ( EMPLOYEE_I D
3 , START_DATE
4 , END_DATE
5 , J OB_I D
6 , DEPARTMENT_I D)
7 val ues
8 ( 174
9 , t o_dat e( ' 05/ novembr o/ 1974' , ' dd/ mont h/ yyyy' )
10 , t o_dat e( ' 10abr 1978' , ' ddmonyyyy' )
11 , ' AD_VP'
12 , 80)
13 /

1 l i nha cr i ada.

Exemplo 4.5 Funes TO_DATE

Obs.:Para converso de dados, existe tambm o TO_NUMBER, no entando mais prtico se valer
da converso implcita executada pelo Oracle. Tente usar o comando SELECT 1 + 1 FROM DUAL

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
16 Funes de uma linha

4.5 Expresses Condicionais Gerais

4.5.1 NVL
Converte valores nulos para um valor real, a funo est apta a trabalhar
com os tipos de dados DATE, CHARACTER e NUMBER. Os parmetros
informados devem ser do mesmo tipo de dado.


SQL>sel ect sal ar y, commi ssi on_pct , sal ar y+commi ssi on_pct , sal ar y+nvl ( commi ssi on_pct , 0)
2 f r omempl oyees
3 wher e EMPLOYEE_I D i n ( 144, 149)
4 /

SALARY COMMI SSI ON_PCT SALARY+COMMI SSI ON_PCT SALARY+NVL( COMMI SSI ON_PCT, 0)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10500 , 2 10500, 2 10500, 2
2500 2500

2 l i nhas sel eci onadas.

Exemplo 4.6 Funes NVL

4.5.2 DECODE

DECODE( expr
, sear ch1, r esul t 1
[ , sear ch2, r esul t 2, . . . ,
, sear chN, r esul N]
[ , def aul t ] )

Figura 4.3 DECODE

A expresso DECODE trabalha de um modo similar lgica IF-THEN-
ELSE. A expresso DECODE compara expr a todos search um por vez. Se expr
igual to search ento o Oracle retorna o result correspondente. Se no encontrar
nenhuma correspendncia ento o Oracle retorna default. Neste caso, se defult
estiver omitida o Oracle retornar null


SQL>sel ect
2 j ob_i d,
3 sal ar y,
4 DECODE( j ob_i d,
5 ' I T_PROG' , sal ar y*1. 1,
6 ' ST_MAN' , sal ar y*1. 2,
7 ' MK_REP' , sal ar y*1. 3,
8 sal ar y) r eal ust e
9 f r omempl oyees
10 /

Exemplo 4.7 DECODE

4.5.3 CASE

CASE expr WHEN compar e1 THEN r esul 1
[ WHEN compar e2 THEN r esul 2
WHEN compar 2N THEN r esul N
ELSE r esul El se
END

Figura 4.4 CASE

Em uma expresso CASE, o Oracle pesquisa a partir da primeira clusula
WHEN no qual expr igual a compare e retorna result. Se nenhuma das clusulas
WHEN for selecionada e uma clusula ELSE existir, ento o Oracle retornar
resultElse.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
17 Funes de uma linha

SQL>sel ect
2 j ob_i d,
3 sal ar y,
4 CASE j ob_i d
5 WHEN ' I T_PROG' THEN sal ar y*1. 1
6 WHEN ' ST_MAN' THEN sal ar y*1. 2
7 WHEN ' MK_REP' THEN sal ar y*1. 3
8 ELSE sal ar y
9 END
10 f r omempl oyees
11 /

Exemplo 4.8 CASE

Obs: D preferncia ao comando CASE ao invs do DECODE. O comando CASE mais poderoso

Obs: No link http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/functions.htm#i1482196
encontra-se a relao de todas as funes de uma linha disponveis nas verses Oracle10g

Obs: No captuto 15 ser apresentado como criar e programar as suas prpias funes



_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
18 Mostrando dados de vrias tabelas
5 Mostrando dados de vrias tabelas

Existem momentos em que faz necessrio o uso de dados a partir de mais
de uma tabela, neste caso usaremos condies especiais chamadas de J OINs. As
linhas de uma tabela podem ser relacionadas s linhas de outra tabela de acordo
com os valores comuns existentes nas colunas correspondentes, que em geral so
colunas de chave primria e estrangeira.


SELECT t abl e1. col umn, t abl e2. col umn
FROM t abl e1, t abl e2
WHERE t abl e1. col umn1 = t abl e2. col umn2;

Figura 5.1 J oin

Di ret ri zes para Joi ns:
Ao se escrever uma instruo SELECT que combine mais de uma tabela, interessante
deixar claro a que tabela o campo pertence, posicionando o nome da tabela antes do
nome do campo.
No obrigatrio o posicionamento o nome da tabela antes do nome do campo, porm,
se uma mesma coluna pertence a mais de uma tabela, deve-se prefixar a coluna com o
nome da tabela.
Para combinar n tabelas se fez necessrio no mnimo n-1 condies de J OIN


SQL>SELECT empl oyees. empl oyee_i d, empl oyees. l ast _name,
2 empl oyees. depar t ment _i d, depar t ment s. depar t ment _i d,
3 depar t ment s. l ocat i on_i d
4 FROM empl oyees, depar t ment s
5 WHERE empl oyees. depar t ment _i d = depar t ment s. depar t ment _i d;

EMPLOYEE_I D LAST_NAME DEPARTMENT_I D DEPARTMENT_I D LOCATI ON_I D
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1000 Ki ng 90 90 1700
100 Ki ng 90 90 1700

Exemplo 5.1 J oin

possvel tambm adicionar condies de filtros s condies de J OIN
para restringe mais ainda as linhas obtidas. No exemplo abaixo, sero
apresentados o nome e o departamento do funcionrio Matos.


SQL>SELECT l ast _name, empl oyees. depar t ment _i d,
2 depar t ment _name
3 FROM empl oyees, depar t ment s
4 WHERE empl oyees. depar t ment _i d = depar t ment s. depar t ment _i d
5 AND l ast _name = ' Mat os' ;

LAST_NAME DEPARTMENT_I D DEPARTMENT_NAME
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Mat os 50 Shi ppi ng

1 l i nha sel eci onada.

Exemplo 5.2 J oin / AND

5.1 Produto Cartesiano

Quando um J OIN for completamente invlido ou omitido, o resultado da
consulta SQL ser um produto cartesiano no qual sero exibidas todas
combinaes de linhas de todas as tabelas envolvidas na consulta. O Produto
cartesiano tende a gerar um grande nmero de linhas e seu resultado raramente
til. Apresentamos o produto cartesiano aqui por finalidades didticas.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
19 Mostrando dados de vrias tabelas

SQL>SELECT l ast _name, depar t ment _name dept _name
2 FROM empl oyees, depar t ment s;

LAST_NAME DEPT_NAME
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ki ng Admi ni st r at i on
Ki ng Admi ni st r at i on
Kochhar Admi ni st r at i on
. . . .
Hi ggi ns Cont r act i ng
Gi et z Cont r act i ng

168 l i nhas sel eci onadas.

Exemplo 5.3 Produto Cartesiano

5.2 Alias de Tabela

Para qualificar as colunas possvel utilizar alias de tabela ao invez do
nome da tabela. Assim como os alias de coluna do outro nome coluna, os alias
de tabela tem a mesma funo. Os alias de tabela so definidos na clusula
FROM. O nome da tabela especificado totalmente seguido do seu alias.


SQL>SELECT e. empl oyee_i d, e. l ast _name, e. depar t ment _i d,
2 d. depar t ment _i d, d. l ocat i on_i d
3 FROM empl oyees e , depar t ment s d
4 WHERE e. depar t ment _i d = d. depar t ment _i d;

EMPLOYEE_I D LAST_NAME DEPARTMENT_I D DEPARTMENT_I D LOCATI ON_I D
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
100 Ki ng 90 90 1700
101 Kochhar 90 90 1700

Exemplo 5.4 Alias tabela

Na instruo SQL do exemplo 5.4 foram definidos os alias e para a tabela
employees e alias d para a tabela departments.

Obs: Perceba quanto o uso de alias de tabela trs legibilidade construo de consultas SQL
comparando o exemplo 5.4 e o exemplo 5.1


SQL>SELECT
2 e. l ast _name,
3 d. depar t ment _name,
4 l . ci t y
5 FROM
6 empl oyees e,
7 depar t ment s d,
8 l ocat i ons l
9 WHERE
10 e. depar t ment _i d = d. depar t ment _i d
11 AND d. l ocat i on_i d = l . l ocat i on_i d;

LAST_NAME DEPARTMENT_NAME CI TY
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ki ng Execut i ve Seat t l e
Kochhar Execut i ve Seat t l e
De Haan Execut i ve Seat t l e
Hunol d I T Sout hl ake

Exemplo 5.5 J oin em mais de uma tabela.

Di ret ri zes para Joi ns:
Os alias de tabela no ultrapassam 30 posies;
um alias de tabela poder substituir o nome da tabela em todas as clusulas do SQL.
os alias devem ser sugestivos. No utilizem algo com T1, T2, T3,...
palavras reservadas no podem ser utilizadas como alias nenhum. Algo como DESC
alusivo a descrio.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
20 Mostrando dados de vrias tabelas
5.3 Outer-JOIN

Se a linha no satisfaz a condio da clausula WHERE, no aparecer no
resultado do Select. Nestas condies, estas linhas podero aparecer se operador
de outer join for utilizado no J OIN. O operador (+) dever ser posicionado no lado
join onde a informao deficiente.


SELECT e. l ast _name, e. depar t ment _i d, d. depar t ment _name
FROM empl oyees e, depar t ment s d
WHERE e. depar t ment _i d = d. depar t ment _i d( +)

Exemplo 5.6 OUTER J OIN

5.4 Self-JOIN

As vezes, necessrio a execuo do um join de uma tabela com ela
mesma. Desta forma a tabela aparecer duas vezes na clusula FROM e na
clusula WHERE existir a restrio referente ao self-join. Neste caso o uso de
alias de tabela imperativo.


SQL>SELECT wor ker . l ast _name | | ' wor ks f or ' | | manager . l ast _name
2 FROM empl oyees wor ker , empl oyees manager
3 WHERE wor ker . manager _i d = manager . empl oyee_i d ;

WORKER. LAST_NAME| | ' WORKSFOR' | | MANAGER. LAST_NAME
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Kochhar wor ks f or Ki ng
De Haan wor ks f or Ki ng
Hunol d wor ks f or De Haan

Exemplo 5.7 Self J OIN



_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
21 Funes de grupo
6 Funes de grupo

De modo diferente das funes de uma nica linha, as funes de grupo
operam em conjunto de linhas para fornecer um resultado por grupo. Esses
conjuntos podem ser uma tabela inteira ou a mesma dividida em grupos menores.

Tabela 3.5. Funes de Grupo.
Funo Descri o
AVG Valor mdio
COUNT Nmero de linhas
MAX Valor Mximo
MIN Valor Mnimo
SUM Soma de Valores


SQL>
SQL>SELECT AVG( sal ar y) , MAX( sal ar y) , MI N( sal ar y) , SUM( sal ar y)
2 FROM empl oyees
3 WHERE j ob_i d LI KE ' %REP%' ;

AVG( SALARY) MAX( SALARY) MI N( SALARY) SUM( SALARY)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
8150 11000 6000 32600
SQL>
SQL>SELECT MI N( hi r e_dat e) , MAX( hi r e_dat e)
2 FROM empl oyees;

MI N( HI RE_DA MAX( HI RE_DA
- - - - - - - - - - - - - - - - - - - - - -
17- J UN- 1987 29- J AN- 2000
SQL>
SQL>SELECT COUNT( *)
2 FROM empl oyees
3 WHERE depar t ment _i d = 50;

COUNT( *)
- - - - - - - - - -
5
SQL>
SQL>SELECT COUNT( commi ssi on_pct )
2 FROM empl oyees;

COUNT( COMMI SSI ON_PCT)
- - - - - - - - - - - - - - - - - - - - -
4

Exemplo 6.1 Group by Tabela Inteira

atravz da clusula GROUP BY que dividimos as linhas de uma tabela
em grupo menores. Em seguida, poder ser aplicado a esses grupos formados as
funes de grupo, gerando assim informaes sumrias para cada grupo.
Primeiramente deve ser determinada a identificao do grupo. A identificao
do grupo pode ser uma coluna, vrias colunas, uma expresso usando colunas ou
vrias expresses usando colunas. O Oracle considerar no grupo todas as linhas
que atendenrem a clusula WHERE caso esta exista, e ento ser aplicada a
funo de grupo ao grupo caso exista.


SELECT depar t ment _i d, AVG( sal ar y)
FROM empl oyees
GROUP BY depar t ment _i d ;

SELECT depar t ment _i d dept _i d, j ob_i d, SUM( sal ar y)
FROM empl oyees
GROUP BY depar t ment _i d, j ob_i d ;

Exemplo 6.2 Group by criando grupos

Na figura 6.2 tempos 3(trs) exemplos de consulta utilizando funes de
grupo. Na primeira o resultado ser agrupado pelo valor do campo department_id,
e a cada grupo ser aferida a mdia aritmtica do campo salary. A quantidade de

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
22 Funes de grupo
linhas retornada no primeiro exemplo ser em funo da quantidade de valores
existentes na coluna department_id. No segundo exemplo apresentamos um grupo
mais sofisticado com dois campos (department_id , job_id) e a estes grupos ser
aplicado a somatria do campo salary.

Di ret ri zes para Joi ns:
Usando a clusula WHERE, linhas sero eliminadas antes de serem organizadas me
grupo.
No permitido o uso de alias na clusula GROUP BY .
Quando se deseja um campo esteja no retorno do SQL este dever estar na clusula
GROUP BY.
possvel criar agrupamentos de mais de um campo.
Funes de grupo no devem ser utilizadas na clusula WHERE e sim na clusula
HAVING.

Para se excluir um grupo inteiro criado pela clusula GROUP BY,
deveremos usar a clusula HAVING, que executa um trabalho parecido com a
clusula WHERE que elimina as linhas, este, no entanto, elimina grupos.


SQL>SELECT depar t ment _i d, MAX( sal ar y)
2 FROM empl oyees
3 GROUP BY depar t ment _i d
4 HAVI NG MAX( sal ar y) >10000 ;

DEPARTMENT_I D MAX( SALARY)
- - - - - - - - - - - - - - - - - - - - - - - -
90 26400
20 13000
80 11000
SQL>
SQL>
SQL>SELECT j ob_i d, SUM( sal ar y) PAYROLL
2 FROM empl oyees
3 WHERE j ob_i d NOT LI KE ' %REP%'
4 GROUP BY j ob_i d
5 HAVI NG SUM( sal ar y) > 13000
6 ORDER BY SUM( sal ar y) ;

J OB_I D PAYROLL
- - - - - - - - - - - - - - - - - - - -
I T_PROG 19200
AD_PRES 50400

Exemplo 6.3 HAVING



_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
23 Subconsultas
7 Subconsultas

Uma subconsulta uma instruo SELECT incorporada a outra instruo
SELECT. O uso de subconsultas torna possvel a construo de sofisticadas
instrues e so teis quando precisamos selecionar linhas de uma tabela com
uma condio que dependa dos dados na prpria tabela. Tambm podem ser
chamadas de subqueries ou consulta interna.

Tabela 7.1. Tipos de Subconsulltas
Ti po Descri o Operadores
Subquerie de uma nica
linha
O resultado da consulta interna
retorna apenas uma linha
=, >, >=, <, <=, <>
Subquerie de vrias linhas O resultado da consulta interna
retorna vrias linhas
IN Igual a qualquer membro da
lista
ANY Compare o valor de cada
valor retornado pela subconsulta.
ALL Compare o valor a todo
valor retornado pela subconsulta.


SQL>SELECT l ast _name
2 FROM empl oyees
3 WHERE sal ar y >
4 ( SELECT sal ar y
5 FROM empl oyees
6 WHERE l ast _name = ' Abel ' )
7 /

LAST_NAME
- - - - - - - - - - - - - - - - - - - - - - - - -
Ki ng
Kochhar
De Haan

SQL>SELECT l ast _name, j ob_i d, sal ar y
2 FROM empl oyees
3 WHERE j ob_i d =
4 ( SELECT j ob_i d
5 FROM empl oyees
6 WHERE empl oyee_i d = 141)
7 AND sal ar y >
8 ( SELECT sal ar y
9 FROM empl oyees
10 WHERE empl oyee_i d = 143) ;

LAST_NAME J OB_I D SALARY
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Raj s ST_CLERK 3500
Davi es ST_CLERK 3100

Exemplo 7.1 Subquerie


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
24 Subconsultas
7.1 Operador IN


SQL>SELECT l ast _name, sal ar y, depar t ment _i d
2 FROM empl oyees
3 WHERE sal ar y I N ( SELECT MI N( sal ar y)
4 FROM empl oyees
5 GROUP BY depar t ment _i d) ;

LAST_NAME SALARY DEPARTMENT_I D
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Gr ant 7000
De Haan 17000 90
Kochhar 17000 90

SQL>SELECT l ast _name, sal ar y, depar t ment _i d
2 FROM empl oyees
3 WHERE sal ar y I N ( 7000, 17000, 6000, 8300, 2500, 8600, 4200, 4400)
4 /

LAST_NAME SALARY DEPARTMENT_I D
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Kochhar 17000 90
De Haan 17000 90

Exemplo 7.2 Operador IN

7.2 Operador ANY


SELECT empl oyee_i d, l ast _name, j ob_i d, sal ar y
FROM empl oyees
WHERE sal ar y < ANY
( SELECT sal ar y
FROM empl oyees
WHERE j ob_i d = ' I T_PROG' )
AND j ob_i d <> ' I T_PROG' ;


Obs.: < ANY(...) significa menor que o maior da lista e > ANY(...) significa mais do que o mnimo

7.3 Operador ALL


SELECT empl oyee_i d, l ast _name, j ob_i d, sal ar y
FROM empl oyees
WHERE sal ar y < ALL
( SELECT sal ar y
FROM empl oyees
WHERE j ob_i d = ' I T_PROG' )
AND j ob_i d <> ' I T_PROG' ;


Obs.: > ALL(...) significa mais do que o maior valor listado e < ALL(...) significa manos do que o
menor valor listado ca mais do que o mnimo
Obs.: Em uma instruo com subconsulta, a consulta interna a primeira a ser resolvida.

Obs: Em http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/toc.htm
encontramos todas as possibildiades com o comando SQL disponveis nas verses Oracle10g



_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
25 Manipulando dados (DML)
8 Manipulando dados (DML)

8.1 INSERT


I NSERT I NTO t abel a [ ( campo1, campo2, . . . , campo n) ]
val ues ( val or _campo1, val or _campo2, . . . , val or _campo n)

Figura 8.1 Insert

A instruo INSERT serve para adicionar linhas em uma determinada
tabela. Como voc pode observar a lista de campos da tabela no obrigatria, no
entanto, se voc optar por supri-la dever ter em mente a sua estrutura da tabela,
pois dever fornec-los na mesma ordem.


SQL>i nser t i nt o r egi ons
2 ( r egi on_i d, r egi on_name)
3 val ues
4 ( 5, ' Af r i ca' )
5 /

1 l i nha cr i ada.

SQL>
SQL>i nser t i nt o count r i es
2 val ues
3 ( ' BR' , ' Br asi l ' , 50)
4 /
i nser t i nt o count r i es
*
ERRO na l i nha 1:
ORA- 02291: r est r i o de i nt egr i dade ( HR. COUNTR_REG_FK) vi ol ada - chave me no
l ocal i zada

Exemplo 8.1 Insert

Obs.: encontramos todas as opes do comando INSERT disponveis nas verses Oracle10g em
http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_9014.htm#i2163698

8.2 UPDATE


UPDATE Tabel a
SET Campo1 = val or _campo1, campo2 = val or _campo2,
. . .
[ WHERE <condi o> ]

Figura 8.2 Update

A instruo UPDATE altera valores de campos de uma tabela, de acordo
com uma condio fornecida, se esta condio for suprida, toda a tabela ser
atualizada. As regras que governam a restrio de linhas nas consultas so
tambm aplicveis nas instrues UPDATE (Ver 3.1, 3.2, 3.3, 3.4).


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
26 Manipulando dados (DML)

SQL>updat e l ocat i ons
2 set ci t y = ' Bel m'
3 wher e LOCATI ON_I D = 2500
4 /

x l i nha cr i ada.

SQL>
SQL>updat e l ocat i ons
2 set count r y_i d = ' AG'
3 wher e LOCATI ON_I D = 1400
4 /
updat e l ocat i ons
*
ERRO na l i nha 1:
ORA- 02291: r est r i o de i nt egr i dade ( HR. LOC_C_I D_FK) vi ol ada - chave me no l ocal i zada

Exemplo 8.2 Update

Obs.: encontramos todas as opes do comando UPDATE disponveis nas verses Oracle10g em
http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_10007.htm#i2067715


8.3 DELETE


DELETE {t abel a} [ WHERE <condi o> ]

Figura 8.3 Delete

A instruo DELETE exclui um ou mais registros de acordo com a condio
fornecida, similarmente ao UPDATE se esta condio for suprida todos os dados
de sua tabela sero apagados!!!. As regras que governam a restrio de linhas
nas consultas so tambm aplicveis nas instrues DELETE (Ver 3.1, 3.2, 3.3,
3.4).


SQL>del et e r egi ons
2 wher e r egi on_i d = 5
3 /

1 l i nha del et ada.

SQL>del et e l ocat i ons
2 wher e LOCATI ON_I D=2500
3 /
del et e l ocat i ons
*
ERRO na l i nha 1:
ORA- 02292: r est r i o de i nt egr i dade ( HR. DEPT_LOC_FK) vi ol ada - r egi st r o f i l ho l ocal i zado

Exemplo 8.3 Delete

Obs.: encontramos todas as opes do comando DELETE disponveis nas verses Oracle10g em
http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_8005.htm#i2117787


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
27 Controle de transao
9 Controle de transao

Transao uma unidade lgica de trabalho que compreende uma ou mais
instrues DML executadas em funo das atividades de um usurio do sistema.
O conjunto de DMLs que devem estar contidas em uma transao determinado
pelas regras de nogcio.
O conjunto de inseres, alteraes e excluses efetivadas pelas instrues
SQL pertencentes a uma transao pode ser confirmadas (COMMIT) ou
desconsideradas (ROLLBACK). Uma transao se inicia com o primeiro comando
DML executado. A transao termina quando confirmada ou desconsiderada.
Para ilustrar o conceito de transao, podemos considerar o velho
exemplo de atividades de banco de dados para instituies finaceiras. Quando um
cliente do banco transfere valores da conta poupana para a conta corrente, a
transao deve consistir no mnimo de 3(trs) operaes.
Decrementar da conta poupana
Incrementar na conta corrente
Registrar a transao
O Oracle deve prover duas situaes. Se as trs operaes conseguiram
ser bem executadas afim de fornecer o adequado balanceamento nas contas,
estas devero ser aplicadas (COMMIT) ao banco de dados. Entretanto se algum
problema como saldo insuficiente, nmero de conta invlida or falha de hardware
impedir no mnimo uma atividade da transao, ento a transao inteira dever
ser desconsiderada (ROLLBACK) afim de assegurar o adequado balanceamento
nas contas.
Um savepoint permite dividir uma transao em vrias partes e marcar um
determinado ponto da transao que permitir ao programador um rollback total
onde toda a transao ser desnconsiderada ou rollback parcial onde tudo o que
foi executado aps o savepoint ser desconsiderado. Todo o savepoint tem um
nome associado a ele.


1 BEGI N
2 I NSERT1;
3 I NSERT2;
4 SAVEPOI NT exempl o_t r ansao;
5 UPDATE1;
6 UPDATE2;
7 I F t est e THEN
8 ROLLBACK; ( r ol l back t ot al )
9 ELSE
10 ROLLBACK TO exempl o_t r ansao; ( r ol l back par ci al )
11 END I F;
12 END;

Figura 9.2 SavePoint

Os comandos COMMIT e ROLLBACK respectivamente confiram ou
desconsirem as transaes segundo a lgica de programao imposta.

Obs.:No link a seguir encontramos a completa referncia do comando COMMIT
http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4010.htm#i2060233

Obs.:No link a seguir encontramos a completa referncia do comando ROLLBACK
http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_9021.htm#i2104635

Obs.:No link a seguir encontramos a completa referncia sobre transaes Oracle
http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14220/transact.htm#i6564

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
28 Bloco PL/SQL

Parte II - Programao PL/SQL


10 Bloco PL/SQL

PL/SQL(Procedural Language/SQL) a linguagem procedural desenvolvida
pela Oracle que utilizada para montar os blocos PL/SQL.
Um bloco PL/SQL consiste de um conjunto de instrues SQL (SELECT,
INSERT, UPDATE, DELETE) ou comandos PL/SQL, e desempenha uma funo
lgica nica, afim de resolver um problema especfico ou executar um conjunto de
tarefas afins. O Bloco PL/SQL tambm pode ser referenciado com Unidade de
Programa PL/SQL
Os blocos PL/SQL so qualificados em bloco annimo e Stored Procedure.

O bloco annimo
No tem nome
No est armazenado no SGDB
Geralmente est armazenada na aplicao.

Stored SubProgramas
Utiliza a estrutura do bloco annimo com base.
Esto armazenados no SGDB,
A eles atribudo um nome que poder ser utilizado nas aplicaes
ou por outros objetos do banco de dados

A estrutura de um bloco PL/SQL constituida de trs sees:

a) SEO DE DECLAO (DECLARE) - Nesta seo so definidos os objetos
PL/SQL como variveis, constantes, cursores e excees definidas pelo
usurio que podero ser utilizadas dentro do bloco.
b) SEO DE EXECUES (BEGIN..END;) - Nesta seo contemplar a
sequncia de comandos PL/SQL e instrues SQL do bloco.
c) SEO DE TRATAMENTO DE ERRO (EXCEPTION) - Nesta seo sero
tratados os erros definidos e levantados pelo prprio bloco e os erros gerados
pela execuo do bloco (O captulo 12 abordar o tratamento de exees no
PL/SQL)


[ DECLARE
- - decl ar aes]
BEGI N
- - i nst r ues e comnados
[ EXCEPTI ON
- - t r at ament os de er r o]
END;

Figura 10.1 Sees de um bloco PL/SQL


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
29 Bloco PL/SQL
Di ret ri zes:
Apenas a seo de execuo obrigatria.
As palavras chaves, DECLARE, BEGIN, EXCEOPTION no so seguidas por ponto-e-
vrgula, mas END e todas as outras instrues PL/SQL requerem ponto-e-vrgula.
No existe bloco sem algum comando vlido.
Pode existir aninhamento de bloco, no entanto, esta funcionalidade restrita seo de
Execuo e Seo de Tratamento de Erro.
As lnhas da seo de execuo devem ser finalizadas com ; (ponto-e-vgula)

Maiores detalhes sobre a programao PL/SQL podero ser encontradas
em http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14261/toc.htm



_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
30 Programao PL/SQL
11 Programao PL/SQL

11.1 Comentrios

Os comentrios em PL/SQL so de dois tipos

a) Uma Linha: utiliza-se o delimitador --. A partir de dois hfens tudo o que for
escrito at o final da linha considerado comentrio.
b) Mltiplas linhas: utiliza-se o delimitador /* para abrir e */ para fechar. Tudo e
todas as linhas que estiverem entre os dois delimitadores sero ignorados na
execuor.


1 BEGI N
2 - - coment ando apenas uma l i nha
3 COMANDO1;
4 / * coment ando
5 vr i as
6 l i nhas */
7 COMANDO2;
8 COMANDO3; - - o r est o ser i gnor ado
9 END;
10 /

Exemplo 11.1 Uso de comentrio

11.2 Decl araes (seo de declarao)

Para utilizar variveis e constantes no seu programa, voc deve declar-los
anteriormente. na seo DECLARE que so declaradas as variveis e
constantes.


1 DECLARE
2 nVI Venda NUMBER( 16, 2) ;
3 cNmVendedor VARCHAR2( 40) ;
4 dDt Venda DATE: =SYSDATE;
5 mMul t i pl i c CONSTANT NUMBER: =100; - - const ant e
6 BEGI N
7 NULL;
9 END;
10 /

Exemplo 11.2 Declarao de Objetos

As declaraes no exemplo 2.2 foram:
nVIVenda do tipo numrico tamanho 16 e 2 casas decimais,
cNmVendedor do tipo numrico de tamanho varivel at 40
caracteres,
dDTVenda do tipo data e a constante
mMultiplic do tipo numrica com valor 100.

O escopo de uma varivel a parte do programa onde a varivel pode ser
acessada. Para uma varivel PL/SQL, isso ocorre a partir da declarao de
variveis at o final do bloco. Variveis declaradas em um bloco externo so
acessveis apenas neste bloco e em qualquer sub-bloco contido neste, porm
variveis declaradas no sub-bloco no so acessveis pelo bloco externo.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
31 Programao PL/SQL
Pacote DBMS_OUTPUT

Na programao PL/SQL no existe nenhuma funcionalidade de entrada ou sada. Para
remediar isso, usaremos no aplicativo SQL*Plus o Supplied Package DBMS_OUTPUT que
fornecer apenas a capacidade de dar sadas para mensagens na tela. Isso feito por meio de dois
passos

1.Permitir a sada no SQL*Plus com o comando set serveroutput

SET SERVEROUTPUT {ON | OFF}

2.Dentro do programa PL/SQL, utilize o procedure DBMS_OUTPUT.PUT_LINE. Essa
procedure adicionar o argumento informado ao buffer de sada.

Com esses passos completados, a sada impressa na tela do SQL*Plus depois que o bloco
for completamente executado. Durante a execuo, o buffer preenchido pelas chamadas de
DBMS_OUTPUT.PUT_LINE. O SQL*Plus no recupera o contedo do buffer e no o imprime at
que o controle retorne para o SQL*Plus, depois que o bloco terminou a execuo.

SQL> SET SERVEROUTPUT ON
SQL> BEGI N
2 DBMS_OUTPUT. PUT_LI NE( Hel l o f r omPL/ SQL ) ;
3 END;
4 /
Hel l o f r omPL/ SQL

PL/ SQL pr ocedur e successf ul l y compl et ed.

SQL>


11.3 Tipos de Dados

Tipo Descrio
VARCHAR2
[(tamanho_maximo)]
Tipo bsico para dados cararter de tamanho varivel com at 32.767
bytes. No h tamanho default para as constantes e variveis
VARCHAR2
NUMBER
[(preciso,escala)]
Admite nmero de ponto fixo e flutuante.
DATE Tipo bsico para datas e horas. Valores DATE incluem a hora do dia
em segundos desde a meia-noite. A faixa entre 01/01/4712 A.C e
31/12/9999 D.C.
CHAR
[(tamanho_maximo)]
Tipo bsico para dados cararter de tamanho fixo. Se voc no
especificar o tamanho_maximo, o tamanho default Ser definido com 1.
BOOLEAN Tipo bsico para dados que armazena um dos trs possveis valores
usados para clculos lgicos: TRUE, FALSE, NULL.
BINARY_INTEGER

Inteiros com sinal entre -2.147.483.647 a 2.147.483.647
PL_INTERGER Inteiros com sinal entre -2.147.483.647 a 2.147.483.647. Valores com
PL_INTERGER requerem menos espao e so mais rpidos que os
valore NUMBER e BINARY_INTERGER

O comando %TYPE nos d a possibilidade de associarmos ao tipo de uma
varivel o tipo de uma coluna de uma tabela, desta forma, automaticamente a
varivel assumir o tipo de dado da coluna.
O comando %ROWTYPE criar uma estrutura de registro idntica estrutura
de uma tabela.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
32 Programao PL/SQL

DECLARE
Nome_var i vel nome_t abel a. nome_col una%TYPE; - - var i vel
Nome_r egi st r o nome_t abel a%ROWTYPE; - - r egi st r o
BEGI N
- - i nst r ues e comnados
END;

Figura 11.1 Uso de %TYPE e %ROWTYPE

Nesta abordagem o cdigo fica mais ligado estrutura e no ser necessria
a reescrita do cdigo quando o tipo de coluna for alterado.

11.4 Assi nalar Valores

Voc pode assinalar valores a uma varivel de duas formas. A primeira forma
utiliza o operador := (sinal de dois pontos seguido do sinal de igual). Assim a
varivel posicionada esquerda do operador receber o valor da expresso
posicionada direita.


1 DECLARE
2 nSal ar i o NUMBER;
3 nSal ar i oAt ual NUMBER;
4 aRegi onName r egi ons. r egi on_name%TYPE;
5 dHoj e DATE;
6 nAnoBi BOOLEAN: =TRUE;
7 BEGI N
8 nSal ar i o : = 400;
9 nSal ar i oAt ual : = F_SALARY( 103) * 0. 10;
10 aRegi onName : = ' ASI A' ;
11 dHoj e : = SYSDATE;
12 END;
13 /

Exemplo 11.3 Assinalar valores por operador

A Segunda forma de assinalar valor a uma varivel atravs de um resultado
de SELECT que ser transferido assinalado varivel.
Um SELECT que assinala valor a uma varivel obrigatoriamente dever
retornar uma e somente uma linha, caso contrrio, um erro de execuo ser
disparado, NO_DATA_FOUND se no for retornada nenhuma linha e
TOO_MANY_ROWS se mais de uma linha for retornada (ver 12.3)


1 DECLARE
2 bonus10 NUMBER;
3 bonus20 NUMBER;
4 emp_i d NUMBER: =206;
5 BEGI N
6 SELECT sal ar y * 0. 10
7 I NTO bonus10
8 FROM empl oyees
9 WHERE empl oyee_i d = emp_i d;
10
11 SELECT sal ar y * 0. 10, sal ar y * 0. 20
12 I NTO bonus10, bonus20
13 FROM empl oyees
14 WHERE empl oyee_i d = emp_i d;
15
16 DBMS_OUTPUT. PUT_LI NE( ' SALARI O COM 10%DE BONUS : ' | | bonus10) ;
17 DBMS_OUTPUT. PUT_LI NE( ' SALARI O COM 20%DE BONUS : ' | | bonus20) ;
18 END;
19 /

Exemplo 11.4 Assinalar valores por SELECT

11.5 Controle de Fluxo

Este conjunto de comandos permite testar uma condio e, dependendo se a
condio falsa ou verdadeira, ser tomada uma determinada direo de fluxo. O
controle de fluco se d em trs formas: IF-THEN, IF-THEN-ELSE,IF-THEN-ELSIF.

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
33 Programao PL/SQL

11.5.1 IF-THEN
a forma mais simples. Testa a condio especificada aps o IF e, caso seja
verdadeira, executa o comando alm do THEN. Caso no seja, executa as aes
aps o END IF (note que devem ser escritos separados).


1 DECLARE
2 v_f i r st _name empl oyees. f i r st _name%TYPE;
3 v_sal ar y empl oyees. sal ar y%TYPE;
4 BEGI N
5 SELECT f i r st _name, sal ar y
6 I NTO v_f i r st _name, v_sal ar y
7 FROM empl oyees
8 WHERE empl oyee_i d = 142;
9
10 I F v_sal ar y > 3000 THEN
11 DBMS_OUTPUT. put _l i ne( ' Sal ar i o aci ma de US$ 3, 000' ) ;
12 DBMS_OUTPUT. put _l i ne( ' Test e I F- THEN' ) ;
13 END I F;
14 END;
15 /

Exemplo 11.5 IF-THEN

Obs.:Note que cada linha de ao dentro do IF deve ser terminada com ponto-e-vrgula(;) e apenas
aps o END IF que se coloca o ponto-e-vrgula final do comando IF.

11.5.2 IF-THEN-ELSE
Aqui, acrescenta-se a palavra-chave ELSE para determinar o que deve ser
feito caso a condio seja falsa. Dessa forma, o fluxo seguir para os comandos
aps o THEN caso a condio seja verdadeira, e aps o ELSE caso seja falsa.


1 DECLARE
2 v_f i r st _name empl oyees. f i r st _name%TYPE;
3 v_commi ssi on_pct empl oyees. commi ssi on_pct %TYPE;
4 BEGI N
5 SELECT f i r st _name, commi ssi on_pct
6 I NTO v_f i r st _name, v_commi ssi on_pct
7 FROM empl oyees
8 WHERE empl oyee_i d = 174;
9
10 I F v_commi ssi on_pct I S NULL THEN
11 DBMS_OUTPUT. put _l i ne( ' Semcomi sso' ) ;
12 DBMS_OUTPUT. put _l i ne( ' out r a ao' ) ;
13 ELSE
14 DBMS_OUTPUT. put _l i ne( ' Comi sso de ' | | v_commi ssi on_pct *100| | ' %' ) ;
15 DBMS_OUTPUT. put _l i ne( ' out r a ao ' ) ;
16 END I F;
17 END;
18 /

Exemplo 11.6 IF-THEN-ELSE

Obs.:Note que h um ponto-e-vrgula somente aps cada linha de ao e aps o END IF.

11.5.3 IF-THEN-ELSIF
Quando se deseja testar diversas condies utilizando um mesmo IF, utiliza-
se ELSIF. Assim, pode-se aps cada ELSIF, testar nova condio que, caso seja
verdadeira, executar as respectivas aes.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
34 Programao PL/SQL

1 DECLARE
2 Venci ment os NUMBER;
3 BEGI N
4 venci ment os : = F_SALARY( 101) ; - - dedues
5 I F venci ment os <= 10000 THEN
6 DBMS_OUTPUT. PUT_LI NE( ' Pr i mei r a f ai xa' ) ;
7 ELSI F venci ment os > 10000 AND venci ment os <= 15000 THEN
8 DBMS_OUTPUT. PUT_LI NE( ' Segunda f ai xa' ) ;
9 ELSI F venci ment os > 15000 AND venci ment os <= 20000 THEN
10 DBMS_OUTPUT. PUT_LI NE( ' Ter cei r a f ai xa' ) ;
11 ELSE
12 DBMS_OUTPUT. PUT_LI NE( ' Ul t i ma f ai xa' ) ;
13 END I F;
14 END;
15 /

Exemplo 11.7 IF-THEN-ELSIF

Mesmo utilizando diversos ELSIFs pode-se acrescentar um ELSE no final
para o caso de nenhuma das condies anteriores serem satisfeitas. Mais uma
vez, somente aps o END IF e a cada linha de ao que se deve colocar o
ponto-e-vrgula.

11.6 Controle de Repetio

O LOOP permite que voc realize repeties de determinadas aes. Na
programao PL/SQL encontramos 3(trs) tipo: LOOP Simples, WHILE-LOOP,
FOR-LOOP.

11.6.1 LOOP Simples
Com este comando voc pode realizar repeties de uma seqncia de
comandos. O comando LOOP indica o inicio da rea de repetio, enquanto que o
END LOOP indica que o fluxo deve retornar do LOOP.


1 BEGI N
2 LOOP
3 DBMS_OUTPUT. PUT_LI NE( ' Pr i mei r a ao do l ao' ) ;
4 DBMS_OUTPUT. PUT_LI NE( ' Segunca ao do l ao' ) ;
5 END LOOP;
6 END;
7 /

Exemplo 11.8 LOOP simples

No exemplo 11.8 como no est definida nenhuma condio de parada do
lao, voc j deve ter concludo que este LOOP no ter fim. Logo, para resolver
este problema necessrio utilizar o comando EXIT ou EXIT WHEN. O EXIT
causa uma sada incondicional do LOOP, e o EXIT WHEN permite testar uma
condio e, apenas se ela for verdadeira, provocar a saida do LOOP.


1 DECLARE
2 x NUMBER;
3 BEGI N
4 X : = 1;
5 LOOP
6 DBMS_OUTPUT. PUT_LI NE( ' O val or de x eh ' | | X) ;
7 X : = X + 1;
8 EXI T WHEN X>=5;
9 END LOOP;
10 END;
11 /

Exemplo 11.9 LOOP simples

11.6.2 WHILE-LOOP
Este comando permite testar uma condio antes de iniciar a seqncia de
aes de repetio. Ao final de LOOP, testada a condio novamente e, caso

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
35 Programao PL/SQL
verdadeira, continua a seqncia de aes dentro do LOOP ou sai, caso seja
falsa, executando o que estiver aps o END LOOP.


1 DECLARE
2 x NUMBER;
3 BEGI N
4 X : = 1;
5 WHI LE X < 5 LOOP
6 X : = X + 1;
7 END LOOP;
8 END;
9 /

Exemplo 11.10 WHILE - LOOP

11.6.3 FOR - LOOP
Utilize este comando sempre que voc souber preveamente o nmero de
vezes que um LOOP deve ser executado. A cada comando FOR-LOOP existe uma
varivel controladora que em cada interao assumir todos os valores interiros
(variando de 1 em 1) contidos entre o limite inicial e o limite final.


FOR cont ador I N [ REVERSE] i ni ci o. . f i mLOOP
comando1;
comando2;
END LOOP;

cont ador Var i vel que t er seu val or i ncr ement ado.
[ REVERSE] I ndi ca que se deve di mi nui r ao i nvs de aument ar O
cont ador . O val or de i ni ci o deve ser mai or que o
f i m, poi s o val or ser decr esci do a cada r epet i o
i ni ci o i nt er val o i ni ci al de r epet i o
f i m i nt er val or f i nal da r epet i o

Figura 11.2 FOR-LOOP


1 DECLARE
2 Y NUMBER : = 1;
3 BEGI N
4 FOR X I N 1. . 5 LOOP
5 Y : = Y + X ;
6 DBMS_OUTPUT. PUT_LI NE( x) ;
7 END LOOP;
8 END;
9 /

Exemplo 11.11 FOR-LOOP.

No necessidade de declarar a varivel controladora, isso feito
implicitamente pelo comando FOR-LOOP. Podemos utilizar a varivel controladora
como uma varivel normal, no entanto, no podemos assinalar valores varivel
controladora. O escopo de visibilidade na varivel controladora apenas dentro do
lao.
Caso o nmero de vezes que deva ser repetida a seqncia de aes seja
fruto de um clculo, voc poder substituir tanto o intervalo superior quanto o
superior por variveis, mas no se esquea que esses valores devem ser sempre
nmeros inteiros.

Obs.: Voc poder utilizar o EXIT WHEN condio para terminar prematuramente o FOR-LOOP.

11.7 Labels

Os labels so utilizados para melhorar a leitura do programa PL/SQL. Labels
so aplicados a blocos ou LOOPs. Um label deve preceder imediatamente um
bloco ou LOOP e deve ser delimitado por << e >>. A clusula END ou END LOOP

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
36 Programao PL/SQL
pode fazer referncia do label. O uso de labels vantajoso quando existem vrios
blocos aninhados.


1 DECLARE
2 v_dept NUMBER( 2) ;
3 v_emp_count NUMBER( 2) ;
4 BEGI N
5 <<sei s_t ent at i vas>>
6 FOR cont I N 1. . 6 LOOP
7 <<bl oco_sel ecao>>
8 BEGI N
9 SELECT DEPARTMENT_I D
10 I NTO v_dept
11 FROM DEPARTMENTS
12 WHERE DEPARTMENT_I D = cont * 10;
13 <<bl oco_cont ador >>
14 BEGI N
15 SELECT count ( *)
16 I NTO v_emp_count
17 FROM EMPLOYEES
18 WHERE DEPARTMENT_I D = v_dept ;
19 END bl oco_cont ador ;
20 DBMS_OUTPUT. PUT_LI NE( ' Exi st e( m) ' | | v_emp_count | | ' empr egados no depar t ament o
' | | v_dept ) ;
21 END bl oco_sel ecao;
22 END LOOP sei s_t ent at i vas;
23 END;
24 /

Exemplo 11.12 Labels

11.8 Cursores

Em alguns casos necessitamos de espaos de armazenamento mais
complexos que as variveis, como uma matriz de informao resultada de uma
consulta SQL, neste case se faz necessrio o uso de cursores.
Os cursores em PL/SQL podem ser explcitos e implcitos. O PL/SQL declara
um cursor implicitamente para toda instruo DML (UPDATE, INSERT, DELETE,
SELECT...INTO), incluindo consultas que retornam apenas uma linha. As
consultas que retornam mais de uma linha devero ser declaradas explicitamente.
Cursores explcitos so indicados quando necessrio um controle no
processamento do mesmo.

11.8.1 Controlando Cursores Explcitos
De acordo com a figura 11.3, quatro so os comandos que controlam o
processamento de um cursor.


Figura 11.3 Controle de Processamento de Cursores

11.8.2 Declarando um Cursor (DECLARE)
Quando declaramos um cursor associado a ele um nome e a consulta SQL
que ser processada por este cursor. Assim como as variveis, os cursores devem
ser declarados na seo DECLARE.
O escopo de validade dos cursores o mesmo de uma varivel (ver 11.2).
Cursores declarados em um bloco externo so acessveis apenas neste bloco e
em qualquer sub-bloco contido neste, porm cursores declarados no sub-bloco
no so acessveis pelo bloco externo.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
37 Programao PL/SQL

CURSOR nome_cur sor
[ ( par amet r o1 t i po
, par amet r o2 t i po
, . . . ,
, par amet r oN t i po) ]
I S I nst r uo_SQL;

Figura 11.4 Declarando um cursor

Os cursores podem ser definidos com parmetros e para cada parmetro
devem ser escolhidos um nome e um tipo de dado(ver 11.3).

11.8.3 Abrindo um Cursor (OPEN)
O comando OPEN abre o cursor, executa a consulta associada a ele e gera o
conjunto ativo, que consiste de todas as linhas que atendem os critrios de
pesquisa da consulta associada ao cursor. Para gerenciar o conjunto ativo existe
um ponteiro que registra qual linha est passvel do comando FETCH. Aps o
OPEN o FETCH atuar sobre a primeira linha do conjunto ativo.


OPEN nome_cur sor [ ( var 1, var 2, . . . ) ] ;

Figura 11.5 Abrindo um cursor

11.8.4 Extraindo dados do Cursor (FETCH)
Extrair os dados do cursor o evento onde os dados da linha atual do
conjunto ativo so copiados para variveis ou registros e a cada FETCH realizado,
o ponteiro passar a apontar para a linha seguinte do conjunto ativo.


FETCH nome_cur sor I NTO [ var 1, var 2, . . . | r ecor d_name] ;

Figura 11.6 Fetch Cursor

Di ret ri zes
Inclua o mesmo nmero de variveis na clusula INTO da instruo FETCH do que as
colunas na instruo SELECT e certifique-se que os tipos de dados so compatveis
Faa a correspondncia de cada varivel para coincidir com as posies das colunas
Registros podem ser utilizados. O tipo %ROWTYPE pode ser associado ao cursor ou
diretamente a uma tabela. Os campos do cursor devem ser idnticos aos campos do
registro usado em quantidade e tipo

11.8.5 Fechando do Cursor (CLOSE)
O comando CLOSE desativa o cursor e libera o conjunto ativo. Esta etapa
permite que o cursor seja reaberto, se necessrio, para gerar um outro conjunto
ativo.


CLOSE nome_cur sor ;

Figura 11.6 Fechando um cursor


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
38 Programao PL/SQL

1 DECLARE
2 V_empno NUMBER;
3 V_ename VARCHAR2( 100) ;
4 CURSOR cEmpl yee I S
5 SELECT empl oyee_i d, f i r st _name
6 FROM EMPLOYEES;
7 r Empl oyee cEmpl yee%ROWTYPE;
8 CURSOR cEmpl yeeJ ob
9 ( p_j ob var char )
10 I S
11 SELECT f i r st _name
12 FROM EMPLOYEES
13 WHERE J ob_i d = p_j ob;
14 BEGI N
15 OPEN cEmpl yee;
16 FETCH cEmpl yee I NTO V_empno, V_ename;
17 DBMS_OUTPUT. PUT_LI NE( V_ename) ;
18 FETCH cEmpl yee I NTO V_empno, V_ename;
19 DBMS_OUTPUT. PUT_LI NE( V_ename) ;
20 FETCH cEmpl yee I NTO V_empno, V_ename;
21 DBMS_OUTPUT. PUT_LI NE( V_ename) ;
22 FETCH cEmpl yee I NTO r Empl oyee ;
23 DBMS_OUTPUT. PUT_LI NE( r Empl oyee. f i r st _name) ;
24 CLOSE cEmpl yee;
25
26 OPEN cEmpl yeeJ ob( ' SALESMAN' ) ;
27 FETCH cEmpl yeeJ ob I NTO V_ename;
28 DBMS_OUTPUT. PUT_LI NE( V_ename) ;
29 FETCH cEmpl yeeJ ob I NTO V_ename;
30 DBMS_OUTPUT. PUT_LI NE( V_ename) ;
31 CLOSE cEmpl yeeJ ob;
32
33 OPEN cEmpl yeeJ ob( ' MANAGER' ) ;
34 FETCH cEmpl yeeJ ob I NTO V_ename;
35 DBMS_OUTPUT. PUT_LI NE( V_ename) ;
36 FETCH cEmpl yeeJ ob I NTO V_ename;
37 DBMS_OUTPUT. PUT_LI NE( V_ename) ;
38 CLOSE cEmpl yeeJ ob;
39 END;
40 /

Exemplo 11.13 Cursores

Obs: No exemplo acima, as linhas 8 at 13 mostram a declarao de um cursor com parmetro e
nas linhas 15, 26 e 33 mostra o open do cursor. A linha 7 mostra um registro recebendo a
estrutura de linha de um cursor (isso poderia ser feito a uma tabela) e as linhas 22 e 23 mostram o
fetch para o registro e o uso do valor do registro

11.8.6 Atributos do Cursor Explcito
Quando anexados ao nome do cursor, esses atributos retornam
informaes teis sobre a execuo de uma instruo de manipulao de dados.

Atri buto Ti po Descri o
%ISOPEN Booleano Ser avaliado para TRUE se o cursor estiver aberto
%NOTFOUND Booleano Ser avaliado para TRUE se a extrao mais recente no
retornar linha.
%FOUND Booleano Ser avaliado para TRUE se a extrao mais recente retornar
linha.
%ROWCOUNT Numerico Ser avaliado para o nmero total de linhas retornadas at o
momento.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
39 Programao PL/SQL
11.8.7 LOOP Simples X Cursor
Neste primeiro estilo de loop de busca, a sintaxe de loop simples utilizada
para processamento do cursor. Atributos explcitos de cursor so utilizados para
controlar o nmero de vezes que o loop executado.


1 DECLARE
2 CURSOR cEmpr egados I S
3 SELECT f i r st _name FROM empl oyees;
4 aName empl oyees. f i r st _name%TYPE;
5 BEGI N
6 OPEN cEmpr egados;
7 LOOP
8 FETCH cEmpr egados I NTO aName;
9 EXI T WHEN cEmpr egados%NOTFOUND;
10 DBMS_OUTPUT. PUT_LI NE( aName) ;
11 END LOOP;
12 CLOSE cEmpr egados;
13 END;
14 /

Exemplo 11.14 Cursores Loop Simples

11.8.8 LOOP While X Cursor
O mesmo Exemplo 11.14 poderia ser escrito utilizando a sintaxe
WHILE..LOOP, da seguinte maneira.


1 DECLARE
2 CURSOR cCi dades I S
3 SELECT * FROM l ocat i ons;
4 r Ci t y l ocat i ons%ROWTYPE;
5 BEGI N
6 OPEN cCi dades;
7 FETCH cCi dades I NTO r Ci t y;
8 WHI LE cCi dades%FOUND LOOP
9 DBMS_OUTPUT. PUT_LI NE( r Ci t y. ci t y| | ' - ' | | r Ci t y. st at e_pr ovi nce) ;
10 FETCH cCi dades I NTO r Ci t y;
11 END LOOP;
12 CLOSE cCi dades;
13 END;
14 /

Exemplo 11.15 Cursores Loop While

11.8.9 LOOP For X Cursor
Os dois exemplos de LOOPs descritos anteriormente requerem um
processamento explcito de cursor por meio de instrues OPEN, FETCH, CLOSE
ver (11.8.1). A programao PL/SQL fornece um tipo de LOOP mais eficiente, que
trata implicitamente o processamento de cursor.


1 DECLARE
2 CURSOR cCar gos I S
3 SELECT j ob_t i t l e, j ob_i d
4 FROM j obs;
5 BEGI N
6 FOR r Car go I N cCar gos LOOP
7 DBMS_OUTPUT. PUT_LI NE( r Car go. j ob_i d| | ' - ' | | r Car go. j ob_t i t l e) ;
8 END LOOP;
9 END;
10 /

Exemplo 11.16 Cursor FOR

Observaes
O registro rCargo no declarado, sua declarao executada implicitamente,
recebe o tipo cCargos%ROWTYPE e o seu escopo apenas o LOOP.
O cursor cCargos processado implicitamente, sendo desnecessrio os
comandos OPEN, FETCH, CLOSE.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
40 Programao PL/SQL
11.8.10 LOOP For Implcitos
Alm do registro, o prprio cursor pode ser implicitamente declarado. A
consulta SQL geradora do conjunto ativo apresentada em de parnteses dentro
da prpria instruo FOR, e neste caso, tanto o registro com o cursor so
implicitamente declarados.


1 BEGI N
2 FOR r Depar t ament o I N ( SELECT d. depar t ment _i d, d. depar t ment _name
3 FROM depar t ment s d) LOOP
4 DBMS_OUTPUT. PUT_LI NE( r Depar t ament o. depar t ment _name) ;
5 END LOOP;
6 END;
7 /

Exemplo 11.17 Cursor FOR Implcito

11.8.11 Cursores Implcitos
Existem os cursor implcitos que so criados para processar as instrues
INSERT, UPDATE, DELETE, SELECT...INTO e so manipulados a revelia do
programador. Neste caso apenas o atributo %ROWCOUTN interessante para a
instruo UPDATE. O cursor implcito representado pela palavra reservada SQL.


1 BEGI N
2 UPDATE j obs
3 SET MAX_SALARY = MAX_SALARY+100
4 WHERE MAX_SALARY < 9000;
5
6 DBMS_OUTPUT. PUT_LI NE( SQL%ROWCOUNT| | ' l i nhas sal ar i os f or amat ual i zadas' ) ;
7 END;
8 /

Exemplo 11.18 Cursor Implcito



_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
41 Tratamento de Exceo
12 Tratamento de Exceo

Qualquer boa linguagem de programao deve ter a capacidade de tratar
erros de run-time e, se possvel, recuperar-se deles. A programao PL/SQL
implementa essa funcionalidade por meio de excees PL/SQL e tratamento de
excees.
Para se entender como o PL/SQL trabalha com os tratamentos de exees,
ser necessrio o entendimento dos seguintes conceitos:

Erro de run-time ou exeo situao adversa que ocasiona interrupo
na execuo do programa podendo ser motivada por falha na concepo
do sistema, codificao equivocada, falha de hardware, ou outro motivo.
Exceo PL/SQL o objeto de programao PL/SQL que nos permite
evitar a interrupo abrupta do programa caso este seja acomedido de um
erro de run-time.
Tratamento da exeo Indica qual ao ou quais aes devero ser
tomadas quando o programa for acomedido de um erro de run-time.

Quando o Oracle apresenta um erro de run-time ou exeo, este sempre ser
acompanhado de um cgido uma mensagem. Todos os possveis erros de run-
time ou excees podem ser consultados na lista de erros Oracle em http://download-
east.oracle.com/docs/cd/B19306_01/server.102/b14219/toc.htm. A cada cgido est associado
alm de uma mensagem, uma causa e aes a serem tomadas. Essas
informaes so extremamente importantes no dia-a-dia de um programador
PL/SQL.
Quando criamos um programa, a rigor no sabemos, antes de coloc-lo em
produo quais erros de run-time ou exceo podem ocorrer no momento da
execuo. No entanto, em alguns casos podemos vislumbrar ou imaginar um
conjunto pequeno de erros de run-time ou exceo que podero ocorrer na
execuo. A qualidade do programa se dar em funo da habilidade que o
programa ter para tratar os eventuais erros. Para cada erro vislumbrado ou
imagnado dever existir um tratamento espefico, e isso perfeitamente
programvel no PL/SQL.

12.1 Tratando X Propagando

Quando um erro de run-time ou exeo ocorre, o controle do bloco PL/SQL
deixa a seo de execuo(BEGIN) e passa compulsivamente para a seo de
exceo(EXCEPTION). Se existe algum tratamento especfico para o erro de run-
time (atravz de um objeto EXCEPTION), este ser capturado e tratado (se
existir o devido tratamento) pelo bloco e a execuo do bloco terminar sem
apresentar o erro de run-time (isso no quer dizer que o bloco executou com
sucesso todas as suas atividades). Se por outro lado, este tratamento no existe,
ou no bloco no existe a seo EXCEPTION, ento o bloco propagar ou
transferir o erro de run-time para bloco que o contm ou para o ambiente que o
executou.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
42 Tratamento de Exceo

<<bl oco_de_f or a>>
BEGI N
comando1;
comando2;
<<bl oco_de_dent r o>>
BEGI N
comando3;
comando4;
EXCEPTI ON
t r at ament o1;
t r at ament o2;
END bl oco_de_dent r o;
Comando5;
Comando6;
EXCEPTI ON
t r at ament o3;
t r at ament o4;
END bl oco_de_f or a;

Figura 12.1 Capturando X Propagando

Tabela 12.1. Tabela de Comportamento.
Premi ssa p/ t rat ament o Quando Tratado Quando Propagado
<<bloco_de_dentro>> tratamento1 e tratamento2
serem capazes de capturar
todo e qualquer erro de
runtime gerado por
comando3 ou comando 4
O comando5
executado, dando
continuidade
execuo.
O <<bloco_de_fora>>
recebe o run-time e fica
encaregado de propagar
ou capturar e os
comando5 e comando6
no so executados.
<<bloco_de_fora>> tratamento3 e tratamento4
serem capazes de capturar
todo e qualquer erro de
runtime gerado por
comando1, comando2 ou
<<bloco_de_dentro>>
Procedimento
concludo com
sucesso
O ambiente que
executou o bloco mostra
o cdigo de erro.

12.2 Tratamento de Excees

atravez do objeto exeo PL/SQL que temos a possibilidade de qualificar
as exees e aplic-las o devido tratamento. na seo de exceo que ocorrem
os tratamentos de erros de run-time como ilustrado pelo exemplo 12.1.
Para cada exeo provvel dever exisitr um tratamento atravz de uma
clusula WHEN que estar associada a uma exeo PL/SQL, seguida por uma
seqncia de instrues a serem executadas quando o run-time ocorrer, que
representam efetivamento o tratamento do erro de run-time.
A clusula WHEN OTHERS, se usada, deve ser posicionada com ltimo
tratamento, e utilizada para tratar alguma exeo que no encontrar o devido
tratamento nas clusulas WHEN. Devemos pensar a seo de exceo como um
comando IF, ELSIF, ELSE. Cada WHEN corresponde a um IF ou ELSIF, e WHEN
OTHERS corresponde ao ELSE.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
43 Tratamento de Exceo

1 DECLARE
2 v_empl oyee_i d empl oyees. empl oyee_i d%TYPE;
3 v_f i r st _name empl oyees. f i r st _name%TYPE: =' St even' ;
4 BEGI N
5 SELECT empl oyee_i d
6 I NTO v_empl oyee_i d
7 FROM empl oyees
8 WHERE f i r st _name = v_f i r st _name;
9 EXCEPTI ON
10 WHEN NO_DATA_FOUND THEN
11 DBMS_OUTPUT. PUT_LI NE( ' Pr i mei r o nome no encont r ado' ) ;
12 WHEN TOO_MANY_ROWS THEN
13 DBMS_OUTPUT. PUT_LI NE( ' Ret or nou mai s de uma l i nha' ) ;
14 WHEN OTHERS THEN
15 DBMS_OUTPUT. PUT_LI NE( ' Pr obl emas ao execut ar o pr ocedi ment o! ! ! ' ) ;
15 END;
16 /

Exemplo 12.1 Tratamento de Erros

No exemplo 12.1 apresenta um programa com uma instruo SELECT
(linha5) e trs tramatentos de exeo (linhas 10, 12 e 14). Sendo dois tratamentos
especficos para determinadas exees e o terceiro para tratar toda e qualquer
exceo inesperada. Desta forma o programa sempre terminar a execuo sem
apresentar erro algum.

Existem 2(dois) tipos de objetos exeo PL/SQL
Pr-definidos ou internos
Definido pelo usurio

Di ret ri zes
A palavra EXCEPTION inicia a seo de tratamento de excees.
So permitidos vrios tratamentos de exceo
Somente um tratamento processado antes de se sair do bloco
WHEN OTHERS se existir sempre deve ser o ltimo tratamento.

12.3 Excees PL/SQL Pr-definidas ou internas

As exees pre-definidas so disparados automaticamente pelo programa
quando este gera um erro de run-time. Do grupo de erros Oracle catalogados,
existe um grupo menor para as quais foram criadas excees pr-definidas ou
internas que podem ser tratadas diretamente na seo EXCEPTION, sem a
necessidade de declarao na seo DECLARE.
Os erros de run-time que tm exceo associada podem ter um tratamento
especfico e previlegiado atravs da clusula WHEN, os demais, que formam o
maior grupo, s podero ser tratados na clusula OTHERS. Veremos a frente com
remediar isso (ver 12.6)
Na tabela 12.2 mostra os mais recorrentes e em http://download-
east.oracle.com/docs/cd/B14117_01/appdev.101/b10807/07_errs.htm#i7014 encontram-
se todas as excees pr-definidas

Tabela 12.2. Excees Pr-definidas.
Exepti on Oracl eError Rai se when
DUP_VAL_ON_INDEX ORA-00001 O seu programa tentou armazenar valores duplicados em
uma coluna com restrio de UNIQUE
INVALID_CURSOR ORA-01001 O seu programa tentou um operao ilegal de cursores
como fechar um cursos j fechado.
NO_DATA_FOUND ORA-01403 Uma instruo SELECT INTO retornou nenhuma linha.
TOO_MANY_ROWS ORA-01422 Uma instruo SELECT INTO retornou mais de uma linha.
ZERO_DIVIDE ORA-01476 O seu programa tentou efetuar uma diviso por 0(zero)



_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
44 Tratamento de Exceo
12.4 Excees PL/SQL definidas pelo Usurio

Para que uma exceo seja definida pelo programador, esta deve ser
declarada explicitamente na seo DECLARE e so acionadas atravs do
comando RAISE.
O escopo de validade deste tipo de exceo o mesmo de uma varivel (ver
11.2). Excees declaradas em um bloco externo so acessveis apenas neste
bloco e em qualquer sub-bloco contido neste, porm excees declaradas no sub-
bloco no so acessveis pelo bloco externo.


1 DECLARE
2 e_Emp_I nval i do EXCEPTI ON;
3 v_sal empl oyees. sal ar y%TYPE: =2000;
4 v_empl oyee_i d empl oyees. empl oyee_i d%TYPE: =5;
5 BEGI N
6 UPDATE empl oyees
7 SET sal ar y = v_sal
8 WHERE empl oyee_i d = v_empl oyee_i d;
9 I F SQL%NOTFOUND THEN
10 RAI SE e_Emp_I nval i do;
11 END I F;
12 EXCEPTI ON
13 WHEN e_Emp_I nval i do THEN
14 DBMS_OUTPUT. PUT_LI NE( ' Est e f unci onar i o naumexi st e' ) ;
15 END;
16 /

Exemplo 12.2 Exceo declarada

No exemplo 12.2.o programa declara a exeo PL/SQL e_emp_invlido na
linha 2, aciona a exeo na linha 10 e a trata na linha 13. Percebam que o
tratamento dado s exees PL/SQL definidas pelo usurio identica ao
tratamento dado s exees PL/SQL pr-definidas.
Exees PL/SQL definidas so uteis para tratar sutiaes relativa ao negcio
como saldo insuficiente, cliente j cadastrado ou cdigo j utilizado.

Obs.: Se uma exceo definida pro usurio for disparada e o devido tratamento no existir na seo
EXCEPTION o bloco retornar o seguinte erro ORA-06510: PL/SQL: exceo no-manipulada
definida pelo usurio

12.5 Comando RAISE_APLLICATION_ERROR

Em alguns casos se faz necessrio forar um erro de run-time. Para isso
usamos o comando RAISE_APPLICATION_ERROR, que nos permite interromper
a execuo de um programa, gerando erro de run-time e assinal-lo um cdigo e
uma mensagem. Para usarmos RAISE_APPLICATION_ERROR devemos utilizar a
seguinte sintaxe:


r ai se_appl i cat i on_er r or ( er r or _number , message) ;

Figura 12.1 Tratamento de Erros

onde er r or _number um numero negativo e inteiro na faixa de -20999 a -20000
e message a mensagem customizada pelo programador.

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
45 Tratamento de Exceo


1 DECLARE
2 nQdt NUMBER;
3 BEGI N
4 SELECT COUNT( *)
5 I NTO nQdt
6 FROM empl oyees;
7 I F nQdt < 100 THEN
8 RAI SE_APPLI CATI ON_ERROR( - 20000, ' Ai nda no Exi st em100 f unci onar i os' ) ;
9 END I F;
10 END;
11 /

Exemplo 12.3 RAISE_APPLICATION_ERROR

Obs.: Excees geradas por RAISE_APPLICATION_ERROR no estaro na lista erros Oracle e
sero capturadas e tratadas na clusula WHEN OTHERS.

12.6 Pragma EXCEPTION_INIT

Para tratar os erros de run-time que no tem exceo PL/SQL pr-definida
(ver 12.3), deveramos usar a clusula OTHERS ou PRAGMA EXCEPTION_INIT.
Nesta segunda abordagem, o compilador associa uma exceo declarada pelo
usurio (ver 12.4) com um cdigo de erro de run-time mapeado na lista de erros
Oracle.


1 DECLARE
2 e_emp_r emai n EXCEPTI ON;
3 PRAGMA EXCEPTI ON_I NI T( e_emp_r emai n, - 2292) ;
4 V_depar t ment _i d depar t ment s. depar t ment _i d%TYPE: =60;
5 nQdt NUMBER;
6 BEGI N
7 DELETE depar t ment s
8 WHERE depar t ment _i d = V_depar t ment _i d;
9 I F SQL%NOTFOUND THEN
10 RAI SE_APPLI CATI ON_ERROR( - 20001, ' O depat ament o ' | | V_depar t ment _i d| | ' no
exi st e' ) ;
11 END I F;
12 EXCEPTI ON
13 WHEN e_emp_r emai n THEN
14 SELECT COUNT( *)
15 I NTO nQdt
16 FROM empl oyees
17 WHERE depar t ment _i d = V_depar t ment _i d;
18 DBMS_OUTPUT. PUT_LI NE( ' No possi vel a r emoo do depar t ament o ' | | V_depar t ment _i d
| | ' . Nel e exi st e( m) ' | | nQdt | | ' f unci onar i o( s) ' ) ;
19 END;
20 /

Exemplo 12.4 Pragma EXCEPTION_INIT

No exemplo 12.4 o comando PRAGMA EXCEPTION_INIT (linha 3) associa
ORA-2292 exeo PL/SQL e_emp_remain declarada na linha 2. Apartir desta
associao os erros de run-time ORA-2292 podero ser tratados pela exeo
PL/SQL e_emp_remain (linha 13).
Esta modalidade de tratamento interessante para os erros de chave
estrangeira ORA-02292: restrio de integridade violada - registro filho
Localizado e ORA-02291: restrio de integridade violada - chave me no
localizada.

12.7 SQLCODE, SQLERRM

Quando ocorre um erro de run-time ocorre, voc pode identificar o cdigo e a
mensagem do erro associado atravs das funes SQLCODE e SQLERRM. A
obteno do cdigo erro e consulta na lista de erros Oracle ajuda na resoluo de
erros de programao.

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
46 Tratamento de Exceo
Tabela 12.3. SQLCODE, SQLERRM
Funo Descri o
SQLCODE Retorna o nmero de cdigo de erro
SQLERRM Retorna os dados de caracteres que contm a mensagem associada ao nmero
de erro


1 DECLARE
2 V_count r y_i d count r i es. count r y_i d%TYPE: =' CA' ;
3 BEGI N
4 DELETE count r i es
5 WHERE count r y_i d = V_count r y_i d;
6 EXCEPTI ON
7 WHEN OTHERS THEN
8 DBMS_OUTPUT. PUT_LI NE( ' Cdi go - > ' | | SQLCODE) ;
9 DBMS_OUTPUT. PUT_LI NE( ' Mensagem- > ' | | SQLERRM) ;
10 END;
11 /

Exemplo 12.5 SQLCODE, SQLERRM





_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
47 Stored Subprograms

Parte III - Objetos Procedurais


13 Stored Subprograms

Subprogramas so compilados e armazenados no banco de dados Oracle,
esto disponveis para leitura e execuo. Uma vez compilados se tornam objetos
de schema na forma de stored procedure ou stores funciton, que podem ser
acessados pelos usurios e aplicaes conectados do banco de dados.
O comando CREATE [OR REPLACE] PROCEDURE nos permite criar uma
procedure no banco de dados e o comando CREATE [OR REPLACE] FUNCTION
nos permite criar uma funo de banco de dados.
A utilizao de subprogramas armezenados nos traz a vantagem de
compartilhamento de memria, tendo se em vista que apenas uma verso do
subprograma ser carregada em memria e ser compartilhada por vrios
usurios. Podemos citar tambm a padronizao na forma de tratar os dados.

13.1 Stored Procedure

Uma PROCEDURE um bloco PL/SQL nomeado que pode obter parmetros
(algumas vezes chamados de argumentos), e que pode ser referenciada por
nome.
Para transformar um bloco PL/SQL em uma PROCEDURE basta eliminar
palavra DECLARE (se existir) e adicionar CREATE [OR REPLACE] PROCEDURE
nome_procedimento (par1,par2,...,parN) IS ao inicio. Entre o nome do
procedimento e a palavra IS, podem ser especificados os parmetros separados
por vrgula.


CREATE [ OR REPLACE] PROCEDURE nome_pr ocedi ment o
( par amet r o1 [ MODO] t i podado
, par amet r o2 [ MODO] t i podado,
, . . .
, par amet r oN [ MODO] t i podado)
I S
- - decl ar aes
BEGI N
- - i nst r ues e comandos
EXCEPTON
- - t r at ament os de er r o
END;

Figura 13.1 Sintaxe Create procedure


1 CREATE OR REPLACE PROCEDURE Pr ocNul a
2 I S
3 BEGI N
4 DBMS_OUTPUT. PUT_LI NE( ' Pr i mei r a Pr ocedur e' ) ;
5 END Pr ocNul a;
6 /

1 BEGI N
2 Pr ocNul a;
3 END;
/

Exemplo 13.1 Primeira procedure


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
48 Stored Subprograms
As PROCEDURES podem ser chamadas apartir de :
blocos annimos
procedures
triggers
funes

boa prtica aps o END de concluso de PROCEDURE especificar o nome
desta como vemos na linha 5(cinco) de exemplo 13.1.

13.1.1 Parmetros Stored Procedures

A uma PROCEDURE pode estar assiciado vrios parmetros e para cada
parmetro, dois aspectos devem ser considerados, o tipo de parmetro e o modo
do parmetro. Quanto ao primeiro, apenas uma definio dever existir por
parmetro, sero considerados os tipos de dados permitidos na programao
PL/SQL (VER 11.3)
Quanto ao modo do parmetro, existem 3 casos, IN, OUT e IN OUT

Figura 13.1 Comportamento Parmetros
IN OUT IN OUT
Default Deve ser especificado Deve ser especificado
O valor transferido do
ambiente para a
procedure
O valor transferido da
procedure para o
ambiente.
O valor transferido do ambiente para a
procedure e em seguida transferido da
procedure para o ambiente.
Age dentro da
procedure como uma
constante
Age dentro da procedure
como uma varivel no
inicializada
Age dentro da procedure como uma varivel
inicializada
O parmetro pode ser
uma varivel
inicializada, constante,
expresso ou literal
Deve ser uma varivel Deve ser uma varivel


1 CREATE OR REPLACE PROCEDURE r ai se_sal ar y
2 ( p_empl oyee_i d empl oyees. empl oyee_i d%TYPE)
3 I S
4 v_sal ar y empl oyees. sal ar y%TYPE;
5 BEGI N
6 SELECT sal ar y
7 I NTO v_sal ar y
8 FROM empl oyees
9 WHERE empl oyee_i d = p_empl oyee_i d;
11 DBMS_OUTPUT. PUT_LI NE( ' Sal r i o Ant er i or ' | | v_sal ar y) ;
13 v_sal ar y : = v_sal ar y * 1. 1;
15 UPDATE empl oyees
16 SET sal ar y = v_sal ar y
17 WHERE empl oyee_i d = p_empl oyee_i d;
19 DBMS_OUTPUT. PUT_LI NE( ' Sal r i o Cor r i gi do ' | | v_sal ar y) ;
21 EXCEPTI ON
22 WHEN NO_DATA_FOUND THEN
23 DBMS_OUTPUT. PUT_LI NE( ' Empr egado ' | | p_empl oyee_i d| | ' no exi st e' ) ;
24 END r ai se_sal ar y;
25 /

1 BEGI N
2 r ai se_sal ar y( 100) ;
3 END;
4 /

Exemplo 13.2 Parmetro IN


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
49 Stored Subprograms

1 CREATE OR REPLACE PROCEDURE quer y_emp
2 ( i n_empl oyee_i d empl oyees. empl oyee_i d%TYPE
3 , out _name OUT empl oyees. f i r st _name%TYPE
4 , out _sal ar y OUT empl oyees. sal ar y%TYPE
5 , out _phone_number OUT empl oyees. phone_number %TYPE)
6 I S
7 BEGI N
8 SELECT f i r st _name, sal ar y , phone_number
9 I NTO out _name , out _sal ar y, out _ phone_number
10 FROM empl oyees
11 WHERE empl oyee_i d = i n_empl oyee_i d;
12 EXCEPTI ON
13 WHEN NO_DATA_FOUND THEN
14 DBMS_OUTPUT. PUT_LI NE( ' Empr egado ' | | i n_empl oyee_i d| | ' no exi st e' ) ;
15 END quer y_emp;
16 /

1 DECLARE
2 v_name VARCHAR2( 20) ;
3 v_sal ar y NUMBER;
4 v_phone VARCHAR2( 20) ;
5 BEGI N
6 quer y_emp( 100, v_gname, v_gsal ar y, v_gphone_number ) ;
7 DBMS_OUTPUT. PUT_LI NE( Nome: | | v_name| | , sal ar i o: | | v_sal ar y| | , f one: | |
v_phone) ;
8 END;
9 /

Exemplo 13.3 Parmetro OUT


1 CREATE OR REPLACE PROCEDURE f or mat _phone
2 ( i n_out _phone I N OUT VARCHAR2)
3 I S
4 ePar amet r oI nval i do EXCEPTI ON;
5 BEGI N
6 I F LENGTH( i n_out _phone) <> 10 THEN
7 RAI SE ePar amet r oI nval i do;
8 END I F;
9
10 i n_out _phone : = ' ( ' | | SUBSTR( i n_out _phone, 1, 2) | | ' ) ' | |
11 SUBSTR( i n_out _phone, 3, 4) | | ' - ' | |
12 SUBSTR( i n_out _phone, 7, 4) ;
13 EXCEPTI ON
14 WHEN ePar amet r oI nval i do THEN
15 DBMS_OUTPUT. PUT_LI NE( ' Par amet r o I nval i do' ) ;
16 END f or mat _phone;
17 /

1 DECLARE
2 v_phone VARCHAR2( 15) : =' 9132182315' ;
3 BEGI N
4 f or mat _phone( v_phone) ;
5 DBMS_OUTPUT. PUT_LI NE( Tel ef one f or mat ado : | | v_phone) ;
6 END;
7 /

Exemplo 13.4 Parmetro IN OUT

Nos exemplos 13.2, 13.3 e 13.4 apresentam a codificao de algumas
PROCEDURES e como estas devem ser acionadas. Lembramos que
PROCEDURES podem ser chamadas apartir de outras PROCEDURES,
FUNCTIONS ou TRIGGERS.

Obs.: Tipo de parmetro %TYPE e %ROWTYPE so permitidos(Ver 11.3).

13.1.2 Especificando valores de parmetros

Para uma procedure contendo parmetros, existem dois mtodos possveis
de especificar os valores dos parmetros.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
50 Stored Subprograms
Tabela 13.2. Especificaes de valores
Mt odo Descri o
Posicional Os valores dos parmetros devero ser listados na ordem em que
mesmos foram declarados. Neste mtodo todos os valores devem ser
especificados.
Associao Nomeada Os valores dos parmetros podero ser listados em ordem arbitrria. A
associao do valor com o nome feita atravs do smbolo =>
(nome_parametro =>valor).


SQL>CREATE OR REPLACE PROCEDURE add_dept
2 ( i n_depar t ment _name depar t ment s. depar t ment _name%TYPE DEFAULT ' UNKNOWN'
3 , i n_l ocat i on_i d depar t ment s. l ocat i on_i d%TYPE DEFAULT 1400)
4 I S
5 nMax NUMBER;
6 BEGI N
7 SELECT MAX( depar t ment _i d) +1
8 I NTO nMax
9 FROM depar t ment s;
10
11 I NSERT I NTO depar t ment s
12 ( depar t ment _i d, depar t ment _name , l ocat i on_i d )
13 VALUES
14 ( nMax , i n_depar t ment _name, i n_l ocat i on_i d ) ;
15 END add_dept ;
16 /

1 BEGI N
2 add_dept ;
3 add_dept ( ' TREI NAMENTO2' , 1500) ;
4 add_dept ( I N_DEPARTMENT_NAME => ' TREI NAMENTO3' , i n_l ocat i on_i d => ' 1500' ) ;
5 add_dept ( I N_DEPARTMENT_NAME => ' TREI NAMENTO4' ) ;
6 add_dept ( i n_l ocat i on_i d => ' 1500' ) ;
7 END;
8 /

Exemplo 13.5 Especificando Parmetros

Na especificao de parmetro por associao nomeada, no somos
obrigados a elencar todos os parmetros, neste caso o parmetro omitido
assumir o valor default, se este existir, caso contrrio assumir valor NULL.

13.2 Stored Function

Uma FUNCTION um bloco PL/SQL nomeado que pode ou no obter
parmetros e que deve ser referenciada por nome. Todos os parmetros de uma
FUNCTION devem ser do modo IN e por definio uma FUNCTION deve
obrigatoriamente ter um valor de retorno associado a ela.
Para transformar um bloco PL/SQL em uma FUNCTION basta eliminar
palavra DECLARE (se existir) e adicionar CREATE [OR REPLACE] FUNCTION
nome_funcao (par1,par2,...,parN) RETURN tipo_de_dado IS ao inicio do bloco.
Entre o nome da funo e a palavra RETURN, entre parnteses, podero ser
especificados quantos parmetros forem necessrios, separados por vrgula.


CREATE [ OR REPLACE] FUNCTI ON nome_f uncao
( par amet r o1 t i podado
, par amet r o2 t i podado,
, . . .
, par amet r oN t i podado)
RETURN t i po_de_dado
I S
- - decl ar aes
BEGI N
- - i nst r ues e comandos
RETURN val or _f uno;
EXCEPTON
- - t r at ament os de er r o
END nome_f uncao;

Figura 13.2 Sintaxe Create Funo


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
51 Stored Subprograms
O comando RETURN determina o valor da funo, e alm disso, atua como
um comando EXIT e tudo que estiver aps ser desconsiderado. O valor de uma
pode ser codificado vrias vezes, no entanto apenas um ser utilizado.


SQL>CREATE OR REPLACE FUNCTI ON f _qdt _empr egados
2 ( i n_depar t ment _i d depar t ment s. depar t ment _i d%TYPE)
3 RETURN NUMBER
4 I S
5 nQdt NUMBER;
6 BEGI N
7 SELECT COUNT( *)
8 I NTO nQdt
9 FROM empl oyees
10 WHERE depar t ment _i d = i n_depar t ment _i d;
11 RETURN nQdt ;
12 END f _qdt _empr egados;
13 /

Exemplo 13.6 Function

boa prtica aps o END de concluso da FUNCTION especificar o nome
desta como vemos na linha 12(doze) de exemplo 13.6.

13.2.1 Locais permitidos para uso de Functions

Funes podem ser chamadas de qualquer lugar onde uma expresso
vlida.

Tabela 13.3 Locais Possveis
Local/Chamada Exemplo
Assinalando valor a uma varivel
BEGI N
v_sal ar i o : = f _sal ari o( 19) ;
END;
Em uma expresso BOOLEAN (se o
tipo da funo BOOLEAN)
I F f _pagamento_aberto( 234) THEN
Assinalando valor DEFAULT a uma
varivel
DECLARE
v_sal ar i o NUMBER: = f _sal ari o( 10) ;
BEGI N
Passando valor como parmetro a
uma procedure.
BEGI N
pr oc_r eaj ust e( i n_i d_empl oyee => 15
, i n_sal r i o_at ual => f _sal ari o( 15)
) ;
END;
Lista de seleo de um comando
SELCT
SELECT DEPARTMENT_NAME, qdt_empregados( DEPARTMENT_I D)
FROM depar t ment s
Condio das clusulas WHERE
SELECT f i r st _name
FROM empl oyees
WHERE f _sal ari o( empl oyee_i d) > 10500
Clusula VALUES do comando
INSERT
I NSERT I NTO empl oyees
( EMPLOYEE_I D, FI RST_NAME, LAST_NAME, SALARY)
VALUES
( 1500 , ' MARCUS' , ' WI LLI AM' , f _sal ari o( 1015) )
Clusula SET de comando UPDATE
UPDATE empl oyees
SET SALARY = f _sal ari o( 1015)
WHERE EMPLOYEE_I D = 1500

Na tabela 13.3, observamos que as FUNCTIONS podem ser chamadas
apartir de blocos PS/SQL ou apartir de instrues DML.



_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
52 Package

14 Package


As PACKAGES so objetos que agrupam logicamente elementos de
programao PL/SQL. Esses elementos podem ser tipos definidos pelo usurio,
variveis, excees PL/SQL, cursores, PROCEDURES e FUNCTIONS.
Na maioria das vezes os packages tm duas partes, a especificao e o
corpo. Em alguns casos o corpo desnecessrio.


SQL>CREATE OR REPLACE PACKAGE pacot e_sem_cor po
2 AS
3 mi ni mum_bal ance CONSTANT REAL : = 10. 00;
4 number _pr ocessed NUMBER;
5 i nsuf f i ci ent _f unds EXCEPTI ON;
6 END pacot e_sem_cor po;
7 /

Pacot e cr i ado.

SQL>BEGI N
2 pacot e_sem_cor po. number _pr ocessed : = 100;
3 pacot e_sem_cor po. number _pr ocessed : = pacot e_sem_cor po. number _pr ocessed + 10;
4 DBMS_OUTPUT. PUT_LI NE( pacot e_sem_cor po. number _pr ocessed) ;
5
6 I F pacot e_sem_cor po. number _pr ocessed > 100 THEN
7 RAI SE pacot e_sem_cor po. i nsuf f i ci ent _f unds;
8 END I F;
9 EXCEPTI ON
10 WHEN pacot e_sem_cor po. i nsuf f i ci ent _f unds THEN
11 DBMS_OUTPUT. PUT_LI NE( ' i nsuf f i ci ent _f unds' ) ;
12 END;
13 /

Pr ocedi ment o PL/ SQL concl u do comsucesso.

Exemplo 14.1 Pacote sem corpo

No exemplo 16.1 ilustra um package sem corpo, com apenas 3 elementos,
uma constante, uma varivel e uma exceo. Mostra tambm algumas maneiras
de manipular esses elementos. PACKAGES sem corpo so teis quando se
deseja criar variveis ou elementos de escopo global

Obs.: Variveis de pacote no podem ser usadas diretamente em instrues SQL. Somente uma
funo pblica do pacote poder ser usada em instrues SQL e retornar o valor de uma varivel,
mesmo que esta varivel seja tambm pblica.

A especificao a interface do package, e nele declarado o contedo
pblico, quais os elementos de programao que podero ser referenciada por
outros objetos do banco de dados. Os subprogramas (procedure e fuctions)
devero estar especificados com o nome e todos os seus parmetros
No corpo, ser definido o contedo privado do package que dever ser
referenciados e acessados apenas pelos elementos privados do package. no
corpo que se encontra a codificao completa dos subprogramas, assim como as
consultas associadas aos cursores.

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
53 Package

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Package |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| HEADER | BODY |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| VARI AVEL1; | VARI AVEL2; |
| TI PO1; | TI PO2; |
| EXCEPTI ON1; | EXCEPTI ON2; |
| CURSOR1 | CURSOR1 |
| ( p1, p2, . . . , pN) ; | ( p1, p2, . . . , pN) |
| | I S SELECT . . . ; |
| | CURSOR2 |
| | ( p1, p2, . . . , pN) |
| | I S SELECT . . . ; |
| PROC1 | PROC1 |
| ( p1, p2, . . . , pN) ; | ( p1, p2, . . . , pN) |
| | I S BEGI N . . . END; |
| | PROC2 |
| | ( p1, p2, . . . , pN) |
| | I S BEGI N . . . END; |
| FUNCTI ON1 | FUNCTI ON1 |
| ( p1, p2, . . . , pN) | ( p1, p2, . . . , pN) |
| RETURN; | RETURN |
| | I S BEGI N . . . END; |
| | FUNCTI ON2 |
| | ( p1, p2, . . . , pN) |
| | RETURN |
| | I S BEGI N . . . END; |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Figura 14.1 Elementos de um package.

O corpo e a especificao so considerados objetos diferentes e devem ser
criados em instrues diferentes.


SQL>CREATE OR REPLACE PACKAGE pck_emp
2 I S
3 PROCEDURE quer y_emp
4 ( i n_empl oyee_i d empl oyees. empl oyee_i d%TYPE
5 , out _name OUT empl oyees. f i r st _name%TYPE
6 , out _sal ar y OUT empl oyees. sal ar y%TYPE
7 , out _phone_number OUT empl oyees. phone_number %TYPE) ;
8 END pck_emp;
9 /

SQL>CREATE OR REPLACE PACKAGE BODY pck_emp
2 I S
3 PROCEDURE quer y_emp
4 ( i n_empl oyee_i d empl oyees. empl oyee_i d%TYPE
5 , out _name OUT empl oyees. f i r st _name%TYPE
6 , out _sal ar y OUT empl oyees. sal ar y%TYPE
7 , out _phone_number OUT empl oyees. phone_number %TYPE)
8 I S
9 BEGI N
10 SELECT f i r st _name, sal ar y , phone_number
11 I NTO out _name , out _sal ar y, out _phone_number
12 FROM empl oyees
13 WHERE empl oyee_i d = i n_empl oyee_i d;
14 EXCEPTI ON
15 WHEN NO_DATA_FOUND THEN
16 DBMS_OUTPUT. PUT_LI NE( ' Empr egado ' | | i n_empl oyee_i d| | ' no exi st e' ) ;
17 END quer y_emp;
18 END pck_emp;
19 /

SQL>DECLARE
2 aEmpl oyee_i d empl oyees. empl oyee_i d%TYPE: =206;
3 aFi r st _name empl oyees. f i r st _name%TYPE;
4 aSal ar y empl oyees. sal ar y%TYPE;
5 aPhone_number empl oyees. phone_number %TYPE;
6 BEGI N
7 pck_emp. quer y_emp( aEmpl oyee_i d, aFi r st _name, aSal ar y, aPhone_number ) ;
8 DBMS_OUTPUT. PUT_LI NE( ' aFi r st _name - - > ' | | aFi r st _name) ;
9 DBMS_OUTPUT. PUT_LI NE( ' aSal ar y - - > ' | | aSal ar y) ;
10 DBMS_OUTPUT. PUT_LI NE( ' aPhone_number - - > ' | | aPhone_number ) ;
11 END;
12 /

aFi r st _name - - > Wi l l i am
aSal ar y - - > 8300
aPhone_number - - > 515. 123. 8181

Exemplo 14.2 Pacote com apenas uma procedure e como utiliz-lo

Observaes:
Todos os elementos posicionados na especificao
(VARIAVEL1, TIPO1, EXCEPTION1, PROC1,
FUNCTION1, CURSOR1) so os elementos
pblicos acessveis a todos os objetos do banco de
dados.
Os elementos VARIAVEL2, TIPO2, EXCEPTION2,
CURSOR2, PROC2, FUNCTION2, so os
elementos privados do pacote acessveis apenas
pelos objetos do pacote
Os elementos cursores, procedures, e functions se
pblicos, devero estar presentes no corpo com a
sua especificaao ou programao e no cebealho
apresentando os parmetros se estes existirem.

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
54 Package

SQL>CREATE OR REPLACE PACKAGE pck_empl oyee
2 I S
3 FUNCTI ON emp_qt d
4 ( i n_depar t ment _i d empl oyees. depar t ment _i d%TYPE)
5 RETURN NUMBER;
6 PROCEDURE f i r e_empl oyee
7 ( i n_emp_i d NUMBER) ;
8 END pck_empl oyee;
9 /

Pacot e cr i ado.

SQL>CREATE OR REPLACE PACKAGE BODY pck_empl oyee
2 I S
3 nGl obal NUMBER;
4
5 PROCEDURE del _j ob
6 ( i n_Empl oyee_I d empl oyees. Empl oyee_I d%TYPE) I S
7 BEGI N
8 DELETE j ob_hi st or y
9 WHERE empl oyee_i d = i n_Empl oyee_I d;
10 END del _j ob;
11
12 FUNCTI ON emp_qtd
13 ( i n_depar t ment _i d empl oyees. depar t ment _i d%TYPE)
14 RETURN NUMBER
15 I S
16 nResul t ado NUMBER;
17 BEGI N
18 SELECT COUNT( *)
19 I NTO nResul t ado
20 FROM empl oyees
21 WHERE depar t ment _i d = i n_depar t ment _i d;
22
23 RETURN nResul t ado;
24 END emp_qdt ;
25
26 PROCEDURE f i re_empl oyee
27 ( i n_emp_i d NUMBER)
28 I S
29 nQdt NUMBER;
30 BEGI N
31 - - obt er o depar t ament o
32 SELECT depar t ment _i d
33 I NTO nGl obal
34 FROM empl oyees
35 WHERE empl oyee_i d = i n_emp_i d;
36
37 del _j ob( i n_emp_i d) ;
38
39 - - del at ar empr egado
40 DELETE empl oyees
41 WHERE empl oyee_i d = i n_emp_i d;
42
43 SELECT emp_qt d( nGl obal )
44 I NTO nQdt
45 FROM DUAL;
46
47 DBMS_OUTPUT. put _l i ne( ' Agor a exi st emapenas ' | |
48 nQdt | |
49 ' no depar t ament o ' | | nGl obal
50 ) ;
51 END f i r e_empl oyee ;
52
53 END pck_empl oyee;
54 /

Cor po de Pacot e cr i ado.

Exemplo 14.3 Uma procedure publica e uma function privada

Obs.: Se uma function utilizada em uma instruo SQL (exemplo 16.3, linha 43) esta deve
obrigatoriamente estar declarada na especificao do pacote.

Quando uma sesso manipula o valor de uma varivel de pacote, este se
torna permanente ao longo da existncia desta sesso. Para cada sesso que
manipula o valor de uma varivel de pacote, existe uma rea de memria que
armazena os valores desta varivel. O valor manipulado por uma sesso no
interfere no valor manipulado por outra. O valor persiste para a sesso desde o
momento em que feita a primeira manipulao, at a finalizao da sesso ou
uma remanipulao deste valor. Essa caracterstica tambm atribuda a
conjuntos ativos gerados por cursores.

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
55 Database Trigger

15 Database Trigger

As triggers assim como as stored procedures so armazenadas do banco de
dados e podem ser compostas de instrues SQL e PL/SQL. Entretanto stored
procedure e triggers diferem na forma como estes so acionados. Uma stored
procedure explicitamente acionda por um usurio, aplicao ou trigger. As
triggers so implicitamente disparadas pelo Oracle quando um determinado evento
ocorre. O disparo da trigger independe do usurio ou aplicao que gerou o
evento.
Uma database trigger subprograma associado a uma tabela, view ou
evento. A traigger pode ser acionada uma vez quando um determinado evento
ocorre ou vrias vezes para cada linha afetada por uma instruo INSERT,
UPDATE ou DELETE. A trigger pode ser aciondad aps um determindo evento
para registr-lo ou efetuar alguma atividade posterior, ou pode ser acionado antes
de um evento para previnir operaes indevidas ou ajustar os novos dados para
que estes estejam de acordo com a regra de negcio.
Como principais motivos para o uso de database trigger, podemos citar os
seguintes:

gerao automtica de valores de colunas derivados;
preveno de transaes invlidas;
reforar regras de negcio complexas;
prover auditoria;
gerar estatsticas sobre acesso s tabelas;
prover log de transaes.

escopo deste captulo apenas as triggers associadas a tabelas, no entanto,
existem as INSTED OF triggers voltadas para DMLs disparados contra objetos
view e triggers de eventos de sistema voltadas para atividade de administrao do
banco de dados.

15.1 Elementos

Antes de se codificar uma trigger interessante decidir, segundo as
necessidades de regra de negcio, quais os elementos desta futura trigger.

Tabela 15.1. Elementos triggers
Component es Descri o Val ores
Tempo Quando o trigger dispara em relao ao evento
de acionamento (DML)
BEFORE
AFTER
Evento de acionamento Quais operaes de manipulao de tabela
(DML) disparam a trigger
INSERT
UPDATE
DELETE
abrangncia da trigger Quantas vezes o corpo da trigger ser
executado
de linha (for each row)
de instruo(*)
Corpo da trigger Que aes sero executadas Bloco PL/SQL
(*) Opo default

Quanto quantidade de vezes que a trigger ser acionda, podemos afirmar
que o comportamento default das por instruo e quando o DML acionador de
trigger afeta apenas uma linha, tanto o trigger de instruo quanto o trigger de
linha dispararo apenas uma vez. Ao passo que, quando o DML acionado afeta

_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
56 Database Trigger
vrias linhas o trigger de instruo ser executado apenas uma vez enquanto que
o trigger de linha ser executado na mesma quantidade das linhas afetadas.


SQL>CREATE OR REPLACE TRI GGER j obs_bi ud
2 BEFORE I NSERT OR UPDATE OR DELETE ON j obs
3 BEGI N
4 I F TO_CHAR ( SYSDATE, ' HH24' ) NOT BETWEEN ' 08' AND ' 18' THEN
5 RAI SE_APPLI CATI ON_ERROR( - 20205, ' Al t er aes so per mi t i das apenas no hor r i o de
expedi ent e' ) ;
6 END I F;
7 END j obs_bi ud;

Exemplo 15.1 Trigger

Obs: O exemplo 17.1 uma trigger que ser disparada apenas uma vez quando um INSERT,
UPDATE ou DELETE for efetuado na tabela jobs.

15.2 Predicado Condicional

Quando programamos uma trigger para vrios eventos e temos a
necessidade de identifica qual evento disparou a trigger, poderemos usar os
predicados condicionais que so funes booleanas que podem ser utilizadas para
determinar a operao que disparou o trigger.


SQL>CREATE OR REPLACE TRI GGER empl oyees_bi ud
2 BEFORE I NSERT OR UPDATE OR DELETE ON empl oyees
3 BEGI N
4 I F ( TO_CHAR ( SYSDATE, ' HH24' ) NOT BETWEEN ' 08' AND ' 18' ) THEN
5 I F DELETI NG THEN
6 RAI SE_APPLI CATI ON_ERROR( - 20502, ' Del ees na t abel a de empr egados apenas no
hor ar i o nor mal ' ) ;
7 ELSI F I NSERTI NG THEN
8 RAI SE_APPLI CATI ON_ERROR( - 20502, ' I nser es na t abel a de empr egados apenas no
hor ar i o nor mal ' ) ;
9 ELSI F UPDATI NG( ' SALARY' ) THEN
10 RAI SE_APPLI CATI ON_ERROR( - 20502, ' Al t er aes no sal r i o apenas no hor ar i o
nor mal ' ) ;
11 ELSE
12 RAI SE_APPLI CATI ON_ERROR( - 20504, ' Al t er aes nos empr egados apenas no hor ar i o
nor mal ' ) ;
13 END I F;
14 END I F;
15 END empl oyees_bi ud;

Exemplo 15.2 Predicado

15.3 Trigger de Linha

Uma trigger de linha disparada uma vez para cada linha afetada pela
instruo DML. Uma trigger de linha identificada pela clusula FOR EACH ROW.

15.3.1 Qualificadores (:new, :old)
Em uma trigger de linha, existe uma forma de acessar os valores dos campos
que esto sendo processados atualmente, atraves dos identificadores :new, :old. O
compilador PL/SQL ir trat-los como tabela_da_trigger%ROWTYPE.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
57 Database Trigger

SQL>CREATE OR REPLACE TRI GGER empl oyees_bi ur
2 BEFORE I NSERT OR UPDATE ON empl oyees
3 FOR EACH ROW
4 BEGI N
5 I F NOT ( : NEW. j ob_i d I N ( ' AD_PRES' , ' AD_VP' ) ) THEN
6 I F : NEW. sal ary > 15000 THEN
7 RAI SE_APPLI CATI ON_ERROR ( - 20202, ' Est e empr egado no pode r eceber est e
val or ' ) ;
8 END I F;
9 END I F;
10 END empl oyees_bi ur ;

Exemplo 15.3 Qualificadores

Tabela 15.2 Qualificadores
DML :ol d :new
INSERT NULO Valores Novos
DELETE Valores antigos NULO
UPDATE Valores antigos Valores Novos


SQL>cr eat e t abl e dept _audi t
2 ( user i d var char 2( 30)
3 , t i mest amp dat e
4 , t i po_dml CHAR( 1)
5 , ol d_dept _i d NUMBER
6 , ol d_name var char 2( 30)
7 , ol d_manager _i d number
8 , ol d_l ocat i on_i d number
9 , new_dept _i d NUMBER
10 , new_name var char 2( 30)
11 , new_manager _i d number
12 , new_l ocat i on_i d number
13 )

SQL>CREATE OR REPLACE TRI GGER depar t ment _ai udr
2 AFTER I NSERT OR UPDATE OR DELETE ON depar t ment s
3 FOR EACH ROW
4 DECLARE
5 v_DML dept _audi t . t i po_dml %TYPE;
6 BEGI N
7 I F I NSERTI NG THEN
8 v_DML : = ' I ' ;
9 ELSI F DELETI NG THEN
10 v_DML : = ' D' ;
11 ELSI F UPDATI NG THEN
12 v_DML : = ' U' ;
13 END I F;
14
15 I NSERT I NTO dept _audi t
16 ( user i d , t i mest amp , t i po_dml
17 , ol d_dept _i d , ol d_name , ol d_manager _i d
18 , ol d_l ocat i on_i d , new_dept _i d , new_name
19 , new_manager _i d , new_l ocat i on_i d
20 )
21 VALUES
22 ( USER , SYSDATE , v_DML
23 , : OLD. depar t ment _i d , : OLD. depar t ment _name , : OLD. manager _i d
24 , : OLD. l ocat i on_i d , : NEW. depar t ment _i d , : NEW. depar t ment _name
25 , : NEW. manager _i d , : NEW. l ocat i on_i d
26 ) ;
27 END;

Exemplo 15.4 Auditagem por trigger

Obs.: Os qualificadores :old, :new, esto disponveis apenas nas triggers de linha.


SQL>CREATE OR REPLACE TRI GGER r egi ons_bi r
2 BEFORE I NSERT ON r egi ons
3 FOR EACH ROW
4 DECLARE
5 v_r egi on_i d r egi ons. r egi on_i d%TYPE;
6 BEGI N
7 SELECT MAX( r egi on_i d) +1
8 I NTO v_r egi on_i d
9 FROM r egi ons;
10
11 : NEW. r egi on_i d : = v_r egi on_i d;
12 END r egi ons_bi r ;

Exemplo 15.5 Autoincremento.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
58 Database Trigger
15.3.2 Clusula WHEN
Nas triggers de linha, podemos restringir a ao da trigger segundo uma
condio, onde a mesma ser disparada apenas para as linhas que satisfaam a
condio prevista.


SQL>CREATE OR REPLACE TRI GGER der i ve_commi ssi on_pct
2 BEFORE I NSERT OR UPDATE OF sal ar y ON empl oyees
3 FOR EACH ROW
4 WHEN ( NEW. j ob_i d = ' SA_REP' )
5 BEGI N
6 I F I NSERTI NG THEN
7 : NEW. commi ssi on_pct : = 0;
8 ELSI F : OLD. commi ssi on_pct I S NULL THEN
9 : NEW. commi ssi on_pct : = 0;
10 ELSE
11 : NEW. commi ssi on_pct : = : OLD. commi ssi on_pct + 0. 05;
12 END I F;
13 END;
14 /

Exemplo 15.6 Clusula WHEN

No exemplo 17.6 alm da clusula condicional, percebemos na linha 2
clusula OF seguida de um campo (salary) da tabela (employees) associada
trigger. Isso indica que a trigger s ser disparada quando o update afetar a coluna
indicada. Caso a clusula OF estiver omitida a trigger do exemplo 17.6 ser
disparada indepedente da coluna afetada.

59 A Oracle Net
Parte IV Apndices

A Oracle Net

tendncia, entre os envolvidos em desenvolvimento de sistemas,
transferir para o DBA a responsabilidade sobre a configurao de acesso ao banco
de dados nos equipamentos de trabalho. Acreditamos que cada programador deve
ter a capacidade de gerenciar as configuraes de acesso aos bancos de dados.
Para isso o programador dever conhecer o Oracle Net.
O Oracle Net uma camada de software que reside no cliente e no servidor
de banco de dados Oracle. responsvel por estabelecer e manter conexes
entre a aplicao cliente e o servidor, bem como, intercambiar mensagens entre os
mesmos, usando protocolos de comunicao disponveis no mercado.

A.1 - Arquitetura

A figura A.1 mostra com a arquitetura no Oracle Net e como funciona o
estabelecimento de uma conexo com um banco de dados Oracle. Uma aplicao
primeiramente envia uma requisio de conexo ao banco correto aps a leitura
dos arquivos de configurao do Oracle Net (sqlnaet.ora, tnsnames.ora) No
servidor existe um elemento chamado listener que gerencia e libera as conexes
com o banco de dados.


Figura A.1 Arquiteture Oracle Net

Para se estabelecer uma comunicao com um banco de dados Oracle
devem ser fornecidas apenas trs informaes, o nome do usurio, senha do
usurio e o net service name. O terceiro item um alias que encapsula todas as
informaes necessrias para acessar um banco de dados Oracle. A rigor, para
acessar um banco, so necessrios, a identificao do equipamento (Host Name
ou endereo IP) onde se encontra o banco de dados, o protocolo de comunicao
que este equipamento est apto a usar, o nmero da porta que ser usada para
receber as requisies de banco de dados e o nome do banco de dados (service
name) instalado neste equipamento. Todos estes aspectos so resolvidos em um
connect descriptor, no qual todas estas informaes esto contempladas.
Existem quatro formas de se obter as informaes de um connect descriptor
(localnaming, Oracle Names Server, Hostnaming, Exteral Naming Server). Neste
curso, usaremos apenas localnaming.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
60 A Oracle Net
A.2 - Configurao

no arquivo sqlnet.ora, atravs do parmetro NAMES.DIRECTOTY_PATH, que
definido a forma de obteno dos connect descriptor. Os valores vlidos so
CDS, HOSTNAME, NDS, NIS, ONAMES, TNSNAMES. Podem existir
combinaes de valores para este parmetro, no entanto para o nosso escopo de
trabalho o valor TNSNAMES, que corresponte a localnaming, obrigatrio.


NANES. DI RECT_PATH=( TNSNAMES)

Exemplo A.1 Contedo arquivo sqlnet.ora

Por sua vez, no arquivo tnsnames.ora que so registrados dos os net
service names disponveis para o cliente oracle e seu respectivo connect
descriptor.


ORCL = # Pr i mei r o net ser vi ce Name
( DESCRI PTI ON =
( ADDRESS_LI ST =
( ADDRESS = ( PROTOCOL = TCP) ( HOST = host name) ( PORT = 1521) )
)
( CONNECT_DATA =
( SERVI CE_NAME = ORCL)
)
)
MARCUSDB = # Segundo net ser vi ce Name
( DESCRI PTI ON =
( ADDRESS_LI ST =
( ADDRESS = ( PROTOCOL = TCP) ( HOST = MARCUS) ( PORT = 1521) )
)
( CONNECT_DATA =
( SERVI CE_NAME = MARCUS)
)
)
BELEM = # Ter cei r o net ser vi ce Name
( DESCRI PTI ON =
( ADDRESS_LI ST =
( ADDRESS = ( PROTOCOL = TCP) ( HOST = 10. 1. 20. 100) ( PORT = 1521) )
)
( CONNECT_DATA =
( SI D = BELEM)
)
)

Exemplo A.2 Contedo arquivo tnsnames.ora

Neste contedo exemplificativo de TNSNAMES.ORA encontramos trs net
service names que juntamente com seus connect descriptor do acessos aos
bancos de dados Oracle. As informaes deste exemplo esto compiladas na
tabela 1.1.

Tabela A.1. Informaes compiladas
NetServi ceName PROTOCOL HOST PORT SERVICE_NAME
ORCL TCP hostname 1521 ORCL
MARCUSDB TCP MARCUS 1521 MARCUS
BELEM TCP 10.1.20.100 1521 BELEM

A varivel de ambiente TNS_ADMIN tem como valor o local/pasta onde se
encontra o arquivo tnsnames.ora que ser usado nas conexes Oracle. Case esta
varivel no exista ser o local default que so $ORACLE_HOME/network/admin
para UNIX e %ORACLE_HOME%\network\admin para Windows


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
61 A Oracle Net
A.3 - Principais Problemas

Na figura A.2 esto listadas as etapas executadas quando uma conexo
com o banco de dados Oracle estabelecida. O bom entendimento destas etapas
se faz necessrio para se enfrentar os problemas de conexo com o banco de
dados Oracle. Esto listados os principais problemas de conexo.


1. A apl i cao envi a ao Or acl e Net as segui nt es i nf or maes: usur i o,
senha e Net Ser vi ceName
2. O Or acl e Net f az busca do Net Ser vi ceName i nf or mado no ar qui vo
t nanames. or a par a obt er os dados do connect descr i pt or .
3. O comput ador i nf or mado na di r et i va HOST aci onado.
4. J no ser vi dor , o l i st ener pr ocur a nos seus ar qui vos de conf i gur ao
o SERVI CO_NAME ou SI D i nf or mado no connect descr i pt or usado.
5. O l i st ener est abel ece a conexo

Figura A.2 Etapas no estabelecimento de conexo

ORA-12154: TNS: coul d not resol ve servi ce name
Moti vos
A leitura do connect descriptor no foi executada com sucesso
Ao
Assegurar que TNSNAMES est listado com um dos valores do parmetro
NAMES.DIRECTORY_PATH no arquivo SQLNET.ORA(Oracle Net Profile)
Verificar se o arquivo TNSNAMES.ORA existe e est no local adequado e acessvel (varivel de
ambiente .TNS_ADMIN)
Verificar se o net service name usado com identificador de conexo existe no arquivo
TNSNAMES.ORA
Assegurar que no existam erros no arquivo TNSNAMES.ORA, como parnteses no fechados

ORA-03505: TNS: Fail ed do resol ve name
Moti vos
O net service name usado com identificador de conexo no foi encontrado no arquivo
TNSNAMES.ORA
Ao
Idem ORA-12154

ORA-12535 : Connect fail ed because target host or obj ect does not exi st
Moti vos
O equipamento indicado na diretiva HOST no est ativo (desligado).
O equipamento indicado na diretiva HOST no foi alcanado (problema de rede).
Ao
Ativar o servidor de Banco de dados.
Correo na diretiva HOST para o endereo de IP ou HostName correto.

ORA-12535 TNS:operati on timed out
Moti vos
O equipamento indicado na diretiva HOST no est ativo (desligado).
O equipamento indicado na diretiva HOST no foi alcanado (problema de rede).
Ao
Ativar o servidor de Banco de dados.
Correo na diretiva HOST para o endereo de IP ou HostName correto.

ORA-12541: TNS: no li stener
Moti vos
O listener do servidor est inativo impossibilitado de estabelecer novas conexes
O equipamento indicado na diretiva HOST existe, foi alcanado, porm nele no est instalado
SGDB Oracle.
Ao
Acionar o DBA para ativar o listener.
Correo na diretiva HOST do connect descriptor para o equipamento correto.


_Introduo Programao PL/SQL ______________________marcuswlima@gmail.com
62 A Oracle Net
ORA-12514: Li stener coul d not resol ve SERVICE_NAME gi ven i n connect descri pti on
Moti vos
O valor da diretiva SERVICE_NAME est incorreto. O NetServiceName existe, o HOST foi
alcanado, porm o SERVICE_NAME informado no esperado pelo listener.
Se o banco estiver na verso 8i ou inferior
Ao
Confirmar com o DBA qual o valor correto para a diretiva SERVICE_NAME
Passar a usar a diretiva SID ao invez de SERVICE_NAME

ORA-01033: ORACLE i niti al i zati on or shutdown i n progress
Moti vos
O banco est em manuteno
Ao
Perguntar para o DBA o que ele est fazendo

ORA-01034: ORACLE not avali abl e
Moti vos
O banco est fora do ar e indisponvel
Ao
Correr e avisar o DBA.

ORA-01017: i nvali d username/password; l ogon deni ed
Moti vos
Usurio ou senha invlidos
Ao
Confirmar como DBA as informaes de usurio e senha.


63 B Schema HR (Human Resource)
B Schema HR (Human Resource)

Potrebbero piacerti anche