W niektórych sytuacjach zmienne w pakiecie muszą zostać zainicjalizowane dynamicznie np. wartością pochodzącą z zapytania.
Do naszego ćwiczebnego pakietu dodaję zmienną dostępną dla wszystkich podprogramów w tym pakiecie:
Chciałbym teraz aby do nowej zmiennej podczas inicjalizacji pakietu (czyli wtedy gdy po raz pierwszy w danej sesji odwołuję się do jakiegoś składnika pakietu) została przypisana dynamiczna wartość – w tym wypadku pochodząca z jednej z funkcji tegoż pakietu.
W tym celu muszę uzupełnić sekcję inicjującą pakietu. Wykonuję to poprzez dodanie poleceń które mają zostać wykonane przed końcem treści pakietu, poprzedzając je słowem „BEGIN”.:
Do zmiennej „zmienna” zostanie przypisana wartość będąca wynikiem działania funkcji „srednia_zarobkow_dzialu”. Zwróć uwagę że jeśli zmieni się wartość jaka wynikałaby z tej funkcji w trakcie korzystania z pakietu, ale już po inicjalizacji – zawartość zmiennej zainicjalizowanej w ten sposób nie zmieni się.
Ćwiczenia
1. Stwórz pakiet który będzie "sercem" prostego programu kadrowo - płacowego. Pakiet nazwij hrmanager.
2. Do pakietu hrmanager dodaj funkcję która zwróci największe zarobki w całej firmie.
3. Do pakietu hrmanager dodaj procedurę o nazwie "srednia" która pobiera jako parametr id działu. Procedura powinna wyświetlić na konsoli średnią zarobków w dziale o id takim jak przyjęty parametr.
4. Do pakietu hrmanager dodaj procedurę o nazwie "srednia" która pobiera jako parametry id działu oraz id managera. Procedura powinna wyświetlić na konsoli średnią zarobków w dziale o id takim jak przyjęty pierwszy parametr, ale tylko tych osób które są podwładnymi managera o numerze podanym jako parametr drugi.
5. Do pakietu hrmanager dodaj procedurę o nazwie "srednia" która pobiera jako parametry nazwę działu oraz nazwisko managera. Procedura powinna wyświetlić na konsoli średnią zarobków w dziale o nazwie takiej jak przyjęty pierwszy parametr, ale tylko tych osób które są podwładnymi managera o nazwisku podanym jako parametr drugi. Procedura powinna wyświetlać na konsoli informację, jeśli w wyniku zapytania zostanie zwrócone 0 wierszy.
Ten temat omawiam na poniższych szkoleniach:
• Programowanie w PL/SQL
• Podstawy SQL i PL/SQL
Możesz w nich uczestniczyć, a jako czytelnik tego bloga otrzymasz 10% zniżki - poinformuj o tym fakcie konsultanta.
Moje rozwiązanie dla zadań:
OdpowiedzUsuńcreate or replace package body hrmanager
is
function max_zarobki return number is
maximum number;
begin
select max(salary) into maximum from employees;
end;
procedure srednia(id_dzialu number) is
srednia number;
begin
select avg(salary) into srednia from employees where department_id=id_dzialu;
dbms_output.put_line('Średnia zarobków dla dzialu nr: ' || id_dzialu|| ' wynosi: ' || srednia);
end;
procedure srednia(id_dzialu number, id_managera number) is
srednia number;
begin
select avg(salary) into srednia from employees where department_id = id_dzialu
AND manager_id=id_managera;
dbms_output.put_line('Średnia zarobkow dla dzialu nr: ' || id_dzialu || ' i pracowników managera o id: ' || id_managera|| ' wynosi: ' || srednia);
end;
procedure srednia(nazwa_dzialu varchar2, nazwisko_managera varchar2) is
srednia number;
begin
select avg(e.salary) into srednia from employees e JOIN departments d ON e.DEPARTMENT_ID=d.department_id
where d.department_name= nazwa_dzialu and e.manager_id=(select employee_id
from employees
where last_name=nazwisko_managera);
if srednia is null
then srednia:=0;
end if;
dbms_output.put_line('Średnia zarobków dla dzialu: ' || nazwa_dzialu || ' i pracownikow managera: ' || nazwisko_managera || ' wynosi: ' || srednia);
end;
end;
Ten komentarz został usunięty przez autora.
OdpowiedzUsuńcreate or replace package body hrmanager is
OdpowiedzUsuńfunction salary_max return number is salary_m number;
begin
select max(salary) into salary_m from employees;
return salary_m;
end;
procedure srednia(id_dzialu number) is
srednia_dzialu number;
begin
select avg(salary) into srednia_dzialu from employees where department_id = id_dzialu;
dbms_output.put_line('srednia dzialu o numerze = '||id_dzialu||' jest równa = '||srednia_dzialu);
end;
procedure srednia(id_dzialu number, id_managera number) is
srednia_dzialu number;
begin
select avg(salary) into srednia_dzialu from employees where department_id = id_dzialu and manager_id = id_managera;
dbms_output.put_line('srednia pracownikow z dzialu o numerze = '||id_dzialu||' podleglych managerowi o numerze = '||id_managera||' jest równa = '||srednia_dzialu);
end;
procedure srednia(nazwa_dzialu varchar2, nazwisko_managera varchar2) is
srednia_dzialu number;
begin
select avg(e.salary) into srednia from employees e JOIN departments d ON e.DEPARTMENT_ID=d.department_id
where d.department_name= nazwa_dzialu and e.manager_id=(select employee_id
from employees
where last_name=nazwisko_managera);
if srednia is null
then srednia:=0;
end if;
dbms_output.put_line('srednia pracownikow z dzialu o nazwie = '||nazwa_dzialu||' podleglych managerowi o nazwisku = '||nazwisko_managera||' jest równa = '||srednia_dzialu);
end;
create or replace package hrmanager is
OdpowiedzUsuńfunction max_salary return number;
procedure avg_salary(iddzialu number);
procedure avg_salary(iddzialu number, idmanagera number);
procedure avg_salary(nazwa_dzialu varchar2, man_name varchar2);
end hrmanager;
create or replace package body hrmanager is
function max_salary return number is
salary number;
begin
select max(salary) into salary from employees;
return salary;
exception
when others then
dbms_output.put_line(SQLCODE || ' , ' || SQLERRM);
return 0;
end;
procedure avg_salary(iddzialu number) is
srednia number;
begin
select avg(salary) into srednia from employees
where department_id = iddzialu;
dbms_output.put_line('srednia dla dzialu ' || iddzialu || ' wynosi ' || srednia);
exception
when others then
dbms_output.put_line(SQLCODE || ' , ' || SQLERRM);
end;
procedure avg_salary(iddzialu number, idmanagera number) is
srednia number;
begin
select avg(salary) into srednia from employees
where department_id = iddzialu and manager_id = idmanagera;
dbms_output.put_line('srednia dla dzialu ' || iddzialu || ' i managera o id ' || idmanagera || ' wynosi ' || srednia);
exception
when others then
dbms_output.put_line(SQLCODE || ' , ' || SQLERRM);
end;
procedure avg_salary(nazwa_dzialu varchar2, man_name varchar2) is
srednia number;
begin
select avg(salary) into srednia from employees e join departments d on e.department_id = d.department_id
where department_name = nazwa_dzialu and e.manager_id in (select employee_id from employees where last_name = man_name);
if srednia is null
then srednia := 0;
end if;
dbms_output.put_line('srednia dla dzialu ' || nazwa_dzialu || ' i managera ' || man_name || ' wynosi ' || srednia);
exception
when others then
dbms_output.put_line(SQLCODE || ' , ' || SQLERRM);
end;
end;
/
-- sprawdzamy
set serveroutput on;
begin
dbms_output.put_line(hrmanager.max_salary);
hrmanager.avg_salary(10);
hrmanager.avg_salary(10, 101);
hrmanager.avg_salary('Executive','King');
end;
create or replace package hrmanager
OdpowiedzUsuńis
function highest_salary return number;
procedure avg_salary(id_department number);
procedure avg_salary(id_department number, id_manager number);
procedure avg_salary_with_0(id_department number, id_manager number);
end;
create or replace package body hrmanager
is
function highest_salary return number
is
v_salary number;
begin
select max(salary) into v_salary from employees;
return v_salary;
end;
procedure avg_salary(id_department number)
is
v_salary number;
begin
select avg(salary)into v_salary from employees where department_id=id_department;
dbms_output.put_line(v_salary);
end;
procedure avg_salary(id_department number, id_manager number)
is
v_salary number;
begin
select avg(salary)into v_salary
from employees
where department_id=id_department and
manager_id=id_manager;
dbms_output.put_line(v_salary);
end;
procedure avg_salary_with_0(id_department number, id_manager number)
is
v_salary number;
begin
select avg(salary)into v_salary
from employees
where department_id=id_department and
manager_id=id_manager;
IF v_salary is null THEN
v_salary:=0;
END IF;
dbms_output.put_line(v_salary);
end;
end;