Создайте процедуру для предоставления бонусов сотрудникам

#sql #oracle #plsql #procedure

#sql #Oracle #plsql #процедура

Вопрос:

  • Я новичок в PL / SQL.
  • Мне нужно создать процедуру.
  • Имя процедуры sp_emp_bonus — это то, что принимает 3 параметра:
    • department_id
    • job_id
    • amount
  • Процедура обновит бонус сотрудников в department_id и job_id и увеличит существующий бонус на сумму.

После update инструкции выведите с помощью DBMS_OUTPUT.PUT_LINE , чтобы распечатать количество сотрудников, затронутых обновлением (подсказка использовать неявный атрибут курсора).

Если сотрудники не найдены, то в разделе исключений должен быть записан NO_DATA_FOUND и напечатаны сотрудники, которые не найдены. Также включите обработку ошибок для WHEN OTHERS ... and print DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM,1,100));

Как это написать?

Комментарии:

1. Вы не должны использовать префикс для имен объектов базы данных, и вы особенно не должны использовать его в sp_ качестве префикса, потому что он зарезервирован Microsoft: sqlperformance.com/2012/10/t-sql-queries/sp_prefix (ОБНОВЛЕНИЕ: я вижу, что вы используете Oracle, поэтому sp_ запрет не применяется, но я все же думаю использовать любой префикс имени типа объекта (например, системыВенгерская нотация) — плохая практика).

2. Ваш пост читается как домашнее задание. Пожалуйста, уточните предысторию и характер вашего вопроса.

3. Где ваш код? Что вы пробовали до сих пор? Как выглядят данные?

4. Вы должны начать с написания простого запроса на обновление и документации по синтаксису CREATE PROCEDURE . Затем вы можете опубликовать другой вопрос с подробным объяснением и запутанными моментами, которые вы получили до сих пор.

Ответ №1:

Вы можете использовать простой update оператор и sql%rowcount в процедуре следующим образом:

 CREATE OR REPLACE PROCEDURE SP_EMP_BONUS (
    P_DEPARTMENT_ID   IN   NUMBER,
    P_JOB_ID          IN   NUMBER,
    P_AMOUNT          IN   NUMBER
) AS
    LV_UPDATED_COUNT NUMBER := 0;
BEGIN
    UPDATE YOUR_TABLE
       SET
        SALARY = SALARY   AMOUNT
     WHERE DEPARTMENT_ID = P_DEPARTMENT_ID
       AND JOB_ID = P_JOB_ID;

    LV_UPDATED_COUNT := SQL%ROWCOUNT;
    IF LV_UPDATED_COUNT = 0 THEN
        DBMS_OUTPUT.PUT_LINE('no records found');
    ELSE
        DBMS_OUTPUT.PUT_LINE('Number of records updated: ' || LV_UPDATED_COUNT);
    END IF;

END SP_EMP_BONUS;
/
  

Комментарии:

1. Большое вам спасибо! Я попробую!

Ответ №2:

Надеюсь, это ответит на ваш вопрос:

 create or replace procedure sp_emp_bonus(
    ip_dep_id in departments.department_id%type,
    ip_job_id in jobs.job_id%type,
    amount in number
)
is
    no_emp_found exception;
    pragma exception_init(no_emp_found, -20101);
    cnt integer := 0;
begin
    update
        employees e
            set e.salary = e.salary   nvl(amount, 0)
        where
            e.department_id = ip_dep_id and
            e.job_id = ip_job_id;
    cnt := sql%rowcount;
    if cnt = 0 then
        raise no_emp_found;
    else
        dbms_output.put_line('Employees updated ' || cnt);
    end if;
    commit;
exception
    when no_emp_found then
        rollback;
        dbms_output.put_line('No Employees found for given Department and Job');
    when OTHERS then
        rollback;
        DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM,1,100));
end;
  

Спасибо.