论坛首页 Java企业应用论坛

为何关闭 ResultSet 需要这么长时间?

浏览 18880 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-02-12  
top 和order by 不是通用sql词语吗?
我只用过mssql, mysql,oracle都是最浅地用用。
0 请登录后投票
   发表时间:2004-02-12  
order by 当然是标准 SQL,但是 top 不是。
0 请登录后投票
   发表时间:2004-02-12  
dlee 写道
我就知道你要做这件事情。呵呵。
查一下 identity( 8 ) 这个函数,把数据取出存到临时表中,增加一个字段,值为 identity( 8 )。例如:
select A0=identity( 8 ), A1, A2, A3 into tmptable from ...
然后从这个临时表中取数据,A0 就是临时表中的行号。A1、A2... 是表中的字段。


照上面的做的话,那只要在where中增加一个条件 A0<行号,就可以了吧(我没有用过,只是分析可能是这个样子,不知道了解得对不对)。
where A0<行号 ,其实这个 行号 就是你想要的一页的记录数目.

这个数据库我没有用,oracle 是不支持 top 的(至少8i是这样,后版本我没有用过),支持 rownum ,不过用它分页时要小心,因为它不是先 order by 的.
0 请登录后投票
   发表时间:2004-02-12  
你分析的是对的,就是这样做,很简单的。
用 Oracle 的话可以直接使用 rownum,根本不需要建立临时表。
0 请登录后投票
   发表时间:2004-02-12  
是这样吗?
select ID_NUM=IDENTITY(10),* INTO #tmpt FROM WT_1 WHERE ID_NUM <= 10

会抛出以下错误:
com.sybase.jdbc2.jdbc.SybSQLException: Invalid column name 'ID_NUM'.

at com.sybase.jdbc2.tds.Tds.processEed(Tds.java:2636)
at com.sybase.jdbc2.tds.Tds.nextResult(Tds.java:1996)
at com.sybase.jdbc2.jdbc.ResultGetter.nextResult(ResultGetter.java:69)
at com.sybase.jdbc2.jdbc.SybStatement.nextResult(SybStatement.java:204)
at com.sybase.jdbc2.jdbc.SybStatement.nextResult(SybStatement.java:187)
at com.sybase.jdbc2.jdbc.SybStatement.queryLoop(SybStatement.java:1537)
at com.sybase.jdbc2.jdbc.SybStatement.executeQuery(SybStatement.java:1522)
at com.sybase.jdbc2.jdbc.SybPreparedStatement.executeQuery(SybPreparedStatement.java:72)
at DataBaseUtil.main(DataBaseUtil.java:34)
0 请登录后投票
   发表时间:2004-02-12  
这是我从网上别处找到的,应该是用存储过程实现的:
set rowcount 10*(@page-1)
go
select id into #temp from tb_writ
go
set rowcount 10
go
select * from tb_writ where id not in (select id from #temp.id)
go
set rowcount 0

只是我想用纯代码(JAVA)实现,这样程序的移植性和维护性会好些. 我实在是没办法了,烦了我很长时间了,真是不知道该怎么整了. 还请再帮我想想办法啊!!
0 请登录后投票
   发表时间:2004-02-13  
ID_NUM 是数据到了临时表中才有的字段,你这样查当然会出问题。
select ID_NUM=IDENTITY(10);,* INTO #tmpt FROM WT_1 WHERE ID_NUM <= 10

你要分两步来做:
select ID_NUM=IDENTITY(10);,* INTO #tmpt FROM WT_1 
select * from #tmpt WHERE ID_NUM <= 10

如果相同的查询很多,为了提高性能,需要把临时表保留一段时间。这时候注意还要为临时表的数据加上时间戳,定一个期限,过期后要重新生成这些数据。不过也可以在做完全部查询后立刻删除临时表。
0 请登录后投票
   发表时间:2004-02-13  
TO dlee:
  谢谢DLEE!该问题已经解决。在这再请教一下:
1.一个#号应该是即时的吧,也就是当我把这个连接CLOSE时,这个表就释放了吧(立刻删除)?
2.象你所说,如果给临时表的数据加上时间戳,请问是不是只能在数据库里进行设置?可以用代码动态设置吗?又如何设置?
3.两个##号是全局临时表,存在一个SESSION中,请问这个SESSION的生命周期是多长(是否是一个用户的生命周期)?
0 请登录后投票
   发表时间:2004-02-15  
tlink 写道
1.一个#号应该是即时的吧,也就是当我把这个连接CLOSE时,这个表就释放了吧(立刻删除)?
2.象你所说,如果给临时表的数据加上时间戳,请问是不是只能在数据库里进行设置?可以用代码动态设置吗?又如何设置?
3.两个##号是全局临时表,存在一个SESSION中,请问这个SESSION的生命周期是多长(是否是一个用户的生命周期)?

临时表分为两类:可共享的和不可共享的。不可共享临时表在由 create table 中将符号 # 置于表名之前创建;可共享临时表通过 create table 中指定表名前缀 tempdb.. 而创建。不可共享临时表生命周期为创建临时表的连接,一旦连接关闭,临时表就会被丢弃。可共享临时表将一直存在于数据库中,直到 Sybase 重新启动。你说的那个 ## 的用法我在 Sybase 中从来没有用到过。
给数据加时间戳就是给临时表加一个时间戳字段,值为数据生成的时间。我不知道你说的代码动态设置是什么意思,也不知道该如何设置。
0 请登录后投票
   发表时间:2004-02-17  
不知道可以不可以一步来呢??像如下:

SELECT * FROM  (SELECT IDENTITY(10); as rowNumber,字段 FROM 表 WHERE 条件 ); as temp WHERE temp.rowNumber>=开始 and temp.rowNumber<=结束


另外,如果用了连接池的话,那个所谓的如下:
引用
不可共享临时表生命周期为创建临时表的连接,一旦连接关闭,临时表就会被丢弃

会不会有麻烦呢??
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics