PL/SQL存储过程修改需求:显示指定数量及同薪资高薪员工
解决方案:PL/SQL存储过程显示含同薪资的指定数量高薪员工
原代码的问题在于FETCH FIRST num_employee ROWS ONLY会严格返回你指定的行数,不会自动包含后续薪资相同的员工。要实现需求,得先拿到第N个员工的薪资,再把所有薪资不低于这个值的员工都查出来。
修改后的存储过程代码如下:
CREATE OR REPLACE PROCEDURE p5_q5 (num_employee NUMBER) AS v_min_sal EMP.SAL%TYPE; BEGIN -- 获取第num_employee名员工的薪资(降序排序后的) SELECT SAL INTO v_min_sal FROM ( SELECT SAL, ROW_NUMBER() OVER (ORDER BY SAL DESC) AS rn FROM EMP ) WHERE rn = num_employee; -- 查询所有薪资大于等于该值的员工,按薪资降序、姓名排序(可选) FOR emp IN ( SELECT ENAME, SAL FROM EMP WHERE SAL >= v_min_sal ORDER BY SAL DESC, ENAME ) LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp.ENAME || ' - Salary: ' || emp.SAL); END LOOP; END; /
执行EXEC p5_q5(3);后,就能得到你要的结果:
Employee name: KING - Salary: 5512.5
Employee name: JONES - Salary: 3570
Employee name: SCOTT - Salary: 3450
Employee name: FORD - Salary: 3450
补充说明
- 用
ROW_NUMBER()来定位第N个员工的薪资,确保拿到的是降序后的第N位薪资值 - 后续查询筛选所有薪资不低于该值的员工,自然就包含了所有同薪资的后续员工
- 额外加了
ENAME排序是为了同薪资的员工显示顺序固定,你可以根据需要调整
内容的提问来源于stack exchange,提问作者Brunno Santos
相关产品推荐
相关产品推荐

