【问题标题】:Create a procedure to give bonuses to employees创建一个程序来给员工奖金
【发布时间】:2021-02-25 04:07:39
【问题描述】:
  • 我是 PL/SQL 的初学者。
  • 我需要创建一个过程。
  • 过程名称是sp_emp_bonus,它有3个参数:
    • department_id
    • job_id
    • amount
  • 该程序将更新department_idjob_id内员工的奖金,并按金额增加现有奖金。

update 语句之后,使用DBMS_OUTPUT.PUT_LINE 打印出受更新影响的员工数量(提示使用隐式游标属性)。

如果未找到员工,则异常部分应捕获 NO_DATA_FOUND 并打印未找到员工。还包括WHEN OTHERS ... and print DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM,1,100));的错误处理

这个怎么写?

【问题讨论】:

  • 你不应该使用前缀作为数据库对象名称,尤其是你不应该使用 sp_ 作为前缀,因为它是微软保留的:sqlperformance.com/2012/10/t-sql-queries/sp_prefix(更新:我看到你使用的是 Oracle - 所以 sp_ 禁令不适用,但我仍然认为使用任何类型的对象类型名称前缀(如 Systems Hungarian notation)都是不好的做法)。
  • 您的帖子读起来像家庭作业。请详细说明您的问题的背景和性质。
  • 你的代码在哪里?你都尝试了些什么?数据是什么样的?
  • 您应该从编写普通更新查询和CREATE PROCEDURE 语法文档开始。然后,您可以发布另一个问题,其中包含到目前为止的详细解释和令人困惑的要点。

标签: sql oracle plsql 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;
/

【讨论】:

  • 非常感谢!我试试看!
【解决方案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;

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多