请写一个PL/SQL,列出员工档中薪资最高的前10位员工的EMPNO,ENAME,JOB,SAL。
   注:1.依SAL,EMPNO排序。
       2.输出时各栏间以'--'做区隔。
       3.薪资如与第10位相同者必须全部列出。
       4.CURSOR只可使用select ... from ... where ... order by...。
       5.注意版面整齐,薪资靠左对齐。
  范例:
       名次---员工--- 姓名 --- 薪资 
          1---9000---QUEEN --- 80000
          2---7566---JONES --- 60000
          3---7839---KING  ---  5000
          4---7902---      ---  3000
          5---7788---SCOTT ---  3000
          6---7698---BLAKE ---  2850
          7---7782---CLARK ---  2450
          8---7499---ALLEN ---  1600
          9---7844---TURNER---  1500
         10---7934---MILLER---  1300
         11---7876---ADAMS ---  1300我写的PL/SQL:DECLARE
V_EMPNO VARCHAR2(20);
V_ENAME VARCHAR2(20);
V_JOB VARCHAR2(20);
V_SAL VARCHAR2(20);
CURSOR CUR_DISPLAY IS
select EMPNO,ENAME,JOB,SAL from emp
where sal>=(select min(sal) from(select*from(select SAL from emp order by sal desc)where ROWNUM<=10))
order by sal desc;
BEGIN
OPEN CUR_DISPLAY;
DBMS_OUTPUT.PUT_LINE('EMPNO' || '---' || 'ENAME' || '---' || 'JOB' || '---' || 'SAL');
LOOP
FETCH CUR_DISPLAY INTO V_EMPNO,V_ENAME,V_JOB,V_SAL;
EXIT WHEN CUR_DISPLAY%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_EMPNO || '---' || V_ENAME || '---' || V_JOB || '---' || V_SAL);
END LOOP;
CLOSE CUR_DISPLAY;
END;
结果
EMPNO---ENAME---JOB---SAL
9000---QUEEN---PRESIDENT---80000
7566---JONES---MANAGER---60000
7839---KING---PRESIDENT---5000
7788---SCOTT---ANALYST---3000
7902------ANALYST---3000
7698---BLAKE---MANAGER---2850
7782---CLARK---MANAGER---2450
7499---ALLEN---SALESMAN---1600
7844---TURNER---SALESMAN---1500
7876---ADAMS---CLERK---1300
7934---MILLER---CLERK---1300怎么改才能达到题目要求

解决方案 »

  1.   

    你这个主要是版面无法对齐,其实很简单
    首先将你输出的数据保存在一个临时表里
    然后对每一列取 max(length()), 
    再输出时,每个字段以该字段最大值为目标使用 lpad(字段, max_len, ' ') 使用空格填充
      

  2.   

    select EMPNO,nvl(ENAME,' '),JOB,SAL from emp 如果为null,则用空格
      

  3.   

    declare
    num number:=1;
    begin
    dbms_output.put_line('名次'||'---'||'员工'||'---'||'姓名' ||'---'||'薪资');
    for cur1 in (select * from(
                  select t.*, rank()over(order by sal desc) rk from emp t)
                 where rk<=10
                 order by sal desc,empno)
    loop
    dbms_output.put_line(num||'---'||cur1.empno||'---'||cur1.ename ||'---'||cur1.sal);
    num:=num+1;
    end loop;
    end ;      
      

  4.   

    要对齐的话
    declare
    num number:=1;
    begin
    dbms_output.put_line('名次'||'---'||'员工'||'---'||' 姓  名 ' ||'---'||'薪资');
    for cur1 in (select * from(
                  select t.*, rank()over(order by sal desc) rk from emp t)
                 where rk<=10
                 order by sal desc,empno)
    loop
    dbms_output.put_line(rpad(num,4,' ')||'---'||rpad(cur1.empno,4,' ')||'---'||
                         rpad(cur1.ename,8,' ') ||'---'||rpad(cur1.sal,6,' '));
    num:=num+1;
    end loop;
    end ;      
      

  5.   

    job可能为空,填一个函数
    declare
    num number:=1;
    begin
    dbms_output.put_line('名次'||'---'||'员工'||'---'||' 姓  名 ' ||' 工    作 '||'---'||'薪资');
    for cur1 in (select * from(
                  select t.*, rank()over(order by sal desc) rk from emp t)
                 where rk<=10
                 order by sal desc,empno)
    loop
    dbms_output.put_line(rpad(num,4,' ')||'---'||rpad(cur1.empno,4,' ')||'---'||
                         rpad(cur1.ename,8,' ') ||rpad(nvl(cur1.job,' '),10,' ')||'---'||rpad(cur1.sal,6,' '));
    num:=num+1;
    end loop;
    end ;   
      

  6.   

    ...原来可以不用pl/sql
    被楼主忽悠了...