我在 oracle 10g 中有多个存储过程,我想在不接触它们的情况下实现排序、分页和过滤。
我正在考虑有一个通用过程,我将把排序方向、排序列、页面索引和过滤子句以及目标过程和所需参数传递给它。
这个通用过程将执行并返回其中的行,并应用我想要的过滤、排序和分页。
关于如何实现这一目标的任何建议。
假设您有一个返回employee data
如下所示的包:
CREATE OR REPLACE PACKAGE get_data
IS
TYPE emp_data IS REF CURSOR;
PROCEDURE get_emp_data(p_emp_data IN OUT emp_data);
END get_data;
/
create or replace package body get_data
IS
PROCEDURE get_emp_data(p_emp_data IN OUT emp_data)
IS
begin
open p_emp_data for select empno
,ename
,job
,mgr
,hiredate
,sal
,comm
,deptno
from emp;
end get_emp_data;
end get_data;
/
现在我假设您正在从过程中获取光标get_data.get_emp_data(..)
。您需要编写一个调用上述过程的过程并对sorting,pagination and filtering
上述从光标返回的数据进行处理。
在这里,我认为您知道从上述光标返回的列。现在我将创建从 proc 返回的列的对象和该对象的类型。
create or replace type emp_obj as object
(
empno number(4)
,ename varchar2(10)
,job varchar2(9)
,mgr number(4)
,hiredate date
,sal number(7,2)
,comm number(7,2)
,deptno number(2)
);
create type emp_data_nt as table of emp_obj;
现在,主要问题是,您想对现有过程中 emp 光标的数据进行排序和分页。例如:您需要order by hiredate
并选择仅有的 5 条记录。
创建一个将调用上述包过程的过程
create or replace procedure get_emp_data1
(
v_emp_data IN OUT get_data.emp_data
)
is
v_emp_data_nt emp_data_nt:=emp_data_nt();
v_emp_data_rec emp%ROWTYPE;
i integer :=1;
begin
get_data.get_emp_data(v_emp_data);
LOOP
FETCH v_emp_data INTO v_emp_data_rec;
EXIT WHEN v_emp_data%NOTFOUND;
v_emp_data_nt.extend();
v_emp_data_nt(i) := emp_obj(v_emp_data_rec.empno
,v_emp_data_rec.ename
,v_emp_data_rec.job
,v_emp_data_rec.mgr
,v_emp_data_rec.hiredate
,v_emp_data_rec.sal
,v_emp_data_rec.comm
,v_emp_data_rec.deptno);
i:=i+1;
END LOOP;
close v_emp_data;
open v_emp_data for select *
from (select * from table(v_emp_data_nt) ed
order by ed.hiredate)
where rownum<=5;
end;
如果我执行上述过程,我将得到以下输出
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
===========================================================================
7369 SMITH CLERK 7902 17-12-1980 800 20
7499 ALLEN SALESMAN 7698 20-02-1981 1600 300 30
7521 WARD SALESMAN 7698 22-02-1981 1250 500 30
7566 JONES MANAGER 7839 02-04-1981 2975 20
7698 BLAKE MANAGER 7839 01-05-1981 2850 30
可能这不是有效的方法,但是通过这种方式,您将实现您想要的。我知道这里有很多专家的建议,他们总是受欢迎的:)