You are on page 1of 64

PL/SQLFundamentos

1
1

Instrutor: Mrcio Mendona

Oracle Database 11g

O que PL/SQL?

uma linguagem de programao


utilizada para acessar e modificar
dados num banco de dados Relacional.
Ela integrada ao servidor de banco de
dados de modo que o seu cdigo possa
ser processado de maneira rpida e
eficiente.
2

Instrutor: Mrcio Mendona

Oracle Database 11g

Benefcios da Linguagem
Um programa pode ser escrito em blocos,
com variveis locais e tratamento de
erros;
Performance;
Potabilidade - pode ser usado em qualquer plataforma
que acesse um banco de dados Oracle.

O fluxo do programa pode ser


determinado atravs de comandos de
desvio.
3

Instrutor: Mrcio Mendona

Oracle Database 11g

Estrutura do PL/SQL
O PL/SQL uma linguagem estruturada em
blocos lgicos que podem conter um nmero
qualquer de sub-blocos aninhados.
Um bloco PL/SQL pode ser um bloco annimo ou
um sub-programa ou uma trigger.

Instrutor: Mrcio Mendona

Oracle Database 11g

Blocos Estruturados
DECLARE(Opcional)
Variveis, cursores, definio de excees
definidas pelo desenvolvedor
BEGIN (Obrigatrio)
Declarao SQL
Declarao PL SQL
EXCEPTION (Opcional)
Aes a serem tomadas caso ocorra algum
erro
END; (Obrigatrio)
5

Instrutor: Mrcio Mendona

Oracle Database 11g

Bloco Annimo

Bloco Annimo =>

um
bloco de comandos sem nome.
declarado na aplicao no ponto
em que ser executado e
passado para a execuo em
tempo de execuo.
6

Instrutor: Mrcio Mendona

Oracle Database 11g

Sub-Programas
Consistem em Procedures e Funes.
Podem ser armazenados no banco de dados
como objetos independentes, como parte
de um pacote ou como mtodos de um
tipo de objeto.

Instrutor: Mrcio Mendona

Oracle Database 11g

Triggers
Consistem em um bloco PL/SQL que est
associado a um evento que ocorre no
banco de dados.

Instrutor: Mrcio Mendona

Oracle Database 11g

Sintaxe Bsica do PL/SQL


Sub-programas definidos dentro de um outro
sub-programa ou dentro de um bloco PL/SQL,
so sub-programas locais e no podem ser
referenciados por outras aplicaes.
Linhas de comando podem ser divididas em
diversas linhas.
Identificadores devem comear com uma letra
e conter, no mximo, 30 caracteres;

Instrutor: Mrcio Mendona

Oracle Database 11g

Sintaxe Bsica do PL/SQL


Campos caracteres e datas devem ser
usados entre aspas simples;
Comentrios so delimitados por: /* */ e
podem conter diversas linhas.
Comentrios de apenas uma linha so
iniciados por '--' (pode ser em linhas que
j tenham comandos).
Palavras reservadas no podem ser
usadas;
10

Instrutor: Mrcio Mendona

Oracle Database 11g

Smbolos Simples do PL/SQL

11

Instrutor: Mrcio Mendona

Oracle Database 11g

Smbolos Compostos do PL/SQL

12

Instrutor: Mrcio Mendona

Oracle Database 11g

Regras de Estrutura de Blocos


O mnimo requerido em um bloco so os comandos
BEGIN e END delimitando as aes que sero
executadas.
Se o bloco PL/SQL precisar de definio de
variveis, conter, tambm, a seo DECLARE.

13

Instrutor: Mrcio Mendona

Oracle Database 11g

Blocos Aninhados
Blocos podem estar aninhados, inclusive na
seo de EXCEPTION.

14

Instrutor: Mrcio Mendona

Oracle Database 11g

Blocos aninhados
BEGIN
Aes do bloco principal
DECLARE
Declarao de objetos
BEGIN
Aes do bloco interno
EXCEPTION
O que fazer na ocorrncia de erros do bloco interno
END;
Outras aes do bloco principal
EXCEPTION
WHEN erro THEN
BEGIN
Aes do bloco interno do EXCEPTION
EXCEPTION
Aes a serem tomadas na ocorrncia de erros no bloco interno de
EXCEPTION.
END;
END;

Instrutor: Mrcio Mendona

Oracle Database 11g

15

Variveis
16

Instrutor: Mrcio Mendona

Oracle Database 11g

Uso de Variveis
As variveis podem ser utilizadas para armazenar
temporariamente os dados e manipular valores.
O nome atribudo a uma varivel deve ter no
mximo 30 posies. Pode possuir letras, nmeros
e caracteres especiais como underscore, ponto
simples, dlar.
Elas devem ser declaradas e inicializadas na
seo declarativa. Usada e atribuda novos valores
na seo de executveis. Passada como
parmetros em subprogramas PL/SQL
No existe distino entre letras maisculas e
minsculas.
Instrutor: Mrcio Mendona
Oracle Database 11g

17

Declarao de Variveis

Nome_da_varivel [CONSTANT] datatype [NOT NULL] [{:= |


DEFAULT} valor];
Onde nome_da_varivel o identificador, datatype tipo e
valor o contedo inicial da varivel. EX:
DECLARE
v_dataInicial DATE;
v_contador BINARY_INTEGER NOT NULL := 0;
v_nome VARCHAR2(20);
c_PI CONSTANT NUMBER DEFAULT 3.14;

18

Instrutor: Mrcio Mendona

Oracle Database 11g

Tipos de Dados

O Oracle PL/SQL possui diferentes tipos de dados (datatypes)


para atender suas necessidades, que so divididos nas
seguintes categorias:
CHARACTER,
NUMBER,
DATE,
LOB,
BOOLEANOS,
%TYPE

19

Instrutor: Mrcio Mendona

Oracle Database 11g

Character
CHAR(<n>) armazena string de tamanho fixo. Tamanho
default 1, mximo 32.767. Subtipo: CHARACTER
VARCHAR2(<n>) armazena string de tamanho varivel.
possvel armazenar string de at 32.767 bytes. Subtipo:
STRING
VARCHAR(<n>) sinnimo para o tipo VARCHAR2.
NCHAR(<n>) e NVARCHAR2(<n>) possuem as mesmas
caractersticas dos tipos CHAR e VARCHAR2 e so usados
para armazenar dados NLS (National Language Support). A
arquitetura Oracle NLS permite armazenar, processar e
recuperar informaes em linguagens nativas.
LONG um tipo de dados que se tornou obsoleto com a
chegada dos tipos LOB (Large Object). O tipo LONG armazena
strings
deMendona
tamanhoOracle
varivel
de 11g
no mximo 32.760 bytes.
Instrutor:
Mrcio
Database

20

Numrico
Usado para armazenar dados numricos com preciso de at
38 digitos.
NUMBER(<x>, <y>) onde <X> corresponde ao nmero de
dgitos e <Y> o
nmero de casas decimais. Valores inseridos em colunas
numricas com nmero de casas decimais menor que o dado
inserido sero arredondados. Subtipos: DEC, DECIMAL,
DOUBLE PRECISION, FLOAT, INTEGER, INT, NUMERIC, REAL,
SMALLINT.
BINARY_INTEGER utilizado para armazenar inteiros com sinal,
que variam de 2147483647 a 2147483647. Requerem
menos memria que tipos NUMBER. Subtipos: NATURAL
(n>=0), NATURALN (n>=0 not null), POSITIVE (n>0),
POSITIVEN (n>0 not null), SIGNTYPE (-1, 0, 1).
PLS_INTEGER Possui as mesmas caractersticas do tipo
21
BINARY_INTEGER, entretanto possui melhor performance para
clculos.
Instrutor: Mrcio Mendona

Oracle Database 11g

Data
O tipo DATE permite valores de data e hora. O formato
padro definido pelo parmetro NLS_DATE_FORMAT. O
Oracle armazena internamente a data em formato de nmero
juliano com a parte fracionria usada para controlar a hora.
Uma data Juliana corresponde ao nmero de dias desde 1 de
Janeiro de 4712 A.C.
Para operaes aritmticas com datas no Oracle, basta
adicionar ou subtrair nmeros inteiros ou fracionrios. Por
exemplo, SYSDATE + 1 para somar uma dia, 1/24 para
acrescentar uma hora, 1/(24x60) ou 1/1440 para acrescentar
1 minuto e 1/(24x60x60) ou 1/86400 para um segundo.
22

Instrutor: Mrcio Mendona

Oracle Database 11g

Lob
Large Object (LOB) datatypes so usado para armazenar
dados no estruturados como imagens, arquivos binrios. Os
tipos LOBs podem armazenar at 4GB de informao. A
manipulao dos tipos LOB feita atravs da package
DBMS_LOB.
- BLOBBinary Large Object: Armazena at 4GB de dados
binrios no banco
-CLOBCharacter Large Object: Armazena at 4GB de dados
carter
- BFILEBinary File: Armazena at 4GB de dados em arquivos
binrios externos. Uma coluna BFILE armazena um ponteiro
para o arquivo armazenado no sistema operacional.

Instrutor: Mrcio Mendona

Oracle Database 11g

23

Booleano
O nico tipo de dados na famlia booleana o BOOLEAN.
Variveis booleanas so utilizadas em estruturas de controle
da PL/SQL como as instrues IF-THEN-ELSE e de LOOP.
Podem conter apenas os valores TRUE, FALSE ou NULL.

24

Instrutor: Mrcio Mendona

Oracle Database 11g

Utilizando %TYPE
Utilizado para declarar uma varivel com o mesmo tipo de uma
coluna de alguma tabela, ex:
DECLARE
v_Nome STUDENTS.FIRST_NAME%TYPE;
v_Idade PLS_INTEGER NOT NULL :=0;
v_IdadeTemp v_Idade%TYPE; --no herda restrio
nem valor default

25

Instrutor: Mrcio Mendona

Oracle Database 11g

Variveis de Host
So variveis declaradas no ambiente operacional que
podem ser referenciadas nos comandos PL/SQL.
Sintaxe:
:nome_da_varivel := expresso;
Onde expresso pode ser uma varivel, um valor,
uma expresso usada para chegar a um valor especfico.

26

Instrutor: Mrcio Mendona

Oracle Database 11g

Converso entre Tipos de


Dados
Quando possvel, a PL/SQL converter
automaticamente (converso implcita) tipos
dentro da mesma famlia e entre as famlias de
tipos de dados:
Caracteres e nmeros
Caracteres e datas

27

Instrutor: Mrcio Mendona

Oracle Database 11g

Funes mais utilizadas para


converso explcita de dados
TO_CHAR
Converte seu argumento em um tipo VARCHAR2
TO_DATE
Converte seu argumento em um tipo DATE
TO_NUMBER
Converte seu argumento em um tipo NUMBER

28

Instrutor: Mrcio Mendona

Oracle Database 11g

Funes de caracter
que retornam
valores caracter

29

Instrutor: Mrcio Mendona

Oracle Database 11g

Funes Pr Definidas
CHR (x[using nchar_cs])
Retorna o caractere que tem o valor equivalente ao x no conjunto de
caracteres do banco de dados. CHR e ASCII so funes opostas.
CONCAT (string1, string2)
Retorna string1 concatenada com string2. Essa funo idntica ao operador
|| .
INITCAP (string)
Retorna string com o primeiro caractere de cada palavra em letra maiscula e
os caracteres restantes de cada palavra em letras minsculas.

30

Instrutor: Mrcio Mendona

Oracle Database 11g

Funes Pr Definidas
LOWER (string)
Retorna string com todos os caracteres em letras minsculas. Quaisquer
caracteres que no forem letras permanecem intactos. Se string tiver o tipo de
dados CHAR, o resultado tambm ser CHAR. Se string for VARCHAR2, o
resultado ser VARCHAR2.
LPAD (String1, x[string2])
Retorna string1 preenchida esquerda at o comprimento x com os caracteres
em string2.
LTRIM (String1,String2)
Retorna string1 com os caracteres mais esquerda aparecendo em string2
removidos. string2 assume o padro de um espao em branco.

31

Instrutor: Mrcio Mendona

Oracle Database 11g

Funes Pr Definidas
REPLACE (string, string_a_pesquisar [string_substituta])
Retorna string com cada ocorrncia de string_a_pesquisar susbstituda por
string_substituta.
RPAD (string1, x, [string2])
Retorna string1, com os caracteres mais direita que aparecem em string2,
removidos. A string2 assume o padro de um espao em branco.
TRANSLATE (string, str_de, str_para)
Retorna string com todas as ocorrncias de cada caractere em
str_de_substitudo pelo caractere correspondente em str_para.

32

Instrutor: Mrcio Mendona

Oracle Database 11g

Funes Pr Definidas
TRIM([{{LEADING|TRAILING|BOTH}[aparar_char])|
aparar_char}FROM]string)
Retorna string com as ocorrncias inicial, final ou ambas de aparar_char
removidas.
UPPER (string)
Retorna string com todas as letras em maisculas.
SUBSTR
Sintaxe:
SUBSTR (string, a[,b])
Retorna uma parte da string que inicia no caractere a, com o comprimento dos
caracteres b. Se a for 0, tratado como 1 (o incio da string). Se a for positivo,
os caracteres que retornam so contados da esquerda. Se a for negativo, os
caracteres retornam iniciando do final da string e so contados da direita. Se
33b
no estiver presente, a string inteira assumida como padro. Se b for menor
que 1, NULL retornado. Se um valor de ponto flutuante for passado para a e
b, o valor primeiro truncado para um inteiro. O tipo de retorno sempre do
Instrutor: Mrcio Mendona
Oracle Database 11g
mesmo tipo da string.

Funes de caracter
que retornam valores
numricos

34

Instrutor: Mrcio Mendona

Oracle Database 11g

Funes Pr Definidas
ASCII (string)
Retorna a representao decimal do primeiro byte de string no conjunto de
caracteres do banco de dados.
INSTR (string1,string2 [,a] [,b])
Retorna a posio dentro de string 1 onde string2 est contida, com a e b
medidos em caracteres.
LENGTH (string)
Retorna o comprimento de string medido em caracteres.
INSTR
Sintaxe:
INSTR (string1, string2 [,a] [,b])
Retorna a posio dentro de string1 em que string2 est contida.

Instrutor: Mrcio Mendona

Oracle Database 11g

35

Funes numricas

36

Instrutor: Mrcio Mendona

Oracle Database 11g

Funes Pr Definidas
MOD(x,y)
Retorna o resto de x dividido por y. Se y for 0, x retomado.
ROUND(x[,y])
Retorna x arredondado para y casas direita do ponto decimal. Y assume o
padro de 0, o qual arredonda x para o inteiro mais prximo. Se y for negativo,
os dgitos esquerda do ponto decimal so arredondados. Y deve ser um
inteiro.
TRUNC (x,[,y])
Retorna x truncado (em oposio a arredondado ) para y casas decimais. Y
assume o padro de 0, o que trunca x para um valor de inteiro. Se y for
negativo, os dgitos esquerda do ponto decimal so truncados.

37

Instrutor: Mrcio Mendona

Oracle Database 11g

Funes de Datas

38

Instrutor: Mrcio Mendona

Oracle Database 11g

Funes Pr Definidas
ADD_MONTHS(d,x)
Retorna a data d mais x meses. X pode ser qualquer inteiro. Se o ms
resultante tiver menos dias que o ms d, o ltimo dia do ms resultante
retornado. Se no, o resultado tem o mesmo componente de dia que d. O
componente de hora de d e o resultado so os mesmos.
LAST_DAY
Retorna a data do ltimo dia do ms que contm d.Essa funo pode ser
utilizada para determinar quantos dias restam no ms atual.
MONTHS_BETWEEN
Retorna o nmero de meses entre a data1 ea data2.
SYSDATE
Retorna a data e a hora atual no tipo DATE.
TRUNC (d,[,formato])
Retorna a data d truncado para a unidade especificada por formato.
Instrutor: Mrcio Mendona

Oracle Database 11g

39

Escopo de Variveis
O escopo de uma varivel a parte do programa onde a varivel
pode ser acessada antes de ser liberada da memria.
A visibilidade de uma varivel a parte do programa
onde a varivel pode ser acessada sem ter de qualificar a
referncia.
DECLARE
x number;
BEGIN
........
DECLARE
y number;
BEGIN
........
........
END;
..........
Instrutor: Mrcio
END;Mendona

Oracle Database 11g

40

Operadores
O operador mais bsico na PL/SQL o de atribuio. A atribuio de

valores permite mudar o valor de uma varivel j definida em


uma seo DECLARE.
Sintaxe:
nome_da_varivel := expresso;
Onde expresso pode ser um outro identificador, um
valor, uma expresso usada para chegar a um valor
especfico, uma linha ou coluna de um outro identificador ou
de uma tabela ou cursor, uma varivel de host dependendo
de como o nome_da_varivel foi declarado.

Instrutor: Mrcio Mendona

Oracle Database 11g

41

Outros Operadores

42

Instrutor: Mrcio Mendona

Oracle Database 11g

Expresses Booleanas
Todas as estruturas de controle PL/SQL envolvem
expresses booleanas, tambm conhecidas como
condies.
Uma expresso booleana qualquer expresso que
avaliada como um valor booleano (TRUE, FALSE ou
NULL).

43

Instrutor: Mrcio Mendona

Oracle Database 11g

Usando PL/SQL com PL/SQL


Developer

44

Instrutor: Mrcio Mendona

Oracle Database 11g

Criao de Tabelas
Create table alunos as
(codigo number(3),
nome varchar2(50),
endereco varchar2(150),
codigo_profissao varchar2(50));
Create table profissoes as
(codigo number(2),
descricao varchar2(50));
45

Instrutor: Mrcio Mendona

Oracle Database 11g

Inserindo Registros
Insert into profissoes
(codigo, descricao) values (1,Analista de
Sistemas);
Insert into alunos
(codigo, nome, endereco, codigo_profissao) values
(1,Maria,Av Afonso Pena, 600,1);

46

Instrutor: Mrcio Mendona

Oracle Database 11g

Exemplo de Declarao
DECLARE
v_desc varchar2(50);
BEGIN
SELECT descricao INTO v_desc
FROM profissoes
WHERE codigo = 1;
END;

47

Instrutor: Mrcio Mendona

Oracle Database 11g

Comandos SQL em Blocos PL/SQL


Cada comando SQL deve terminar com um
ponto e vrgula(;)
Um bloco PL/SQL no uma unidade de
transao. Os comandos COMMIT e ROLLBACK
devem ser usados dependendo da necessidade
da aplicao.
Comandos DDL no so permitidos.
48

Instrutor: Mrcio Mendona

Oracle Database 11g

Comandos SQL em Blocos PL/SQL


Comandos SELECT que no retornam apenas
uma linha causam uma exeception a ser
tratada pelo usurio;
Comandos DML podem processar diversas
linhas ao mesmo tempo.

49

Instrutor: Mrcio Mendona

Oracle Database 11g

DDL X DML
SQL apresenta uma srie de comandos que permitem a definio
dos dados, chamada de DDL ( Data Definition Language) ,
composta entre outros pelos comandos Create, que destinado
a criao do Banco de Dados, das tabelas que o compe, alm
das relaes existentes entre as tabelas. Como exemplo de
comandos da classe DDL temos os comandos Create, Alter e
Drop.
Os comandos da srie DML ( Data Manipulation Language),
destinados a consultas, inseres, excluses e alteraes em um
ou mais registros de uma ou mais tabelas de maneira
simultnea. Com exemplo de comandos da classe DML temos os
comandos Select, Insert, Update e Delete.
50

Um subclasse de comandos DML, a DCL ( Data Control Language),


dispe de comandos de controle como Grant e Revoke.
Instrutor: Mrcio Mendona

Oracle Database 11g

Comandos SQL

51

Instrutor: Mrcio Mendona

Oracle Database 11g

Usando Variveis PL/SQL em SQL


Valores de variveis e de constantes PL/SQL podem
ser passados e usados diretamente por comandos
SQL.
Exemplo:
DECLARE
Cod number(6) := 3;
BEGIN
UPDATE clientes SET conceito = 4
WHERE codigo = cod;
END;
Instrutor: Mrcio Mendona

Oracle Database 11g

52

Controle de Transaes
Para o ORACLE uma transao DML vai comear no
primeiro comando seguinte a um COMMIT ou
ROLLBACK, e vai terminar no prximo COMMIT ou
ROLLBACK.
Estas aes podem ocorrer dentro de um bloco
PL/SQL, serem controladas manualmente(atravs da
ferramenta utilizada) ou atravs de um evento do
sistema.
Os comandos de controle de transaes so
pemitidos em um bloco PL/SQL .
Instrutor: Mrcio Mendona

Oracle Database 11g

53

Controle de Transaes
Exemplo:
BEGIN
UPDATE
Detalhes_do_Pedido
SET
Desconto = 10
WHERE
Quantidade > 1000;
IF SQL%ROWCOUNT > 20
THEN ROLLBACK;
ELSE COMMIT;
END IF;
END;
Instrutor: Mrcio Mendona

Oracle Database 11g

54

Usos do Comando SELECT em PL/SQL


A) Atribuir valor a uma varivel: Neste caso, deve
retornar sempre apenas uma linha de resposta.
Sintaxe:
SELECT coluna_1,..., coluna_n
INTO varivel_1, ..., varivel_n
FROM tabela_1,..., tabela_n WHERE condio.

Onde coluna_i colocada na varivel_i. E cada


varivel j foi declarada.
Instrutor: Mrcio Mendona

Oracle Database 11g

55

Usos do Comando SELECT em PL/SQL


B) Como subquerie de um outro comando, neste caso sem a clusula INTO.

Exemplo:
INSERT INTO funcionarios
SELECT max(cod_funcionario) + 1, 'fulano', sysdate,777,1000,2000
FROM funcionarios;

56

Instrutor: Mrcio Mendona

Oracle Database 11g

Tratamento de
Excesses
57

Instrutor: Mrcio Mendona

Oracle Database 11g

Tratamento de Excees
Em PL/SQL, um aviso ou condio de erro
denominado uma exceo.
Excees podem ser definidas internamente ou pelo
usurio.
Uma exceo pr-definida disparada implicita e
automaticamente pelo sistema. Excees definidas
pelo usurio devem ser escritas em rotinas separadas
e disparadas explicitamente
58

Instrutor: Mrcio Mendona

Oracle Database 11g

Tratamento de Excees
Exemplos de Excees Pr-definidas:

59

Instrutor: Mrcio Mendona

Oracle Database 11g

Tratamento de Erros
Quando um erro ocorre, uma exceo disparada, a
execuo normal interrompida e o controle
passado para a parte de tratamento de excees do
bloco.
Se uma exceo encontrada no tem tratamento
ento o bloco PL/SQL terminado com a mensagem:
UNHANDLED EXCEPTION.

60

Instrutor: Mrcio Mendona

Oracle Database 11g

Tratamento de Erros
Exemplo de declarao de uma
Exception:
DECLARE
nome EXCEPTION;
...........
BEGIN
...........
EXCEPTION
WHEN no_data_found THEN
...........
WHEN two_many_rows THEN
...........
END;

Instrutor: Mrcio Mendona

Oracle Database 11g

61

Capturando Excees
Na seo EXCEPTION pode ser definida uma exceo que
capture uma outra exceo que no foi definida, quando esta
ocorrer.
Exemplo:
DECLARE
preco NUMBER(5,2);
BEGIN
SELECT
Preco_Unitario
INTO
preco
FROM
Produtos
WHERE
Cod_Produto = 1;
IF preco > 120 THEN
UPDATE Produtos
SET Preco_Unitario = 90
WHERE Cod_Produto = 1
END IF;
END;
Instrutor: Mrcio Mendona

Oracle Database 11g

62

Capturando Excees
DECLARE
preco NUMBER(5,2);
BEGIN
SELECT Preco_Unitario
INTO preco
FROM Produtos
WHERE Cod_Produto = 3;
IF preco > 120 THEN
UPDATE Produtos
SET Preco_Unitario = 90
WHERE Cod_Produto = 3;
END IF;
EXCEPTION
WHEN no_data_found THEN
INSERT INTO error_tab VALUES ('Cdigo no cadastrado');
WHEN too_many_rows THEN
INSERT INTO error_tab VALUES ('Mais de um produto com cdigo 1');
WHEN others THEN
INSERT INTO error_tab VALUES ('Erro ocorrido no bloco');
END;
Instrutor: Mrcio Mendona

Oracle Database 11g

63

Funes teis na Captura de Erros


Para tratarmos uma exceo, podemos utilizar as
funes SQLCODE e SQLERRM, para descobrirmos qual
erro ocorreu e conseguir a mensagem associada ao
erro.
SQLCODE: Retorna o nmero da mensagem associada
ao erro ocorrido, para excees internas.
SQLERRM: Retorna a mensagem associada ao erro
ocorrido.
64

Instrutor: Mrcio Mendona

Oracle Database 11g