Oracle存储过程返回结果集,需要把游标作为存储过程参数
1.创建pakage
CREATE OR REPLACE PACKAGE pkg_query AS TYPE cur_query IS REF CURSOR; END pkg_query;
2.创建存储过程()
create or replace procedure Sp_Students ( p_name in varchar2, --姓名(传入参数,根据姓名筛选数据) p_totalRecords out Number, --总记录数(返回结果集的总条数) v_cur out pkg_query.cur_query --返回的结果集 ) is v_sql VARCHAR2(2000) := \'\'; --sql语句 BEGIN v_sql:=\'SELECT TO_NUMBER(COUNT(1)) FROM tb_students t where t.name= \'\'\'|| p_name ||\'\'\' \' ; EXECUTE IMMEDIATE v_sql INTO p_totalRecords; v_sql := \'select * from tb_students t where t.name=\'\'\'|| p_name ||\'\'\' \' ; -- DBMS_OUTPUT.put_line(v_sql); OPEN v_cur FOR v_sql; END Sp_Students;
3.c#调用存储过程
/// <summary> /// 返回结果集 /// </summary> /// <param name="name">存储过程传入参数,用于筛选数据</param> /// <param name="count">存储过程返回参数,返回筛选出来的数据总条数</param> /// <returns></returns> public DataSet RunProcedure(string name,out int count) { count = 0;
string connectionString = "Data Source=orcl;User ID=用户名;Password=口令;Unicode=True"; using (OracleConnection connection = new OracleConnection(connectionString)) { DataSet dataSet = new DataSet(); connection.Open(); OracleDataAdapter sqlDA = new OracleDataAdapter("Sp_Students", connection); OracleParameter[] paras ={ new OracleParameter("p_name",name), new OracleParameter("p_totalRecords",count), new OracleParameter("v_cur", OracleType.Cursor) //返回的游标 }; paras[1].Direction = ParameterDirection.Output; paras[2].Direction = ParameterDirection.Output; sqlDA.SelectCommand.Parameters.AddRange(paras); sqlDA.SelectCommand.CommandType = CommandType.StoredProcedure;//设置 使用存储过程 sqlDA.Fill(dataSet); connection.Close(); count = Convert.ToInt32(paras[1].Value); return dataSet; } }
4.测试存储过程
4.1 创建表:
-- Create table create table TB_STUDENTS ( ID NVARCHAR2(32) default sys_guid() not null, NAME NVARCHAR2(32), AGE NUMBER ); commit; --插入测试数据 insert into TB_STUDENTS (ID, NAME, AGE) values (\'DE3A7D4D5D054992B40761BFA2391F5\', \'张三\', 20); insert into TB_STUDENTS (ID, NAME, AGE) values (\'137ACF3D6C0A4BE0B71423A1F7D8452\', \'李四\', 22); insert into TB_STUDENTS (ID, NAME, AGE) values (\'2AF70A53BCD348EE9E8FF03916D018F\', \'王五\', 18); insert into TB_STUDENTS (ID, NAME, AGE) values (\'2877652AE0A3408A981D8980AE833CF\', \'100\', 55); insert into TB_STUDENTS (ID, NAME, AGE) values (\'7B356A73B80C4ED0BFAFA1DD96256E0\', \'100\', 12); insert into TB_STUDENTS (ID, NAME, AGE) values (\'1FF0A99B47FF4056BBDA7E3B4262C61\', \'100\', 26); commit;
4.2 c#调用:
DataTable dt = null; int count ; DataSet ds = RunProcedure("100",out count); if (ds != null && ds.Tables.Count > 0) { dt = ds.Tables[0]; }