`
xitong
  • 浏览: 6203231 次
文章分类
社区版块
存档分类
最新评论

Oracle数据分页

 
阅读更多

Oracle存储过程访问,Oracle数据分页

//访问Oracle的存储过程并获取返回结果

using (OracleConnection cn = new OracleConnection(ConnectionStringLocalTransaction))
{
OracleParameter[] parameters ={
new OracleParameter("p_table_name",OracleType.VarChar,40), //输入参数
new OracleParameter("p_succ",OracleType.VarChar,20) //输出参数,必须跟存储过程里的一样
};
parameters[0].Value = "Value"; //输入参数的值
parameters[0].Direction = ParameterDirection.Input; //设置为输入参数
parameters[1].Direction = ParameterDirection.Output; //设置为输出参数
string queryString = "processing"; //存储过程名
OracleCommand cmd = new OracleCommand(queryString, cn);
cmd.CommandType = CommandType.StoredProcedure;
foreach (OracleParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
cn.Open();
cmd.ExecuteNonQuery();
string ss = cmd.Parameters["p_succ"].Value.ToString();
cn.Close();
}

//注:也可以分离开来,将赋值完的参数 传递到 数据库访问层去 (string spname, string rtvaluename, params OracleParameter[] commandParameters)



//获取 字符串长度中文占2个 int s=System.Text.Encoding.GetEncoding("gb2312").GetByteCount(day.Trim());

//Oracle分页(每次只取区间,因为一般使用Oracle数据量肯定很大,所以不可能一次取出所有数据)

select * from (select rownum q,t.* from (select * from tb1) t) t2 where q between 1 and 15)



Oracle:

方法一:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21;
方法二:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN between 21 and 40

公认第二种方法效率没有第一种高。原因是第二种要把子查询执行完,而第一种方法子查询执行到Rownum=40后就结束了。

利用oracle的存储过程实现数据分页

Posted on2008-03-17 15:43Caizhanshu'sBlog阅读(337) 评论(2)编辑收藏

因为oracle 中的存储过程无法像SQLServer的存储过程直接返回结果集,所以要返回结果集就得使用引用游标,
首先定义一个包,在包中定义一个引用游标。

createorreplacepackagepkg_queryas
typecur_query
isrefcursor;
endpkg_query;



创建实现分页的存储过程:

CREATEORREPLACEPROCEDUREprc_query
(p_tableName
invarchar2,--表名
p_strWhereinvarchar2,--查询条件
p_orderColumninvarchar2,--排序的列
p_orderStyleinvarchar2,--排序方式
p_curPageinoutNumber,--当前页
p_pageSizeinoutNumber,--每页显示记录条数
p_totalRecordsoutNumber,--总记录数
p_totalPagesoutNumber,--总页数www@bitscn@com
v_curoutpkg_query.cur_query)--返回的结果集
IS
v_sql
VARCHAR2(1000):='';--sql语句
v_startRecordNumber(4);--开始显示的记录条数
v_endRecordNumber(4);--结束显示的记录条数
BEGIN
--记录中总记录条数
v_sql:='SELECTTO_NUMBER(COUNT(*))FROM'||p_tableName||'WHERE1=1';
IFp_strWhereISNOTNULLorp_strWhere<>''THEN
v_sql:
=v_sql||p_strWhere;
ENDIF;
EXECUTEIMMEDIATEv_sqlINTOp_totalRecords;

--验证页面记录大小
IFp_pageSize<0THEN
p_pageSize:
=0;
ENDIF;




--根据页大小计算总页数
IFMOD(p_totalRecords,p_pageSize)=0THEN
p_totalPages:
=p_totalRecords/p_pageSize;
ELSE
p_totalPages:
=p_totalRecords/p_pageSize+1;
ENDIF;

--验证页号
IFp_curPage<1THEN
p_curPage:
=1;
ENDIF;
IFp_curPage>p_totalPagesTHEN
p_curPage:
=p_totalPages;
ENDIF;

--实现分页查询
v_startRecord:=(p_curPage-1)*p_pageSize+1;
v_endRecord:
=p_curPage*p_pageSize;
v_sql:
='SELECT*FROM(SELECTA.*,rownumrFROM'||
'(SELECT*FROM'||p_tableName;
IFp_strWhereISNOTNULLorp_strWhere<>''THEN


v_sql:
=v_sql||'WHERE1=1'||p_strWhere;
ENDIF;
IFp_orderColumnISNOTNULLorp_orderColumn<>''THEN
v_sql:
=v_sql||'ORDERBY'||p_orderColumn||''||p_orderStyle;
ENDIF;
v_sql:
=v_sql||')AWHERErownum<='||v_endRecord||')BWHEREr>='
||v_startRecord;
DBMS_OUTPUT.put_line(v_sql);
OPENv_curFORv_sql;
ENDprc_query;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics