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
おそらくこれは効率的な方法ではありませんが、この方法で目的を達成できます。ここの専門家から多くの提案があることを私は知っています、彼らはいつでも歓迎されます:)