Você está na página 1de 29

Comandos Básicos da

Linguagem PL/SQL

Msc. Ricardo Esteves Kneipp


Ricardo.kneipp@gmail.com
O que é a Linguagem Pl/SQL?

• A linguagem PL/SQL é a linguagem procedural do


Oracle, sendo considerada uma extensão da
linguagem SQL. Rotinas escritas em Java, C++,
Cobol podem ser chamadas pelo Oracle. A
linguagem PL/SQL associa a facilidade de
manipulação da linguagem SQL à da
programação de uma linguagem procedural.
• Através da PL/SQL, cria-se vários objetos como :
functions, stored procedures, triggers e packages.
Uma aplicação Pl/SQL envia de uma só
vez o bloco Pl/SQL para SGBD,

Enquanto uma aplicação usando somente


SQL enviará um comando por vez resultando
em perda de performance
Blocos Pl/SQL
A linguagem PL/SQL é divida em três blocos:
Seção de declaração, de execução e de exceção.
• Seção de declaração (opcional) : É iniciada
sempre com o comando DECLARE. É o local
onde são declaradas as variáveis e constantes.
• Seção de execução (obrigatória) : Iniciada pelo
comando BEGIN. Esta área aloca os comandos
PL/SQL.
• Seção de exceção (opcional): Iniciada pelo
comando EXCEPTION. Está área é o local onde
são tratados os erros.
Variáveis e constantes
• A PL/SQL permite a declaração de variáveis e constantes que podem ser
utilizadas em comandos SQL contidos em stored procedures e functions. As
variáveis podem ter qualquer tipo de datatype usados pelo Oracle (number,
date, char, varchar2....), além dos tipos apresentados abaixo:
• Boolean : Valores lógicos, podem assumir os seguintes valores : (true, false,
null).
• Binary_integer: Trabalha com números entre -2.147.483.647 à 2.147.483.647.
• Positive: Trabalha com números entre 1 à 2.147.483.647.
• Natural : Trabalha com números entre 0 à 2.147.483.647.
• % type : Atribui à variável que está sendo criada o mesmo tipo de dados que
faz referência a utilizada no banco de dados.
• Ex.; codigo := clientes.codcli%type;
• As duas formas de atribuição de valores a uma variável são:
• Através do símbolo :=, e do uso do comand select.
• Ex.: total:=total+1;
• Select pvenda * 0.30 INTO novopreco from produtos;
Constantes

• A declaração de constantes é idêntica a de


variáveis; com um adendo, a utilização da
palavra CONSTANT.
• Ex.: novopreco CONSTANT real :=3.54;
Estrutura de controle – IF /
Then / Else
• O comando IF .. THEN.. ELSIF

• O comando IF.. THEN, avalia uma condição e executa uma ou mais instruções somente se a condição for verdadeira.

• Sintaxe:

• IF <condição> THEN
• <comando 1>
• <comando 2>
• <comando 3>
• END IF

• IF <condição> THEN
• <comando 1>
• ELSIF <condição 2> THEN
• <comando 2>
• ELSIF <condição 3> THEN
• <comando 3>
• ELSE
• <comando 4>
• END IF;

• Ex IF novopreco < 100 THEN


• UPDATE produtos
• Set preco = preco * 1.10;
• ELSIF novopreco < 200 THEN
• UPDATE produtos
• Set preco = preco * 1.20;
• ELSE
• UPDATE produtos
• Set preco = preco * 1.20;
• END IF;
O comando LOOP
O LOOP inicializa um grupo de comandos até que uma condição force o desvio para uma
outra parte do programa. O comando LOOP, é usado em conjunto com o comando
EXIT, responsável pela parada de execução do LOOP.
Sintaxe:
LOOP
<comando1>
EXIT
<comando2>
<comando3>
END LOOP;
LOOP
<comando1>
EXIT [<nome da label>] WHEN <condição>
<comando2>
<comando3>
END LOOP.
O comando FOR...LOOP

Os comandos são executados automaticamente


até que uma condição avaliada retorne FALSE.
SINTAXE:
For <contador> IN [REVERSE] <valor inicial> ..
<valor final> LOOP
<comando1>
<comando2>
<comando3>
Começando a programar em
PL/SQL
Crie a tabela teste conforme abaixo:
Create table teste (num number(4), data date, observação varchar2(100));

Exemplo :
-- exemp1.sql
declare
cont int:=0;
begin
for cont in 1..10 loop
insert into teste
values (cont, sysdate, 'Numero '|| cont);
end loop;
end;
O comando WHILE

O comando While analisa uma condição e,


somente se esta condição for verdadeira,
executa os comandos contidos dentro dessa
estrutura.
SINTAXE:
WHILE <condição> LOOP
<comandos1>
<comandos2>
END LOOP
Exemplo do comando While
-- exemp2.sql
declare
cont int:=0;
begin
delete from teste
while cont <= 5 loop
insert into teste
values (cont, sysdate, 'Numero '||cont);
cont:=cont+1;
end loop;
end;
Terceiro exemplo.
-- exemp3.sql
declare
cont int:=0;
begin
for cont in 1..10 loop
if mod(cont,2) = 0 then
insert into teste
values (cont, sysdate, 'PAR');
else
insert into teste
values (cont, sysdate, 'IMPAR');
end if;
end loop;
end;
Referenciando variáveis não
PL/SQL
• Alguns produtos externos ao Oracle com por
exemplo Forms, Reports e o utilitário SQL
PLUS, podem passar valores para blocos
PL/SQL para serem utilizados internamente.
Para isso basta prefixar a variável com dois
pontos (:).
• Exemplo:
• :e_variavel_externa:=v_variavel_interna +
10;
Exemplo 4
• Accept p_in_out PROMPT ‘Entre com o parâmetro
IN/OUT: ‘
• Variable e_in_out char(20)
• Declare
• v_interna varchar2(20):= ‘&p_in_out’;
• begin
• :e_in_out := SUBSTR(v_interna,3, 5);
• End;
• Agora digite :
• Print e_in_out e pressione a tecla enter
Exemplo 5 cursoaluno.sql
• ACCEPT p_cod PROMPT 'ENTRE COM UM CODIGO DO
ALUNO'
• VARIABLE e_nome varchar2(50);
• declare
• v_nome cursoaluno.nome%type;
• begin
• select nome into v_nome from alunos
• where matricula=&p_cod;
• :e_nome:=v_nome;
• end;
• print e_nome
Exemplo 6 – novo.sql
declare
r_novo novo%rowtype;
begin
r_novo.codigo:=1;
r_novo.nome:='Ricardo Esteves Kneipp';
insert into novo values
(r_novo.codigo,r_novo.nome, null);
end;
Procedures

• Uma procedure nada mais é do um bloco PL/SQL


nomeado. A grande vantagem sobre um bloco PL/SQL
anônimo é que pode ser compilado e armazenado no
banco de dados como um objeto de schema. Graças a
essa característica as procedures são de fácil
manutenção, o código é reutilizável e permitem que
trabalhemos com módulos de programa.
• Uma procedure é, então, um bloco PL/SQL nomeado que
pode aceitar argumentos (também chamado de
parâmetros) e pode ser chamada por um programa,
uma sessão SQL ou uma trigger.
Sintaxe - Procedure
A sintaxe básica de uma procedure é:
CREATE [OR REPLACE] PROCEDURE [schema.]nome_da_procedure [(parâmetro1 [modo1]
tipodedado1, parâmetro2 [modo2] tipodedado2, ...)]IS|ASBloco PL/SQL
Onde:
REPLACE - indica que caso a procedure exista ela será eliminada e substituída pela nova versão
criada pelo comando;
BLOCO PL/SQL - inicia com uma cláusula BEGIN e termina com END ou END nome_da_procedure;
NOME_DA_PROCEDURE - indica o nome da procedure;
PARÂMETRO - indica o nome da variável PL/SQL que é passada na chamada da procedure ou o
nome da variável que retornará os valores da procedure ou ambos. O que irá conter em
parâmetro depende de MODO;
MODO - Indica que o parâmetro é de entrada (IN), saída (OUT) ou ambos (IN OUT). É importante
notar que IN é o modo default, ou seja, se não dissermos nada o modo do nosso parâmetro será,
automaticamente, IN;
TIPODEDADO - indica o tipo de dado do parâmetro. Pode ser qualquer tipo de dado do SQL ou do
PL/SQL. Pode usar referencias como %TYPE, %ROWTYPE ou qualquer tipo de dado escalar ou
composto. Atenção: não é possível fazer qualquer restrição ao tamanho do tipo de dado neste
ponto.
IS|AS - a sintaxe do comando aceita tanto IS como AS. Por convenção usamos IS na criação de
procedures e AS quando estivermos criando pacotes.
BLOCO PL/SQL - indica as ações que serão executadas por aquela procedure.
Exemplo 8 - Procedure
• CREATE OR REPLACE PROCEDURE aumenta_sal
• (p_cod_func IN novo.codigo%TYPE)
• IS
• BEGIN
• UPDATE novo
• SET salario = salario * 1.10
• WHERE p_cod_func = codigo;
• END aumenta_sal;
CURSORES

Cursores são trechos alocados de memória


destinados a processar as declarações
SELECT. Podem ser definidos pelo próprio
PL/SQL, chamados de Cursores
Implícitos, ou podem ser definidos
manualmente, são os chamados de
Cursores Explícitos.
Cursores Explícitos

Esta técnica exige que o cursor seja declarado manualmente na


seção DECLARE, e deve conter somente declarações SELECT. Para
a sua utilização os seguintes passos devem ser observados:
1. Declarar o Cursor
2. Abrir o Cursor ( Preparar para sua utilização ) – Open
3. Buscar os dados – Fetch
4. Liberar memória após o uso ( Fechar o Cursor ) – Close

Nota: O Cursor é sempre definido na Seção DECLARE e é aberto após


o BEGIN. O número de variáveis que recebem dados na declaração
FETCH deve ser igual ao número de campos definidos na declaração
SELECT, quando da declaração do cursor. O sucesso ou insucesso
do cursor é determinado pelo teste %FOUND% ou %NOTFOUND
%. Este teste deve ser feito antes que o cursor seja fechado.
ATRIBUTO DESCRIÇÃO

%ISOPEN Atributo do tipo Boolean, (True/False), sendo


True quando o cursor está aberto
%NOTFOUND Atributo do tipo Boolean, (True/False),
sendo True quando o último FETCH não retornou linha.
%FOUND Atributo do tipo Boolean, (True/False), sendo
True quando o último FETCH retorna linha.
%ROWCOUNT Atributo numérico, que retorna o
número da linha retornada.
Exemplo de cursor
create or replace procedure exemp
is
cursor salario_cursor is select * from funcionarios for update;
v_salario funcionarios%rowtype;
begin
open salario_cursor;
loop
fetch salario_cursor into v_salario;
exit when salario_cursor%notfound;
If v_salario.salario>10000
then Delete from funcionarios
Where current of salario_cursor;
End if;
if (v_salario.salario>=500) and (v_salario.salario<=1500) then
update funcionarios
set salario=salario*1.30
Where current of salario_cursor;
end if;
if (v_salario.salario>=1500) and (v_salario.salario<=7000) then
update funcionarios
set salario=salario*1.15
Where current of salario_cursor;
end if;
End loop;
close salario_cursor;
commit;
end;
/
Cursor
declare
cursor c_insc_cursor is
select * from alunos_nas_turmas for update;
v_aluno alunos_nas_turmas%rowtype;
v_num_insc number(12):=999;
begin
open c_insc_cursor;
loop
fetch c_insc_cursor into v_aluno;
exit when c_insc_cursor%notfound;
if v_aluno.numero_insc>=50 then
update alunos_nas_turmas
set numero_insc=v_num_insc
where current of c_insc_cursor;
v_num_insc :=v_num_insc+1;
end if;
end loop;
close c_insc_cursor;
commit;
end
Outro exemplo
declare
cursor teste is select * from alunos
for update;
v_cidade alunos%rowtype;
cont int:=1;
begin
open teste;
loop
fetch teste into v_endereco;
exit when teste%NOTFOUND;
if v_cidade= ‘Petrópolis’
then update alunos
set endereco='Rua General Camara'|| cont;
cont:=cont+1;
end if;
end loop;
close teste;
end;
Cursor continuação
create or replace procedure exemp2
is
cursor c_cursos is select * from cursos for update;
v_cursos cursos%rowtype;
begin
open c_cursos;
loop
fetch c_cursos into v_cursos;
exit when c_cursos%notfound;
if v_cursos.duracao>=50
then update cursos
set preco=preco*1.50
where current of c_cursos;
end if;
if v_cursos.duracao>=20 and v_cursos.duracao<50
then update cursos
set preco=preco-preco*0.20
where current of c_cursos;
end if;
end loop;
close c_cursos;
commit;
end;
/
A figura abaixo apresenta os dados da tabela cursos antes da atualização.
Figura após a atualização

Você também pode gostar