Skip to content

存储函数带引用型游标输出结果集

-- SQL准备:
create table ta(id number,pid integer, name char(100),descri varchar(100),modify_time datetime default sysdate,   p_date date default sysdate,p_time time default sysdate ) ;
create table tp(id number,pid integer,pname char(100),descri varchar(100),modify_time datetime default sysdate);
insert into tp values(1, 38 , '财务部', '测试数据变更', '2017-12-12 12:11:11' );
insert into tp values(2, 1 , '财务部', '开发项目', '2017-12-12 12:11:11');
insert into tp values( 3, 2 , '开发部', '测试数据变更', '2017-12-12 12:11:11');
insert into tp values(124,24 , 'dsf', 'dsgrt', '2016-12-12 12:11:11');

insert into ta values( 1, 1 , '张三', NULL, '2017-08-01 09:34:49.458' , '2017-08-01',  '09:34:49.458') ;
insert into ta values( 2, 2 , '李四', NULL, '2017-08-01 09:36:51.113' , '2017-08-01',  '09:36:51.113') ;
insert into ta values( 3, 2 , '王五', NULL, '2017-08-01 09:36:53.427' , '2017-08-01',  '09:36:53.427') ; 

create or replace function myfunc_outrefur(refcur_out  out sys_refcursor)
  return sys_refcursor is refcur_ret sys_refcursor;
  begin 
  open refcur_ret for  select * from ta;
  open refcur_out for   select * from tp;
  return refcur_ret;
  end ;
  /
//代码示例:
XuguConnection conn = new XuguConnection();
conn.ConnectionString = conn_xugu;
try
{
    conn.Open();
    XuguCommand cmd = new XuguCommand();
    cmd.Connection = conn;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "myfunc_outrefur";
    cmd.Parameters.Clear();

    XuguParameters pa1= new XuguParameters("refcur1",XuguDbType.RefCursor);
    pa1.Direction= ParameterDirection.Output;
    cmd.Parameters.Add(pa1);

    XuguParameters pa2 = new XuguParameters("refcur2", XuguDbType.RefCursor);
    pa2.Direction = ParameterDirection.ReturnValue;
    cmd.Parameters.Add(pa2);   
    ret = cmd.ExecuteNonQuery();
    //output to reader
    XuguDataReader reader_out1 = ((XuguRefCursor)pa1.Value).GetDataReader();   
    Console.WriteLine("reader_out1.getname(2) = " + reader_out1.GetName(2));
    XuguDataReader reader_out2 = ((XuguRefCursor)pa2.Value).GetDataReader();
    Console.WriteLine("reader_out2.getname(2) = " + reader_out2.GetName(2));   
    reader_out1.Close();
    reader_out1.Dispose();   
    reader_out2.Close();
    reader_out2.Dispose();    
    //
    cmd.Parameters.Clear();
    cmd.Dispose();   
    conn.Close();
    conn.Dispose();
}
catch (System.Exception ex)
{
    Console.WriteLine(ex.ToString());
    conn.Close();
    return 0;
}