Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取前3个rownum的子查询在pl/sql中不起作用_Sql_Oracle_Plsql_Subquery_Rownum - Fatal编程技术网

获取前3个rownum的子查询在pl/sql中不起作用

获取前3个rownum的子查询在pl/sql中不起作用,sql,oracle,plsql,subquery,rownum,Sql,Oracle,Plsql,Subquery,Rownum,此代码不起作用: 第2行错误:ORA-06550:第2行第17列:PLS-00103:遇到 当需要下列之一时,选择符号:;回归 符号已替换为“选择”以继续 您错过了一个IS on游标声明,第7行EMPREC.EMONO中有一个输入错误 试着这样, DECLARE CURSOR EMPCUR SELECT EMPNO,ENAME,SAL,ROWNUM FROM (SELECT * FROM EMP

此代码不起作用:

第2行错误:ORA-06550:第2行第17列:PLS-00103:遇到 当需要下列之一时,选择符号:;回归 符号已替换为“选择”以继续

您错过了一个IS on游标声明,第7行EMPREC.EMONO中有一个输入错误

试着这样,

DECLARE
    CURSOR EMPCUR 
      SELECT EMPNO,ENAME,SAL,ROWNUM 
        FROM (SELECT * 
                FROM EMP 
               ORDER BY SAL DESC) 
       WHERE ROWNUM<=3 
       ORDER BY ROWNUM;
BEGIN
  FOR EMPREC IN EMPCUR
  LOOP
    DBMS_OUTPUT.PUT_LINE('RANK '||EMPREC.ROWNUM);
    DBMS_OUTPUT.PUT_LINE(EMPREC.EMONO||' - '||EMPREC.ENAME||' - '||EMPREC.SAL);
  END LOOP;
END;
/

我想建议,在子查询中使用rownum伪列对事物进行排序充其量是一种有缺陷的方法,很少实现实际目标。例如,您是否希望拥有前三名薪酬的员工?或者你总是想要三张唱片?这个等式如何处理工资相同的员工?等等

更好的方法是使用分析函数,在这些函数中定义明确的排名,并返回实际回答问题的结果

DECLARE
    CURSOR EMPCUR IS  SELECT EMPNO,ENAME,SAL,ROWNUM FROM (SELECT * FROM EMP ORDER BY SAL DESC) WHERE ROWNUM<=3 ORDER BY ROWNUM;
BEGIN
    FOR EMPREC IN EMPCUR
    LOOP
        DBMS_OUTPUT.PUT_LINE('RANK '||EMPREC.ROWNUM);
        DBMS_OUTPUT.PUT_LINE(EMPREC.EMPNO||' - '||EMPREC.ENAME||' - '||EMPREC.SAL);
    END LOOP;
END;
/
EMPCUR游标声明中缺少关键字。此外,在这种特殊情况下,实际上不需要使用orderbyrownum。
begin
    for rec in ( select sq.*
                   from ( select e.employee_id
                               , e.first_name ||' '|| e.last_name as full_name 
                               , e.salary
                               , rank() over (order by e.salary desc) as salary_rank
                            from hr.employees e ) sq
                  where sq.salary_rank <= 3
                  order by sq.salary desc )
    loop
        dbms_output.put_line('RANK ' || rec.salary_rank);
        dbms_output.put_line(rec.employee_id || ' - ' || rec.full_name || ' - ' || rec.salary);
    end loop;
end;