0
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;
/

このコードは機能しません:

行 2 のエラー: ORA-06550: 行 2、列 17: PLS-00103: 次のいずれかを予期しているときに、記号 "SELECT" が検出されました: ( ; is return 記号 "is" が "SELECT" の代わりに使用されました。

4

2 に答える 2

0

サブクエリでrownum疑似列を使用して物事をランク付けすることは、せいぜい欠陥のあるアプローチであり、実際の目標を達成することはめったにないことを提案したいと思います。たとえば、給与が上位 3 位の従業員が必要ですか? それとも、常に最大 3 つのレコードが必要ですか? この方程式は、同じ給与の従業員にどのように対処しますか? など。

分析関数を使用し、それらの関数で明示的なランキングを定義して、実際に質問に答える結果を返す方が良い方法です。

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;
于 2013-11-27T17:02:15.867 に答える
0

on cursor 宣言を見逃しておりIS、 line7 にタイプミスがありますEMPREC.EMONO

このようにしてみて、

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;
/
于 2013-11-27T16:34:31.717 に答える