天天看点

oracle在pl/sql中如何调用分页程序返回的sys_refcursor

在查找oracle分页程序时找到这位高手写的一个程序https://blog.csdn.net/fhl13017599952/article/details/80278626,发现只有mybatis的调用,没有oracle自身的调用,于是摸索了一下解决了,代码如下:

declare
  p_sql   varchar2(300):='select e.empno,d.dname from scott.emp e,scott.dept d where e.deptno=d.deptno order by empno';
  p1              number := 1;--当前页
  p2              number := 5;--每页显示记录的条数
  v_totalRecords  NUMBER; --总记录数
  v_totalPages    NUMBER; -- 总页数
  type test is record(
  v_empno scott.emp.empno%type,  --emp表
  v_deptno scott.dept.dname%type,--dept表
  r number  --ROWNUM这个不能漏了,否则会报ORA-00932,因为分页程序里面有rownum
  );--这里可以把多表查询当成一个临时表的思路来看
  v_test test;--
  outData sys_refcursor;  -- 输出结果集游标
begin
  P_TEST_PAGING_QUERY(p_sql,
                      p1,
                      p2,
                      v_totalRecords,
                      v_totalPages,
                      outData);
  dbms_output.put_line(p1);
  dbms_output.put_line(p2);
  dbms_output.put_line(v_totalRecords);
  dbms_output.put_line(v_totalPages);

  loop 
  fetch outData into   v_test;
  exit when outData%notfound;
  dbms_output.put_line(v_test.v_empno||' NO'||v_test.r);
  end loop;
  close outData;  
end;