就是求排序之后记录的第21-31条显示出来。select * from(select t1.*, row_number() over(order by c DESC) rid from t t1) where rid between 21 and 31;这个sql语句不用子查询,怎么用oracle的函数实现啊?
给你个例子: CREATE OR REPLACE FUNCTION gg(s INT,e INT) RETURN SYS_REFCURSOR AS r_c SYS_REFCURSOR; BEGIN OPEN r_c FOR SELECT ename,empno FROM (SELECT ename,empno, ROW_NUMBER() OVER(ORDER BY ENAME) RN FROM SCOTT.EMP T) WHERE RN >= S AND RN <= E; RETURN r_c; END; /DECLARE r_c SYS_REFCURSOR; v_c1 VARCHAR2(10); v_c2 VARCHAR2(10); BEGIN r_c:=gg(2,6); LOOP FETCH r_c INTO v_c1,v_c2; EXIT WHEN r_c%NOTFOUND; dbms_output.put_Line(v_c1||'-'||v_c2); END LOOP; CLOSE r_c; END; /输出: ALLEN-7499 BLAKE-7698 CLARK-7782 FORD-7902 JAMES-7900
给你个例子:
CREATE OR REPLACE FUNCTION gg(s INT,e INT) RETURN SYS_REFCURSOR AS
r_c SYS_REFCURSOR;
BEGIN
OPEN r_c FOR
SELECT ename,empno
FROM (SELECT ename,empno, ROW_NUMBER() OVER(ORDER BY ENAME) RN FROM SCOTT.EMP T)
WHERE RN >= S
AND RN <= E;
RETURN r_c;
END;
/DECLARE
r_c SYS_REFCURSOR;
v_c1 VARCHAR2(10);
v_c2 VARCHAR2(10);
BEGIN
r_c:=gg(2,6);
LOOP
FETCH r_c INTO v_c1,v_c2;
EXIT WHEN r_c%NOTFOUND;
dbms_output.put_Line(v_c1||'-'||v_c2);
END LOOP;
CLOSE r_c;
END;
/输出:
ALLEN-7499
BLAKE-7698
CLARK-7782
FORD-7902
JAMES-7900