当前位置: 代码迷 >> Oracle管理 >> C# 取oracle返回的多个结果集的有关问题
  详细解决方案

C# 取oracle返回的多个结果集的有关问题

热度:286   发布时间:2016-04-24 04:09:44.0
C# 取oracle返回的多个结果集的问题
小弟刚学oracle,碰到个难题,希望大家不吝指教。
环境是win8.1 64位,vs2010开发,plsql developer10.
具体问题是:
有6个select语句,返回6个datatable,在c#里用dataset接收。
我使用了包,然后用6个游标返回了6个结果(等于返回了一个dataset),然后成功了。
但问题是,这样取数据过程极为缓慢,我在页面上操作了一下,起码得5秒钟才会反应。不知各位大虾有没有好的办法?
代码贴上:

--包定义
create or replace package pack_siit is
 type t_cur_1 is ref cursor;--定义游标变量
 type t_cur_2 is ref cursor;
 type t_cur_3 is ref cursor;
 type t_cur_4 is ref cursor;
 type t_cur_5 is ref cursor;
 type t_cur_6 is ref cursor;
 procedure GZPC_GZSOFT_GETCODEDATASET
           (
          cur_1 out t_cur_1,
          cur_2 out t_cur_2,
          cur_3 out t_cur_3,
          cur_4 out t_cur_4,
          cur_5 out t_cur_5,
          cur_6 out t_cur_6
          );
   end pack_siit;


--包主体
create or replace package body pack_siit is
  procedure  GZPC_GZSOFT_GETCODEDATASET
    (  cur_1 out t_cur_1,
          cur_2 out t_cur_2,
          cur_3 out t_cur_3,
          cur_4 out t_cur_4,
          cur_5 out t_cur_5,
          cur_6 out t_cur_6)
    as
     begin
 OPEN cur_1 FOR
  select * from Basic_Code where substr(CodeId,4,2)='00' and substr(CodeId,2,4)!='0000' and CodeId!='000000';
   OPEN cur_2 FOR
   select * from Basic_Code where substr(CodeId,4,2)!='00'; 
    OPEN cur_3 FOR
  select * from Basic_Code where substr(CodeId,2,4)='0000';
   OPEN cur_4 FOR
  select * from basic_town;
     OPEN cur_5 FOR
  select * from basic_village;
   OPEN cur_6 FOR
  select codeid,(codeid||TownId) as townid,TownName from Basic_Town;

    end GZPC_GZSOFT_GETCODEDATASET;
   end pack_siit;



后台是这样写的:

DataSet tempds = null;                            
 OracleParameter[] parameters = {
                    new OracleParameter("cur_1",OracleType.Cursor),
                    new OracleParameter("cur_2",OracleType.Cursor),
                    new OracleParameter("cur_3",OracleType.Cursor),
                    new OracleParameter("cur_4",OracleType.Cursor),
                    new OracleParameter("cur_5",OracleType.Cursor),
                    new OracleParameter("cur_6",OracleType.Cursor)};
                parameters[0].Direction = ParameterDirection.Output;
                parameters[1].Direction = ParameterDirection.Output;
                parameters[2].Direction = ParameterDirection.Output;
                parameters[3].Direction = ParameterDirection.Output;
                parameters[4].Direction = ParameterDirection.Output;
                parameters[5].Direction = ParameterDirection.Output;
--这是公司里的方法,其实就是写入存储过程名就好了。我用了包,所以是用包名.存储过程名。                              
tempds = GZSoft.DBUtility.DbHelper.ExecuteDataSetByProc("pack_siit.GZPC_GZSOFT_GETCODEDATASET", parameters);

------解决思路----------------------
如果几个游标的查询结构是一样的,可以使用union all将几个查询并在一起使用1个游标进行返回,然后每个查询多select一列用于区分这几个查询的数据
  相关解决方案