Escolar Documentos
Profissional Documentos
Cultura Documentos
O PL/SQL uma linguagem procedural que roda diretamente no ncleo do SGBD Oracle.
O objetivo deste tutorial mostrar a criao de funes e procedimentos em PL/SQL, interagindo
com comandos SQL padres.
Logado no OracleXE vamos acessar a opo:
Vamos construir uma funo que calcula a mdia ponderada. Esta funo ter como
parmetros quatro valores numricos e ir retornar o calculado. Acompanhe a criao desta
funo:
Passo-1: Nome da funo e tipo de retorno:
return NUMBER
o valor de retorno da funo, ao final do seu processamento ela deve retornar a quem chamou
um nmero.
is
Indica que a escrita da funo ir comear.
mp NUMBER;
Estamos declarando uma varivel de escopo local do tipo nmero para ser usada durante o
processo de calculo.
return mp;
Retorna para quem chamou o valor da mdia ponderada.
INSERT INTO Tab_MP (n1, p1, n2, p2) VALUES (10, 1, 5, 2);
INSERT INTO Tab_MP (n1, p1, n2, p2) VALUES (6, 1, 8, 2);
INSERT INTO Tab_MP (n1, p1, n2, p2) VALUES (10, 1, 8, 2);
INSERT INTO Tab_MP (n1, p1, n2, p2) VALUES (1, 1, 7, 3);
Exerccio Proposto:
1) Crie uma funo que dado o nmero de minutos retorne o nmero de horas
correspondente.
2) Crie uma funo que dado um salrio retorne o nmero de salrios mnimos que a pessoa
ganha.
1)
2)
Deciso:
Falso
IF <CONDIO> THEN
<BLOCO-VERDADEIRO>
ELSE
<BLOCO-FALSO>
END IF;
verdadeiro
Exerccio Proposto:
Dado um salrio X calcule o salrio lquido, sendo que os descontos de IRPF ocorrem conforme a
tabela abaixo:
Base de clculo mensal em
R$
At 1.313,69
De 1.313,70 at 2.625,12
15,0
Acima de 2.625,12
27,5
Alquota
%
Repetio:
LOOP
[BLOCO-REPETIO]
EXIT WHEN <CONDIO>
[BLOCO-REPETIO]
END LOOP;
Falso
Verdadeiro
Desejamos criar uma funo que recebe um nmero e informa se o nmero ou primo:
Exerccio Proposto
Dado um nmero X representando a quantidade de nmeros primos que se deseja retornar.
Mostre a lista com os X primeiros primos a partir de 2:
Cursores
Cursor no PL/SQL uma forma de tratar um resultado de consulta de forma
personalizada. Podemos trabalhar registro a registro aplicando uma lgica prpria.
Sintaxe Geral:
DECLARE
CURSOR <NOME-CURSOR> IS
<CONSULTA>;
<VARIAVEL-REGISTRO> <NOME-CURSOR>%ROWTYPE;
BEGIN
OPEN <NOME-CURSOR>;
LOOP
FETCH <NOME-CURSOR> INTO <VARIAVEL-REGISTRO>;
EXIT WHEN <NOME-CURSOR>%NOTFOUND;
/* LGICA PERSONALIZADA
INSERIR, ALTERAR EM OUTRA TABELA;
- FAZER ALGUM CALCULO, EXPRESSES;
*/
END LOOP;
CLOSE <NOME-CURSOR>;
END;
Desejamos ler registro a registro a tabela FUN e mostrar os funcionrios e seus salrios,
informando ainda se o salrio do mesmo acima ou abaixo da mdia:
create or replace PROCEDURE LISTAFUN is
CURSOR c_fun is SELECT * FROM Fun;
r_fun c_fun%ROWTYPE;
media NUMBER;
BEGIN
SELECT AVG(salario) INTO media FROM Fun;
DBMS_OUTPUT.PUT_LINE('Mdia=' || to_char(media));
DBMS_OUTPUT.PUT_LINE('Lista de Funcionrios');
OPEN c_fun;
LOOP
FETCH c_fun INTO r_fun;
EXIT WHEN c_fun%NOTFOUND;
if r_fun.salario>=media THEN
DBMS_OUTPUT.PUT_LINE(r_fun.nomeFun || ' - ' || to_char(r_fun.salario) || ' - Salrio maior ou
igual a mdia');
ELSE
DBMS_OUTPUT.PUT_LINE(r_fun.nomeFun || ' - ' || to_char(r_fun.salario) || ' - Salrio menor
que a mdia');
END IF;
END LOOP;
CLOSE c_fun;
END LISTAFUN;
Para rodar este procedimento:
begin
listafun;
end;