首页 新闻 搜索 专区 学院

求oracle分页存储过程

0
悬赏园豆:50 [已关闭问题]
 项目需要用到一oracle存储过程,要求如下:<br> 可以支持多表查询,<br> 可以支持排序<br> 可以支持筛选<br>我以前很少接触Oracle,所以写不出,谁能给提供一下。<br>
问题补充: 两位的回答好象都不有显示完全,是超出字数限制了吗?
张荣华的主页 张荣华 | 老鸟四级 | 园豆:2020
提问于:2008-07-17 15:01
< >
分享
其他回答(2)
0
oracle分页存储过程的思路于sqlserver的思路是一样的. CREATE OR REPLACE PROCEDURE TABLEPAGE_SELECT(v_page_size  int, --the size of a page of list                        v_current_page int, --the current page of list                        v_table_name varchar2, --the talbe name                        v_order_field varchar2,--the order field                        v_order_sequence varchar2,--the order sequence should by "_desc"or "_asc",_is blank.                        --v_sql_select  varchar2, --the select sql for procedure                        --v_sql_count  varchar2, --the count sql for procedure                        --v_out_recordcount OUT int, --the num of return rows                        p_cursor OUT refcursor_pkg.return_cursor) as  v_sql     varchar2(3000); --the sql for select all rows of list  v_sql_count  varchar2(3000); --the count sql for procedure  v_sql_order  varchar2(2000); --the order of list  v_count    int; -- the amount rows fo original list  v_endrownum  int; --the end row num of the current page  v_startrownum int; --the start row num of the current page BEGIN  ----set the order of list  if v_order_field!='NO' then   v_sql_order :=' ORDER BY '|| v_order_field ||' '||v_order_sequence;  else    v_sql_order :='';  end if;  ----catch the amount rows of list  v_sql_count:='SELECT COUNT(ROWNUM) FROM '||v_table_name;  execute immediate v_sql_count into v_count;  -- v_out_recordcount := v_count;  ----set the value of start and end row  if v_order_sequence='desc' then   v_endrownum:=v_count-(v_current_page-1)*v_page_size;   v_startrownum:=v_endrownum - v_page_size + 1;  else   v_endrownum:= v_current_page * v_page_size;   v_startrownum := v_endrownum - v_page_size + 1;  end if;  ----the sql for page slide  v_sql := 'SELECT * FROM (SELECT '||v_table_name||'.*, rownum rn FROM '||v_table_name||' WHERE rownum <= ' ||       to_char(v_endrownum) ||' '|| v_sql_order||') WHERE rn >= ' ||       to_char(v_startrow
雄哥 | 园豆:220 (菜鸟二级) | 2008-07-18 09:32
0
我正在使用的,供您参考 create or replace procedure sp_select ( tblName nvarchar2, -- 表名 doCount number := 0, -- 返回记录总数, 0 False 默认返回具体的记录, 非 0 True 返回记录的总数 strGetFields nvarchar2 := '*',-- 需要返回的列 默认返回全部列 OrderField nvarchar2 := ' ', -- 排序的字段名 OrderType number := 0, -- 设置排序类型, 0 False 默认升序, 非 0 True 降序 strWhere nvarchar2 := ' ', -- 查询条件 (注意: 不要加 where) 默认为空 PageSize number := 10, -- 页尺寸 默认为10条 PageIndex number := 1, -- 页码 默认为第1页 mycs out sys_refcursor ) as strSQL varchar2(32767); -- 主语句 strTmp varchar2(100); -- 临时变量 strOrder varchar2(100); -- 排序类型 begin if doCount != 0 then --如果@doCount传递过来的不是0,就执行总数统计 begin if strWhere != ' ' then strSQL := 'select count(1) as Total from '||tblName||' where '||strWhere ; else strSQL := 'select count(1) as Total from '||tblName ; end if; end; else --以下的所有代码都是doCount为0 的情况,即要求返回具体的记录 begin if OrderType != 0 then --如果OrderType不是0,就执行降序。 begin strTmp := '<(select min'; strOrder := ' order by '||OrderField||' desc' ; end; else begin strTmp := '>(select max' ; strOrder := ' order by '||OrderField||' asc' ; end; end if; if PageIndex = 1 then --如果是第一页就执行以下代码,这样会加快执行速度。 begin if strWhere != ' ' then strSQL := 'select * from (select '||strGetFields|| ' from '||tblName ||' where ('||strWhere || ') '||strOrder ||') where rownum<='||PageSize; else strSQL := 'select * from (select '||strGetFields|| ' from '||tblName ||' '||strOrder||') where rownum<='||PageSize ; end if; end; else --如果不是第一页,就要加上取数的条件。 begin if strWhere != ' ' then strSQL := 'select * from (select '|| strGetFields || ' from '||tblName||' where '||OrderField||' '||strTmp||'('||OrderField||') from (select * from (select '||OrderField||'
致博腾远 | 园豆:1389 (小虾三级) | 2008-07-18 17:34
0

不完整啊  

zhangzhigang | 园豆:110 (初学一级) | 2011-12-19 17:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册