Plsql 在cirsor迭代循环中将curosr变量传递给子查询

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

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_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