【问题标题】:I'm stuck with this PLSQL function question, can you help me out?我被这个 PLSQL 函数问题困住了,你能帮帮我吗?
【发布时间】:2022-11-14 18:40:58
【问题描述】:

编写一个PLSQL函数,检查员工的薪水是否 低于所有员工的平均工资。如果薪水是酒糟, 程序应将该员工的工资更新为当前工资的 5% 并打印 老员工工资,所有员工的平均工资,新员工 更新后的工资。你的程序应该处理所有可能的异常。 您的输出格式应如下所示:

O/P: Old salary is: $510
     Avg salary is: $957.05
     New salary is: $765
     1-Huguette Sandrine: $765
CREATE OR REPLACE FUNCTION checkEMPsal()
return number
IS
avg_sal number;
BEGIN
select AVG(emp_sal) into avg_sal from employee;

【问题讨论】:

  • 我知道这可能只是一个例子,但 510 到 765 增加了 5% 以上,接近 50%!很高兴获得50%的加薪!

标签: oracle plsql


【解决方案1】:

功能?我宁愿用一个程序这里。函数返回一些值,但是 - 在这个任务中 - 你要做的更多。

SQL> set serveroutput on
SQL> CREATE OR REPLACE PROCEDURE p_raise (par_empno IN emp.empno%TYPE)
  2  IS
  3     l_avg      NUMBER;
  4     l_sal_old  emp.sal%TYPE;
  5     l_sal_new  emp.sal%TYPE;
  6  BEGIN
  7     -- average salary
  8     SELECT ROUND (AVG (sal)) INTO l_avg FROM emp;
  9
 10     -- employee's salary
 11     SELECT sal
 12       INTO l_sal_old
 13       FROM emp
 14      WHERE empno = par_empno;
 15
 16     IF l_sal_old < l_avg
 17     THEN
 18        l_sal_new := l_sal_old * 1.05;
 19
 20        UPDATE emp
 21           SET sal = l_sal_new
 22         WHERE empno = par_empno;
 23
 24        DBMS_OUTPUT.put_line (
 25              'old salary: '
 26           || l_sal_old
 27           || ', new salary:  '
 28           || l_sal_new
 29           || ', average salary: '
 30           || l_avg);
 31     ELSE
 32        DBMS_OUTPUT.put_line (
 33           'Employee''s salary is not lower than average salary - no raise');
 34     END IF;
 35  EXCEPTION
 36     WHEN NO_DATA_FOUND
 37     THEN
 38        DBMS_OUTPUT.put_line ('Employee not found');
 39  END;
 40  /

Procedure created.

对于 Scott 架构中的示例数据:

SQL>   SELECT empno, ename, sal
  2      FROM emp
  3  ORDER BY sal;

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             840
      7900 JAMES             950
      7876 ADAMS            1100
      7521 WARD             1250
      7654 MARTIN           1250
      7934 MILLER           1300
      7844 TURNER           1500
      7499 ALLEN            1600
      7782 CLARK            2450
      7698 BLAKE            2850
      7566 JONES            2975
      7788 SCOTT            3000
      7902 FORD             3000
      7839 KING             5000

14 rows selected.

测试:

SQL> EXEC p_raise(7369);
old salary: 840, new salary:  882, average salary: 2076

PL/SQL procedure successfully completed.

SQL> EXEC p_raise(7788);
Employee's salary is not lower than average salary - no raise

PL/SQL procedure successfully completed.

SQL> EXEC p_raise(-1);
Employee not found

PL/SQL procedure successfully completed.

SQL>

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 2011-01-24
    • 2021-08-14
    • 1970-01-01
    • 2016-06-18
    • 2018-10-19
    • 2021-01-28
    • 2011-12-08
    相关资源
    最近更新 更多