Practice Cursors
Ushtrim 1
Ndertoni nje kursor qe afishon emrin dhe mbiemrin e cdo punonjesi duke perdoror employees%rowtype;
Zgjdhje
set serveroutput on;
Declare
cursor e_c is select *
from employees order by employee_id ;
emp employees%rowtype;
begin
OPEN e_c;
FETCH e_c into emp;
while e_c%FOUND LOOP
dbms_output.put_line('kodi: '||emp.employee_id||' emri: '||emp.first_name||' mbiemri: '||emp.last_name);
FETCH e_c into emp;
END LOOP;
dbms_output.put_line('U afishuan gjithsej: '||e_c%ROWCOUNT||' punonjes;');
close e_c;
end;
Cfare afishon kodi ne rreshtin 14?
Provoni ta spostoni kodin ne rreshtin 14 ne rreshtin 16 dhe riekzekutoni skriptin. Shpjegoni rezultatin.
Provoni ta spostoni kodin ne rreshtin 14 ne rreshtin 7 dhe riekzekutoni skriptin. Shpjegoni rezultatin.
Ushtrim 1(B)
Deklaroni nje tipe rekordi punonjes me fushat e meposhtme:
Duke perdorur tipin e rekordit punonjes ,ndertoni nje kursor qe afishon kodin, emrin, mbiemrin dhe pagen e cdo punonjesi.
zgjidhje
set serveroutput on;
Declare
TYPE punonjes IS RECORD
(
kodi number,
emri varchar(50),
mbiemri varchar(50),
paga number
);
p punonjes;
cursor e_c is select employee_id,first_name,last_name,salary
from employees order by employee_id ;
begin
OPEN e_c;
FETCH e_c into p;
while e_c%FOUND LOOP
dbms_output.put_line('kodi: '||p.kodi||' emri: '||p.emri||
' mbiemri: '||p.mbiemri||'salary: '||p.paga);
FETCH e_c into p;
END LOOP;
dbms_output.put_line('U afishuan gjithsej: '||e_c%ROWCOUNT||' punonjes;');
close e_c;
end;
Ushtrim 2
Te afishojme sa here ka nderruar pune sejcili nga punonjesit.
SET SERVEROUTPUT ON
DECLARE
emp_rec employees%rowtype;
here number:=0;
CURSOR emp_cur IS
SELECT *
FROM Employees;
-- WHERE salary > 10;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO emp_rec;
EXIT WHEN emp_cur%NOTFOUND;
select count(*) into here
from job_history where employee_id=emp_rec.employee_id ;
dbms_output.put_line (emp_rec.first_name || ' ' || emp_rec.last_name||here);
END LOOP;
CLOSE emp_cur;
END;
Ushtrim 3
Ndertoni nje skript qe perdor kursoret per te kapur rreshtat e punonjesve nje e nga nje.
Per cdo punonjes skripti:
afishon kodin,emrin,mbiemrin,pagen.
Modifikon pagen duke i shtuar 9 euro
Ben commit veprimin
afishon kodin,emrin,mbiemrin,pagen
si ne formatin me poshte:
kodi: 414 emri: Steven mbiemri: Kingsalary: 18
kodi: 414 emri: Steven mbiemri: Kingsalary: 18
kodi: 415 emri: Steven mbiemri: Kingsalary: 18
kodi: 415 emri: Steven mbiemri: Kingsalary: 18
kodi: 416 emri: Steven mbiemri: Kingsalary: 18
kodi: 416 emri: Steven mbiemri: Kingsalary: 18
Zgjidhje
set serveroutput on;
Declare
cursor e_c is select *
from employees order by employee_id ;
emp employees%rowtype;
begin
OPEN e_c;
FETCH e_c into emp;
while e_c%FOUND LOOP
dbms_output.put_line('kodi: '||emp.employee_id||' emri: '||emp.first_name||
' mbiemri: '||emp.last_name||'salary: '||emp.salary);
update employees set salary=nvl(salary,0)+9 where employee_id=emp.employee_id;
commit;
dbms_output.put_line('kodi: '||emp.employee_id||' emri: '||emp.first_name||
' mbiemri: '||emp.last_name||'salary: '||emp.salary);
FETCH e_c into emp;
END LOOP;
dbms_output.put_line('U afishuan gjithsej: '||e_c%ROWCOUNT||' punonjes;');
close e_c;
end;
A afishohet paga e modifikuar ne kursor apo jo? Pse?
Ushtrim 4
Ndertoni nje cursor qe lexon tabelen e punonjesve me kollonat employee_id,first_name,last_name te renditur sipas employee_id.
Kursori afishon rreshtat nje e nga nje. Kursori afishon gjithashtu hapesirat midis id te punonjesve aty ku i gjen ato.
Ne fund kodi afishon totalin e boshlleqeve ne ID e punonjesve si me poshte:
kodi: 197 emri: Kevin mbiemri: Feeney
gap :197->199 gap=1
kodi: 199 emri: Douglas mbiemri: Grant
kodi: 200 emri: Jennifer mbiemri: Whalen
kodi: 201 emri: Michael mbiemri: Hartstein
Zgjidhje
set serveroutput on;
Declare
cursor e_c is select employee_id,first_name,last_name
from employees order by employee_id ;
kodi NUMBER;
k1 number;
k2 number;
step number;
gaps number:=0;
emri varchar2(50);
mbiemri varchar2(50);
begin
OPEN e_c;
FETCH e_c into KODI,EMRI,mbiemri;
k1:=kodi;
k2:=kodi;
while e_c%FOUND LOOP
dbms_output.put_line('kodi: '||kodi||' emri: '||emri||' mbiemri: '||mbiemri);
FETCH e_c into KODI,EMRI,mbiemri;
k2:=kodi;
step:=k2-k1-1;
if(step>0) then
dbms_output.put_line('gap :'||k1||'->'||k2||' gap='||step);
end if;
k1:=kodi;
gaps:=gaps+step;
END LOOP;
close e_c;
dbms_output.put_line('gaps: '||gaps);
end;