
这过程是为了查到表中的字段名类似@str的所有表
如果存在,刚输出select [fieldname] from [tablename]
if exists() --如果结果集不为空
print--则输出 select [fieldname] from [tablename]
axusertype是字段类型,
具体可以下语句查询select from systypes where xtype in (175,239,231,167,56,60,108,106)
a 表为syscolumns 是系统字段表,存着当前数据库所有对象的字段名
b 表为sysobjects 是系统对象表,存着当前数据库所有的对象(表,视图,过程,索引,关健字,约束等)
xtype='U'是用户表
astatus>=0这个条件是没有用的,MSSQL 系统字段表的status都是>=0的
整个过程核心为一个游标cursor
select s=''
from syscolumns a
join sysojbects b on aid = bid
where
open cursor
fetch --读到@S
while --开始循环
execute @S
fetch
end
释放 cursor
你的问题是bname无效 那是有效的b-->sysobjects
其实这个可以写得简单点不用写得这么复杂
可以这么写:
create procedure procSelect (@str varchar(100))
as
select 'select ' + AName + ' from ' + BName
from syscolumns A
left join sysobjects B on Aid = Bid
where Bxtype = 'u' and AName like '%' + @str + '%'
and Axusertype in (175,239,231,167,56,60,108,106)理论上说,不停地建立数据库连接、查询、断开数据库连接这种 *** 作是很慢的,所以把要查的东西放到Map中会快很多。但实际上我们多数情况下不会把数据查出来放到Map中,因为查询的数据往往很多,全都放到内存中去根本就不现实,就算你服务器100G的内存也不够用。所以我们通常的做法就是用数据连接池,具体做法我就不说了,用兴趣的话可以查查数据连接池。
问题描述 在通常的三层构架下 客户通过Browser请求Web服务器查询数据库 而查询结果是上千条甚至是上百万条记录 要求查询结果传送到客户端浏览器并分页显示
考虑因素
Web服务器的资源消耗 包括 内存(用来存储查询结果) 数据库相关资源(数据库连接对象 ResultSet对象等等)
DB服务器资源的消耗 包括游标 会话等等
网络开销 包括与数据库建立会话 传输查询结果等等
JDBC中的几个重要Class:
A ResultSet object maintains a cursor pointing to its current row of data Initially the cursor is positioned before the first row The next method moves the cursor to the next row and because it returns false when there are no more rows in the ResultSet object it can be used in a while loop to iterate through the result set
ResultSet是直接在数据库上建立游标 然后通过ResultSet的行位置定位接口来获得指定行位置的记录 当用户通过get方法获取具体纪录的内容时 ResultSet才从数据库把所需数据读到客户端
Oracle的ResultSet实现似乎会在本地缓存用户读取过的数据 导致内存消耗会随读取数据的增加而增加 这样 如果一次查询并读取海量数据 即使读出数据后马上丢弃(比如直接写入文件) 内存消耗也会随查询结果的增加而递增
The RowSet interface extends the standard java sql ResultSet interface A RowSet object may make a connection with a data source and maintain that connection throughout its life cycle in which case it is called a connected rowset A rowset may also make a connection with a data source get data from it and then close the connection Such a rowset is called a disconnected rowset A disconnected rowset may make changes to its data while it is disconnected and then send the changes back to the original source of the data but it must reestablish a connection to do so
RowSet是JDBC 中提供的接口 Oracle对该接口有相应实现 其中很有用的是 oracle jdbc rowset OracleCachedRowSet OracleCachedRowSet实现了ResultSet中的所有方法 但与ResultSet不同的是 OracleCachedRowSet中的数据在Connection关闭后仍然有效
解决方案一 直接使用ResultSet来处理
从ResultSet中将查询结果读入collection 缓存在>在jsp中加入如下代码即可实现功能:
<% Enumeration<String> s=sessiongetAttributeNames();
while(shasMoreElements()){
Systemoutprintln(sessiongetAttribute(snextElement()));
//这里的snextElement()就对应了每一个键名 通过他取值就可以了
}
%>
application同理
尽管已经支持JavaScript原生代码,Jade还是支持了一些特殊的标签,它们可以让模板更加易于理解,其中之一就是each, 这种形式:
each VAL[, KEY] in OBJ
一个遍历数组的例子 :
- var items = ["one", "two", "three"]
each item in items
li= item
渲染为:
<li>one</li>
<li>two</li>
<li>three</li>
遍历一个数组同时带上索引:
items = ["one", "two", "three"]
each item, i in items
li #{item}: #{i}
渲染为:
<li>one: 0</li>
<li>two: 1</li>
<li>three: 2</li>
遍历一个数组的键值:
obj = { foo: 'bar' }
each val, key in obj
li #{key}: #{val}
将会渲染为:<li>foo: bar</li>
Jade在内部会把这些语句转换成原生的JavaScript语句,就像使用 usersforEach(function(user){, 词法作用域和嵌套会像在普通的JavaScript中一样:
each user in users
each role in userroles
li= role
如果你喜欢,也可以使用for :
for user in users
for role in userroles
li= role
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)