2013-02-03 86 views
0

我正在用JAVA编程一个软件并使用Oracle DB。JAVA从数据库中获取数据没有循环

通常我们获得使用循环数据库中的值一样

Resultset rt = (Resultset) cs.getObject(1); 

while(rt.next){ 
    .... 
} 

但它的声音是比较慢从数据库中获取数据的千元。

我的问题是:

在Oracle DB:我创造了这样一个过程,它是迭代的数据,并分配给光标。

Ex.procedure test_pro(sysref_cursor out info) as 

open info select * from user_tbl ...... 

end test_pro; 

在Java代码中:正如我前面提到我一个迭代的resultset为获取值,但数据库的身边,就算我选择了价值观,我为什么要使用一个循环得到那个值?

(在.NET框架的另一个事实,有正在使用的数据库结合的概念,所以在Java任何方式,结合数据库的程序,如:.NET的,而迭代。 )

+2

有没有办法做到这一点不用循环.. :-) –

+0

你可以使用ORM – smk

+0

@Praneeth你的意思是说你的结果集将始终从DB和你不返回只有一行在这种情况下不需要,因为它是单行的outut?实际上,RESULT-SET将允许我们迭代从DB返回的单个行的列。如果那么多行返回我们需要的,而()来遍历倍数行。 –

回答

1

如果你肯定知道总会有只有一个结果,像在这种情况下,你甚至可以,如果跳过并调用rs.next()一次:

例如:

ResultSet resultset = statement.executeQuery("SELECT MAX (custID) FROM customer"); 
resultset.next(); // exactly one result so allowed 
int max = resultset.getInt(1); // use indexed retrieval since the column has no name 
0
+0

但是,当获得一个sys_refcursor。我需要一个循环获取该对象 –

+0

@Praneeth没有办法避免循环,如果你有多行。如果你想映射数据库到java对象没有manully,你必须使用一些框架,如ormlite.It将投数据库行到java对象。 – xff1874

+0

感谢您的评论。我会寻找“ormlite”。 –

0

您无法避免循环。出于性能原因,您需要调整Statement或Resultset对象上的预取(100是一个可靠的起点)。
为什么要这样做?它类似于读数据流 - 你永远不知道它有多大可能 - 让你的块/缓冲器,一个又一个读...

1

取决于你打算用这些数据,并在其频做什么时, ref_cursor的选择可能是好的或坏的。为了报告目的,Ref_cursors旨在为非Oracle知晓的程序提供传递数据的方法。

在你的情况下,坚持循环,但不要忘记实现数组提取,因为这会对性能产生巨大影响。数据库将行块传递给客户端的jdbc缓冲区,并且您的代码从该缓冲区中提取行。到达缓冲区结束时,Jdbc层会从数据库请求下一行数据块,从而消除了很多网络往返行程。默认情况下,一次可以获取10行。对于较大的套餐,如果内存可以提供房间,则使用更大的数字。

Oracle® Database JDBC Developer's Guide and Reference