sobota, 20 listopada 2010

Kurs Oracle SQL. Pakiety - sekcja inicjalizacyjna pakietu


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.

4 komentarze:

  1. Moje rozwiązanie dla zadań:

    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;

    OdpowiedzUsuń
  2. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  3. create or replace package body hrmanager is

    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;

    OdpowiedzUsuń
  4. create or replace package hrmanager is
    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;

    OdpowiedzUsuń