请写一个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.依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怎么改才能达到题目要求
首先将你输出的数据保存在一个临时表里
然后对每一列取 max(length()),
再输出时,每个字段以该字段最大值为目标使用 lpad(字段, max_len, ' ') 使用空格填充
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 ;
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 ;
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 ;
被楼主忽悠了...