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 に答える