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 中的存储过程无法像SQLServer的存储过程直接返回结果集,所以要返回结果集就得使用引用游标,
首先定义一个包,在包中定义一个引用游标。
typecur_query is ref cursor ;
end pkg_query;
创建实现分页的存储过程:
(p_tableName in varchar2 , -- 表名
p_strWhere in varchar2 , -- 查询条件
p_orderColumn in varchar2 , -- 排序的列
p_orderStyle in varchar2 , -- 排序方式
p_curPage in out Number , -- 当前页
p_pageSize in out Number , -- 每页显示记录条数
p_totalRecordsout Number , -- 总记录数
p_totalPagesout Number , -- 总页数www@bitscn@com
v_curoutpkg_query.cur_query) -- 返回的结果集
IS
v_sql VARCHAR2 ( 1000 ): = '' ; -- sql语句
v_startRecord Number ( 4 ); -- 开始显示的记录条数
v_endRecord Number ( 4 ); -- 结束显示的记录条数
BEGIN
-- 记录中总记录条数
v_sql: = ' SELECTTO_NUMBER(COUNT(*))FROM ' || p_tableName || ' WHERE1=1 ' ;
IF p_strWhere IS NOT NULL or p_strWhere <> ' ' THEN
v_sql: = v_sql || p_strWhere;
END IF ;
EXECUTE IMMEDIATEv_sql INTO p_totalRecords;
-- 验证页面记录大小
IF p_pageSize < 0 THEN
p_pageSize: = 0 ;
END IF ;
-- 根据页大小计算总页数
IF MOD(p_totalRecords,p_pageSize) = 0 THEN
p_totalPages: = p_totalRecords / p_pageSize;
ELSE
p_totalPages: = p_totalRecords / p_pageSize + 1 ;
END IF ;
-- 验证页号
IF p_curPage < 1 THEN
p_curPage: = 1 ;
END IF ;
IF p_curPage > p_totalPages THEN
p_curPage: = p_totalPages;
END IF ;
-- 实现分页查询
v_startRecord: = (p_curPage - 1 ) * p_pageSize + 1 ;
v_endRecord: = p_curPage * p_pageSize;
v_sql: = ' SELECT*FROM(SELECTA.*,rownumrFROM ' ||
' (SELECT*FROM ' || p_tableName;
IF p_strWhere IS NOT NULL or p_strWhere <> ' ' THEN
v_sql: = v_sql || ' WHERE1=1 ' || p_strWhere;
END IF ;
IF p_orderColumn IS NOT NULL or p_orderColumn <> ' ' THEN
v_sql: = v_sql || ' ORDERBY ' || p_orderColumn || ' ' || p_orderStyle;
END IF ;
v_sql: = v_sql || ' )AWHERErownum<= ' || v_endRecord || ' )BWHEREr>= '
|| v_startRecord;
DBMS_OUTPUT.put_line(v_sql);
OPEN v_cur FOR v_sql;
END prc_query;