You are on page 1of 27

UNIVEM

PL/SQL

Banco de Dados II
Engenharia da Computao

D
I
N
O

Linguagens hospedeiras
Aplicaes

PL/SQL
Oracle
Introduo bsica






interrogar a BD
tomar decises
dialogar com o utilizador
etc.

linguagem de programao convencional


C, Delphi, Ada, Java

Prof. Edmundo Spoto

linguagem de manipulao de dados (DML)


otimizada para acesso rpido a grandes BD

O SGBD fornece um conjunto de procedimentos


que implementam as principais funes da DML
PL/SQL - 2

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Acesso ao Banco de Dados

D
I
N
O

ligao direta (API)

Comunicao

ODBC
JDBC

dados locais

BD

os programas de aplicao no escrevem


diretamente no BD
usam operaes do nvel conceitual - a bem da
independncia dos dados
se uma chamada da DML produz uma relao



aplicao





PL/SQL - 3

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Assim


chamadas
DML

esta pode ser maior que a rea de dados local


as linguagens convencionais so orientadas a registros
transferida para a rea local uma tupla de cada vez
o seguinte obtido com uma instruo de fetch
os dados na rea local so variveis normais do programa
PL/SQL - 4

Tpicos_Especiais1 - PL-SQL

D
I
N
O

PL/SQL - Ambiente

PL/SQL
Desenvolvimento modular de
programas.
 Permite executar instrues
condicionais.
 Permite executar instrues num ciclo.
 Permite processar vrias linhas
devolvidas por uma pergunta atravs de
cursores.
 Os erros podem ser processados com
rotinas de tratamento de excees.
Sintaxe:


Engine PL/SQL

PL/SQL
Block

PL/SQL

PL/SQL
Block
SQL

Execuo da
expresso
procedimental

Execuo da expresso SQL

Declare
ooo
Begin
ooo
Exception
ooo
End;

Servidor Oracle

Begin <lgica>
Declare <declarao de
variveis>

Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 5

End
;
Exception <tratamento de
erros>

PL/SQL - 6

Tpicos_Especiais1 - PL-SQL

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Linguagem PL/SQL

Modularidade





A linguagem PL/SQL permite a declarao de


constantes, variveis, subprogramas (procedures e
funes), que favorecem a estruturao de cdigo;
Possui mecanismos para controle de erros de
execuo;
Incorpora os novos conceitos de objeto,
encapsulamento e, ainda, permite a interface com
rotinas escritas em outras linguagens .

PL/SQL - 7

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Benefcios da PL/SQL

A PL/SQL no um produto independente; podemos consider-la um


mdulo executor de blocos e subprogramas;


PL/SQL - 8

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Arquitetura


A modularidade um conceito que determina a diviso do programa em


mdulos com aes bem definidas, que visam a facilitar o entendimento
e a manuteno.
 Um problema complexo poderia ser subdividido em problemas
menos complexos que, por sua vez, poderiam ser novamente
subdivididos at que obtivssemos problemas simples com
solues de fcil implementao.
A PL/SQL, por possuir uma estrutura de blocos, favorece a
modularidade.
 Alm de blocos annimos, temos a possibilidade de criar
procedimentos e funes armazenadas na base de dados e
compartilhadas por outras aplicaes, ou pacotes (packages) que
permitem que agrupemos os procedimentos, funes e variveis
relacionadas.

SUPORTE PARA SQL

Esse mdulo pode ser instalado no Oracle Server e nas ferramentas de


desenvolvimento da Oracle (Forms Builder, Report Builder, etc.).
Estes dois ambientes so independentes e podem conter at mesmo verses diferentes
da PL/SQL.

Esse mdulo, no entanto, trabalha da mesma forma: ele capaz de tratar os


comandos de PL/SQL, mas no os comandos de SQL, que devem ser resolvidos
por mecanismos internos do Oracle Server.
Em ferramentas que possuem esse mdulo embutido, a ferramenta passa para
seu mdulo executor local o bloco de PL/SQL que pode ser processado no
prprio ambiente, com a exceo dos comandos de SQL encontrados.

Grande parte do trabalho realizada localmente, sem necessidade de envio de


informaes para o ambiente servidor.


Em ferramentas que no tm esse mdulo embutido, tais como SQL*Plus e


Enterprise Manager, torna-se necessrio o envio de todo o bloco para o
servidor, para que este acione o seu mdulo executor local e processe o bloco de
PL/SQL.

Tpicos_Especiais1 - PL-SQL

D
I
N
O

PL/SQL - 9

Benefcios da PL/SQL

SUPORTE PARA PROGRAMAO


ORIENTADA A OBJETO




Quando criamos um tipo objeto, definimos suas


caractersticas atravs de seus atributos e mtodos.
Os mtodos so escritos em PL/SQL.
Na criao de um bloco de PL/SQL, podemos
declarar variveis com qualquer dos tipos
predefinidos existentes no banco de dados ou com
os tipos criados pelo usurio, inclusive tipos
objeto.

Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 11

PL/SQL - 10

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Benefcios da PL/SQL

A PL/SQL permite a utilizao, integrada no


cdigo, dos comandos da DML, das funes de
SQL, de comandos de controle de cursor e dos
comandos para controle da transao (Commit,
Rollback, etc.).

PERFORMANCE


A PL/SQL pode:




Reduzir o trfego na rede pelo envio de um bloco contendo diversos


comandos de SQL agrupados em blocos para o Oracle.
Adicionar performance s ferramentas que possuem um mdulo executor
local,.
Reduzir no s o trfego na rede como tambm a programao quando
estabelecemos aes que podem ser compartilhadas em diversas aplicaes
(Uso de Stored Procedure).

PL/SQL - 12

Tpicos_Especiais1 - PL-SQL

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Benefcios da PL/SQL

Benefcios da PL/SQL
PRODUTIVIDADE

PORTABILIDADE

O aprendizado da PL/SQL pode ser aproveitado


no desenvolvimento de aplicaes batch,
online, relatrios, etc.
 No desenvolvimento de um programa
utilizando uma Ferramenta tal como Forms
Builder ou Report Builder. Conhecer a
Linguagem ajudar muito no desenvolvimento
de sistemas.


Aplicaes escritas em PL/SQL so portveis


para qualquer sistema operacional e plataforma
nos quais o Oracle execute. No h necessidade
de customizao.
 Isso significa que podemos escrever programas
ou bibliotecas de programas que podem ser
utilizados em diferentes ambientes.


PL/SQL - 13

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Identificadores da Linguagem


D
I
N
O

Um identificador consiste em uma letra seguida de outras


letras, nmeros, $ (dlar), _ (sublinhado) e # (smbolo
numrico). Possui um limite mximo de 30 caracteres.
As letras podem ser maisculas ou minsculas
indiscriminadamente, pois a linguagem no sensvel
forma.
Opcionalmente, os identificadores podem ser declarados
(e usados) entre aspas. Com essa sintaxe, podemos
declarar variveis com outros caracteres alm daqueles
estabelecidos no incio do texto (exceto aspas). O
tamanho continua limitado a 30 caracteres (excluindo-se
as aspas).

D
I
N
O

Um comentrio em PL/SQL pode ser informado de duas


maneiras:
 - Dois hfens em qualquer ponto da linha torna o restante da
linha como comentrio (--).
 - /* (incio) e */ (fim) marcam uma regio que ser ignorada
pelo compilador.
Restries: no podemos embutir um comentrio em outro e,
no podemos utilizar comentrios com dois hfens em
blocos de PL/SQL que venham a ser processados
dinamicamente por um Oracle Precompiler,
(isso ocorre porque os caracteres de fim de linha so
ignorados (no so considerados)) e, desta forma, o fim do
comentrio no percebido at o fim do bloco.
Neste caso, devemos usar /* e */.


Dino Spoto

PL/SQL - 17

Alguns identificadores possuem um significado especial em


PL/SQL e no devem ser utilizados na declarao de
variveis.
- No utilizem palavras reservadas na declarao de
variveis:
if, end, do, while, else, etc..
- Evite tambem de usar os mesmos nomes das colunas das
tabelas. Dica  use um v_nome para distinguir o nome da
coluna na tabela.
PL/SQL - 16

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Comentrios

Tpicos_Especiais1 - PL-SQL

PALAVRAS RESERVADAS

PL/SQL - 15

Tpicos_Especiais1 - PL-SQL

PL/SQL - 14

Tpicos_Especiais1 - PL-SQL

Comentrios - Exemplo
Listagem L03_04 - Comentrios
SQL> DECLARE
2
VALOR
VARCHAR2(10);
3
END_CASA
VARCHAR2(20);
4 BEGIN
5 VALOR := -- A atribuio ser feita na outra linha
6
'RUA A';
7 END_CASA := /* a atribuio vir a seguir */ 'RUA B S/N';
8 END;
9 /


Procedimento PL/SQL concludo com sucesso

PL/SQL - 18

Tpicos_Especiais1 - PL-SQL

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

FINAL DE LINHA




D
I
N
O

DECLARE
... definio dos objetos PL/SQL que sero
utilizados neste bloco
BEGIN
.... aes executveis
EXCEPTION
.... o que fazer se um ao executada causar
um erro
END;

A indicao de fim de linha de comando em


PL/SQL feita com um ponto-e-vrgula (;);
Observe que o comportamento do SQL*Plus
mudar quando encontrar o primeiro comando de
PL/SQL, pois no aguardar mais o ponto-evrgula (;) para indicao de fim de comando.
Para concluirmos a digitao de um programa,
deveremos utilizar a barra (/) para encerrar sem
executar.

PL/SQL - 19

Tpicos_Especiais1 - PL-SQL

Bloco Annimo

PL/SQL - 20

Tpicos_Especiais1 - PL-SQL

Declarao e atribuio

TIPOS DE DADOS - Escalares

Sintaxe:
identifier [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expr];

1.

Exemplos:

Declare
v_hiredate
DATE;
v_deptno NUMBER(2) NOT NULL :=10;
c_comm CONSTANT NUMBER :=1400;
v_ename emp.ename%TYPE;

Atribuio:
v_hiredate := 31-DEC-98;

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Dino Spoto

2.
3.
4.
5.

Tipo de dado numrico para armazenamento de inteiros vlidos no seguinte


intervalo de valores: de 231 + 1 (-2147483647) e 231 1 (2147483647).
Binary_Integer possui um conjunto de subtipos (derivado do tipo bsico
Binary_Integer):
Natural Com intervalo de valores vlidos entre 0 a 231 1.
NaturalN Com intervalo de valores vlidos entre 0 a 231 1 e sem a
possibilidade de associao de valores NULLS.
Positive Com intervalo de valores vlidos entre 1 a 231 1.
PositiveN Com intervalo de valores vlidos entre 1 a 231 1 e sem a
possibilidade de associao de valores NULLS.
SignType Restrito seguinte lista de valores: -1, 0 e 1

PL/SQL - 21

Number
Tipo de dado numrico para armazenamento de
valores fixos ou em ponto flutuante com preciso
de at 38 dgitos e magnitude de 1.0E-130 a
9.99E125.
Pode-se especificar preciso e escala. Se no
especificarmos preciso, o default 38 (ou o
maior tamanho vlido para o sistema operacional,
o que for menor).
Escala pode variar de 84 a 127. Escalas
negativas causam o arredondamento da parte
inteira.

Tpicos_Especiais1 - PL-SQL

1.

Variveis %TYPE herdam o


tipo da coluna base e suportam
mudanas nessa definio

TIPOS DE DADOS - Number

2.

ESCALARES

PL/SQL - 23

D
I
N
O

TIPOS DE DADOS
Listagem L03_06 Tipo de dado - Number
SQL> VARIABLE P1 NUMBER
SQL> VARIABLE P2 NUMBER
SQL> VARIABLE P3 NUMBER
SQL> DECLARE
2 WNUM1
NUMBER;
3 WNUM2
NUMBER(38, -4);
4 WNUM3
NUMBER(38, 127);
5 BEGIN
6 WNUM1 := 9.99E125;
7 WNUM2 := 38925;
8 WNUM3 := 123456789987654321.0E-130;
9 :P1 := WNUM1;
10 :P2 := WNUM2;
11 :P3 := WNUM3;
12 END;
13 /

Procedimento
sucesso.

PL/SQL

concludo

SQL> PRINT
P1
---------9,990E+125
P2
---------40000

P3
---------1,235E-113
PL/SQL - 24

Tpicos_Especiais1 - PL-SQL

com

UNIVEM

D
I
N
O

PL/SQL

Na listagem L03_06, declaramos trs variveis no


SQL*Plus para recebermos o resultado das
atribuies feitas no programa.
O comando Print (de SQL*Plus) nos mostra o
resultado:



O tipo Number tambm possui um conjunto de subtipos (derivados do


tipo bsico Number):

- Decimal, Dec e Numeric armazenamento em ponto fixo com
uma preciso mxima de 38 dgitos decimais.

- Doubl Precision, Float armazenamento em ponto flutuante
com uma preciso mxima de 126 dgitos binrios, o que equivale
a 38 dgitos decimais. Para efetuarmos a converso de preciso
binria para preciso decimal, devemos multiplicar a preciso
binria por 0.30103 e para realizar a operao inversa devemos
multiplicar a preciso decimal por 3.32193.

- Real armazenamento em ponto flutuante com uma preciso
mxima de 63 dgitos binrios, o que equivale a 38 dgitos
decimais.
- Integer, Int e Smallint armazenamento de inteiros com uma
preciso mxima de 38 dgitos.

Listagem L03_08 Tipo de dado Pls_Integer


SQL> DECLARE
2 WNUM
NUMBER;
3 WPLS
PLS_INTEGER := 2147483647;
4 WBIN
BINARY_INTEGER := 2147483647;
5 BEGIN
6 WNUM := WBIN + 1;
7 WNUM := WPLS + 1;
8 END;
9 /
DECLARE
*
ERRO na linha 1:
ORA-01426: overflow numrico
ORA-06512: em line 7

Tpicos_Especiais1 - PL-SQL

Dino Spoto

Tipos de Dados Pls_Integer

3.

Pls_Integer
Tipo de dado numrico para armazenamento de inteiros vlidos no
seguinte intervalo de valores: de 231 + 1 (-2.147.483.647) e 231 1
(2.147.483.647).
similar ao tipo Binary_Integer, porm mais rpido para efetuar
clculos que um Binary_Integer ou um Number, pois utiliza machine
arithmetic, enquanto os demais usam library arithmetic.
Possui uma outra diferena em relao ao Binary_Integer no que se
refere deteco de Overflow. Quando efetuamos um clculo usando
variveis Pls_Integer e o valor ultrapassa a capacidade mxima da
varivel, ocorre um erro de Overflow mesmo que a rea receptora tenha
capacidade de armazenamento (seja um Number, por exemplo).
J com Binary_Integer no ocorrer qualquer erro se atribuirmos o
resultado a um Number.

PL/SQL - 27

Tipos de Dados - Char


4.

A recomendao da
Oracle que
passemos a utilizar
variveis do tipo
Pls_Integer nas
novas aplicaes
para que possamos
obter ganhos de
performance

PL/SQL - 29

PL/SQL - 28

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Exemplo - Pls_Integer

concludo

PL/SQL - 26

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Comentrios - Number

D
I
N
O

Observe o resultado do exemplo da Listagem L03_07:

Listagem 3.07 Tipo de dado


SQL> DECLARE
2 WNUM1
NUMBER := 1.23456789987654E-113;
3 WNUM3
NUMBER(38,127);
4 BEGIN
5 WNUM3
:= 123456789987654321.0E-130;
6 IF WNUM3 > WNUM1 THEN
Procedimento PL/SQL
7
:P1 := 3;
com sucesso.
8 ELSIF WNUM3 = WNUM1 THEN
9
:P1 := 0;
SQL> PRINT P1
10 ELSE
11
:P1 := 1;
P1
12 END IF;
---------13 END;
0
14 /

PL/SQL - 25

Tpicos_Especiais1 - PL-SQL

Outro Exemplo

A varivel wnum1 no teve seu valor alterado, pois a


declaramos sem qualquer restrio quanto preciso ou escala.
A varivel wnum2, por possuir uma escala negativa, causou o
arredondamento da parte inteira do nmero que passou de
38.925 para 40.000.
A varivel wnum3 perde os trs ltimos nmeros informados,
pois a escala 127 e o valor multiplicado por 10-130.

Tpicos_Especiais1 - PL-SQL

D
I
N
O

D
I
N
O

Comentrios - Number

Char
Tipo de dado alfanumrico de tamanho fixo com comprimento de at
32.767 bytes. Pode-se especificar o tamanho mximo na declarao de
uma varivel com esse tipo. Caso isso no seja especificado, o
comprimento default de 1 byte.
O comprimento especificado em bytes e no em caracteres. Isso
importante quando armazenamos valores multibytes.
O conjunto de valores vlidos para armazenamento depende do charset
do banco de dados.
A definio de uma coluna do tipo Char no banco de dados est
limitada a 2.000 bytes.
O tipo Char tem um nico subtipo Character que possui as mesmas
caractersticas de seu tipo bsico.
PL/SQL - 30

Tpicos_Especiais1 - PL-SQL

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Exemplo - Char
Listagem L03_09 Tipo de dado - CHAR
SQL> VARIABLE P1 VARCHAR2(100)
SQL> DECLARE
2 WCHAR
CHAR(5);
3 BEGIN
4 WCHAR := 'ABC';
5 :P1 := '*'||WCHAR||'*';
6 END;
7 /
Procedimento PL/SQL concludo com sucesso.

5.

SQL> PRINT P1
P1
-----------------------------*ABC *

Na listagem L03_09,
possvel observar que a
varivel foi completada com
brancos direita at atingir o
comprimento especificado
pelo tipo.

PL/SQL - 31

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Tipos de Dados Varchar2

Tipos de Dados - Long

6.

P1
---------------------------*ABC*

Observe que, neste caso,


somente armazenado
para a varivel o que
realmente foi atribudo.

Procedimento PL/SQL concludo com sucesso.

D
I
N
O

PL/SQL - 33

Tipos de Dados

SQL> PRINT P1
P1
-------------------------------8.

*ABC*

Procedimento PL/SQL concludo com sucesso.


9.

Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 35

PL/SQL - 34

Tpicos_Especiais1 - PL-SQL

7.

Listagem L03_11 Tipo de dado - Long


SQL> DECLARE
2 WLONG
LONG(32767);
3 BEGIN
4 WLONG := 'ABC';
5 :P1
:= '*'||WLONG||'*';
6 END;
7 /

Long
Tipo de dado alfanumrico de tamanho varivel
com comprimento de at 32.767 bytes. Podemos
especificar o tamanho mximo na declarao de
uma varivel com esse tipo.
Uma coluna Long no banco de dados armazena at
2 GB (2.147.483.647 bytes).
Podemos fazer referncia a colunas Long em
comandos de DML (Insert, Update e muitos
comandos Select), mas no em expresses,
chamadas de funes SQL, ou em certas clusulas,
tais como Where, Group By e Connect By.

D
I
N
O

Exemplo - Long

PL/SQL - 32

Tpicos_Especiais1 - PL-SQL

SQL> PRINT P1

Tpicos_Especiais1 - PL-SQL

Tipo de dado alfanumrico de tamanho varivel com comprimento de at 32.767


bytes. A especificao de tamanho obrigatria para uma varivel declarada
com esse tipo.
O comprimento especificado em bytes e no em caracteres. Isso importante
quando armazenamos valores multibyte.
O conjunto de valores vlidos para armazenamento depende do charset do
banco de dados.
A definio de uma coluna do tipo Varchar2 no banco de dados est limitada a
4.000 bytes.
O tipo Varchar2 possui os seguintes subtipos:
String Possui as mesmas caractersticas do seu tipo bsico. Considerado
um sinnimo.
Varchar Possui as mesmas caractersticas do seu tipo bsico atualmente.
Em verses futuras, se tornar um tipo separado com caractersticas de
comparao diferentes do Varchar2.

D
I
N
O

Exemplo Varchar2
Listagem L03_10 Tipo de dado Varchar2
SQL> DECLARE
2 WVARCHAR2
VARCHAR2(32767);
3 WVARCHAR
VARCHAR(100);
4 BEGIN
5 WVARCHAR2 := 'ABC';
6 WVARCHAR := WVARCHAR2;
7 :P1
:= '*'||WVARCHAR||'*';
8 END;
9 /

Varchar2

Raw
Tipo de dado binrio de tamanho varivel com comprimento de at 32.767.
A especificao de tamanho na declarao de uma varivel com esse tipo
obrigatria. So semelhantes a colunas Varchar2, porm a PL/SQL no
interpreta seu contedo. Uma coluna Raw no banco de dados armazena at
2.000 bytes.
Long Raw
Tipo de dado binrio de tamanho varivel com comprimento de at 32.767.
A especificao de tamanho na declarao de uma varivel com esse tipo
obrigatria. So semelhantes a colunas Long, porm a PL/SQL no
interpreta seu contedo.
Uma coluna Long Raw no banco de dados armazena at 2 GB
(2.147.483.647).
Rowid
Para armazenamento de valores Rowid do banco de dados. Cada tabela
criada no banco de dados possui uma pseudocoluna Rowid que armazena
valores hexadecimais que correspondem ao endereo de cada linha (row).
PL/SQL - 36

Tpicos_Especiais1 - PL-SQL

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Exemplo - Rowid
Listagem L03_12 Tipo de dado - Rowid
SQL> SELECT CD_MAT, ROWID FROM FUNC
2 WHERE ROWNUM < 10;

10.

Um Rowid contm o seguinte


formato:
11.

D
I
N
O

Nchar
Tipo de dado alfanumrico de tamanho fixo com comprimento de at 32.767
bytes. Podemos especificar o tamanho mximo na declarao de uma varivel
com este tipo. Caso isso no seja especificado, o comprimento default de 1
byte.

- Data file (onde o primeiro


arquivo recebe o nmero 1)
- Data block in the data file
12.

- Row in the data block


(onde a primeira ainda recebe
o nmero 0)

9 linhas
selecionadas.
Tpicos_Especiais1
- PL-SQL

Urowid
Armazena um Rowid lgico. Usado para captura do Rowid (lgico) de tabelas
Index Organized.

- Data object number


CD_MAT ROWID
---------- -----------------10 AAAC0zAABAAAE5yAAA
30 AAAC0zAABAAAE5yAAB
50 AAAC0zAABAAAE5yAAC
60 AAAC0zAABAAAE5yAAD
70 AAAC0zAABAAAE5yAAE
90 AAAC0zAABAAAE5yAAF
100 AAAC0zAABAAAE5yAAG
110 AAAC0zAABAAAE5yAAH
120 AAAC0zAABAAAE5yAAI

Tipos de Dados

Nvarchar2
Tipo de dado alfanumrico de tamanho varivel com comprimento de at
32.767 bytes. A especificao de tamanho obrigatria para uma varivel
declarada com este tipo

13.

Boolean
um tipo de dados para variveis (no podem ser definidas como colunas em
uma base de dados). Armazena valores lgicos True e False e a ausncia de
valor Null. No possui tamanho e nem qualquer tipo de parmetro.

PL/SQL - 37

D
I
N
O

Tipo de Dado - Date

PL/SQL - 38

Tpicos_Especiais1 - PL-SQL

Exemplo - Date
SQL> PRINT P1

14.

Listagem L03_13 Tipo de dado - Date


SQL> DECLARE
2 WVARCHAR
VARCHAR2(20);
P1
3 WVARCHAR2
VARCHAR2(20) := '05/02/87';
--------------------------4 WDATE
DATE;
5 WDATE2
DATE;
01/01/87 - 05021987
6 BEGIN
7 WDATE := TO_DATE('01011987', 'DDMMYYYY');
8 WVARCHAR := WDATE;
9 WDATE2 := WVARCHAR2;
10 :P1
:= WVARCHAR||' - '||TO_CHAR(WDATE2, 'DDMMYYYY');
11 END;
O formato default de data para a
12 /

Date
Tipo de dado para armazenamento de valores de data e hora. Os valores
variam de 01 de janeiro de 4712 A.C. at 31 de dezembro de 9999 D.C.
Na definio de uma varivel de tipo data, no especificamos
comprimento.
Podemos operar com variveis tipo data (da mesma forma que com
colunas Date) adicionando ou subtraindo valores inteiros, usando as
funes de SQL para data e subtraindo duas datas para obter o intervalo de
dias.
Quando associamos uma data a uma varivel alfanumrica, ocorre a
converso automtica de tipo, da mesma forma que ocorre quando
associamos uma varivel alfanumrica a uma varivel de data. O layout
default para a converso depende do valor de Nls_Date_Format em vigor
para a sesso.

Tpicos_Especiais1 - PL-SQL

D
I
N
O

PL/SQL - 39

16.

17.

18.

19.

Timestamp
Extenso do tipo Date. Ano, ms e dia assim com hora, minuto, segundo e frao
de segundo. Podemos indicar o nmero de dgitos da parte fracionria do segundo.
Timestamp With Time Zone
Extenso ao tipo Timestamp. Inclui a apresentao da zona de tempo. Onde a zona
de tempo corresponde diferena (entre horas e minutos) entre a hora local e UTC
(hora de Greenwich).
Timestamp With Local Time Zone
Extenso ao tipo Timestamp. A diferena entre esta opo e a anterior que a zona
de tempo no armazenada no banco de dados. O dado, quando armazenado,
normalizado para Dbtimezone e, quando recuperado, visualizado pelo usurio
com a Time Zone da sesso (ocorre uma segunda converso).
Interval Day to Second
Armazena um perodo de tempo em dias, horas, minutos e segundos.
Interval Year to Month
Armazena um perodo de tempo em anos e meses.
Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 41

sesso era dd/mm/rr, uma vez que a


atribuio de uma varivel Varchar2 a
uma varivel Date foi interpretada
corretamente.
PL/SQL - 40

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Tipos de Dados - Data


15.

Procedimento PL/SQL concludo com sucesso.

Exerccio - Datas
Listagem L03_14 Tipo de dado - Datas
SQL> VARIABLE P1 VARCHAR2(1000)
SQL> VARIABLE P2 VARCHAR2(1000)
SQL> DECLARE
2 WTM
TIMESTAMP := CURRENT_TIMESTAMP;
3 WTM_TZ TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
4 WTM_LTZ TIMESTAMP WITH LOCAL TIME ZONE :=
LOCALTIMESTAMP;
5
IDS
INTERVAL DAY TO SECOND := NUMTODSINTERVAL
(1125.3, 'MINUTE');
6
IYM
INTERVAL YEAR TO MONTH := NUMTOYMINTERVAL
(25.3, 'MONTH');
7 BEGIN
8 :P1 := WTM||' | '||WTM_TZ||' | '||WTM_LTZ;
9 :P2 := IDS||' | '||IYM;
10 END;
11 /
Procedimento PL/SQL concludo com sucesso.
PL/SQL - 42

Tpicos_Especiais1 - PL-SQL

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Exemplo

Tipo de Dados - Lob

SQL> PRINT P1
20.

P1 (WTM )
(WTM_TZ )
(WTM_LTZ)
-------------------------------------------------------------------------------22/08/03 20:00:59,328000 | 22/08/03 20:00:59,390000 -03:00 | 22/08/03 20:00:59,4
06000

Na listagem L03_14 podemos observar que o


padro de apresentao para valores de timestamp
j compreende data, hora, minuto, segundo e,
para alguns, a zona de tempo. A varivel Day to
P2 (IDS)
(IYM )
Second armazena um valor que pode conter dia
-------------------------------------------------------------------------------(no data), hora, minuto, sgundo e frao.J a
+00 18:45:18.000000 | +02-01 varivel do tipo Year To Month armazena anos e
meses.
SQL> PRINT P2

PL/SQL - 43

Tpicos_Especiais1 - PL-SQL

D
I
N
O

22.

23.

24.

Tipos de Dados - COMPOSTOS

Blob
O tipo Blob tem a capacidade de armazenar grandes valores binrios. O tamanho mximo no
pode exceder 4 GB. O armazenamento da informao pode ser feito na prpria linha ou em
outro espao especfico.
Clob
O tipo Clob tem a capacidade de armazenar grandes volumes de dados alfanumricos singlebyte. O tamanho mximo no pode exceder 4 GB. O armazenamento da informao pode ser
feito na prpria linha ou em outro espao especfico.
Nclob
O tipo Nclob tem a capacidade de armazenar grandes volumes de dados alfanumricos singlebyte ou multibyte do tipo Nchar. O tamanho mximo no pode exceder 4 GB. O
armazenamento da informao pode ser feito na prpria linha ou em outro espao especfico.
Bfile
O tipo Bfile tem a capacidade de armazenar grandes volumes de dados binrios fora do banco
de dados. O locator de um Bfile inclui um diretrio que especifica o caminho completo do
arquivo no servidor. O arquivo endereado por um Bfile fica fora do banco de dados. No banco
de dados, armazenamos apenas um locator (endereo) para o arquivo. O tamanho do arquivo
no pode exceder 4 GB

Tpicos_Especiais1 - PL-SQL

D
I
N
O

PL/SQL - 45

Tipos de Dados - REFERENCE

So aqueles tipos que armazenam valores


chamados ponteiros, que apontam para outros
itens do programa ou do banco de dados.
Fazem parte deste grupo os tipos Ref Cursor e
Ref <object>, que tambm sero vistos em tpicos
especficos.

Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 47

So aqueles tipos que possuem componentes


internos
que
podem
ser
manuseados
individualmente.
Nesse grupo, se encontram os tipos definidos pelo
usurio: Table, Record e Varray. Sero vistos em
tpicos especficos de Banco de Dados Objeto
Relacional.

PL/SQL - 46

Tpicos_Especiais1 - PL-SQL

D
I
N
O

SUBTIPOS DEFINIDOS PELO


USURIO


PL/SQL - 44

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Tipos de Dados
21.

Lobs
So conjuntos de tipos de dados predefinidos e que armazenam valores
chamados locators, os quais especificam a localizao dos lobs (large
objects) armazenados na linha ou fora dela.
Armazenam valores com comprimento de at 4 GB. Permitem o acesso
randmico a trechos do dado.
So diferentes dos tipos Long e Long Raw nos seguintes aspectos:
- Podem ser atributos (exceto Nclob) de tipos objeto, Longs no podem.
- O comprimento mximo de 4 GB e o dos Longs 2 GB.
- Lobs suportam acesso randmico, enquanto Longs suportam somente
acesso seqencial.
- Pode-se declarar diversas colunas Lob em uma mesma tabela; Longs
no so permitidos (somente 1).

Cada tipo de PL/SQL define um conjunto de valores vlidos e um conjunto de


operaes aplicveis s variveis declaradas com aquele tipo. Subtipos
declaram o mesmo conjunto de operaes, mas apenas um subconjunto de
seus valores.

Listagem L03_15 Subtipo


SQL> DECLARE
2 SUBTYPE DATA IS DATE NOT NULL;
3 SUBTYPE TEXTO IS VARCHAR2;
4 SUBTYPE CODIGO IS NUMBER;
SQL> PRINT P1
5 DT_HOJE
DATA := SYSDATE;
6 DESCRICAO
TEXTO(100);
7 CD_MAT
CODIGO(5);
P1
8 BEGIN
------------------------------------------------9 DT_HOJE := SYSDATE;
TESTE DE SUBTIPO-12345-04/04/04
10 DESCRICAO := 'TESTE DE SUBTIPO';
11 CD_MAT := 12345;
12 :P1
:= DESCRICAO||'-'||CD_MAT||'-'||DT_HOJE;
13 END;
14 /
Tpicos_Especiais1
- PL-SQL
PL/SQL - 48
Procedimento
PL/SQL
concludo com sucesso.

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Subtipos - Exemplos
Podemos definir subtipos de um tipo bsico e, posteriormente, uma
varivel com aquele tipo. As restries estabelecidas para o subtipo devem
ser respeitadas pelo item (veja Listagem L03_16).
Listagem 3.16 Subtipo
SQL> DECLARE
DECLARE
2 SUBTYPE DATA IS DATE NOT NULL;
*
3 SUBTYPE TEXTO IS VARCHAR2(100);
ERRO na linha 1:
4 SUBTYPE CODIGO IS NUMBER(5);
ORA-06502:
PL/SQL:
5 DT_HOJE
DATA := SYSDATE;
erro: preciso de nmero
TEXTO(100);
6 DESCRICAO
grande demais numrico
7 CD_MAT
CODIGO(5);
ou de valor
8 BEGIN
ORA-06512: em line 11
9 DT_HOJE := SYSDATE;
10 DESCRICAO := 'TESTE DE SUBTIPO';
11 CD_MAT := 123456;
12 :P1
:= DESCRICAO||'-'||CD_MAT||'-'||DT_HOJE;
13 END;
14 /

D
I
N
O
B_Integer

Blob

BInteger

Char

CLOB

Date

Long

Number

P_Integer

Blob
Char

D
I
N
O

Raw

Urowid

S
S

Date

Long

P_Integer

S
S

S
S

S
S

PL/SQL - 51

Tpicos_Especiais1 - PL-SQL

D
I
N
O

S
S

Urowid

Number

Raw

PL/SQL - 50

A parte declarativa de um bloco de PL/SQL precede a parte


executiva e deve conter todas as variveis necessrias
execuo do bloco. A PL/SQL no declara, implicitamente,
variveis como ocorre em outras linguagens.
Variveis e Constantes
 Podemos declarar variveis e constantes na parte declarativa
de qualquer bloco, subprograma ou pacote.


PL/SQL - 52

Tpicos_Especiais1 - PL-SQL

D
I
N
O

DECLARAES

Exemplos Converso Implcita


Listagem L03_17 Converso implcita
SQL> PRINT P1
SQL> DECLARE
2 DT_HOJE DATE := SYSDATE;
3 DESCRICAO VARCHAR2(100) := '123';
P1
4 CD_MAT
NUMBER(5) := 0;
---------------------------------5 BEGIN
6 CD_MAT := DESCRICAO;
04/04/04-123-04/09/04
7 DESCRICAO := DT_HOJE;
8 :P1
:= DESCRICAO||'-'||CD_MAT||'-'||DT_HOJE;
9 END;
Na Listagem L03_17, as
atribuies no resultaram em
10 /
erros, pois os valores eram
compatveis. Qual o resultado
Procedimento PL/SQL concludo com sucesso.
obtido se a varivel Descrio
fosse inicializada com o valor
abc em vez de 123?

Varchar2

CLOB

Varchar2

Quando atribumos uma varivel de um determinado tipo a


uma outra varivel de outro tipo, ocorre uma converso
implcita de tipo de dado.
A converso implcita possvel em PL/SQL, mas no
recomendada, porque pode dificultar a performance e,
ainda, sofrer modificaes de uma verso para outra do
software.
A tabela a seguir indica o que possvel converter:

Tpicos_Especiais1 - PL-SQL

Tabela 3.01 Converso Implcita de Tipo de Dado

Tipo

PL/SQL - 49

Tpicos_Especiais1 - PL-SQL

CONVERSO IMPLCITA

Exemplos Declaraes
Listagem L03_18 Declarao de varivel
SQL> DECLARE
2 ZERO
CONSTANT NUMBER(1) DEFAULT 0;
3 NULO
CONSTANT NUMBER(1) := 0;
4 V_COD
NUMBER(4)
:= 0;
5 V_TEXTO VARCHAR2(100);
6 V_DATA DATE NOT NULL := SYSDATE;
7 BEGIN
8 V_COD := ZERO;
9 END;
10 /

Declarou-se duas constantes


informando imediatamente um
valor inicial.
As variveis podem receber ou no
valor inicial.
Caso a declarao da varivel
receba a clusula Not Null, a
atribuio de valor inicial se torna
obrigatria.

Procedimento PL/SQL concludo com sucesso.

Quando no informamos valor


inicial para uma varivel, seu valor
considerado desconhecido, ou
seja, Null

<variveis> <tipo de dado> [Not Null] [:= <valor Inicial] / [Default]


<constante> Constant <tipo de dado> [:= <valor inicial] / [Default]

Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 53

PL/SQL - 54

Tpicos_Especiais1 - PL-SQL

UNIVEM

D
I
N
O

PL/SQL

INTEGRAO COM O ORACLE




As variveis usadas pela PL/SQL podem ter os mesmos


tipos existentes no banco de dados, tanto os tipos
predefinidos quanto aqueles definidos pelos usurios.
Os atributos %TYPE e %ROWTYPE permitem a
integrao com o dicionrio de dados Oracle, pois
podemos declarar uma varivel com o mesmo tipo de
uma coluna definida em uma tabela do banco de dados.
Essa facilidade produz independncia do dado, reduz os
custos de manuteno e permite que os programas se
adaptem s mudanas ocorridas no banco de dados.




PL/SQL - 55

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Exemplo

Listagem L03_20 Declarao de varivel


SQL> VARIABLE MSG VARCHAR2(200) - - Varivel bind
SQL> DECLARE
2 WNUM
NUMBER
:= 12;
3 WCHAR
VARCHAR2(20) := 'WCHAR EXTERNA';
4 WUNICO
NUMBER
:= 5;
5 BEGIN
6 DECLARE
7
WNUM
NUMBER
:= 10;
8
WCHAR
VARCHAR2(20) := 'WCHAR INTERNA';
9
WTOTAL
NUMBER;
10 BEGIN
11 WTOTAL := WNUM + WUNICO;
12 :MSG := WCHAR||'-'||WTOTAL;
13 END;
14 END;
15 /

Procedimento
PL/SQL
concludo com sucesso.
Tpicos_Especiais1
- PL-SQL

Dino Spoto

MSG
-----------------------------WCHAR INTERNA-15

PL/SQL - 59

O escopo de uma varivel a regio (bloco, subprograma


ou pacote) onde a referncia a ela vlida. Dentro de um
mesmo escopo, todas as variveis devem ter nomes
nicos.
Uma varivel declarada em um bloco visvel nesse e em
todos os blocos subordinados a ele. Se uma varivel
redefinida em um sub-bloco, ambas so acessveis. No
sub-bloco, porm, qualquer referncia no qualificada far
acesso varivel de nvel mais interno.
Uma varivel declarada em um bloco deixa de existir
quando o bloco termina.

PL/SQL - 58

Tpicos_Especiais1 - PL-SQL

D
I
N
O

SQL> PRINT MSG

PL/SQL - 56

ESCOPO DE VISIBILIDADE


PL/SQL - 57

Exemplo - Visibilidade

O atributo %Type copia o tipo de dado de uma varivel


ou coluna do banco de dados.
Podemos, desta forma, declarar outra varivel baseada na
definio de uma coluna do banco de dados ou baseada na
definio de outra varivel.
Isso particularmente usado quando declaramos variveis
que venham a receber informaes de colunas do banco de
dados.
A utilizao de %Type favorece a independncia de dados,
uma vez que no precisamos saber exatamente o tipo de
dado da varivel a ser declarada e, caso haja
modificaes no objeto original, a modificao da varivel
Cpia feita automaticamente.
Tpicos_Especiais1 - PL-SQL

Listagem 3.19 Declarao de varivel


SQL> DECLARE
2 V_COD
NUMBER(4)
:= 0;
3 V_DATA
DATE
NOT NULL := SYSDATE;
4 -5 WCOD
V_COD%TYPE NOT NULL := 1234;
6 WDATA
V_DATA%TYPE
:= SYSDATE;
7 -8 WDEP
DEPTO.CD_DEPTO%TYPE;
9 BEGIN
WDATA := NULL;
10 WDEP := NULL;
*
11 V_COD := 1;
ERRO na linha 12:
12 WDATA := NULL;
ORA-06550: linha 12, coluna 14:
PLS-00382: a expresso do tipo incorreto
13 END;
ORA-06550: linha 12, coluna 3:
14 /
PL/SQL: Statement ignored
Tpicos_Especiais1 - PL-SQL

D
I
N
O

%TYPE

Tupla da Tabela

Campo da Tabela

D
I
N
O

D
I
N
O

Exemplos - Visibilidade
Na listagem L03_21 a seguir, fizemos referncia varivel wtotal no bloco principal e
recebemos um erro indicando que neste bloco no havia sido declarada nenhuma
varivel wtotal. Esta varivel deixou de existir quando passamos pelo End ou subbloco.
Listagem L03_21 Declarao de varivel
SQL> DECLARE
2 WNUM
NUMBER := 12;
3 WCHAR
VARCHAR2(20) := 'WCHAR EXTERNA';
4 WUNICO
NUMBER
:= 5;
WTOTAL := WTOTAL + 1;
5 BEGIN
*
6 DECLARE
7
WNUM
NUMBER
:= 10;
ERRO na linha 14:
8
WCHAR
VARCHAR2(20) := 'WCHAR INTERNA';
ORA-06550: linha 14, coluna 3:
9
WTOTAL
NUMBER;
PLS-00201: o identificador 'WTOTAL'
10 BEGIN
deve ser declarado
11 WTOTAL := WNUM + WUNICO;
ORA-06550: linha 14, coluna 3:
12 :MSG := WCHAR||'-'||WTOTAL;
PL/SQL: Statement ignored
13 END; - - Acaba o escopo da varivel WTOTAL
14 WTOTAL := WTOTAL + 1;
15 Tpicos_Especiais1
END;
- PL-SQL
PL/SQL - 60
16 /

10

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

QUALIFICAO
Para controlarmos a visibilidade e termos acesso s variveis
dos blocos de nvel superior, devemos qualificar qualquer
referncia s variveis externas nos blocos internos.
Listagem L03_22 Qualificao

RESTRIES

SQL> BEGIN
2 <<EXT>>
3 DECLARE
4 WCOD
NUMBER := 1;
5 BEGIN
6 DECLARE
7
WCOD
NUMBER:= 5;
8 BEGIN
9
IF WCOD <> EXT.WCOD THEN
10
:MSG := 'DIFERENTE';
11
ELSE
12
:MSG := 'IGUAL';
13
END IF;
14 END;
15 END;
16 END;
17 /

SQL> PRINT MSG

MSG
---------------------------DIFERENTE

Tpicos_Especiais1 - PL-SQL

Procedimento PL/SQL concludo com sucesso.

D
I
N
O

PL/SQL no admite referncias a variveis


no declaradas, mesmo que elas venham a
ser declaradas posteriormente. Para que
utilizemos uma varivel (mesmo sendo na
declarao de outra), devemos ter efetuado
sua declarao primeiro.
Listagem L03_23 Referncia a varivel
SQL> DECLARE
2 WCOD
NUMBER := WVAL + 1;
3 WVAL
NUMBER := 0;
4 BEGIN
5 WCOD := 1;
6 END;
7 /


D
I
N
O

Atribuio





ORA-06550: linha 2, coluna 30:


PLS-00320: a declarao do tipo desta
ORA-06550: linha 2, coluna 20:
PL/SQL: Item ignored
ORA-06550: linha 5, coluna 3:
PLS-00320: a declarao do tipo desta
ORA-06550: linha 5, coluna 3:

A atribuio de valor a uma varivel feita com a notao :=.


As variveis e constantes so criadas e recebem seu valor
inicial cada vez que for iniciado o bloco no qual esto
declaradas.
Na ausncia de atribuio de valor inicial, a varivel
considerada sem valor ou Null.
muito importante, portanto, que as variveis sejam
inicializadas antes do uso.

PL/SQL - 62

Exemplo Variveis booleanas


Listagem L03_25 Varivel booleana
SQL> DECLARE
2 WB1
BOOLEAN;
3 WB2
BOOLEAN;
4 WB3
BOOLEAN;
5 BEGIN
6 WB1 := 1;
7 WB2 := 'TRUE';
8 WB3 := (5 > 3);
9 END;
10 /

WB1 := 1;
*
ERRO na linha 6:
ORA-06550: linha 6, coluna 10:
PLS-00382: a expresso do tipo incorreto
ORA-06550: linha 6, coluna 3:
PL/SQL: Statement ignored
ORA-06550: linha 7, coluna 10:
PLS-00382: a expresso do tipo incorreto
ORA-06550: linha 7, coluna 3:
PL/SQL: Statement ignored

PL/SQL - 64

Tpicos_Especiais1 - PL-SQL

D
I
N
O

COMANDOS BSICOS

*
ERRO na linha 2:

Tpicos_Especiais1 - PL-SQL

Listagem L03_24 Declarao de varivel


SQL> DECLARE
No podemos
2 A, B, C
NUMBER;
declarar, de uma
3 BEGIN
vez, diversas
4 A:= 0;
variveis
5 END;
6 /
referentes a um
A, B, C
NUMBER;
mesmo tipo.
*
ERRO na linha 2:
ORA-06550: linha 2, coluna 4:
PLS-00103: Encontrado o smbolo "," quando um dos seguintes smbolos era
esperado:
constant exception <an identifier>
<a double-quoted
delimited-identifier> table LONG_ double ref
Tpicos_Especiais1 - PL-SQL
PL/SQL - 63

NUMBER := WVAL + 1;

PL/SQL: Statement ignored


PL/SQL - 61

Exemplo Declarao de Variveis

D
I
N
O

WCOD

Exemplo de Atribuio
Listagem L03_26 Atribuio
SQL> VARIABLE RETORNO NUMBER
SQL> DECLARE
2 V1
NUMBER := 1;
3 V2
NUMBER;
4 BEGIN
5 V1 := V1 + V2;
6 :RETORNO := V1 * 2;
7 END;
8 /

O resultado do
programa
apresentado pela
Listagem L03_26
foi Null,

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT RETORNO
RETORNO
---------Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 65

PL/SQL - 66

Tpicos_Especiais1 - PL-SQL

11

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Comandos

IF

Comandos de Desvios de Controle (deciso)


Comandos SQL
- Comandos de Laos

O comando IF verifica uma condio, e dependendo


do resultado realiza uma ou outra ao. Permite a
execuo condicional de uma determinada ao.
Existem trs sintaxes vlidas de IF em PL/SQL.

Sintaxe 3.03 IF
IF (CONDIO) THEN [CORPO DE COMANDOS] END
IF;
IF (CONDIO) THEN [CORPO DE COMANDOS]
ELSE/[ELSEIF] [CORPO DE COMANDOS DO ELSE]
END IF;

PL/SQL - 67

Tpicos_Especiais1 - PL-SQL

D
I
N
O

D
I
N
O

Exemplos
If Var1 > 10 then
Var2 = Var1 + 20 ;
End If ;
If Not ( Var1 < = 10 )
then
Var2 = Var1 + 20 ;
End If ;

If Var1 > 10 then


If Var2 < Var1
then
Var2 =
Var1 + 20 ;
End If ;
End If ;

If Var1 > 10 then


Var2 = Var1 + 20 ;
ElseIf Var1 between 7 and 8 then
Var2 = 2 * Var1 ;
Else
Var2 = Var1 * Var1;
End If;

D
I
N
O

If Var1 > 10 then


Var2 = Var1 + 20 ;
Else
If Var1 between 7 and 8 then
Var2 = 2 * Var1;
Else
Var2 = Var1 * Var1 ;
End If ;
End If ;
PL/SQL - 69

Procedimento PL/SQL concludo com sucesso.


SQL> PRINT MSG
MSG
-----------------------------------------------Valor menor que zero

PL/SQL - 70

SELECT INTO
Dentro da PL/SQL, o comando Select ganha a clusula Into
a fim de obter dados da linha lida para variveis do
programa. Desta forma, poderemos manusear os dados
obtidos.
A clusula Into segue imediatamente a lista de variveis da
clusula Select e precede a clusula From.
Devemos informar uma rea de recepo capaz de
comportar todos os dados lidos; caso contrrio, receberemos
erro na execuo.
O comando Select Into somente faz leitura de uma linha.
Caso venhamos a selecionar mais de uma linha usando este
comando, ocorrer um erro (To Many Rows) indicando o
excesso. A leitura de diversas linhas feita com o uso do
cursor.

begin
update FUNC set
VL_SAL=240
where VL_SAL<200;
if SQL%FOUND then
commit;
else
dbms_output.put_line('Valores nao Encontrados');
end if;
end;
/

Dino Spoto

Entre o valor para val: -5


antigo 2: VALOR
NUMBER := &VAL;
novo 2: VALOR
NUMBER := -5;

Tpicos_Especiais1 - PL-SQL

D
I
N
O

IF - %FOUND

Tpicos_Especiais1 - PL-SQL

Exerccio - IF
Listagem L03_27 IF
SQL> VARIABLE MSG VARCHAR2(100)
SQL> DECLARE
2 VALOR
NUMBER := &VAL;
3 BEGIN
4 IF VALOR > 0 THEN
5
:MSG := 'Valor maior que zero';
6 ELSIF VALOR = 0 THEN
7
:MSG := 'Valor igual a zero';
8 ELSE
9
:MSG := 'Valor menor que zero';
10 END IF;
11 END;
12 /

If Var1 > 10 then


Var2 = Var1 + 20 ;
Else
Var2 = Var1 *
Var1 ;
End If ;

Tpicos_Especiais1 - PL-SQL

PL/SQL - 68

Tpicos_Especiais1 - PL-SQL

PL/SQL - 71

PL/SQL - 72

Tpicos_Especiais1 - PL-SQL

12

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Exemplo Select Into


Listagem L03_28 Select Into
SQL> DECLARE
2 SALARIO NUMBER;
3 ENDROW
ROWID;
4 V_COD
FUNC.CD_MAT%TYPE := 150;
5 BEGIN
6 SELECT VL_SAL, ROWID INTO SALARIO, ENDROW
7 FROM FUNC
8 WHERE CD_MAT =V_COD;
9 :MSG := Salrio Ant = ||SALARIO|| - ;
10 IF SALARIO < 2000 THEN
11
SALARIO := SALARIO * 1.3;
12 ELSIF SALARIO IS NULL THEN
13
SALARIO := 1500;
14 ELSE
15
SALARIO := SALARIO * 1.15;
16 END IF;
17 UPDATE FUNC SET VL_SAL = SALARIO
18 WHERE ROWID = ENDROW;
19 :MSG := :MSG|| Salrio Atual = '||SALARIO;
20 COMMIT;
21 END;
Tpicos_Especiais1 - PL-SQL
22 /

D
I
N
O

Procedimento
PL/SQL
concludo com sucesso.

SQL> PRINT MSG

MSG
-----------------------------Salrio Ant =
Salrio Atual =

2700,0
2907,2

PL/SQL - 73

O comando Goto efetua um desvio incondicional


para um Label.
O Label deve ser nico dentro do escopo e deve
preceder um comando ou um bloco PL/SQL. Alm
de ser usado para desvios, um Label tambm serve
como qualificador de variveis, como foi mostrado
no item Qualificao do tpico Declaraes.
Veremos no prximo tpico que a PL/SQL possui
diversas estruturas de iterao e que raramente
teremos necessidade de utilizar um comando Goto.

PL/SQL - 74

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Exemplo - Goto
Listagem L03_29 Goto
SQL> DECLARE
2 CONTA
NUMBER := 0;
3 BEGIN
4 <<INICIO>>
5 CONTA := CONTA + 1;
6 IF CONTA < 5 THEN
7
GOTO INICIO;
8 END IF;
9 END;
10 /

GOTO

Restries - Goto
Existem algumas situaes em que o comando Goto no pode
ser usado:
- - Desvio para dentro de um IF ou Loop (GoTo Prximo_IF).
- - Desvio para dentro de um sub-bloco (GoTo subbloco).
- - Desvio para fora de um subprograma (GoTo Para_Fora).
- Desvio para dentro de um bloco a partir da rea de exceo
(GoTo Incio).

Na Listagem L03_29,
Label
aparece
um
(incio) que deve ser
codificado entre <<e>>.
No comando Goto, os
smbolos (<<e>>) no
devem ser usados.

Procedimento PL/SQL concludo com sucesso.

PL/SQL - 75

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Exerccio restries goto


Listagem L03_30 GoTo
SQL> DECLARE
2 PROCEDURE DESVIO IS
3 BEGIN
4
GOTO PARA_FORA;
5 END;
6 BEGIN
7 <<INICIO>>
8 IF TRUE THEN
9
GOTO PROXIMO_IF;
10 END IF;
11 IF FALSE THEN
12
<<PROXIMO_IF>>
13
GOTO SUBBLOCO;
14 END IF;
15 <<PARA_FORA>>
16 BEGIN
17
<<SUBBLOCO>>
18
NULL;
19 END;
20 EXCEPTION
21 WHEN OTHERS THEN
22
GOTO INICIO;
23 END;
24 / Tpicos_Especiais1 - PL-SQL

Dino Spoto

D
I
N
O

NULL


GOTO PROXIMO_IF;
*
ERRO na linha 9:
ORA-06550: linha 9, coluna 7:
PLS-00375: instruo GOTO invlida;
este GOTO no pode ser
ramificado para o
label 'PROXIMO_IF'
ORA-06550: linha 11, coluna 13:
PL/SQL: Statement ignored
ORA-06550: linha 4, coluna 5:
PLS-00375: instruo GOTO invlida;
este GOTO no pode ser
ramificado para o
label 'PARA_FORA'
ORA-06550: linha 6, coluna 1:
PL/SQL: Statement ignored
ORA-06550: linha 22, coluna 5:
PLS-00375: instruo GOTO invlida;
este GOTO no pode ser
ramificado para o
label 'INICIO'
ORA-06550: linha 22, coluna 5:
PL/SQL: Statement ignored

PL/SQL - 76

Tpicos_Especiais1 - PL-SQL

Este comando, explicitamente, indica que no h ao a ser feita. Serve para compor
certas situaes em que um comando exigido, mas nenhuma ao , realmente,
necessria.

Listagem L03_31 Null


SQL> DECLARE
2 VEZ
NUMBER := 1;
3 BEGIN
4 <<INICIO>>
5 VEZ := VEZ + 1;
6 IF VEZ > 10 THEN
7
GOTO FIM;
8 ELSE
9
VEZ := VEZ**2 - 1;
10 END IF;
11 GOTO INICIO;
12 <<FIM>>
13 NULL;
14 END;
15 /

J vimos anteriormente que todo


Label deve preceder um comando
ou um bloco de PL/SQL. No
exemplo da listagem L03_31, a
presena do comando Null teve a
finalidade de validar o
posiocionamento do Label Fim.
Caso o comando no fosse
acionado, no poderamos
programar o Fim antes de End
(no um comando), que , na
verdade, fim de bloco.

Procedimento PL/SQL concludo com sucesso.


PL/SQL - 77

PL/SQL - 78

Tpicos_Especiais1 - PL-SQL

13

UNIVEM

D
I
N
O

D
I
N
O

Estruturas de controle




LOOP
FOR
WHILE

PL/SQL - 79

Tpicos_Especiais1 - PL-SQL

Uso de Procedure L03_101-107

D
I
N
O

-- Criar uma procedure INSS que calcula o desconto do salrio A entrada de


parmetros Sal (IN) e saida Valor (IN OUT)
DECLARE
VINSS
NUMBER;
SALARIO
NUMBER := 3000;
PROCEDURE INSS(SAL IN NUMBER, VALOR IN OUT NUMBER) IS
BEGIN
VALOR := SAL * 0.08;
IF VALOR >= 1000 THEN
VALOR := 1000;
END IF;
END INSS;
BEGIN
INSS(3000, VINSS);
INSS(SALARIO, VINSS);
END;
/
Procedimento PL/SQL concludo com sucesso.

D
I
N
O

condition - uma varivel booleana ou uma expresso


que evolui para (TRUE, FALSE ou NULL)
Exerccio: bloco que insira 10 linhas numa tabela de
linhas de encomenda, para a encomenda 0017
PL/SQL - 82

Tpicos_Especiais1 - PL-SQL

D
I
N
O

DECLARE

Estruturas de controlo

FOR counter IN [REVERSE]


lower_bound . . uper_bound LOOP
statement1;
statement2;
...
END LOOP;

v_num_enc itens.no_enc%TYPE := 134;

Contador number(2) := 1;
BEGIN
LOOP
INSERT INTO itens( no_enc, linha )
values(v_num_enc, contador );
Contador:= contador+1;
Exit when contador >10;
End loop;

WHILE condition LOOP


statement1;
statement2;
...
END LOOP;

END;

Dino Spoto

Estruturas de controle

statement1;

EXIT [WHEN condition];


END LOOP;

Exemplo de ciclo

Tpicos_Especiais1 - PL-SQL

PL/SQL - 80

LOOP

PL/SQL - 81

Tpicos_Especiais1 - PL-SQL

CURSOR TYPE (L03_82)


SET LINESIZE 70
DECLARE
TYPE TREG IS RECORD (NOME
VARCHAR2(30),
MAT
NUMBER NOT NULL := 0,
DEP
DEPTO.CD_DEPTO%TYPE);
VREG
TREG;
CURSOR C1 IS SELECT NM_FUNC||' '||NM_SOBRENOME, CD_MAT,
CD_DEPTO FROM FUNC;
BEGIN
OPEN C1;
:MSG := '';
LOOP
FETCH C1 INTO VREG;
EXIT WHEN C1%NOTFOUND;
IF VREG.MAT > 200 AND VREG.DEP IN ('D11', 'E11') THEN
:MSG := :MSG || VREG.NOME ||'; ';
END IF;
END LOOP;
Tpicos_Especiais1 - PL-SQL
END;
/

Ciclos


D
I
N
O

PL/SQL

PL/SQL - 83

PL/SQL - 84

Tpicos_Especiais1 - PL-SQL

14

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

FOR - IN REVERSE
O comando FOR permite que controle o nmero de
vezes que as aoes foram repetidas e define quando
termina essa repetio.
FOR variavel_de_controle IN REVERSE ( menor_valor
.. maior_valor );
declare
x number;
begin
For x in 1..10
loop
dbms_output.put_line(x);
end loop;
end;

O comando WHILE permite que se verifica uma


condio a cada incio de execuo de um grupo de
aes.
WHILE condicao
declare
x number := 0;
begin
while x < 10
loop
dbms_output.put_line(x);
x := x + 1;
end loop;
end;

D
I
N
O

PL/SQL - 85

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Exemplo comando de saida


declare
v_sal number(10,2);
v_ename varchar2(20);
begin
select ename,sal into v_ename,v_sal from emp
where empno = 7369;
if v_sal < 5000 then
dbms_output.put_line('O '||v_ename||' recebe um salrio razovel !!!');
elsif v_sal = 5000 then
dbms_output.put_line('O '||v_ename||' recebe um bom salrio!!!');
else
dbms_output.put_line('O '||v_ename||' recebe um salrio timo !!!');
end if;
end;
/

Listagem: L03_73 a 79
DECLARE
TYPE TTABLE
IS TABLE
OF VARCHAR2(20)
INDEX BY BINARY_INTEGER;
TTEXTO
TTABLE;
I
NUMBER := 0;
CURSOR C1
IS SELECT NM_FUNC FROM FUNC;
BEGIN
FOR RC1 IN C1 LOOP
I := I + 1;
TTEXTO(I) := RC1.NM_FUNC;
END LOOP;
:MSG := 'Quantidade de elementos lidos : '||TTEXTO.COUNT;
END;
/
PL/SQL - 87

Tpicos_Especiais1 - PL-SQL

Tipos de Blocos

Annimo
[DECLARE]

STORED PROCEDURE
PROCEDURE
FUNCTION
TRIGGERS

PL/SQL - 88

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Parte2

PL/SQL - 86

Tpicos_Especiais1 - PL-SQL

D
I
N
O

FOR - TYPE

While - condio

BEGIN
--statements
[EXCEPTION]
END;

Procedimento
PROCEDURE name
IS

Funo

[EXCEPTION]

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

END;

END;

BEGIN
--statements

Um bloco dentro de outro funciona como uma instruo (composta)


Nvel de encaixe arbitrrio
Funes SQL disponveis em PL/SQL excepto as de agregao
Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 89

PL/SQL - 90

Tpicos_Especiais1 - PL-SQL

15

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Criando Procedures

Argumento  o nome de uma varivel PL/SQL passada para a


procedure

CREATE OR REPLACE PROCEDURE


nome_da_procedure( argumento mode
tipo_do_argumento) IS/AS
bloco_PL/SQL;


Mode identifica o tipo de argumento ( IN/OUT/IN OUT)


Tipo do argumento  tipo do dado ( datatype)

Obs.: A clusula REPLACE utilizada


quando a procedure j existe. Nunca utilize a
clusula DECLARE no incio do bloco
PL/SQL.

D
I
N
O

Bloco PL/SQL  o corpo da procedure que define as aes que


sero executadas quando a procedure for executada
IS ou AS  essas clusulas so equivalentes, pode-se utilizar tanto
uma quanto outra

PL/SQL - 91

Tpicos_Especiais1 - PL-SQL

PL/SQL - 92

Tpicos_Especiais1 - PL-SQL

D
I
N
O

ARGUMENTOS

Criando Procedures

Exemplo : Criando uma


procedure com o argumento IN.
Armazene todas as informaes de um novo empregado:
CREATE OR REPLACE PROCEDURE novos_empregados
( v_emp_no
IN
emp.empno%TYPE,
v_emp_name
IN
emp.ename%TYPE,
v_emp_job
IN
emp.job%TYPE,
v_mgr_no
IN
emp.mgr%TYPE,
v_emp_hiredate
IN
emp.hiredate%TYPE,
v_emp_sal
IN
emp.sal%TYPE,
v_emp_comm
IN
emp.comm%TYPE,
v_dept_no
IN
emp.deptno%TYPE)
IS
BEGIN
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm,
deptno )
VALUES ( v_emp_no, v_emp_name, v_emp_job, v_mgr_no,
v_emp_hiredate, v_emp_sal, v_emp_comm, v_dept_no);
COMMIT WORK;
END novos_empregados;

Somente um dos trs modos pode ser escolhido


para cada argumento (IN,OUT,IN OUT).
IN argumento Passa o valor do ambiente
chamador para a procedure(default).
OUT argumento  Retorna um valor da
procedure para o ambiente chamador.
IN OUT argumento  Passa um valor do
ambiente chamador para a procedure, e a
procedure retorna um valor para o ambiente
chamador.
PL/SQL - 93

Tpicos_Especiais1 - PL-SQL

D
I
N
O

D
I
N
O

Out
Retornando um valor da procedure para o ambiente chamador
utilizando o argumento OUT
Devolver informaes sobre um funcionrio:
CREATE OR REPLACE PROCEDURE pesquisa_empregado
( v_emp_no
IN
emp.empno%TYPE,
v_emp_name
OUT
emp.ename%TYPE,
v_emp_sal
OUT
emp.sal%TYPE,
v_emp_comm
OUT
emp.comm%TYPE)
IS
BEGIN
SELECT ename, sal, comm
INTO v_emp_name, v_emp_sal, v_emp_comm
FROM emp
WHERE empno = v_emp_no;
END pesquisa_empregado;
Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 94

Tpicos_Especiais1 - PL-SQL

IN OUT
Exemplo: Criando uma procedure com um argumento IN/OUT.
Transforme a seqncia de sete dgitos de um nmero para o formato
de nmero de telefone.
CREATE OR REPLACE PROCEDURE formata_telefone
(v_phone_no IN OUT varchar2)
IS
BEGIN
v_phone_no := SUBSTR (v_phone_no,1,3) || - ||
SUBSTR (v_phone_no,4,4);
END formata_telefone;

PL/SQL - 95

PL/SQL - 96

Tpicos_Especiais1 - PL-SQL

16

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Criando Funes
Sintaxe:

Retornar um valor de uma funo para o ambiente chamador


utilizando a clusula RETURN
Exemplo : Criando uma funo.

CREATE OR REPLACE FUNCTION


nome_da_funcao
( argumento mode tipo_do_argumento)
RETURN
tipo_do_dado
IS/AS
bloco_pl/sql

CREATE OR REPLACE FUNCTION pesquisa_salario


( v_emp_no IN s_emp.empno%TYPE)
RETURN
NUMBER
IS
v_emp_sal emp.sal%TYPE:= 0;
BEGIN
SELECT sal INTO v_emp_sal
FROM emp
WHERE empno = v_emp_no;
RETURN (v_emp_sal);
ENDTpicos_Especiais1
pesquisa_salario;
- PL-SQL

RETURN  Identifica o tipo do dado que a funo ir


retornar.
PL/SQL - 97

Tpicos_Especiais1 - PL-SQL

D
I
N
O

D
I
N
O

Exibindo resultados SERVEROUTPUT


1. Habilite a opo SERVEROUTPUT
SET serveroutput ON
2. Prepare o texto da mensagem de sada com
a procedure PUT
DBMS_OUTPUT.PUT(texto);
3. Exiba as mensagem de sada na tela com a
procedure NEW_LINE
DBMS_OUTPUT.NEW_LINE;

PL/SQL - 99

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 98

Exibindo uma Funo


CREATE OR REPLACE FUNCTION average_sal
(v_n IN NUMBER)
RETURN NUMBER
IS
CURSOR emp_cursor IS
SELECT empno, sal
FROM emp
ORDER BY sal DESC;
v_total_sal emp.sal%type := 0;
v_counter NUMBER;
BEGIN
FOR r_emp IN emp_cursor LOOP
EXIT WHEN emp_cursor%ROWCOUNT > v_n;
v_total_sal := v_total_sal + r_emp.sal;
v_counter := emp_cursor%ROWCOUNT;
DBMS_OUTPUT.PUT (Loop = );
DBMS_OUTPUT.PUT (v_counter);
DBMS_OUTPUT.PUT (; Empno = );
DBMS_OUTPUT.PUT (r_emp.empno);
DBMS_OUTPUT.NEW_LINE;
END LOOP;
RETURN (v_total_sal/v_counter);
END average_sal;

Exibindo a Funo:

SQL> SET verify OFF


SQL> SET serveroutput ON
SQL> DEFINE p_n = 3
SQL> VARIABLE g_average
NUMBER
SQL> EXECUTE :g_average :=
average_sal (&p_n);

PL/SQL - 100

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Exception
declare
v_nome varchar2(30);
v_sal number(8,2);
begin
select NM_FUNC, VL_SAL
INTO v_nome, v_sal
From func
where CD_MAT=122;
dbms_output.put_line(v_nome||' '||v_sal);
exception
when no_data_found then
dbms_output.put_line('Funcionario nao Cadastrado');
end;
/

Criando uma funo

Exception - %TYPE
declare
v_nome FUNC.NM_FUNC%TYPE;
v_sal FUNC.VL_SAL%TYPE;
begin
select NM_FUNC, VL_SAL
INTO v_nome, v_sal
From FUNC;
dbms_output.put_line(v_nome||' '||v_sal);
exception
when no_data_found then
dbms_output.put_line('Funcionario nao Cadastrado');
when too_many_rows then
dbms_output.put_line('Retornou muitos registros');
end;
/

PL/SQL - 101

PL/SQL - 102

Tpicos_Especiais1 - PL-SQL

17

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Procedimentos

Funes

Sintaxe:
CREATE [OR REPLACE] PROCEDURE procedure_name
(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2, ...)
IS | AS

Criando Funes
Para criar uma funo ou procedure depender
de que forma ser chamada e de que forma
espera-se os valores.
Criar uma nova funo com o comando
CREATE FUNCTION, a qual declara uma
lista de argumentos, declara o argumento que
ir retornar e define as aes que sero
realizadas utilizando blocos PL/SQL.

PL/SQL Block

Exemplo: SQL> CREATE OR REPLACE PROCEDURE raise_salary


2
3
4
5
6
7
8
9

(v_id in emp.empno%TYPE)
IS
BEGIN
UPDATE emp
SET sal = sal * 1.1
WHERE empno = v_id;
END raise_salary;
/

Executar:
SQL> EXECUTE raise_salary (7369)

PL/SQL> raise_salary(7369)
PL/SQL - 103

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Sintaxe:

Exemplo:

CREATE [OR REPLACE] FUNCTION function_name


(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2,
)
RETURN tipo do dado
IS | AS
PL/SQL Block

PL/SQL - 105

Exemplo Procedure (L03_110)


CREATE OR REPLACE PROCEDURE TESTE
(MATRICULA IN NUMBER, PERCENTUAL IN NUMBER := 0.1) IS
VPERC
NUMBER;
BEGIN
IF PERCENTUAL > 1 THEN
VPERC := PERCENTUAL / 100;
ELSIF PERCENTUAL > 0 THEN
VPERC := PERCENTUAL;
END IF;
IF VPERC IS NOT NULL THEN
UPDATE FUNC
SET VL_SAL = VL_SAL + VL_SAL * VPERC
WHERE CD_MAT = MATRICULA;
COMMIT;
END IF;
END;
/

Tpicos_Especiais1 - PL-SQL

Dino Spoto

Exemplo Function (L03_108)


CREATE OR REPLACE FUNCTION NOME(PDEPTO IN
VARCHAR2) RETURN VARCHAR2 IS
NOME
VARCHAR2(100);
BEGIN
SELECT NM_DEPTO INTO NOME
FROM DEPTO
WHERE CD_DEPTO = PDEPTO;
RETURN NOME;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NOME := 'DEPARTAMENTO INEXISTENTE';
RETURN NOME;
END;
/

RETURN identifica o tipo do dado que a funo ira retornar


SQL> CREATE OR REPLACE FUNCTION get_sal
2
(v_id IN emp.empno%TYPE)
3
RETURN NUMBER
4
IS
v_salary emp.sal%TYPE :=0;
5
BEGIN
6
SELECT sal INTO v_salary
7
FROM emp WHERE empno = v_id;
8
RETURN (v_salary);
9
END get_sal;
10
/

Tpicos_Especiais1 - PL-SQL

D
I
N
O

D
I
N
O

Funes

PL/SQL - 106

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Fazer as listagens

L03_115 PROCEDURE VERIFICA


L03_141 SET SEVEROUT ON
L03_142 146 USO DE DBMS_OUTPUT.PUT_LINE

L03_163 MALA DIRETA




PL/SQL - 107

PL/SQL - 104

Tpicos_Especiais1 - PL-SQL

PL/SQL - 108

Tpicos_Especiais1 - PL-SQL

18

UNIVEM

D
I
N
O

PL/SQL

Passando valores do ambiente chamador para uma


procedure utilizando o argumento IN

D
I
N
O

Devolver informaes sobre um funcionrio.


CREATE OR REPLACE PROCEDURE
pesquisa_empregado
( v_emp_no IN emp.empno%TYPE,
v_emp_name OUT emp.ename%TYPE,
v_emp_sal OUT emp.sal%TYPE,
v_emp_comm OUT emp.comm%TYPE)
IS
BEGIN
SELECT ename, sal, comm
INTO v_emp_name, v_emp_sal, v_emp_comm
FROM emp
WHERE empno = v_emp_no;
END pesquisa_empregado;

CREATE OR REPLACE PROCEDURE novos_empregados


( v_emp_no IN emp.empno%TYPE,
v_emp_name IN emp.ename%TYPE,
v_emp_job IN emp.job%TYPE,
v_mgr_no IN emp.mgr%TYPE,
v_emp_hiredate IN emp.hiredate%TYPE,
v_emp_sal IN emp.sal%TYPE,
v_emp_comm IN emp.comm%TYPE,
v_dept_no IN emp.deptno%TYPE)
IS
BEGIN
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm,
deptno )
VALUES ( v_emp_no, v_emp_name, v_emp_job, v_mgr_no,
v_emp_hiredate, v_emp_sal, v_emp_comm,
v_dept_no);
COMMIT WORK;
END novos_empregados;
PL/SQL - 109

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Passando um valor do ambiente chamador para a


procedure, e a procedure retorna um valor para o
ambiente chamador

Retornando um valor da procedure para o ambiente


chamador utilizando o argumento OUT

PL/SQL - 110

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Gerenciando excees em tempo de


execuo

Pode-se gerenciar qualquer tipo de exceo em tempo de


execuo permitindo propagar para o ambiente chamador ou
tomar aes quando essas acontecerem.
RAISE_APPLICATION_ERROR(numero_erro, texto_erro)


Transforma a seqncia de sete dgitos de um nmero


para o formato de nmero de telefone.
CREATE OR REPLACE PROCEDURE formata_telefone
(v_phone_no IN OUT varchar2)
IS
BEGIN
v_phone_no := SUBSTR (v_phone_no,1,3) || - ||
SUBSTR (v_phone_no,4,4);
END formata_telefone;

PL/SQL - 111

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Numero_erro o nmero do erro definido pelo


usurio. Deve estar entre -20000 e -20999.
Texto_erro a mensagem definida pelo usurio.

D
I
N
O

Exemplo
CREATE OR REPLACE PROCEDURE exclui_funcionario
(v_emp_no IN emp.empno%TYPE) IS
BEGIN
DELETE FROM EMP
WHERE empno = v_emp_no;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20200, Funcionario nao
existe);
END IF;
COMMIT WORK;
END exclui_funcionario;

Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 113

PL/SQL - 112

Tpicos_Especiais1 - PL-SQL

Exemplo (exception e rollback)


CREATE OR REPLACE PROCEDURE inclui_funcionario
( v_emp_name IN emp.ename%TYPE,
v_emp_job IN emp.job%TYPE,
v_mgr_no IN emp.mgr%TYPE,
v_emp_sal IN emp.sal%TYPE)
IS
v_emp_hiredate emp.hiredate%TYPE:=sysdate;
v_emp_comm emp.comm%TYPE:=0.0;
v_dept_no emp.deptno%TYPE;
BEGIN
SELECT deptno
INTO v_dept_no
FROM emp
WHERE empno = v_mgr_no;
INSERT INTO emp ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
VALUES (Next_emp, v_emp_name, v_emp_job,
v_mgr_no, v_emp_hiredate, v_emp_sal,
v_emp_comm, v_dept_no);
COMMIT WORK;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20201, Gerente nao e um empregado
valido.);
END inclui_funcionario;
PL/SQL - 114

Tpicos_Especiais1 - PL-SQL

19

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Exception_Init

CREATE OR REPLACE PROCEDURE exclui_funcionario


(v_emp_name IN emp.ename%TYPE,
v_emp_job IN emp.job%TYPE,
v_mgr_no IN emp.mgr%TYPE,
v_emp_sal IN emp.sal%TYPE,
v_emp_hiredate emp.hiredate%TYPE,
v_emp_comm emp.comm%TYPE,
v_dept_no emp.deptno%TYPE)
IS
e_invalid_manager EXCEPTION;
PRAGMA EXCEPTION_INIT (e_invalid_manager, -2291);
BEGIN
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (next_emp, v_emp_name, v_emp_job, v_mgr_no,
v_emp_hiredate,v_emp_sal,
v_emp_comm, v_dept_no);
COMMIT WORK;
EXCEPTION
WHEN e_invalid_manager THEN
RAISE_APPLICATION_ERROR (-20201, Gerente nao e um empregado
valido.);
END exclui_funcionario;

Pode-se tambm definir excees que no


so contempladas pelo ORACLE.
. declare uma exceo
. associe essa exceo com um nmero de erro
utilizando com
. comando PRAGMA EXCEPTION_INIT.

PL/SQL - 115

Tpicos_Especiais1 - PL-SQL

D
I
N
O

DECLARE
v_empno NUMBER := 7654;
BEGIN
...
exclui_funcionario (v_empno);
...
END;
 Executando de outra procedure.

D
I
N
O

Executando do SQL*Plus ou do SQL*DBA.


Para isso, necessrio utilizar o comando
EXECUTE.
Para entrar com valores via SQL*Plus devese utilizar o comando ACCEPT e substituir o
parmetro de entrada da procedure pela
varivel do ACCEPT iniciado pela string &.

ACCEPT p_empno PROMPT Entre com o


numero do funcionario :
EXECUTE exclui_funcionario (&p_empno);
PL/SQL - 117

PL/SQL - 119

PL/SQL - 118

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Executando de um Pr-Compilador ou aplicao OCI.


void exec_exclui_func ()
{
EXEC SQL BEGIN DECLARE SECTION;
int empno;
EXEC SQL END DECLARE SECTION;
printf(\nEntre com o numero do funcionario: );
scanf(%d,&empno);
EXEC SQL EXECUTE;
begin
exclui_funcionario(:empno);
end;
EXEC SQL END-EXEC;
return;
}

Dino Spoto

Execuo - Procedure

ProC ou OCI

Tpicos_Especiais1 - PL-SQL

PL/SQL - 116

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Execuo - Procedure

CREATE PROCEDURE processa_funcionario


(v_emp_no IN emp.empno%TYPE)
IS
BEGIN
...
exclui_funcionario (v_empno);
...
END;
Tpicos_Especiais1 - PL-SQL

Exemplo

Java - JDBC

1.

Criar a stored procedure

2.

Criar um programa em java (jdbc) que execute a


procedure criada no Oracle

PL/SQL - 120

Tpicos_Especiais1 - PL-SQL

20

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Executando - Funo
Executando uma funo de um bloco PL/SQL
DECLARE
v_empno NUMBER := 7654;
v_sal NUMBER;
BEGIN
...
v_sal := pesquisa_salario(v_emp_no);
...
END;
Executando uma funo de uma procedure
CREATE PROCEDURE processa_emp (v_emp_no IN
emp.empno%TYPE) IS v_sal NUMBER;
BEGIN
...
v_sal := pesquisa_salario(v_emp_no);
...
END;
 No SQL*Plus, o valor retornados de uma funo armazenado em
varivel global.
PL/SQL - 121

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Documentando uma procedure armazenada.


SELECT text
FROM user_source
WHERE type = PROCEDURE
AND name = EXCLUI_FUNCIONARIO
ORDER BY line;

PL/SQL - 123

EXECUTE :g_sal := pesquisa_salario


(&p_empno);

PRINT g_sal

PL/SQL - 122

Criando PACKAGES
Declarando construes pblicas dentro
da especificao do package.

PL/SQL - 124

Tpicos_Especiais1 - PL-SQL

Controle - Package

Definir todas construes, pblicas e


privadas, dentro do corpo do package.
 Sintaxe :
CREATE OR REPLACE PACKAGE BODY
nome_do_package IS/AS
-- declaracao_de_variaveis --- declaracao_de_cursores
-- declaracao_de_excessoes --- declaracao_de_procedures --- declaracao_de_funcoes -END nome_do_package

Criando a especificao do Pacote

CREATE OR REPLACE PACKAGE


comm_package IS
g_comm_rate NUMBER := 0.1;
PROCEDURE reset_comm_rate
(v_comm_rate IN NUMBER);
END comm_package;

Dino Spoto

D
I
N
O

Exemplo

Tpicos_Especiais1 - PL-SQL

VARIABLE g_sal NUMBER

Sintaxe:
CREATE OR REPLACE PACKAGE
nome_do_package IS/AS
-- declaracao_de_variaveis --- declaracao_de_cursores --- declaracao_de_excessoes --- declaracao_de_procedures --- declaracao_de_funcoes -END nome_do_package

SELECT object_name, object_type


FROM user_objects
WHERE object_type IN (PROCEDURE, FUNCTION)
ORDER BY object_name;

D
I
N
O

ACCEPT p_empno PROMPT Entre com o


numero do funcionario :

Tpicos_Especiais1 - PL-SQL

Exibir todas as procedure e funes.

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Tratando as Funes e
Procedures


Executando uma funo do


SQL*Plus

PL/SQL - 125

PL/SQL - 126

Tpicos_Especiais1 - PL-SQL

21

UNIVEM

D
I
N
O

PL/SQL

Exemplo Armazenando
Package

D
I
N
O

Executando Package

CREATE OR REPLACE PACKAGE BODY comm_package IS


FUNCTION validade_comm_rate (v_comm_rate IN NUMBER)
RETURN BOOLEAN
IS
v_max_comm_rate NUMBER;
BEGIN
SELECT MAX (comm/sal)
INTO v_max_comm_rate
FROM emp;
IF v_comm_rate > v_max_comm_rate THEN
RETURN (FALSE);
ELSE
RETURN (TRUE);
END IF;
END validade_comm_rate;
PROCEDURE reset_comm_rate (v_comm_rate IN NUMBER)
IS
v_valid BOOLEAN;
BEGIN
v_valid := validade_comm_rate (v_comm_rate);
IF v_valid = TRUE THEN
g_comm_rate := v_comm_rate;
ELSE
RAISE_APPLICATION_ERROR (-20210, Taxa de comissao invalida);
END IF;
END reset_comm_rate;
Tpicos_Especiais1
- PL-SQL
PL/SQL - 127
END comm_package;

D
I
N
O

Exemplo : Chamar uma funo de uma


procedure dentro do package.

CREATE OR REPLACE PACKAGE BODY comm_package


IS
...
PROCEDURE reset_comm_rate (v_comm_rate IN
NUMBER)
IS
v_valid BOOLEAN;
BEGIN
v_valid := validade_comm_rate (v_comm_rate);
IF v_valid = TRUE THEN
g_comm_rate := v_comm_rate;
ELSE
RAISE_APPLICATION_ERROR (-20210, Taxa de
comissao invalida);
END IF;
END reset_comm_rate;
END comm_package;
Tpicos_Especiais1 - PL-SQL

Um gatilho um bloco PL/SQL que executa


implicitamente sempre que um evento particular
acontece.
Um gatilho pode ser do BD ou da aplicao.
Quando executa?




BEFORE - Antes de executar uma frase DML sobre uma


tabela.
AFTER - Depois da frase DML
INSTEAD OF - Executa o corpo do gatilho em vez da frase que
ativou o gatilho.

Tpicos_Especiais1 - PL-SQL

Dino Spoto

Quando chamar uma procedure ou funo de fora do package, o


qualificador deve ser utilizado.

Exemplo : Chamando uma procedure de um package do SQL*Plus


SQL> EXECUTE comm_package.reset_comm_rate (.15);
Exemplo: Chamando uma procedure de um package de um diferente
usurio.
SQL> EXECUTE paulo.comm_package.reset_comm_rate
(.15);
Exemplo: Chamando uma procedure de um package de um banco de
dados remoto.
SQL> EXECUTE paulo.comm_package.reset_comm_rate (.15)@pr;

PL/SQL - 131

PL/SQL - 130

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Gatilhos

Executando Package

PL/SQL - 129

PL/SQL - 128

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Exemplo

D
I
N
O

Depois de armazenar o package no banco de


dados, chame a construo do package de
dentro de um package ou de fora do package,
dependendo se a construo for privada ou
pblica.
Quando executar uma procedure, funo ou
package dentro de um package no
necessrio colocar o nome do qualificador.

Gatilhos

Que frase DML ativa gatilhos?

Tipo de gatilhos: (quantas vezes deve o gatilho


executar ao acontecer o evento?)




INSERT; UPDATE; DELETE.

Statement - executa uma vez;


Row - executa uma vez para cada linha afetada pelo gatilho.

Corpo do gatilho


Bloco PL/SQL ou chamada a procedimento.

PL/SQL - 132

Tpicos_Especiais1 - PL-SQL

22

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Gatilhos

Gatilhos

Sintaxe

Exemplo

CREATE [OR REPLACE] TRIGGER trigger_name


timing
event1 [OR event2 OR event3]
ON table_name
trigger_body
Ou (gatilho de linha)
CREATE [OR REPLACE] TRIGGER trigger_name
timing
event1 [OR event2 OR event3]
ON table_name
[REFERENCING OLD AS old / NEW AS new]
FOR EACH ROW
[WHEN condition]
trigger_body

SQL>
2
3
4
5
6
7
8
9
10
11

D
I
N
O

UPDATE EMP SET SAL=6500 WHERE ENAME=MILLER;


PL/SQL - 133

Tpicos_Especiais1 - PL-SQL

PL/SQL - 135

Criando TRIGGERS de linha

Este gatilho dispara quando um evento de


manipulao de dados afetando linhas em uma tabela.
Para se criar esse trigger, basta apenas acrescentar
FOR EACH ROW no comando CREATE TRIGGER.
Sintaxe :


CREATE O REPLACE TRIGGER nome_do_trigger


BEFORE/AFTER evento ON nome_da_tabela
FOR EACH ROW WHEN clausula_de_restricao
bloco PL/SQL

Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 137

Combinando - DML
CREATE OR REPLACE TRIGGER secure_emp
BEFORE DELETE OR INSERT OR UPDATE ON emp
BEGIN
IF (TO_CHAR (sysdate,`DY`) IN (`SAT`,`SUN`))
OR (TO_NUMBER (TO_CHAR(sysdate,`HH24`)) NOT BETWEEN 8 AND 18) THEN
IF DELETING THEN
RAISE_APPLICATION_ERROR (-20502, `Nao e possivel remover funcionario fora do
horario normal de
trabalho);
ELSIF INSERTING THEN
RAISE_APPLICATION_ERROR (-20503, `Nao e possivel inserir funcionario fora do
horario normal de
trabalho);
ELSIF UPDATING (SAL) THEN
RAISE_APPLICATION_ERROR (-20504, `Nao e possivel alterar a coluna salario do
funcionario fora do
horario normal de trabalho);
END IF;
END IF;
END;

CREATE OR REPLACE TRIGGER secure_emp


BEFORE INSERT ON emp
BEGIN
IF (TO_CHAR (sysdate,`DY`) IN (`SAT`,`SUN`))
OR (TO_NUMBER (TO_CHAR(sysdate,`HH24`))
NOT BETWEEN 8 AND 18) THEN
RAISE_APPLICATION_ERROR (-20500, `No
possvel inluir funcionrio fora do horrio
normal de trabalho);
END IF;
END;

D
I
N
O

PL/SQL - 134

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Exemplo - Before

Tpicos_Especiais1 - PL-SQL

CREATE OR REPLACE TRIGGER derive_commission_pct


BEFORE INSERT OR UPDATE OF sal ON emp
FOR EACH ROW
BEGIN
IF NOT (:NEW.JOB IN (MANAGER,PRESIDENT))
and :NEW.SAL > 5000
THEN
RAISE_APPLICATION_ERROR
(-20202,Emplyee cannot earn this amount);
END IF;
END;

PL/SQL - 136

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Exemplo
CREATE OR REPLACE TRIGGER audit_emp
BEFORE DELETE OR INSERT OR UPDATE ON emp
FOR EACH ROW
BEGIN
IF DELETING THEN
UPDATE audit_table
SET del = del + 1
WHERE user_name = user AND table_name = `EMP`
AND column_name IS NULL;
ELSIF INSERTING THEN
UPDATE audit_table
SET ins = ins + 1
WHERE user_name = user AND table_name = `EMP`
AND column_name IS NULL;
ELSIF UPDATING THEN
UPDATE audit_table
SET upd = upd + 1
WHERE user_name = user AND table_name = `EMP`
AND column_name IS NULL;
END IF;
Tpicos_Especiais1 - PL-SQL
PL/SQL - 138
END;

23

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Exemplo 2

Trigger Sal_maior_gerente
create or replace trigger sal_maior_gerente
after update or insert of sal on emp
for each row
declare
v_sal emp.sal%TYPE;

CREATE OR REPLACE TRIGGER audit_emp_values


AFTER DELETE OR INSERT OR UPDATE ON emp
FOR EACH ROW
BEGIN
INSERT INTO audit_emp_values ( user_name,
timestamp, empno, old_name, new_name, old_job,
new_job, old_mgr, new_mgr, old_sal, new_sal)
VALUES ( user, sysdate, :old.empno, :old.ename,
:new.ename, :old.job, :new.job, :old.mgr, :new.mgr,
:old.sal, :new.sal);
END;

PL/SQL - 139

Tpicos_Especiais1 - PL-SQL

D
I
N
O

begin
SELECT sal INTO v_sal from emp where empno = :new.mgr;
IF (:new.sal > v_sal) THEN
IF UPDATING('SAL') THEN
RAISE_APPLICATION_ERROR (-20701, 'salario Atualizado nao
pode ser maior que o salario do gerente');
ELSIF INSERTING THEN
RAISE_APPLICATION_ERROR (-20702, 'salario Inserido no
pode ser superior ao salrio do gerente');
end if;
end if;
end;
/

D
I
N
O

Auditoria
Criar uma tabela de auditoria:
CREATE TABLE AUDIT_EMP_VALUES (USER_NAME VARCHAR2(10),
TIMESTAMP DATE,
EMPNO
NUMBER(5),
OLD_NAME VARCHAR2(20),
NEW_NAME VARCHAR2(20),
OLD_JOB VARCHAR2(10),
NEW_JOB VARCHAR2(10),
OLD_MGR NUMBER(5),
NEW_MGR NUMBER(5),
OLD_SAL NUMBER(12,2),
NEW_SAL NUMBER(12,2));
Criar a Trigger:
CREATE OR REPLACE TRIGGER audit_emp_values
AFTER DELETE OR INSERT OR UPDATE ON emp
FOR EACH ROW
BEGIN
INSERT INTO audit_emp_values ( user_name, timestamp, empno, old_name, new_name, old_job,
new_job, old_mgr, new_mgr, old_sal, new_sal)
VALUES ( user, sysdate, :old.empno, :old.ename, :new.ename, :old.job, :new.job, :old.mgr, :new.mgr,
:old.sal, :new.sal);
END;
/
Tpicos_Especiais1 - PL-SQL

D
I
N
O

Sintaxe:
ALTER TRIGGER nome_do_trigger
DISABLE/ENABLE
ou
ALTER TABLE nome_da_tabela
DISABLE/ENABLE ALL TRIGGERS
Quando um trigger criado, ele fica disponvel
automaticamente.
Tpicos_Especiais1 - PL-SQL

Dino Spoto

Gerenciando triggers armazenadas dentro do banco


de dados com comandos similares aos comandos
para procedures.
Tarefa
Comando
Criar um novo trigger
CREATE TRIGGER
Modificar um trigger
CREATE OR REPLACE
TRIGGER existente
Remover um trigger
DROP TRIGGER

PL/SQL - 143

PL/SQL - 142

Tpicos_Especiais1 - PL-SQL

D
I
N
O

Diferente das procedures, pode-se desabilitar


um trigger quando for conveniente.

TRIGGERS ARMAZENADAS

PL/SQL - 141

Desabilitando Gatilhos

PL/SQL - 140

Tpicos_Especiais1 - PL-SQL

Exemplo Replicar tabs com


gatilhos
CREATE OR REPLACE TRIGGER emp_replica
BEFORE INSERT OR UPDATE ON emp FOR EACH ROW
BEGIN
IF INSERTING THEN IF :new.flag IS NULL THEN INSERT INTO emp@pr
VALUES (:new.empno, :new.ename, ..., B);
:new.flag = A;
END IF;
ELSE
IF :new.flag = :old.flag THEN
UPDATE emp@pr
SET ename = :new.ename, ...
flag = :new.flag
WHERE empno = :new.empno;
END IF;
IF :old.flag = A THEN
:new.flag = B;
ELSE
:new.flag = A;
END IF;
END IF;
END;

PL/SQL - 144

Tpicos_Especiais1 - PL-SQL

24

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Variveis de Ligao

Exemplo em SQL/Plus

Variveis definidas no PL/SQL no so visveis pelo SQL*Plus


Bind variables -> Variveis ligadas so variveis que so criadas
no SQL*Plus e podem ser referidas no PL/SQL.
Como criar
Ex:
VARIABLE ret_val NUMBER;
Para referir vars ligadas no PL/SQL usa-se (:) imediatamente
antes da varivel
Ex:
:ret_val :=1;
Para mudar o valor desta varivel no SQL*Plus necessrio
escrever um bloco PL/SQL.
Ex:
SQL> begin
2
:ret_val:=4;
3
end;
4
/
PL/SQL - 145

Tpicos_Especiais1 - PL-SQL

D
I
N
O

PL/SQL - SELECT em PL/SQL


SINTAXE:

Exemplo:
erro se pergunta devolver
0 (NO_DATA_FOUND)
ou mais do que 1 linha
(TOO_MANY_ROWS)
clusula INTO crucial

DECLARE
v_sal_increase emp.sal%TYPE := 2000;
BEGIN
UPDATE emp
SET sal:= sal + v_sal_increase
WHERE job = ANALYST;
END;

Pode-se herdar a definio de um registro


DECLARE
registro_emp emp%ROWTYPE
BEGIN
SELECT * INTO registro_emp FROM emp WHERE...
 Tornando desnecessrio conhecer em detalhe a tabela base

Dino Spoto

PL/SQL - 149

PL/SQL - 148

Tpicos_Especiais1 - PL-SQL

D
I
N
O

TYPE nome_tipo IS RECORD (campo[, campo]...);


nome_campo tipo [[NOT NULL] {:= | DEFAULT} expresso]

Tpicos_Especiais1 - PL-SQL

PL/SQL - INSERT/UPDATE em PL/SQL

BEGIN
INSERT INTO emp(empno, ename, job, deptno)
VALUES empno_sequence.nextval,Harding,Clerk, 10);
END;

PL/SQL - 147

Definir um tipo RECORD para agrupar dados


heterogneos


D
I
N
O

DECLARE
v_sum_sal emp.sal%TYPE;
v_deptno
NUMBER NOT NULL :=10;
BEGIN
SELECT SUM(sal) --group function
INTO
v_num_sal
FROM
emp
WHERE dptno=v_deptno;
END;

Registros

PL/SQL - 146

Tpicos_Especiais1 - PL-SQL

SELECT select_list
INTO {variable_name[, variable_name]
| record_name}
FROM table
WHERE condition;

Tpicos_Especiais1 - PL-SQL

D
I
N
O

SQL> VARIABLE g_sal_mensal NUMBER


SQL> ACCEPT p_sal_anual PROMPT Salrio anual:
SQL> DECLARE
SQL>
v_sal NUMBER(9,2) := &p_sal_anual;
SQL> BEGIN
SQL>
:g_sal_mensal := v_sal / 12;
SQL> END;
SQL> /
SQL> PRINT g_sal_mensal
SQL> /* ou: SET SERVEROUTPUT ON
SQL>
DBMS_OUTPUT.PUT_LINE(Salrio mensal de ||
TO_CHAR(v_sal));
SQL> */

Registros encaixados

DECLARE
TYPE TimeRec IS RECORD (mins SMALLINT, hrs SMALLINT);
TYPE MeetingRec IS RECORD (
day DATE,
time_of TimeRec, -- nested record
room_no INTEGER(4));
TYPE PartyRec IS RECORD (
day DATE,
time_of TimeRec, -- nested record
place VARCHAR2(25));
seminar MeetingRec;
party PartyRec;
BEGIN ...
party.time_of := seminar.time_of;
END;

PL/SQL - 150

Tpicos_Especiais1 - PL-SQL

25

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Tabelas

DECLARE
TYPE NumList IS TABLE OF NUMBER;
depts NumList := NumList(10, 20, 30, 40);
BEGIN
depts.DELETE(3); -- apaga terceiro elemento
FORALL i IN depts.FIRST..depts.LAST ligao em massa
DELETE FROM emp WHERE deptno = depts(i); -- causa erro
END;

Coluna de Binary integer funciona como ndice; segunda


coluna (de contedo) pode ser simples ou composta
DECLARE
TYPE CourseList IS TABLE OF VARCHAR2(10);
courses CourseList;
BEGIN
courses := CourseList('Biol 4412', 'Psyc 3112', 'Anth 3001');
courses.DELETE(3); -- delete element 3
/* PL/SQL keeps a placeholder for element 3. So, the
next statement appends element 4, not element 3. */
courses.EXTEND; -- append one null element
/* Now element 4 exists, so the next statement does
not raise SUBSCRIPT_BEYOND_COUNT. */
courses(4) := 'Engl 2005';

D
I
N
O




D
I
N
O

Implcitos (chamados SQL)


Explcitos

no
Open

cria uma
identifica
rea no SQL conjunto
activo





PL/SQL - 153

Controle de cursores explcitos

Fetch

Empty?

Close

D
I
N
O

Dino Spoto

PL/SQL - 152

SQL%ROWCOUNT - n de linhas afetadas pela mais recente


frase SQL;
SQL%FOUND - TRUE se a mais recente frase SQL afeta uma
ou mais linhas;
SQL%NOTFOUND - TRUE se a mais recente frase SQL no
afeta nenhuma linha;
SQL%ISOPEN - Sempre FALSE porque o PL/SQL fecha
sempre os cursores implcitos depois de os executar;

PL/SQL - 154

CURSOR cursor_name [(parameter[, parameter]...)]


[RETURN return_type] IS select_statement;


liberta conjunto
ativo

PL/SQL - 155

Delete

Cursores - declarao

cursor_parameter_name [IN] datatype [{:= | DEFAULT}


expression]

DECLARE
CURSOR c1 IS SELECT empno, ename, job, sal FROM emp
WHERE sal > 2000;
CURSOR c2 RETURN dept%ROWTYPE IS
SELECT * FROM dept WHERE deptno = 10;


Tpicos_Especiais1 - PL-SQL

Extend
Trim

Tpicos_Especiais1 - PL-SQL

yes
carrega linha
testa fim de
corrente
dados

Prior
Next

Atravs dos atributos do cursor implcito


(chamado SQL) podemos testar a sada produzida
por uma pergunta SQL:


Tpicos_Especiais1 - PL-SQL

First
Last

Atributos do cursor SQL

O servidor Oracle usa cursores implcitos para


analisar e executar cdigo SQL.
Os cursores explcitos so explicitamente
declarados pelo programador.

Declare

Exists
Count

Tpicos_Especiais1 - PL-SQL

Um cursor uma rea privada do SQL.


H dois tipos de cursores:


Mtodos para tabelas




PL/SQL - Cursores

D
I
N
O

PL/SQL - 151

Tpicos_Especiais1 - PL-SQL

Tabelas

sem clusula INTO


PL/SQL - 156

Tpicos_Especiais1 - PL-SQL

26

UNIVEM

D
I
N
O

PL/SQL

D
I
N
O

Cursor num Package

DECLARE
emp_rec emp%ROWTYPE;
-- ou emp_rec emp_stuff.c1%ROWTYPE
...
BEGIN
...
OPEN emp_stuff.c1;
LOOP
FETCH emp_stuff.c1 INTO emp_rec;
EXIT WHEN emp_suff.c1%NOTFOUND;
...
END LOOP;
CLOSE emp_stuff.c1;
END;

CREATE PACKAGE BODY emp_stuff AS


CURSOR c1 RETURN emp%ROWTYPE IS
SELECT * FROM emp WHERE deptno = 20; -new WHERE clause
...
END emp_stuff;

Tpicos_Especiais1 - PL-SQL

D
I
N
O

PL/SQL - 157

Atributos dos cursores explcitos





D
I
N
O

PL/SQL - 159

DECLARE
bonus REAL;
BEGIN
FOR emp_rec IN (SELECT empno, sal, comm FROM emp) LOOP
bonus := (emp_rec.sal * 0.05) + (emp_rec.comm * 0.25);
INSERT INTO bonuses VALUES (emp_rec.empno, bonus);
END LOOP;
COMMIT;
END;

Cursor de ciclo FOR


DECLARE
result temp.col1%TYPE;
CURSOR c1 IS
SELECT n1, n2, n3 FROM data_table WHERE exper_num = 1;
BEGIN
FOR c1_rec IN c1 LOOP
/* calcula e armazena os resultados */
result := c1_rec.n2 / (c1_rec.n1 + c1_rec.n3);
INSERT INTO temp VALUES (result, NULL, NULL);
END LOOP;
COMMIT;
END;

Convm fechar o cursor; mximo de cursores


abertos (50) no parmetro da BD
OPEN_CURSORS

Cursor de sub-pergunta

D
I
N
O

SQL%ROWCOUNT - n de linhas devolvidas at ao momento;


SQL%FOUND - TRUE se o fetch mais recente devolveu linha;
SQL%NOTFOUND - TRUE se o fetch mais recente no
devolveu linha;
SQL%ISOPEN TRUE se o cursor estiver aberto

Tpicos_Especiais1 - PL-SQL

PL/SQL - 158

Tpicos_Especiais1 - PL-SQL

Atravs dos atributos dos cursores explcitos


podemos controlar o processamento do resultado:


Processamento das linhas

PL/SQL - 160

Tpicos_Especiais1 - PL-SQL

D
I
N
O

FIM

Prof. Edmundo Spoto

UNIVASF - CECOMP

edmundo.spoto@univasf.edu.br

Neste caso no se pode usar os atributos de cursor porque o


cursor no tem nome

Tpicos_Especiais1 - PL-SQL

Dino Spoto

PL/SQL - 161

PL/SQL - 162

Tpicos_Especiais1 - PL-SQL

27

You might also like