Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1640388
  • 博文数量: 409
  • 博客积分: 6240
  • 博客等级: 准将
  • 技术积分: 4908
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-01 00:04
文章分类

全部博文(409)

文章存档

2021年(1)

2019年(1)

2017年(1)

2016年(13)

2015年(22)

2013年(4)

2012年(240)

2011年(127)

分类: Oracle

2015-03-30 20:10:58

CREATE OR REPLACE PROCEDURE pro_emp (nu IN NUMBER) ISCURSOR cur_emp IS SELECT ename FROM (SELECT ename,row_number()over(ORDER BY sal DESC) rn FROM emp) t WHERE t.rn<=nu;BEGIN  FOR i IN cur_emp LOOP    dbms_output.put_line(i.ename);    END LOOP;END;要求如下:sql>exec pro_emp(2);         sql>have top 2 salary of person are            king            scott            ford(备注:因为scott和ford收入都是3000,所以都为第2高收入的人)

  1. CREATE OR REPLACE PROCEDURE pro_emp_top2 (nu IN NUMBER) IS
  2. CURSOR cur_emp IS SELECT ename,sal FROM (SELECT ename,sal,row_number()over(ORDER BY sal DESC) rn FROM emp1) t ORDER BY rn ;
  3. pname emp1.ENAME%TYPE;
  4. pname2 emp1.ENAME%TYPE;
  5. psal emp1.SAL%TYPE;
  6. psal2 emp1.SAL%TYPE;
  7. i NUMBER :=0;
  8. j NUMBER :=0;
  9. k NUMBER;
  10. BEGIN
  11.   SELECT COUNT(*) INTO k FROM emp1;
  12.   OPEN cur_emp;
  13.   WHILE i<nu LOOP
  14.     FETCH cur_emp INTO pname,psal;
  15.     dbms_output.put_line(pname);
  16.     i:=i+1;
  17.   END LOOP;
  18.    WHILE j<k-nu LOOP
  19.       FETCH cur_emp INTO pname2,psal2;
  20.       IF psal2=psal THEN
  21.       dbms_output.put(pname2);
  22.       dbms_output.put_line(' 发生并列第'||nu||'名!');
  23.       ELSE
  24.         NULL;
  25.       END IF;
  26.       j:=j+1;
  27.     END LOOP;
  28.     CLOSE cur_emp;
  29. END;
test:

  1. PL/SQL procedure successfully completed
  2.   
  3. SQL> exec pro_emp_top2(2);
  4.   
  5. KING
  6. SCOTT
  7. FORD
  8.   
  9. PL/SQL procedure successfully completed
  10.   
  11. SQL>
注释:
对于你提的这个问题,在逻辑上,一般没考虑,但在实际应用当中,可能的确会存在。增加了第二循环,就可以判定,当最后一个有并列(按该维度排序)时,把并列的全部取出来。







阅读(1101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~