使用存储过程中,最常用的莫过于查询数据表,并返回结果集。
在SQL SERVER 中,这类操作最简单,通过简单的select * from xx 即可完成。但是在Oracle中并不支持这种写法,那么我们怎么实现跟SQL SERVER同样的功能呢?且看以下代码:
create or replace procedure sp_getdept (rep_type in varchar2,sel in varchar2,result out sys_refcursor) as seq varchar2(40);
info varchar2(40); begin if rep_type = '' then
open result for select * from help;
end IF;
if rep_type = '' then
select seq,info into seq,info from help where rownum=1;
end if; end;
通过代码可以看到,oracle中通过游标sys_refcursor实现返回一个table格式的结构集。注意定义方式result out sys_refcursor,跟C#中out 参数类型有点类似。
sys_refcursor和 cursor 比较:
sys_refcursor不能用open,close ,fetch 进行操作。可以用作参数。
cursor可以用 open,close ,fetch操作。不可以用作参数。
下面是C#调用上例存储过程的代码:
OracleConnection con = new OracleConnection("Password=manager;User ID=SYSTEM;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));"); OracleCommand cmd = new OracleCommand("sp_getdept", con); cmd.CommandType = CommandType.StoredProcedure; OracleParameter p0 = new OracleParameter("rep_type", OracleType.VarChar); p0.Direction = ParameterDirection.Input; cmd.Parameters.Add(p0); cmd.Parameters["rep_type"].Value = ""; OracleParameter p1 = new OracleParameter("result", OracleType.Cursor); p1.Direction = System.Data.ParameterDirection.Output; cmd.Parameters.Add(p1); OracleParameter p2 = new OracleParameter("sel", OracleType.VarChar); p0.Direction = ParameterDirection.Input; cmd.Parameters.Add(p2); cmd.Parameters["sel"].Value = ""; OracleDataAdapter da = new OracleDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds); Console.WriteLine(ds.Tables[].Rows[][].ToString());
Console.ReadLine();
希望能对您有所帮助。^_^。