//访问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后就结束了。
Posted on
2008-03-17 15:43
Caizhanshu'sBlog阅读(337) 评论(
)
编辑
收藏
因为oracle 中的存储过程无法像SQLServer的存储过程直接返回结果集,所以要返回结果集就得使用引用游标,
首先定义一个包,在包中定义一个引用游标。
create
or
replace
packagepkg_query
as
typecur_query
is
ref
cursor
;
end
pkg_query;


创建实现分页的存储过程:
CREATE
OR
REPLACE
PROCEDURE
prc_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;