Kategoria: PL/SQL

Zadanie 5.

Napisz procedurę z parametrem, która będzie sprawdzała, czy podana w parametrze liczba jest podzielna przez 2 i/lub 3, oraz zwróci odpowiedni komunikat.

proc-z-parametrem-zad-5

proc-z-parametrem-zad-5a

 

 

 

 

 

Rozwiązanie


create or replace procedure podzielnosc (x in number)
is
begin

case
when x mod 3 = 0 and x mod 2 = 0 then dbms_output.put_line(‚podzielna przez 2 i 3’);
when x mod 3 = 0 then dbms_output.put_line(‚podzielna przez 3’);
when x mod 2 = 0 then dbms_output.put_line(‚podzielna przez 2’);
else dbms_output.put_line(‚niepodzielna przez 2 i 3’);
end case;

end;

[collapse]

Zadanie 4.

Napisz funkcję, która będzie przyjmować jako parametr ID pracownika, a w wyniku wyświetlać dane tego pracownika – imię, nazwisko oraz stanowisko.

Schemat: HR, Tabele: Employees, Jobs, Kolumny: first_name, last_name, job_title

fun-z-param

 

 

Rozwiązanie

create or replace function pracownik (id_in in number)
return varchar is
wynik varchar(200);
begin
select e.first_name ||' '|| e.last_name ||' '||' - '|| j.job_title into wynik
from employees e inner join jobs j
on e.job_id = j.job_id
where e.employee_id = id_in;

return wynik;
end;

[collapse]

Zadanie 3.

Korzystając z kursora i pętli for, wyświetl wszystkie auta floty marki Suzuki (marka, model, numer rejestracyjny).

Schemat: HR, Tabela: Flota, Kolumny: marka, model_auta, rejestracja

Rozwiązanie

set serveruotput on;

declare
cursor crs_flota is
select marka, model_auta, rejestracja
from flota
where marka = 'Suzuki';

begin
for v_car in crs_flota loop
dbms_output.put_line(v_car.marka || ' ' || v_car.model_auta || ', ' || v_car.rejestracja);
end loop;
end;
/

[collapse]

Zadanie 2.

Korzystając z tabel Pracownicy oraz Działy (stworzone w Zadaniu 1 poziomu Zaawansowanego) napisz kursor, który pobierze z tabel imię, nazwisko oraz płacę podstawową każdego pracownika, a następnie wyświetli je w formie: Ania Kowalska zarabia 2000.

a) zmodyfikuj kod tak, by pracownicy byli wyświetlani w kolejności alfabetycznej wg nazwiska.

Schemat: HR, Tabele: Pracownicy, Działy, Kolumny: imie, nazwisko, placa_podstawowa.

pl2

 

 

 

 

Rozwiązanie

set serveroutput on;
-- deklaracja zmiennych
declare
cv_imie pracownicy.imie%TYPE;
cv_nazwisko pracownicy.nazwisko%type;
cv_placa DZIALY.PLACA_PODSTAWOWA%type;
-- deklaracja kursora
cursor crs_prac is
  select p.imie, p.nazwisko, d.PLACA_PODSTAWOWA
  from pracownicy p inner join dzialy d
  on p.id_dzialu = d.id_dzialu;
-- otwarcie kursora
begin
open crs_prac;
-- pobieranie wierszy z kursora
loop
  fetch crs_prac
  into cv_imie, cv_nazwisko, cv_placa;
  
  exit when crs_prac%notfound;
  
  DBMS_OUTPUT.PUT_LINE(cv_imie ||' ' || cv_nazwisko || ' zarabia ' || cv_placa);
end loop;

-- zamkniecie kursora
close crs_prac;
end;
/

a) deklarację kursora należy zmienić dopisując klauzulę order by:

-- deklaracja kursora
cursor crs_prac is
  select p.imie, p.nazwisko, d.PLACA_PODSTAWOWA
  from pracownicy p inner join dzialy d
  on p.id_dzialu = d.id_dzialu
  order by p.nazwisko;

[collapse]

			
		

Zadanie 1.

Chcemy wyświetlić kolejne liczby od 10 do 1. Stwórz trzy rozwiązania, korzystając z trzech różnych pętli (Loop, While, For).

Rozwiązanie

Pętla Loop:

set serveroutput on;

declare
  n number := 10;
begin
  loop
  dbms_output.put_line(n);
  n:= n-1;
  exit when n = 0;
  end loop;
end;
/

 

Pętla While:

set serveroutput on;

declare
  n number := 10;
begin
  while n > 0 loop
  dbms_output.put_line(n);
  n:= n-1;
  end loop;
end;
/

 

Pętla For:

set serveroutput on;

declare
  n number := 10;
begin
  for n in reverse 1..10 loop
  dbms_output.put_line(n);
  end loop;
end;
/

[collapse]