小弟刚学oracle,碰到个难题,希望大家不吝指教。
环境是win8.1 64位,vs2010开发,plsql developer10.
具体问题是:
有6个select语句,返回6个datatable,在c#里用dataset接收。
我使用了包,然后用6个游标返回了6个结果(等于返回了一个dataset),然后成功了。
但问题是,这样取数据过程极为缓慢,我在页面上操作了一下,起码得5秒钟才会反应。不知各位大虾有没有好的办法?
代码贴上:
1 --包定义 2 create or replace package pack_siit is 3 type t_cur_1 is ref cursor;--定义游标变量 4 type t_cur_2 is ref cursor; 5 type t_cur_3 is ref cursor; 6 type t_cur_4 is ref cursor; 7 type t_cur_5 is ref cursor; 8 type t_cur_6 is ref cursor; 9 procedure GZPC_GZSOFT_GETCODEDATASET 10 ( 11 cur_1 out t_cur_1, 12 cur_2 out t_cur_2, 13 cur_3 out t_cur_3, 14 cur_4 out t_cur_4, 15 cur_5 out t_cur_5, 16 cur_6 out t_cur_6 17 ); 18 end pack_siit; 19 20 21 --包主体 22 create or replace package body pack_siit is 23 procedure GZPC_GZSOFT_GETCODEDATASET 24 ( cur_1 out t_cur_1, 25 cur_2 out t_cur_2, 26 cur_3 out t_cur_3, 27 cur_4 out t_cur_4, 28 cur_5 out t_cur_5, 29 cur_6 out t_cur_6) 30 as 31 begin 32 OPEN cur_1 FOR 33 select * from Basic_Code where substr(CodeId,4,2)='00' and substr(CodeId,2,4)!='0000' and CodeId!='000000'; 34 OPEN cur_2 FOR 35 select * from Basic_Code where substr(CodeId,4,2)!='00'; 36 OPEN cur_3 FOR 37 select * from Basic_Code where substr(CodeId,2,4)='0000'; 38 OPEN cur_4 FOR 39 select * from basic_town; 40 OPEN cur_5 FOR 41 select * from basic_village; 42 OPEN cur_6 FOR 43 select codeid,(codeid||TownId) as townid,TownName from Basic_Town; 44 45 end GZPC_GZSOFT_GETCODEDATASET; 46 end pack_siit;
后台是这样写的:
1 DataSet tempds = null; 2 OracleParameter[] parameters = { 3 new OracleParameter("cur_1",OracleType.Cursor), 4 new OracleParameter("cur_2",OracleType.Cursor), 5 new OracleParameter("cur_3",OracleType.Cursor), 6 new OracleParameter("cur_4",OracleType.Cursor), 7 new OracleParameter("cur_5",OracleType.Cursor), 8 new OracleParameter("cur_6",OracleType.Cursor)}; 9 parameters[0].Direction = ParameterDirection.Output; 10 parameters[1].Direction = ParameterDirection.Output; 11 parameters[2].Direction = ParameterDirection.Output; 12 parameters[3].Direction = ParameterDirection.Output; 13 parameters[4].Direction = ParameterDirection.Output; 14 parameters[5].Direction = ParameterDirection.Output; 15 --这是公司里的方法,其实就是写入存储过程名就好了。我用了包,所以是用包名.存储过程名。 16 tempds = GZSoft.DBUtility.DbHelper.ExecuteDataSetByProc("pack_siit.GZPC_GZSOFT_GETCODEDATASET", parameters);
我有一个想法,为什么要用游标,你把查询用的Sql语句,组成一条语句,然后 执行,用DataSet接收不行了?这样的话DataSet
会自动 将结果集分为多个结果 返回
我在sql server里正是这样做的。但oracle不支持这样,所以试了很多办法,才用了游标。
超过5小时才有反应,我也完全不奇怪,你又没有说明什么环境、多少数据。
。。兄台 你难道一点没看帖子吗。。
环境:
环境是win8.1 64位,vs2010开发,plsql developer10.
数据:
有6个select语句,返回6个datatable,在c#里用dataset接收。
我使用了包,然后用6个游标返回了6个结果(等于返回了一个dataset),然后成功了。
然后不是五小时,是五秒。
兄台你让我灰常震惊啊。。。
@张孤山: 超过5小时才有反应,我也完全不奇怪,。。。。。。你又没有说明什么环境、多少数据。
我只是路过, 打酱油。
@张孤山:
超过5小时才有反应,我也完全不奇怪,。。。。。。你又没有说明什么环境、多少数据。
我只是路过, 打酱油。
@张孤山: 原来是初学者,没有注意到。
你不懂得我问的环境和数据也是正常的。所以你可能也不知道为什么有两个呆鸟跟着起哄。
那就是说你说的5秒钟也不一定是对的,不知道你怎么判断出来5秒钟的。
@爱编程的大叔: 博客园也有水军了吗?好悲哀。
退而求其次,用多次访问数据库解决了这个问题。多谢田麦成童鞋参与讨论解决。