кодесурса
«PL / SQL

Упражнения на курсорах PL / SQL: распечатайте отчет, в котором будет показано: идентификатор сотрудника, имя, дата найма и размер вознаграждения, который они получили в соответствии с опытом работы

script1adsense2code
script1adsense3code

Курсор PL / SQL: Упражнение 47 с решением

Напишите блок в PL / SQL, чтобы напечатать отчет, в котором будет указан идентификатор сотрудника, имя, дата найма и сумма поощрения, которую они получили в соответствии с опытом работы, присоединившимся к месяцу текущей даты.

Пример решения:

Код PL / SQL:

DECLARE
    emp_id        employees.employee_id%TYPE;
    emp_hiredate  employees.hire_date%TYPE;
    emp_firstname employees.first_name%TYPE;
    emp_lastname  employees.last_name%TYPE;
    no_of_emp     NUMBER;
    inctv_amount  NUMBER;
    work_exp      NUMBER;
    CURSOR emp_cur (
      thismonth NUMBER)IS
      SELECT employee_id,
             first_name,
             last_name,
             hire_date
      FROM   employees
      WHERE  Extract(month FROM hire_date) = thismonth;
BEGIN
    OPEN emp_cur(Extract(month FROM SYSDATE));
    dbms_output.Put_line('Date: '
                         || To_char(SYSDATE, 'DL'));
    dbms_output.Put_line('Employees with yearly incentive amounts:');
    dbms_output.Put_line('------------------------------------------');
    dbms_output.Put_line(Rpad('Employee ID', 15)
                         || Rpad('Name of the Employee', 30)
                         || Rpad('Hire Date', 15)
                         || 'Incentive Amount');
dbms_output.Put_line('------------------------------------------------------------------------------');
LOOP
    FETCH emp_cur INTO emp_id, emp_firstname, emp_lastname, emp_hiredate;
    EXIT WHEN emp_cur%NOTFOUND;
    work_exp := Round(( Months_between(SYSDATE, emp_hiredate) / 12 ));
    IF work_exp > 13 THEN
      inctv_amount := 8000;
    ELSIF work_exp > 11 THEN
      inctv_amount := 5000;
    ELSIF work_exp > 9 THEN
      inctv_amount := 3000;
    ELSIF work_exp > 7 THEN
      inctv_amount := 2000;
    ELSIF work_exp > 4 THEN
      inctv_amount := 1000;
    ELSIF work_exp > 0 THEN
      inctv_amount := 400;
    END IF;
    dbms_output.Put_line(Rpad(emp_id, 15)
                         ||Rpad(( emp_firstname
                                  ||' '
                                  ||emp_lastname ), 30)
                         ||Rpad(emp_hiredate, 15)
                         || To_char(inctv_amount, '9,999'));
END LOOP;
no_of_emp := emp_cur%rowcount;
dbms_output.Put_line('The number of rows fetched is '
                     || no_of_emp);
CLOSE emp_cur;
END;
/ 

Пример вывода:

 SQL> /
Дата: суббота, 26 мая 2018 г.
Сотрудники с ежегодными поощрительными суммами:
------------------------------------------
Идентификатор сотрудника Имя сотрудника Дата найма Сумма поощрения
-------------------------------------------------- ---------------------------
104 Брюс Эрнст 21 мая 2007 г. 3000
115 Александр Ху 18 мая 2003 года 8 000
122 Пайам Кауфлинг 01 мая-03 8,000
174 Эллен Абель 11 мая-04 8,000
178 Кимберлийских Грантов 24-МАЯ-07 3000
197 Кевин Фини 23 мая 2006 года 5000
Количество выбранных строк равно 6
Процедура PL / SQL успешно завершена.

Блок - схема:

«Блок-схема:

Улучшите этот пример решения и опубликуйте свой код через Disqus

Предыдущий: Напишите блок в PL / SQL, чтобы отобразить первый отдел с более чем пятью сотрудниками.
Далее: Написать блок в PL / SQL, чтобы показать, как записи объявляются и инициализируются.

Каков уровень сложности этого упражнения?

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code