您好,欢迎访问一九零五行业门户网

创建 Oracle 分页存储过程

1.创建oracle包的定义。使用 ref cursor 数据类型来处理 oracle 结果集。ref cursor 是一个指向 pl/sql 查询所返回的结果集的指针。与普通的游标不同,ref cursor 是一个变量,它是对游标的引用
1.创建oracle包的定义。使用 ref cursor 数据类型来处理 oracle 结果集。ref cursor 是一个指向 pl/sql 查询所返回的结果集的指针。与普通的游标不同,ref cursor 是一个变量,它是对游标的引用
1.创建oracle包的定义。使用 ref cursor 数据类型来处理 oracle 结果集。ref cursor 是一个指向 pl/sql 查询所返回的结果集的指针。与普通的游标不同,ref cursor 是一个变量,它是对游标的引用,可以在执行时将其设置为指向不同的结果集。使用 ref cursor 输出参数可以将 oracle 结构化程序的结果集传递回调用应用程序。通过在调用应用程序中定义 oracletype.cursor 数据类型的输出参数,可以访问 ref cursor 所指向的结果集。
create or replace package mf_pak_001 is
type t_cursor is ref cursor;
procedure getdatabypage(
p_tablename varchar2,
p_fields varchar2,
p_filter varchar2,
p_sort varchar2,
p_curpage number,
p_pagesize number,
p_cursor out t_cursor,
p_totalrecords out number
);
end mf_pak_001;
2.创建包体。在包体中实现具体的存储过程。
create or replace package body mf_pak_001 is
procedure getdatabypage(
p_tablename varchar2,--要查询的表名
p_fields varchar2,--要查询的字段
p_filter varchar2,--过滤条件
p_sort varchar2,--排序字段及方向
p_curpage number,
p_pagesize number,
p_cursor out t_cursor,
p_totalrecords out number
)
is
v_sql varchar2(1000):='';
v_startrecord number(4);
v_endrecord number(4);
begin
--获取总的记录数
v_sql:=' to_number(count(*)) from '||p_tablename;
if p_filter is not null then
v_sql:=v_sql||' where 1=1 and '||p_filter;
end if;
execute immediate v_sql into p_totalrecords;
v_startrecord:=(p_curpage-1)*p_pagesize;
v_endrecord:=p_curpage*p_pagesize;
v_sql:='select '||p_fields||' from (select '||p_fields||',rownum r from '||
'(select '||p_fields||' from '||p_tablename;
if p_filter is not null then
v_sql:=v_sql||' where 1=1 and '||p_filter;
end if;
if p_sort is not null then
v_sql:=v_sql||' order by '||p_sort;
end if;
v_sql:=v_sql||') a where rownum='||to_char(v_startrecord);
open p_cursor for v_sql;
end getdatabypage;
end mf_pak_001;3.在oracle中编写查询语句,执行包体中的分页存储过程,看是否能够正确执行。
declare
v_cur mf_pak_001.t_cursor;
v_job jobs%rowtype;
v_totalrecords number;
begin
mf_pak_001.getdatabypage('jobs','job_id,job_title,min_salary,max_salary','min_salary>0','job_id asc',
1,10,v_cur,v_totalrecords);
fetch v_cur into v_job;
while v_cur%found loop
dbms_output.put_line(v_job.job_id||','||v_job.job_title);
fetch v_cur into v_job;
end loop;
dbms_output.put_line('总记录数为:'||v_totalrecords);
end;
4.在.net中调用该分页存储过程。
string connstring = data source=orcl;user id=hr;password=pwd123456;
oracleconnection conn = new oracleconnection(connstring);
oraclecommand cmd = new oraclecommand();
cmd.connection = conn;
cmd.commandtext = mf_pak_001.getdatabypage;
cmd.commandtype = commandtype.storedprocedure;
cmd.parameters.add(p_tablename, oracletype.varchar).value = jobs;
cmd.parameters.add(p_fields, oracletype.varchar).value = job_id,job_title,min_salary,max_salary;
cmd.parameters.add(p_filter, oracletype.varchar).value = ;
cmd.parameters.add(p_sort, oracletype.varchar).value = job_id asc;
cmd.parameters.add(p_curpage, oracletype.number).value = 1;
cmd.parameters.add(p_pagesize, oracletype.number).value = 10;
cmd.parameters.add(p_cursor, oracletype.cursor).direction =parameterdirection.output;
cmd.parameters.add(p_totalrecords, oracletype.number).direction = parameterdirection.output;
conn.open();
oracledatareader dr = cmd.executereader();
while (dr.read())
{
for (int i = 0; i response.write(dr[i].tostring() + ;);
response.write(
);
}
conn.close();
其它类似信息

推荐信息