0

我在 oracle 10g 中有多个存储过程,我想在不接触它们的情况下实现排序、分页和过滤。

我正在考虑有一个通用过程,我将把排序方向、排序列、页面索引和过滤子句以及目标过程和所需参数传递给它。

这个通用过程将执行并返回其中的行,并应用我想要的过滤、排序和分页。

关于如何实现这一目标的任何建议。

4

1 回答 1

0

假设您有一个返回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

可能这不是有效的方法,但是通过这种方式,您将实现您想要的。我知道这里有很多专家的建议,他们总是受欢迎的:)

于 2012-05-14T19:09:45.247 回答