#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;
Спасибо.