Plsql 在cirsor迭代循环中将curosr变量传递给子查询
1我的目的是什么:Plsql 在cirsor迭代循环中将curosr变量传递给子查询,plsql,Plsql,1我的目的是什么: I try to get two person from each department with highest salary. 2我如何努力实现这一目标: DECLARE TYPE empl_table IS TABLE OF employees.employee_id%type INDEX BY binary_integer; empl empl_table; CURSOR departmennts_id IS SELECT department
I try to get two person from each department with highest salary.
2我如何努力实现这一目标:
DECLARE
TYPE empl_table IS TABLE OF employees.employee_id%type INDEX BY binary_integer;
empl empl_table;
CURSOR departmennts_id IS
SELECT department_id FROM departments;
BEGIN
FOR depart_row IN departmennts_id
loop
SELECT employee_id BULK COLLECT into empl
FROM
(
SELECT employee_id
FROM employees
where DEPARTMENT_ID= depart_row.department_id
ORDER BY salary DESC
)
WHERE ROWNUM<3;
END loop;
END;
当我将部门id更改为固定id号时。80
查询工作。如果我使用department\u row.department\u id emp.count为0
我哪里出错了?对于外部光标的每次迭代,您都将行放入emp_表中。每次代码循环回另一个部门id,然后重新执行内部选择时,它将替换集合的内容。因此,如果外部光标看到的最后一个部门碰巧没有与之关联的员工,那么最终将得到一个空集合 您最好的办法是消除部门上的单独光标,只使用一个光标即可完成您想要的所有操作,如:
SELECT *
FROM (SELECT DEPARTMENT_ID,
SALARY,
ROW_NUMBER() OVER
(PARTITION BY DEPARTMENT_ID
ORDER BY SALARY DESC) AS EMP_RANK
FROM EMPLOYEES
ORDER BY DEPARTMENT_ID, EMP_RANK)
WHERE EMP_RANK < 3
共享和享受。更改部门id光标,从部门id=80的部门中选择部门id,然后重新运行整个过程。发生了什么?在这种情况下使用Oracle分析函数怎么样。按部门排名,然后筛选排名<3的人员。但是,如果您不能分析函数,那么您可以在sqlfiddle.com中放置一些数据来查看它。可能存在额外空格或其他问题。@BobJarvis当我使用您的解决方案emp.count=2时,正确的结果是什么,但当我在循环中使用put\u linedepartment\u row.department\u id时,它会显示正确的部门id。我很困惑:@Sandeep我将尝试使用您的解决方案。
SELECT *
FROM (SELECT DEPARTMENT_ID,
SALARY,
ROW_NUMBER() OVER
(PARTITION BY DEPARTMENT_ID
ORDER BY SALARY DESC) AS EMP_RANK
FROM EMPLOYEES
ORDER BY DEPARTMENT_ID, EMP_RANK)
WHERE EMP_RANK < 3