【问题标题】:PL/SQL CREATE PROCEDURE - Salary increase based on tenurePL/SQL CREATE PROCEDURE - 基于任期的工资增长
【发布时间】:2022-01-08 14:41:15
【问题描述】:

我已经为此工作了一段时间,但代码不起作用,我无法找出正确的解决方案。我是否错过了代码中的某些内容?谢谢。

-- 问题--公司要计算员工的年薪:--入职第一年,工资金额为基本工资,即$10,000。 ——之后的每一年,工资都会增加5%。 -- 编写一个名为 calculate_salary 的存储过程,该过程获取一个员工 ID,并且 -- 该员工根据员工在公司工作的年数计算薪水。 (使用循环结构来计算工资)。 -- 程序计算并打印工资。 -- 示例输出: --First Name:first_name --Last Name:last_name --Salary:$9999,99 --如果员工不存在,程序会显示适当的消息。

CREATE OR REPLACE PROCEDURE calculate_salary(EMPLOYEE_ID EMPLOYEES.EMPLOYEE_ID%TYPE) AS
    increase FLOAT := 1.05;
    base_salary NUMBER := 10000;
    TENURE NUMBER;
    SALARY NUMBER;
    EMP_ID EMPLOYEES.EMPLOYEE_ID%TYPE;
    FIRST_NAME EMPLOYEES.FIRST_NAME%TYPE;
    LAST_NAME EMPLOYEES.FIRST_NAME%TYPE;
BEGIN
    SELECT EMPLOYEE_ID, ROUND((SYSDATE - HIRE_DATE)/365,0), FIRST_NAME, LAST_NAME INTO EMP_ID,TENURE, FIRST_NAME, LAST_NAME 
    FROM EMPLOYEES
    WHERE EMPLOYEE_ID = EMP_ID;
    FOR i IN 0..TENURE LOOP
        SALARY := base_salary * i;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE ('First Name: '||FIRST_NAME);
    DBMS_OUTPUT.PUT_LINE ('Last Name: '||LAST_NAME);
    DBMS_OUTPUT.PUT_LINE ('Salary: '||TO_CHAR(SALARY,'$99,999.99'));
EXCEPTION
    WHEN NO_DATA_FOUND THEN 
        DBMS_OUTPUT.PUT_LINE ('No Data Found!');
    WHEN OTHERS THEN  
        DBMS_OUTPUT.PUT_LINE ('Error!');
END;
/
    
BEGIN
    calculate_salary(1);
END;
/

【问题讨论】:

  • 您收到的错误信息是什么?

标签: sql oracle plsql


【解决方案1】:

FOR 循环中的计算错误。在第一次循环迭代中,您将SALARY 设置为零。在第二次迭代中,您将SALARY 设置为等于base_salary。在第三次迭代中,您将 SALARY 设置为双倍 base_salary 等。此外,在 PL/SQL 中,FOR 循环限制包括在内。因此,您的循环应该从 1(一)而不是 0(零)开始。

下面的代码计算工资,假设增加是基于当前工资而不是基本工资。对代码的更改由更改行末尾的 cmets 指示。

CREATE OR REPLACE PROCEDURE calculate_salary(EMPLOYEE_ID EMPLOYEES.EMPLOYEE_ID%TYPE) AS
    increase FLOAT := 1.05;
    base_salary NUMBER := 10000;
    TENURE NUMBER;
    SALARY NUMBER;
    EMP_ID EMPLOYEES.EMPLOYEE_ID%TYPE;
    FIRST_NAME EMPLOYEES.FIRST_NAME%TYPE;
    LAST_NAME EMPLOYEES.FIRST_NAME%TYPE;
BEGIN
    SELECT EMPLOYEE_ID, ROUND((SYSDATE - HIRE_DATE)/365,0), FIRST_NAME, LAST_NAME INTO EMP_ID,TENURE, FIRST_NAME, LAST_NAME 
    FROM EMPLOYEES
    WHERE EMPLOYEE_ID = EMP_ID;
    SALARY := base_salary; -- Added this line.
    FOR i IN 1..TENURE LOOP -- Changed this line.
        SALARY := SALARY * increase; -- Changed this line.
    END LOOP;
    DBMS_OUTPUT.PUT_LINE ('First Name: '||FIRST_NAME);
    DBMS_OUTPUT.PUT_LINE ('Last Name: '||LAST_NAME);
    DBMS_OUTPUT.PUT_LINE ('Salary: '||TO_CHAR(SALARY,'$99,999.99'));
EXCEPTION
    WHEN NO_DATA_FOUND THEN 
        DBMS_OUTPUT.PUT_LINE ('No Data Found!');
    WHEN OTHERS THEN  
        DBMS_OUTPUT.PUT_LINE ('Error!');
END;

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2022-12-02
    • 2021-10-16
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多