You are on page 1of 10

Exerccios PL/SQL AULA 3

Exemplo 1
VARIABLE linhas_deletadas VARCHAR2(30)
DECLARE
v_deptno NUMBER := 10;
BEGIN
DELETE FROM emp
WHERE
deptno = v_deptno;
:linhas_deletadas := (SQL%ROWCOUNT || ' linhas deletadas.');
END;
/
print linhas_deletadas

Exemplo 2
ACCEPT p_cargo_func PROMPT 'Digite o CARGO do funcionrio
VARIABLE g_n_ocorrencias NUMBER;
Create table sal_tot ( ename varchar2(50), sal number(7,2));
DECLARE
v_cargo_func emp.job%TYPE :=upper( '&p_cargo_func');
v_nome_func emp.ename%TYPE;
v_sal_mes emp.sal%TYPE;
v_sal_ano number(9,2);
CURSOR sal_func_cursor IS
SELECT ename, sal, sal * 12
FROM emp
WHERE job = v_cargo_func;
BEGIN
OPEN sal_func_cursor;
LOOP
FETCH sal_func_cursor INTO v_nome_func, v_sal_mes, v_sal_ano;
EXIT WHEN sal_func_cursor%NOTFOUND;
INSERT INTO sal_tot(ename,sal) VALUES(v_nome_func, v_sal_ano);
END LOOP;
:g_n_ocorrencias := sal_func_cursor%ROWCOUNT;
CLOSE sal_func_cursor;
END;
/
PRINT g_n_ocorrencias
Select * from sal_tot;

Exemplo 3
DECLARE
cursor cursor_ex_atual
is
select ename, job, sal from emp
for update of sal nowait;
reg_ex_atual cursor_ex_atual%rowtype;
BEGIN
for reg_ex_atual in cursor_ex_atual loop
if reg_ex_atual.job = CLERK then
update emp set sal = sal * 1.10
where current of cursor_ex_atual;
elsif reg_ex_atual.job = PRESIDENT then
update emp set sal = sal + sal
where current of cursor_ex_atual;
else
delete from emp
where current of cursor_ex_atual;
end if;
end loop;
END;
/
select * from emp;
Exemplo 4
DECLARE
cursor cursor_ex_atual
is
select ename, job, sal,comm from emp
for update of sal,comm nowait;
reg_ex_atual cursor_ex_atual%rowtype;
BEGIN
for reg_ex_atual in cursor_ex_atual loop
if reg_ex_atual.job = CLERK then
update emp set sal = sal * 1.10
where current of cursor_ex_atual;
elsif reg_ex_atual.comm is null then
update emp set comm = sal*0.10
where current of cursor_ex_atual;
elsif reg_ex_atual.job = PRESIDENT then
update emp set sal = sal + sal
where current of cursor_ex_atual;
else
delete from emp
where current of cursor_ex_atual;
end if;
end loop;
END;
/
select * from emp;

Exemplo 5
Create table dept10 as (select empno,ename,deptno,job from emp);
Truncate table dept10;
ACCEPT p_cargo PROMPT 'Digite o CARGO do funcionrio
ACCEPT p_deptno PROMPT 'Digite o cdigo do Departamento
DECLARE
V_empno emp.empno%type;
V_ename emp.ename%type;
V_deptno emp.deptno%type;
V_job emp.job%type;
CURSOR emp_cursor
(p_deptno NUMBER, p_job VARCHAR2) IS
SELECT empno, ename,deptno,job
FROM
emp
WHERE deptno = p_deptno
AND
job = p_job;
BEGIN
If not emp_cursor%isopen then
OPEN emp_cursor(&p_deptno, upper(&p_cargo));
End if;
LOOP
FETCH emp_cursor INTO v_empno, v_ename, v_deptno, v_job;
EXIT WHEN emp_cursor%NOTFOUND;
INSERT
INTO
dept10(empno,ename,deptno,job)
v_ename,v_deptno,v_job);
END LOOP;
Close emp_cursor;
END;
/

VALUES(v_empno,

select * from dept10;

Exemplo 6
Declare
CURSOR my_cursor IS
SELECT t1.deptno, t1.dname, t2.STAFF
FROM dept t1, (SELECT deptno, count(*) STAFF
FROM emp
GROUP BY deptno) t2
WHERE t1.deptno = t2.deptno;
Reg_my_cursor my_cursor%rowtype;
Begin
For reg_my_cursor in my_cursor loop
Dbms_output.put_line ( O departamento || reg_my_cursor.dname|| tem ||
reg_my_cursor.staff || funcionarios.);
End loop;
END;
/

Escreva blocos PL/SQL para:


1 Faa um bloco PL/SQL para recuperar todos os funcionrios da tabela EMP um a um
usando FOR LOOP em conjunto com um cursor. Fazer uma condio IF/END IF para saber
quais os funcionrios que ganham menos que 2000 e deleta-los.

Select * from emp;


Declare
Cursor emp_cursor is
Select *
From emp
for update of sal nowait;
Reg_emp emp_cursor%rowtype;
Begin
For reg_emp in emp_cursor loop
If reg_emp.sal < 2000 then
Delete from emp
Where current of emp_cursor;
End if;
End loop;
End;
/
Select * from emp;
v

2 - Faa um cursor que execute a soma de todos os salrios da tabela EMP do usurio
SCOTT e mostre o resultado na tela.

Declare
Cursor soma_sal is
Select sum(sal)
From emp;
V_soma emp.sal%type;
Begin
Open soma_sal;
Loop
Fetch soma_sal into v_soma;
Dbms_output.put_line(Soma
salarial:|| v_soma);
Exit when soma_sal%notfound;
End loop;
Close soma_sal;
End;
/

3 - Faa um cursor que execute um acrscimo de salrio de 10% para todos os empregados
da tabela EMP do usurio SCOTT e mostre na tela os resultados do salrio anterior e
posterior ao acrscimo de salrio.

Declare
Cursor emp_cursor is
Select *
From emp
For update of sal nowait;
Reg_emp emp_cursor%rowtype;
Begin
For reg_emp in emp_cursor loop
Dbms_output.put_line('Funcionario:'||
reg_emp.ename|| ' Salario Anterior:' ||
reg_emp.sal);
Update emp
Set sal= sal * 1.1
Where current of emp_cursor;
End loop;
For reg_emp in emp_cursor loop
7

Dbms_output.put_line('Funcionario:'||
reg_emp.ename|| ' Salario com Aumento:'
|| reg_emp.sal);
End loop;
End;
/

4 - Criar um cursor para aumentar em 20% cada salrio dos empregados que trabalham no
departamento 10 e cuja funo seja CLERK. Usar a clusula WHERE CURRENT OF na
instruo UPDATE.

SELECT ENAME, SAL FROM EMP


WHERE
DEPTNO=10
JOB=CLERK;

AND

Declare
Cursor emp_cursor is
Select SAL
From emp
WHERE DEPTNO=10
AND JOB=CLERK
For update of sal nowait;
Reg_emp emp_cursor%rowtype;
Begin
For reg_emp in emp_cursor loop
Update emp
Set sal= sal * 1.2
Where current of emp_cursor;
End loop;
End;
/
9

5 - Crie um cursor que delete todos os empregados que ganham menos que 1500.
6 - Crie um cursor que altere os cargos dos empregados que ganham mais do que 2999 para
DBA e mostrar na tela o nome, o cargo e o departamento deste. Utilizar a declarao de
registro implcita na estrutura de repetio e a opo where current of para realizao da
atualizao.

7 Faa um bloco PL/SQL para recuperar todos os funcionrios da tabela DEPT um a um


usando FOR LOOP em conjunto com um cursor. Fazer uma condio IF/END IF para saber
quais os departamentos esto localizados (campo loc) em NEW YORK e mud-los para
SANTOS.
8 Faa um bloco PL/SQL para recuperar todos os funcionrios da tabela EMP um a um
usando FOR LOOP em conjunto com um cursor. Usar as condies para realizar as devidas
alteraes como segue tabela abaixo:
Condio 1
Mdia Salarial <= 1000
Mdia Salarial > 1000
Mdia Salarial > 3000

Condio 2
Mdia Salarial <= 3000

Atualizar salrio em
20%
15%
10%

10

You might also like