Escolar Documentos
Profissional Documentos
Cultura Documentos
Captulo PL-SQL
1.1 A Linguagem Pl-SQL
1.2 Utilizao de Procedimentos e Funes
1.3 Estruturas de dados em PL-SQL
1.4 Procedures, Functions e Packages em PL-SQL
1.5 Triggers
Apresentao do Exerccio
Modelo Relacional
DEPT PROJECTS
PROJID
DEPNO
DNAME P_DESC
LOC P_START_DATE
BUDGET_AMOUNT
MAX_NO_STAFF
EMP ASSIGNMENTS
PROJID
EMPNO
EMPNO
DEPNO
JOB A_START_DATE
SAL
MGR A_END_DATE
ENAME BILL_RATE
HIREDATE ASSIGN_TYPE
COMM HOURS
SALGRADE
LOSAL
HISAL
GRADE
Dicionrio de Dados
Tabela EMP
Nome coluna Tipo Dados Tamanho Chaves Restries
Tabela DEPT
Nome coluna Tipo Dados Tamanho Chaves Restries
Tabela SALGRADE
Nome coluna Tipo Dados Tamanho Chaves Restries
Tabela ASSIGNMENTS
Tabela PROJECTS
EMP
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
DEPT SALGRADE
DEPNO DNAME LOC GRADE LOSAL HISAL
ASSIGNMENTS
PROJID EMPNO A_START_DATE A_END_DATE BILL_RATE ASSIGN_TYPE HOURS
PROJECTS
PROJID P_DESC P_START_DATE P_END_DATE BUDGET_AMOUNT MAX_NO_STAFF
FUNES
Definio de Funo
Uma funo PL-SQL um programa desenvolvido nesta linguagem cujo
objectivo e a devoluo de um valor que pode ser de qualquer tipo de
dados.
As funes podem aceitar argumentos de entrada necessrios produo
do resultado de sada.
<variable declarations>
BEGIN
<code_here>;
END <function_name>;
Exemplos:
Criar uma funo que retorna uma string
-- Criar a funo
BEGIN
RETURN 'Simple Function';
END simple;
-- Executar a funo
Begin
select max(empno)+1
into novo_valor
from emp;
return (novo_valor);
end;
Chamada da funo
Select Get_empno from dual;
--Bloco de programa
BEGIN
Var_ent_1 := arg1;
Var_ent_2 := arg2;
Var_saida_3 := calculo_de_valor_de_saida;
return(var_saida_3);
END
Chamada da Funo
DECLARE
Arg1 tipo_dado;
Arg2 tipo_dado;
BEGIN
HTP.P(nome_funo(:arg1, :arg2));
END;
Exemplos
DECLARE
area number;
l1 number;
l2 number;
BEGIN
l1:= 2;
l2:= 2;
area :=POWER((l1*l2),2);
htp.p(' A area :' || area);
END
---Criar a funo
BEGIN
l1:= lado1;
l2:= lado2;
area :=POWER((l1*l2),2);
return(area);
END
Professor Jos Adriano 10
Escola Superior de Tecnologia e de Gesto de Bragana
Adriano@ipb.pt
Base de Dados ORACLE
Pl-SQL Exerccio das aulas
---Chamada da Funo
DECLARE
lado1 NUMBER;
lado2 NUMBER;
BEGIN
Htp.p(area_quadrado(:lado1, :lado2));
END;
Exerccio
-- Criar funo
END;
-- Chamar a funo
DECLARE
numero number;
BEGIN
Htp.p('o nome :' || nome_empregado(:numero));
END
NOTA:
Uma funo pode ser:
Executada de forma independente
select nome_empregado(7902) from dual;
select nome_empregado(:numero) from dual;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END date_diff;
Outra forma
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END date_diff;
EXCEPTION
WHEN OTHERS THEN
RETURN FALSE;
END is_number
Chamar Funo
DECLARE
BEGIN
IF is_number(:string) THEN
htp.p('TRUE');
ELSE
htp.p('FALSE');
END IF;
END;
BEGIN
IF is_digit(:chr_in) THEN
Htp.p('TRUE');
end if;
EXCEPTION
WHEN OTHERS THEN
Htp.p('False');
END;
De comprimento fixo
SELECT DBMS_RANDOM.STRING('X',8)
From Dual;
De comprimento varivel
SELECT
DBMS_RANDOM.STRING('X',TO_NUMBER(SUBSTR(TO_CHAR(DBMS_RANDOM.
NORMAL()),3,1)))
FROM DUAL
DECLARE
BEGIN
IF is_even(:num_in) THEN
Htp.p('TRUE');
end if;
EXCEPTION
WHEN OTHERS THEN
Htp.p('False');
END;
BEGIN
SELECT ename, job INTO nome, prof FROM emp
WHERE empno = empid;
RETURN ('Empregado ' || empid || ' - ' || UPPER(nome)|| ', ' || UPPER(prof) );
END trab_19;
Chamar funo
DECLARE
BEGIN
HTP.P(trab_19(:empid));
END;
EXERCICIOS:
BEGIN
Chamar Funo
DECLARE
empid NUMBER;
BEGIN
empid := :empid;
htp.p('The salary ranking for employee ' || empid
|| ' IS: ' || ROUND(exerc1(empid), 2));
END;
DECLARE
empid NUMBER;
BEGIN
empid := :empid;
htp.p ('The average ranking for employee ' || empid
|| ' IS: ' || ROUND(exerc2(empid), 2));
END;
BEGIN
/*
Most computers require the arguments of trigonometric functions to be
expressed in radians. To convert lon1, lat1 and lon2,lat2 from
degrees,minutes, seconds to radians, first convert them to decimal
degrees. To convert decimal degrees to radians, multiply the number
of degrees by pi/180 = 0.017453293 radians/degrees.
*/
/*
The intermediate result c is the great circle distance in radians.
Inverse trigonometric functions return results expressed in radians.
To express c in decimal degrees, multiply the number of radians by
180/pi = 57.295780 degrees/radian.
The great circle distance d will be in the same units as r.
*/
Chamar a funo
PROCEDIMENTOS - PROCEDURE
empid emp.empno%type;
nome emp.ename%type;
prof emp.job%type;
BEGIN
empid := 7902;
END;
BEGIN
salario_mensal:= x1;
dias_trabalho:= x2;
diaria:= salario_mensal/dias_trabalho;
htp.p ('O Valor da diaria : ' || To_char(diaria));
EXCEPTION
WHEN ZERO_DIVIDE THEN
diaria:=0;
END;
Chamada do procedimento
Begin
Trab_1(:x1, :x2);
End;
BEGIN
Variavel1:= var1;
Variavel2:= var2;
Variavel3:= var3;
Pond1:= valor1;
Pond2:= valor2;
Pond3:= valor3;
begin
Exerc_2(:var1, :var2, :var3, :valor1, :valor2, :valor3);
End;
BEGIN
Emp_id := NUM;
BEGIN
TRAB_4(:NUM);
END;
OBS.
Criar uma variante deste exerccio para uma valor de taxa varivel.
TRAB_1
Crie um procedimento PL-SQL que mostre o maior, menor e mdia
de salrios de uma determinada profisso.
Registo_emp emp%ROWTYPE;
profissao VARCHAR2(10);
avg_sal NUMBER;
min_sal NUMBER;
max_sal NUMBER;
BEGIN
profissao := prof;
SELECT AVG(sal), MIN(sal), MAX(sal) INTO avg_sal, min_sal, max_sal
FROM emp
WHERE emp.job = (profissao);
---------------------
BEGIN
TRAB_1(:prof);
END;
TRAB_2
Criar um procedimento que permita carregar em memria a
totalidade de um registo da base de dados, de um qualquer
empregado, e calcule um valor de bonificao de acordo com as
seguintes condies:
- Se o numero de empregado < 100 atribui um bnus de 500;
- Se o numero de empregado > 100 atribui um bnus de 500;
- se o numero de empregado = 100 atribui um bnus de 750;
Registo_emp emp%ROWTYPE;
bonus NUMBER(6):= 0;
Emp_id NUMBER(4);
BEGIN
Emp_id := Num_empregado;
htp.p ('O valor do Bonus para Empregado ' || registo_emp.ename|| ' is ' ||bonus );
EXCEPTION
When others then
htp.p ('Este empregado no existe');
END;
-------------------------
BEGIN
TRAB_2(:Num_empregado);
END;
TRAB_3
Crie um procedimento Pl-SQL que permita adicionar um bnus, para um
qualquer empregado da tabela Emp da Base de dados, calculado da seguinte
forma:
- Se empregado tiver at dois anos de casa, calcula um bnus com base numa
taxa que pode variar entre os 0-4% do salrio base;
- Se o empregado tiver entre dois e cinco anos de servio, calcula um bnus
com base numa taxa que pode variar entre os 5-7% do salrio base.
- Se o empregado tiver mais do que cinco anos de servio, calcula um bnus
que pode variar entre os 8-10% do salrio base.
CREATE OR REPLACE
PROCEDURE TRAB_3(Num_empregado IN NUMBER, taxa_Baixa IN NUMBER,
Taxa_media IN NUMBER, Taxa_alta IN NUMBER) AS
Registo_emp Emp%ROWTYPE;
bonus NUMBER(8,2);
Total NUMBER(8,2);
Tempo NUMBER(3);
Taxa_1 NUMBER(2);
Taxa_2 NUMBER(2);
Taxa_3 NUMBER(2);
Emp_id NUMBER(4);
BEGIN
Emp_id := Num_empregado;
Taxa_1 := Taxa_baixa;
Taxa_2 := Taxa_media;
Taxa_3 := Taxa_alta;
htp.p ('Nome Empregado: ' || (Registo_emp.ename) || ' Bonus is ' || (bonus) || '
Tempo Servio:' || (Tempo));
END;
---------------------------
BEGIN
TRAB_3(:Num_empregado, :taxa_baixa, :taxa_media, :taxa_alta);
END;
TRAB_4
Elabore um procedimento que carregue em memria o registo de
um determinado empregado e que calcule um valor de aumento
de salrio de acordo com as seguintes condies:
- Quando Profissao = Clerk e Salario < 3000 ento aumento = 8%
Seno aumento = 7%
- Quando Profissao = Analista e Salario< 4000 ento aumento = 6%
Seno aumento = 5%
Quando Profissao = Manager e Salario < 3500 ento aumento = 4%
Seno aumento = 3%
Registo_emp emp%ROWTYPE ;
salario NUMBER(8,2);
aumento NUMBER(3,2);
emp_id NUMBER(4);
BEGIN
Emp_id := Num_emp;
CASE
WHEN Registo_emp.job = 'clerk' THEN
IF Registo_emp.sal < 3000 THEN aumento := 0.08;
ELSE aumento :=0.07;
END IF;
END CASE;
htp.p ('Aumento de salario do: ' || emp_id || ' is: ' || aumento );
END;
-------------------------
BEGIN
TRAB_4(:num_emp);
END;
TRAB_5.1
Crie um procedimento que permita mostrar o nome e a profisso
de um determinado empregado, fazendo uso de um cursor.
CREATE OR REPLACE
PROCEDURE TRAB_5 (Numero IN NUMBER) AS
nome emp.ename%TYPE;
profissao emp.job%TYPE;
emp_id NUMBER;
CURSOR Empregado IS
SELECT ename, job
FROM emp
WHERE empno = emp_id;
BEGIN
emp_id := Numero;
OPEN Empregado;
FETCH Empregado INTO nome, profissao;
htp.p (' Nome do empregado: ' || nome);
htp.p (' Profissao: ' || profissao);
CLOSE Empregado;
END
-----------------------
BEGIN
trab_5(:Numero);
END;
TRAB_5.2
Crie um procedimento que permita mostrar o nome e a profisso e
a localidade do departamento um determinado empregado,
fazendo uso de um cursor.
nome emp1.ename%TYPE;
profissao emp1.job%TYPE;
dloc dept1.loc%type;
emp_id NUMBER;
CURSOR Empregado IS
SELECT ename, job, loc
FROM emp1 inner join dept1 on emp1.deptno = dept1.deptno
WHERE emp1.empno = emp_id;
BEGIN
emp_id := Numero;
OPEN Empregado;
FETCH Empregado INTO nome, profissao, dloc;
htp.p (' Nome do empregado: ' || nome);
htp.p (' Profissao: ' || profissao);
htp.p (' Localidade: ' || dloc);
CLOSE Empregado;
END;
TRAB_5.3
Crie um procedimento que permita mostrar o nome e a profisso
de todos os empregados, fazendo uso de um cursor.
reg_emp emp%ROWTYPE;
CURSOR empregado IS
SELECT emp.ename,emp.job
FROM emp;
BEGIN
OPEN empregado;
LOOP
FETCH empregado INTO reg_emp.ename, reg_emp.job;
EXIT WHEN empregado%NOTFOUND;
htp.p ('O nome '||reg_emp.ename||' e a profisso '||reg_emp.job);
END LOOP;
CLOSE empregado;
END;
------------------------
BEGIN
trab_5a;
END;
TRAB_6
Crie um procedimento que implemente dois cursores.
O 1 cursor apresenta o nome e a profisso, de todos os
empregados para uma determinada profisso.
O 2 Cursor apresenta o nmero, nome e a profisso de todos os
empregados das profisses C%
CURSOR empregado1 IS
SELECT emp.ename, emp.job
FROM emp
WHERE emp.job=profissao;
CURSOR empregado2 IS
SELECT emp.empno, emp.ename, emp.job
FROM emp
WHERE emp.job LIKE 'C%';
BEGIN
profissao:=prof;
--------------------------
BEGIN
trab_6(:prof);
END;
TRAB_7
Criar um procedimento PL-SQL que permita mostrar o nome,
profisso, salrio e o nome do departamento de todos os
empregados de um determinado departamento.
CURSOR cursor1 IS
Select emp.ename, emp.job, emp.sal, dept.dname
FROM emp, dept
WHERE emp.depno = dept.depno
AND dept.depno = (Dept_num);
BEGIN
OPEN cursor1;
htp.p ('********* Cursor1 *********');
LOOP
FETCH cursor1 INTO Nome, Prof, Salario, Departamento;
EXIT WHEN cursor1%NOTFOUND;
htp.p ('Nome: ' || Nome || ' ' || 'Profissao: ' || Prof
|| ' ' || 'Salario: ' || Salario|| ' ' || 'Departamento: ' || Departamento);
END LOOP;
Nlinhas := cursor1%ROWCOUNT;
htp.p (' Numero empregados: ' || Nlinhas);
CLOSE cursor1;
END;
----------------------------
BEGIN
TRAB_7(:Dept_num);
END;
TRAB_8
Crie um procedure PL-SQL que permita saber o Nome, Profisso,
Salario e o nome do departamento dos 2 empregados que ganham
mais, num determinado departamento
Registo_emp emp%Rowtype;
Registo_dept dept%Rowtype;
Nlinhas NUMBER;
Contador NUMBER;
CURSOR cursor1 IS
Select emp.ename, emp.job, emp.sal, dept.dname
FROM emp, dept
WHERE emp.depno = dept.depno
AND dept.depno = (Dept_num)
Order By emp.sal Desc;
BEGIN
OPEN cursor1;
htp.p ('********* Cursor1 *********');
----------------
BEGIN
TRAB_8(:Dept_num);
END;
Professor Jos Adriano 41
Escola Superior de Tecnologia e de Gesto de Bragana
Adriano@ipb.pt
Base de Dados ORACLE
Pl-SQL Exerccio das aulas
TRAB_9
Crie um procedure PL-SQL que permita saber o Nome, e a data de
admisso e o nome do departamento dos empregados mais
antigos de cada departamento.
cursor cursor1 is
select emp.ename, emp.hiredate, dept.dname
from emp, dept
where emp.depno=dept.depno
And(emp.depno,emp.hiredate) in(select emp.depno, max(hiredate)
from emp
group by emp.depno );
begin
open cursor1;
htp.p ('********* Cursor1 *********');
loop
fetch cursor1 into reg_emp.ename, reg_emp.hiredate, reg_dept.dname;
exit when cursor1%notfound;
htp.p ('O Empregado: '||reg_emp.ename||', com a data de admissao:
'||reg_emp.hiredate || ' o mais velho do departamento : ' || reg_dept.dname||'.');
end loop;
nlinhas:=cursor1%rowcount;
htp.p ('Total de Empregrados: '||nlinhas);
close cursor1;
end;
------------------
Begin
Trab 9;
End;
TRAB_10
Crie um procedure PL-SQL que permita fazer a insero de dados
na tabela de Empregados
BEGIN
INSERT INTO emp (empno, ename, deptno, job, mgr, hiredate, comm, sal)
VALUES (numero, nome, Dept1, Prof1, chefe, data, Com, salario);
exception
when no_data_found then
htp.p('Introduza um Nmero de empregado vlido');
END;
--------
Begin
Trab_10 (:numero, :nome, :Dept1, :Prof1, :chefe, :data, :Com, :salario);
End;
TRAB_11
Crie um procedure PL-SQL que permita fazer a remoo de dados
na tabela de Empregados
BEGIN
Numero := empid;
Select * into registo_emp1
from emp
where emp.empno= numero;
EXCEPTION
WHEN NO_DATA_FOUND THEN
htp.p(' Employee ID: ' || registo_emp1.empno || ' not found' );
END;
-------
Begin
Trab_11(:empid);
End;
TRAB_12
Crie um procedure PL-SQL que permita fazer a Alterao de dados
na tabela de Departamentos
begin
update dept
set dept.dname = depname,
dept.loc = deploc
where dept.deptno = Depnum;
htp.p (' Este Departamento foi alterado ' );
exception
when no_data_found then
htp.p (' Este Departamento no existe ' );
end;
-------
begin
trab_12(:depname, :deploc, :depnum);
end;
TRAB_13
Crie um procedure PL-SQL que permita a utilizao de cursores
variveis REF CURSORESs
BEGIN
OPEN emp_cursor FOR
SELECT *
FROM emp
WHERE empno > num_empregado1;
process_emp_cv(emp_cursor);
CLOSE emp_cursor;
VArray A1 A B C D [1..7]
A1.Count 4
A1.EXTEND(1) 5
Varray (Array variavel), devem ser utilizados quando temos conhecimento prvio
da dimenso do array mas no sabemos qual deber ser o seu contedo, nem
sequer se o mesmo deber ser integralmente preenchido.
Exemplo: Sabemos que os empregados so promovidos 3 vezes na sua carreira,
mas no conhecemos priori quais so as datas das rtespectivas promoes.
TRAB_14
Crie um procedure PL-SQL que permita a utilizao de estruturas de
dados do tipo Record
person person_rec;
BEGIN
person.empno := num_empregado2;
person.ename := nome;
person.job := profissao;
person.location.room_number := gabinete;
person.location.building := edificio;
------
begin
trab_14(:num_empregado2, :nome, :profissao, :gabinete, :edificio);
end;
TRAB_14a
Crie um procedure PL-SQL que permita a transferncia de dados de
um cursor para um record
pessoa pessoa_rec;
Cursor Cursor_emp Is
select empno, ename, job, sal
from emp;
BEGIN
open cursor_emp;
loop
fetch cursor_emp into pessoa.emp_num, pessoa.emp_nome, pessoa.emp_prof,
pessoa.emp_sal;
exit when cursor_emp%notfound;
END;
---------------
begin
TRAB_14A;
END;
TRAB_15
Crie um procedure PL-SQL que permita a utilizao de estruturas de
dados do tipo Array .
Objectivo: Criao de estruturas do tipo Array com carregamento fixo dos elementos.
BEGIN
prof:= job_array('clerk', 'salesmam', 'manager', 'analyst', 'president');
--------
Begin
Trab_15;
End;
TRAB_15a
Crie um procedure PL-SQL que permita a utilizao de estruturas de
dados do tipo VArray.
BEGIN
nomes:= nomes_dept();
htp.p (nomes.count());
htp.p (nomes.first);
htp.p (nomes(nomes.first));
htp.p (nomes.last);
htp.p (nomes(nomes.last));
END;
-----------
Begin
Trab_15a (:num);
end;
TRAB_15b
Carregamento de VARRAY com Campos obtidos a partir de
cursores
CURSOR cursor1 IS
SELECT deptno
FROM dept;
dept_rec cursor1%ROWTYPE;
BEGIN
dept_arr := dept_array();
OPEN cursor1;
LOOP
FETCH cursor1 INTO dept_rec;
EXIT WHEN cursor1%NOTFOUND;
dept_arr.EXTEND(1);
dept_arr(i) := dept_rec;
i := i + 1;
END LOOP;
CLOSE cursor1;
------------------------
Begin
trab_15b;
END;
TRAB_15c
Carregamento de VARRAY com registos obtidos a partir de
cursores
CURSOR cursor1 IS
SELECT *
FROM dept;
dept_rec cursor1%ROWTYPE;
BEGIN
dept_arr := dept_array();
OPEN cursor1;
LOOP
FETCH cursor1 INTO dept_rec;
EXIT WHEN cursor1%NOTFOUND;
dept_arr.EXTEND(1);
dept_arr(i) := dept_rec;
i := i + 1;
END LOOP;
CLOSE cursor1;
FOR j IN dept_arr.FIRST..dept_arr.LAST LOOP
SELECT COUNT(*) INTO howmany
FROM emp
WHERE deptno = dept_arr(j).deptno;
Htp.p ('Job ID: ' || RPAD(dept_arr(j).deptno, 11, ' ') || RPAD(dept_arr(j).loc, 36, ' ') ||
'Number of employees: ' || TO_CHAR(howmany));
END LOOP;
END;
------------------------
Begin
trab_15c;
END;
TRAB_16
Passagem de parmetros para cursores
num_empregado emp.empno%TYPE;
data_admissao emp.hiredate%TYPE;
nome emp.ename%TYPE;
profissao emp.job%TYPE;
rowcount NUMBER;
bonusamount NUMBER;
yearsworked NUMBER;
BEGIN
LOOP
FETCH cursor1 INTO num_empregado, nome, profissao, data_admissao;
EXIT WHEN cursor1%NOTFOUND;
rowcount := cursor1%ROWCOUNT;
htp.p ('The number of rows fetched is: ' || rowcount);
CLOSE cursor1;
END;
---------------------------------
BEGIN
trab_16;
END;
TRAB_16a
Re-escreva o procedure Trab_16 de forma a que o parmetro do
cursor passe a ser um ms qualquer, em deterimento do ms
actual, e apresente apenas a 1 linha do cursor1
num_empregado emp.empno%TYPE;
data_admissao emp.hiredate%TYPE;
nome emp.ename%TYPE;
profissao emp.job%TYPE;
rowcount NUMBER;
bonusamount NUMBER;
yearsworked NUMBER;
outro_mes NUMBER;
Contador Number;
BEGIN
Outro_mes := mes;
rowcount := cursor1%ROWCOUNT;
htp.p ('The number of rows fetched is: ' || rowcount);
CLOSE cursor1;
END;
-------------------
BEGIN
TRAB_16a (:mes);
END;
TRAB_17
Utilizao do tipo %ROWTYPE com cursores
CURSOR cursor1 IS
SELECT *
FROM emp
WHERE deptno = num_departamento;
employee_rec cursor1%rowtype;
BEGIN
OPEN cursor1;
LOOP
FETCH cursor1 INTO employee_rec;
EXIT WHEN cursor1%NOTFOUND;
--------------
begin
trab_17 (:num_departamento);
end;
TRAB_18
emp_comissao emp.comm%TYPE;
emp_sal emp.sal%TYPE;
salary_missing EXCEPTION;
BEGIN
EXCEPTION
WHEN salary_missing THEN
Htp.p ('Emp ' || emp_id || ' nao tem salario');
WHEN OTHERS THEN
NULL;
END;
BEGIN
Trab_19 (7902, 0.05);
END;
---------
DECLARE
emp_id NUMBER(4);
BEGIN
Trab_19 (:emp_id, 0.5);
END;
----------
BEGIN
Trab_19 (emp_id=>7902, bonus_rate=>0.05);
END;
TRAB_19
PROCEDURE Insere
(numero Number, nome VARCHAR2, prof VARCHAR2);
END emp_actions;
PROCEDURE Insere
(numero Number, nome VARCHAR2, prof VARCHAR2) AS
BEGIN
INSERT INTO emp (empno, ename, job)
VALUES (numero, nome, prof);
END Insere;
EXCEPTION
WHEN NO_DATA_FOUND THEN
Htp.p (' Employee ID: ' || TO_CHAR(empid) || ' not found' );
END Remove_Emp;
END emp_actions;
Professor Jos Adriano 62
Escola Superior de Tecnologia e de Gesto de Bragana
Adriano@ipb.pt
Base de Dados ORACLE
Pl-SQL Exerccio das aulas
Chamada do Package
DECLARE
empid NUMBER;
BEGIN
empid := :empid;
htp.p ('The salary ranking for employee ' || empid
|| ' IS: ' || ROUND(emp_actions.emp_sal_ranking(empid), 2));
Emp_actions.Insere (:numero, :nome, :prof);
Emp_actions.Remove_emp (:empid);
END;