首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 数据库 第二书店 程序员

wukele/ 


共281个网摘 [ 1  2  3  4  5  6  7  8  9  10 ]  上一页 | 下一页  |  访问wukele的个人空间

jsp导出Excel - 鱼与飞鸟 - CSDNBlog

wukele收录,时间:2007-12-9 12:52:34 | 相关网摘我也收藏

在开发MIS系统的过程中,客户经常会提出这样的要求:将查询结果导出为Excel文件保存下来。经常是写一次就忘一次,因此决定今天将以前的代码和遇到的问题进行一下总结,下面进入正题。

背景:本例的代码来源于我给学校开发的一个奖学金管理系统,使用者在前台设置一组查询条件之后,点击“导出”按钮即可得到Excel文件了。

目的:得到一个Excel文件,包括姓名、学号、奖项类别、所在院系、年级、学生类别、银行卡号、金额等内容项

文件:export.jsp(前台页面,指定搜索条件)、exporting.jsp(后台页面,export.jsp的action)、ExportExcel.java(javabean文件,负责具体的操作)、Dbase.java(javabean文件,负责数据库操作)

代码:

export.jsp:此代码略去,主要是指定搜索条件

exporting.jsp:

<%@ page contentType="text/html;

charset=gb2312" language="java" import="java.sql.*,DBCon.*" errorPage="" %>











无标题文档



<%

String user=(String)session.getAttribute("c_name");//登陆名

String sql="";

String colleage=request.getParameter("colleage");//从export.jsp页面获得

String type=request.getParameter("burseType");//从export.jsp页面获得

String studType=request.getParameter("studType");//从export.jsp页面获得

studType=new String(studType.getBytes("ISO8859_1"),"GBK");

String grade=request.getParameter("studGrade");//从export.jsp页面获得

String title=request.getParameter("title");//从export.jsp页面获得

title=dbase.toChinese(title);

//下面将得到sql语句,与本例业务逻辑相关,无需明白

if(user.equals("ygb"))//研工部用户登陆

sql="select * from master_burse where college like '%"+colleage+"%' and code like '%"+type+"%' and grade like '%"+grade+"%' and type like '%"+studType+"%' and flag1='1'";

else//院系用户登陆

sql="select * from master_burse where college like '%"+colleage+"%' and code like '%"+type+"%' and grade like '%"+grade+"%' and type like '%"+studType+"%'";

response.reset();

response.setContentType("application/vnd.ms-excel");

excel.export(response.getOutputStream(),sql);

//if(excel.export(sql,title,request,application))

//out.println(""+"下载"+title+""+"(右键单击另存为)");

//else{

%>



<%// } %>









ExportExcel.java:

package DBCon;



import DBCon.*;

import jxl.*;

import jxl.write.*;

import java.sql.*;

import java.util.*;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;



public class ExportExcel {



private Dbase dbase=null;//用于完成各种对数据库的操作

private Vector content=null;//用于存放所要查询的记录

private ResultSet rs=null;



private String name="";//学生姓名

private String studId="";//学号

private String burseType="";//奖项类别

private String grade="";//所在年级

private String studType="";//学生类型

private String colleage="";//所在院系

private String card="";//银行卡号

private int number=0;//奖金金额

private String []title={"姓名","学号","奖项类别","所在院系","年级","学生类别","银行卡号","金额"};

private String targetFile="";



public ExportExcel(){

dbase=new Dbase();

content=new Vector();

}



public boolean export(String sql,String name,HttpServletRequest request,ServletContext context){

targetFile+="/"+GetSysTime.getTime()+".xls";

content=getContent(sql);//以向量的形式存放所有的记录

String path=context.getRealPath(targetFile);

try{

Vector inner=null;

String value="";//存放在cell中的文本值

int num=0;//存放在cell中的数字值



OutputStream os=new FileOutputStream(path);

WritableWorkbook workbook=Workbook.createWorkbook(os);//创建工作薄

WritableSheet worksheet=workbook.createSheet("record",0);//创建第一个工作表,name:工作表名称

Label label=null;//用于写入文本内容到工作表中去

jxl.write.Number nmb=null;//用于写入数值到工作表中去



//开始写入第一行,即标题栏

for(int i=0;i
label=new Label(i,0,title[i]);//参数依次代表列数、行数、内容

worksheet.addCell(label);//写入单元格

}

//开始写入内容

for(int i=0;i
inner=(Vector)content.get(i);//获取一条记录

for(int j=0;j
//一个一个字段的放入excel中去

if(j==inner.size()-1){//插入的数值

Integer num_=(Integer)inner.get(j);

num=num_.intValue();

nmb=new jxl.write.Number(j,i+1,num);

worksheet.addCell(nmb);

}

else{

value=(String)inner.get(j);

label=new Label(j,i+1,value);

worksheet.addCell(label);

}

}

}

workbook.write();

workbook.close();



}

catch(Exception e){

e.printStackTrace();

return false;

}

return true;

}



public void export(OutputStream os,String sql){

content=getContent(sql);//以向量的形式存放所有的记录



try{

Vector inner=null;

String value="";//存放在cell中的文本值

int num=0;//存放在cell中的数字值



WritableWorkbook workbook=Workbook.createWorkbook(os);//创建工作薄

WritableSheet worksheet=workbook.createSheet("record",0);//创建第一个工作表,name:工作表名称

//WritableSheet worksheet=workbook.createSheet(name,0);//创建第一个工作表,name:工作表名称



Label label=null;//用于写入文本内容到工作表中去

jxl.write.Number nmb=null;//用于写入数值到工作表中去



//开始写入第一行,即标题栏

for(int i=0;i
label=new Label(i,0,title[i]);//参数依次代表列数、行数、内容

worksheet.addCell(label);//写入单元格

}

//开始写入内容

for(int i=0;i
inner=(Vector)content.get(i);//获取一条记录

for(int j=0;j
//一个一个字段的放入excel中去

if(j==inner.size()-1){//插入的数值

Integer num_=(Integer)inner.get(j);

num=num_.intValue();

nmb=new jxl.write.Number(j,i+1,num);

worksheet.addCell(nmb);

}

else{

value=(String)inner.get(j);

label=new Label(j,i+1,value);

worksheet.addCell(label);

}

}

}

workbook.write();

workbook.close();



}

catch(Exception e){

e.printStackTrace();

//return false;

}

//return true;

}



public Vector getContent(String sql){

rs=dbase.executeQuery(sql);

Vector outter=new Vector();

try{

while(rs.next()){

Vector inner=new Vector();//用于存放一条记录

name=dbase.getName(rs.getString("studId"));//得到学生姓名

studId=rs.getString("studId");//得到学号

burseType=dbase.getBurseName(rs.getString("code"));//得到奖学金类型

colleage=dbase.getCollName(rs.getString("college"));//得到所在院系

grade=rs.getString("grade");

studType=rs.getString("type");

card=dbase.getCard(rs.getString("studId"));//得到银行卡号

number=dbase.getNum(rs.getString("code"));//得到奖学金额度

inner.add(name);

inner.add(studId);

inner.add(burseType);

inner.add(colleage);

inner.add(grade);

inner.add(studType);

inner.add(card);

inner.add(number);

outter.add(inner);

}

}

catch(Exception e){

e.printStackTrace();

//rs.close();

return null;

}

return outter;

}

}



Dbase.java:此代码略去,主要执行一些通用的数据库操作,如增删改查等等。本例中用到了其executeQuery(String sql)方法,其作用就是返回一个结果集,类型为ResultSet,可以自行改写这个方法,只要返回ResultSet类型即可。



OK,在export.jsp页面中点击提交按钮之后IE就会弹出一个提示框,询问你是要保存

还是要打开这个Excel文件。

如下几点需要说明:

1.response.reset();//清空response的buffer

response.setContentType("application/vnd.ms-excel");//设置正确的输出类型

这两句必须要有

2.大家应该注意到ExportExcel.java中还有一个方法

export(String sql,String name,HttpServletRequest request,ServletContext context),它出现在exporting.jsp中蓝色注释部分,它的作用其实与

export(OutputStream os,String sql)差不多,只不过前者是首先在服务器上生成一个excel文件,然后在返回页面上提供一个超链接让用户来点击下载或者打开这个Excel文件,而后者则是在IE中动态生成Excel文件,在服务器上没有生成相应的Excel文件。在具体的应用中,可以根据实际需要来选择使用哪个方法。


Java编程 - 迎风 - 51CTO技术博客-领先的IT技术博客

wukele收录,使用标签:java,时间:2007-12-9 9:58:51 | 相关网摘我也收藏

keytool的几个常用命令
1.4和1.5
使用keytool -genkey来产生一对密钥

a、长命令,将所有的参数写在一行

keytool -genkey -dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US" -alias business -keypass kpi135 -keystore f:\certJava\myKeystore -storepass ab987c -validity 180 -keyalg RSA -keysize 576 -v

这条命令在sun提供的reference中可以找到,各参数解释如下(它们之间顺序任意):

dname:cn=Mark Jones, ou=JavaSoft, o=Sun, c=US

alias:别名business

keystore:keystore的位置

storepass:打开keystore所需要?.


Tomcat设置虚拟目录的方法, 不修改server.xml - 乡下天空 - 51CTO技术博客-领先的IT技术博客

wukele收录,时间:2007-12-9 9:48:19 | 相关网摘我也收藏

在tomcat文件夹的conf\catalina\localhost(对于Tomcat6版本及其以上,需要自己创建catalina和localhost这两个文件夹)
增加project .xml文件(该文件名的project要和下面的“path=“/xxx"”的xxx相同)
文件内容:

docBase是项目文件夹的web-inf文件夹的上一层目录
workDir是指Tomcat解析Jsp转换为Java文件,并编译为class存放的文件夹,设置在项目文件夹里面,可以避免移植到其他地方首次读取jsp文件需要重新解析 。一般格式:项目文件夹\work
reloadable是指可以重新加载,一般设置为true,方便使用,不需要经常重启Tomcat。
以后启动Tomcat,在浏览器输入http://localhost:8080/project就能访问该项目的welcome文件。


tomcat 5.x 中的server.xml 怎么设定reloadable?_It贴吧

wukele收录,时间:2007-12-8 22:56:57 | 相关网摘我也收藏

在tomcat管理界面设置自动重载的方法。

http://localhost:8080/admin

密码和用户名在你安装的时候设定的,如果忘记(或没有)的话,去改%CATALINA_HOME%\conf\tomcat-users.xml,添加admin和manager两个role,一个用户,该用户的role为admin和manager就可以了,按原有的xml复制修改就可以。

1.点击左边框架中Service菜单项左边的小圆,展开列表.
2.点击左边框架中Host (localhost)菜单项左边的小圆,展开列表.
3.点击左边框架中你要添加连接池的工作目录的菜单项,右边框架出现设置页。
4.右边框架有两个Reloadable,将对应的下拉列表值改为true.
5.点击右边框架中右上角save按钮
6.点击顶部框架Commit Changes按钮。


SQL语句中一条常见的行合并问题_数据库专家答疑_SQL语句_IT专家网

wukele收录,使用标签:sql,时间:2007-12-7 22:37:14 | 相关网摘我也收藏

SQL行合并问题一般写个自定义函数,由orig_word 统计similar_word,就可以实现……
  问题:原来问题:现有两个表:

  表一originalword

  ID word

  --------------

  101 about

  102 abound

  103 beard

  104 boast

  105 beast

  表二similarword

  ID original_id similar_id

  -------------------------------

  1 101 102

  2 102 101

  3 103 105

  4 105 103

  5 104 105

  6 105 104

  表originalword和表similarword有关系:

  表similarword的original_id是表originalword中的ID

  表similarword的similar_id也是表originalword中的ID

  第一个表是一个单词表,是源单词

  第二个表是由第一个表来的,是形近词的id列表

  如表一中的101和102是形近词,则在第二个表中我插入了(101,102)和(102,101)两个记录

  103和104分别和105是形近词,则在第二个表中我插入了(103,105)、(105,103)、(104,105)、(105,104)四个记录

  想查询出如下的结果:

  结果表

originalword.ID orig_word similar_word
-------------------------------------------
101 about abound
102 abound about
103 beard beast
104 boast beast
105 beast beard, boast


  请大家帮忙啊,写个查询语句,急!谢谢先!

  回答:

  这样的问题一般写个自定义函数,由orig_word 统计similar_word,就可以实现。

  来自一朋友叫hxd001_810,使用自定义函数的方法:

  用函数解决之。代码如下:

--创建一个合并的函数
create function f_hb(@original_id varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' +b.word
from similarword a inner join dbo.originalword b on a.similar_id=b.ID
where original_id = @original_id
set @str = right(@str , len(@str) - 1)
return(@str)
End
go
--调用自定义函数得到结果:
select distinct a.original_id [originalword.ID],b.word [orig_word],dbo.f_hb(a.original_id) as similar_id
from similarword a inner join dbo.originalword b on a.original_id=b.ID
go
返回:
originalword.ID orig_word similar_id
--------------- ------------- -----------
101 about abound
102 abound about
103 beard beast
104 boast beast
105 beast beard,boast



  (所影响的行数为 5 行)

  从性能分析,个人认为使用自定义函数性能比使用循环语句效率低一点,特别是在处理大量数据时候。

  以下是自己写的一个使用循环的方法: 

SET NOCOUNT ON
CREATE TABLE originalword(id int ,word nvarchar(30))
CREATE TABLE similarword (ID int ,original_id int,similar_id int)
GO
INSERT INTO originalword
SELECT 101, 'about' UNION ALL
SELECT 102, 'abound' UNION ALL
SELECT 103, 'beard' UNION ALL
SELECT 104, 'boast' UNION ALL
SELECT 105, 'beast'
INSERT INTO similarword
SELECT 1, 101, 102 UNION ALL
SELECT 2, 102, 101 UNION ALL
SELECT 3, 103, 105 UNION ALL
SELECT 4, 105, 103 UNION ALL
SELECT 5, 104, 105 UNION ALL
SELECT 6, 105, 104
GO

DECLARE @Result TABLE(id int IDENTITY(1,1),[originalword.ID] int,orig_word nvarchar(30),similar_word nvarchar(30))
INSERT INTO @Result ([originalword.ID],orig_word) SELECT * FROM originalword
DECLARE @i int
,@j int
,@similar_word nvarchar(200)

SELECT @i=1,@j=ISNULL(COUNT(1),0) FROM @Result
WHILE @i<=@j
BEGIN
SET @similar_word=''
SELECT @similar_word=@similar_word+word+',' FROM
(SELECT B.word FROM similarword A INNER JOIN originalword B ON A.original_id=B.ID
AND EXISTS(SELECT 1 FROM @Result C WHERE C.[originalword.ID]=A.original_id AND C.ID=@i)) Tmp
IF(ISNULL(@similar_word,'')<>'')
UPDATE @Result SET similar_word=SUBSTRING(@similar_word,1,LEN(@similar_word)-1) WHERE ID=@i
SET @i=@i+1
END
SELECT [originalword.ID],orig_word,similar_word FROM @Result

GO
DROP TABLE originalword,similarword
GO



简单查询树形结构数据库表_数据库技巧_软件_IT专家网

wukele收录,使用标签:sql,时间:2007-12-7 22:36:39 | 相关网摘我也收藏

查询树表语句

1/**//****** Object: Table [dbo].[Tree] Script Date: 2005-11-04 18:07:00 ******/
2CREATE TABLE [dbo].[Tree] (
3 [ID] [int] IDENTITY (1, 1) NOT NULL ,
4 [PID] [int] NULL ,
5 [Name] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL
6) ON [PRIMARY]
7GO
8
9 CREATE CLUSTERED INDEX [IX_Tree] ON [dbo].[Tree]([PID]) ON [PRIMARY]
10GO
11
12ALTER TABLE [dbo].[Tree] WITH NOCHECK ADD
13 CONSTRAINT [PK_Tree] PRIMARY KEY NONCLUSTERED
14 (
15 [ID]
16 ) ON [PRIMARY] ,
17 CONSTRAINT [子ID不能等于父ID] CHECK ([ID] <> [PID])
18GO
19
20ALTER TABLE [dbo].[Tree] ADD
21 CONSTRAINT [FK_Tree_Tree] FOREIGN KEY
22 (
23 [PID]
24 ) REFERENCES [dbo].[Tree] (
25 [ID]
26 )
27GO
28
29/**//****** 对象: 用户定义的函数 dbo.fGetTreeTable 脚本日期: 2005-11-04 18:07:02 ******/
30CREATE FUNCTION dbo.fGetTreeTable
31 (
32 @ID int= null
33 )
34RETURNS @Tab TABLE(ID int, PID int, Name varchar(10), Lev int)
35AS
36 BEGIN
37 Declare @lev int
38 Set @lev=0
39
40 While @lev=0 or @@ROWCount>0
41 Begin
42 Set @Lev=@Lev+1
43 Insert @Tab(ID, PID, Name, Lev)
44 Select ID, PID, Name, @Lev From Tree Where (@Lev=1 and ((PID=@ID) or (@ID is null and PID is null))) or (PID in (Select ID From @Tab Where Lev=@Lev-1))
45 order by ID
46 End
47 RETURN
48 END
49
50GO
51
52--实际数据
53Insert Tree(PID, Name) values(null, 公司)
54Insert Tree(PID, Name) values(3, IT)
55Insert Tree(PID, Name) values(1, Fin)
56Insert Tree(PID, Name) values(5, XZ)
57Insert Tree(PID, Name) values(1, HR)
58GO


  直接查询Select * from dbo.fGetTreeTable(null)就可以输入所有记录。




outer和left outer join有什么区别 - greytree的专栏 - CSDNBlog

wukele收录,时间:2007-12-7 22:33:05 | 相关网摘我也收藏

使用关系代数合并数据
1 关系代数
合并数据集合的理论基础是关系代数,它是由E.F.Codd于1970年提出的。
在关系代数的形式化语言中:
 用表、或者数据集合表示关系或者实体。
 用行表示元组。
 用列表示属性。
关系代数包含以下8个关系运算符
 选取――返回满足指定条件的行。
 投影――从数据集合中返回指定的列。
 笛卡尔积――是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式进行组合。
 并――关系的加法和减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样。
 交――返回两个数据集合所共有的行。
 差――返回只属于一个数据集合的行。
 连接――在水平方向上合并两个表,其方法是:将两个表中在共同数据项上相互匹配的那些行合并起来。
 除――返回两个数据集之间的精确匹配。
此外,作为一种实现现代关系代数运算的方法,SQL还提供了:
 子查询――类似于连接,但更灵活;在外部查询中,方式可以使用表达式、列表或者数据集合的地方都可以使用子查询的结果。
本章将主要讲述多种类型的连接、简单的和相关的子查询、几种类型的并、关系除以及其他的内容。
2 使用连接
2.1 连接类型
在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。
SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。
连接类型 定义
内连接 只连接匹配的行
左外连接 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
全外连接 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
(H)(theta)连接 使用等值以外的条件来匹配左、右两个表中的行
交叉连接 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配
在INFORMIX中连接表的查询
如果FROM子句指定了多于一个表引用,则查询会连接来自多个表的行。连接条件指定各列之间(每个表至少一列)进行连接的关系。因为正在比较连接条件中的列,所以它们必须具有一致的数据类型。
SELECT语句的FROM子句可以指定以下几种类型的连接
FROM子句关键字 相应的结果集
CROSS JOIN 笛卡尔乘积(所有可能的行对)
INNER JOIN 仅对满足连接条件的CROSS中的列
LEFT OUTER JOIN 一个表满足条件的行,和另一个表的所有行
RIGHT OUTER JOIN 与LEFT相同,但两个表的角色互换
FULL OUTER JOIN LEFT OUTER 和 RIGHT OUTER中所有行的超集

2.2 内连接(Inner Join)
内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接。
下面是ANSI SQL-92标准
select *
from t_institution i
inner join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = "5801"
其中inner可以省略。
等价于早期的连接语法
select *
from t_institution i, t_teller t
where i.inst_no = t.inst_no
and i.inst_no = "5801"

2.3 外连接
2.3.1 左外连接(Left Outer Jion)
select *
from t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
其中outer可以省略。
2.3.2 右外连接(Rigt Outer Jion)
select *
from t_institution i
right outer join t_teller t
on i.inst_no = t.inst_no
2.3.3 全外连接(Full Outer)
全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。
在现实生活中,参照完整性约束可以减少对于全外连接的使用,一般情况下左外连接就足够了。在数据库中没有利用清晰、规范的约束来防范错误数据情况下,全外连接就变得非常有用了,你可以使用它来清理数据库中的数据。
select *
from t_institution i
full outer join t_teller t
on i.inst_no = t.inst_no
2.3.4 外连接与条件配合使用
当在内连接查询中加入条件是,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了。当把条件加入到join子句时,SQL Server、Informix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到where子句中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响:
条件在join子句
select *
from t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
and i.inst_no = “5801”
结果是:
inst_no inst_name inst_no teller_no teller_name
5801 天河区 5801 0001 tom
5801 天河区 5801 0002 david
5802 越秀区
5803 白云区
条件在where子句
select *
from t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = “5801”
结果是:
inst_no inst_name inst_no teller_no teller_name
5801 天河区 5801 0001 tom
5801 天河区 5801 0002 david

2.4 自身连接
自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称作递归关系)中抽取数据。例如人力资源数据库中雇员与老板的关系。
下面例子是在机构表中查找本机构和上级机构的信息。
select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
from t_institution i
join t_institution s
on i.superior_inst = s.inst_no

结果是:
superior_inst sup_inst_name inst_no inst_name
800 广州市 5801 天河区
800 广州市 5802 越秀区
800 广州市 5803 白云区

2.5 交叉(无限制) 连接
交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中一的每个行都要与数据集合二中的每一个行分别组成一个新的行。例如,如果第一个数据源中有5个行,而第二个数据源中有4个行,那么在它们之间进行交叉连接就会产生20个行。人们将这种类型的结果集称为笛卡尔乘积。
大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。
select *
from t_institution i
cross join t_teller t
在交叉连接中没有on条件子句

3 APPENDIX
3.1 A 参考资料与资源
 《Microsoft SQL Server 2000 Bile》Paul Nielsen
 Paul Nielsen的Web站点
www.isnotnull.com
3.2 注文章所有SQL在IBM Informix Dynamic Server Version 9.40.TC2E1测试通过


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=940779


简单统计SQLServer用户数据表大小_数据库技巧_数据库_IT专家网

wukele收录,时间:2007-12-7 22:26:13 | 相关网摘我也收藏

在SQLSERVER,简单的组合sp_spaceused和sp_MSforeachtable这两个存储过程,可以方便的统计出用户数据表的大小,包括记录总数和空间占用情况,非常实用,在SqlServer2K和SqlServer2005中都测试通过……
  在SQL Server,简单的组合sp_spaceused和sp_MSforeachtable这两个存储过程,可以方便的统计出用户数据表的大小,包括记录总数和空间占用情况,非常实用,在SqlServer2K和SqlServer2005中都测试通过。

/**//*
1. exec sp_spaceused '表名' (SQL统计数据,大量事务操作后可能不准)
2. exec sp_spaceused '表名', true (更新表的空间大小,准确的表空大小,但可能会花些统计时间)
3. exec sp_spaceused (数据库大小查询)
4. exec sp_MSforeachtable "exec sp_spaceused '?'" (所有用户表空间表小,SQL统计数据,,大量事务操作后可能不准)
5. exec sp_MSforeachtable "exec sp_spaceused '?',true" (所有用户表空间表小,大数据库慎用)
*/
create table #t(name varchar(255), rows bigint, reserved varchar(20), data varchar(20), index_size varchar(20), unused varchar(20))
exec sp_MSforeachtable "insert into #t exec sp_spaceused '?'"
select * from #t
drop table #t



  另外还有sp_MSforeachdb可以遍历所有数据库,使用方法详见SQL帮助。


查找运行系统里的bad sql语句的好方法_数据库技巧_软件_IT专家网

wukele收录,使用标签:sql,时间:2007-12-7 22:17:57 | 相关网摘我也收藏

本文中我们主要介绍了如何查找运行系统里bad sql,需要大家注意的是我们需要根据自己的实际情况来具体分析。而不应该照搬下面介绍的这些方法。当我们使用这些SQL语句时,会对系统表产生分组操作,当然也增大了系统的负载。希望大家在系统启动了一段时间后,在半夜负载较轻的时间定时(比如:一个月)来仔细查看一下。

  查找bad sql的方法:

  select * from (select buffer_gets, sql_text
  from v$sqlarea
  where buffer_gets >500000
  order by buffer_gets desc) where rownum<=30;


  执行次数多的SQL

  select sql_text,executions from
  (select sql_text,executions from v$sqlarea order by executions desc)
  where rownum<81;


  读硬盘多的SQL

  select sql_text,disk_reads from
  (select sql_text,disk_reads from v$sqlarea order by disk_reads desc)
  where rownum<21;


  排序多的SQL

  select sql_text,sorts from
  (select sql_text,sorts from v$sqlarea order by sorts desc)
  where rownum<21;


  分析的次数太多,执行的次数太少,要用绑变量的方法来写sql

  set pagesize 600;
  set linesize 120;
  select substr(sql_text,1,80) "sql", count(*), sum(executions) "totexecs"
  from v$sqlarea
  where executions < 5
  group by substr(sql_text,1,80)
  having count(*) > 30
  order by 2;


  游标的观察

  set pages 300;
  select sum(a.value), b.name
  from v$sesstat a, v$statname b
  where a.statistic# = b.statistic#
  and b.name = 'opened cursors current'
  group by b.name;
  select count(0) from v$open_cursor;
  select user_name,sql_text,count(0) from v$open_cursor
  group by user_name,sql_text having count(0)>30;
  查看当前用户&username执行的SQL
  select sql_text from v$sqltext_with_newlines where (hash_value,address) in
  (select sql_hash_value,sql_address from v$session where username='&username')
  order by address,piece;


extremeComponents使用AJAX 指南_笑指南山--java框架、开源搜索引擎研究

wukele收录,使用标签:java,时间:2007-12-6 21:08:15 | 相关网摘我也收藏

AJAX 指南
进行中...

在eXtremeTable中使用AJAX非常简单,对现有功能的扩展也非常方便。 AJAX整合一个最强大的地方是它不需要整合。你可以自由地使用任何你想要使用的AJAX工具包。所有你要做的就是:当表的action被调用时,告诉 eXtremeTable使用什么javascript。表的actions包括:过滤、排序、分页、显示的行数和导出。

在我自己的示例中我将使用非常酷的DWR工具包。DWR 需要的粘合代码非常少,这样我们只需要关注如何构建表。你可以通过本站示例看到效果!

[edit]Assembler Example
本示例中将需要安装DWR工具包,创建POJO来构造表并创建包含eXtremeTable的JSP页面。

[edit]安装DWR
首先要做的就是下载DWR工具包。你应该浏览网站的使用说明,不过下面是我让它符合我的需要来工作所进行的操作:

将dwr-1.1.jar拷贝到WEB-INF/lib目录
在WEB-INF目录下创建一个dwr.xml文件

简而言之(In a nutshell)创建(create)标签允许当方法被调用时,参照构建表需要的POJO。签名(signature)标签声明了被调用方法使用的实际类型。 本示例的Assembler类的getTable方法将通过传入一个Map(包含form参数)和HttpServletRequest。

在WEB-INF/web.xml中对DWR servlet进行声明
dwr-invoker DWR Servlet uk.ltd.getahead.dwr.DWRServlet debug true dwr-invoker /dwr/*
以上就完成了DWR servlet的设置,它被用来调用你的POJO。除了设置它,你不需要对这个servlet有更多的了解。

[edit]创建POJO
DWR使用(works with)POJOs。这个非常符合我们的需要,因为eXtremeTable有足够的API使用Jsp标签来构造表。实际上,JSP标签只不过是eXtremeTable Java API的前端。首先,我将展示构造表的方法:

public class Assembler { private Object build(TableModel model, Collection presidents) throws Exception { Table table = model.getTableInstance(); table.setTableId("assembler"); table.setItems(presidents); table.setAction(model.getContext().getContextPath() + "/assembler.run"); table.setTitle("Presidents"); table.setOnInvokeAction("buildTable('assembler')"); model.addTable(table); Export export = model.getExportInstance(); export.setView(TableConstants.VIEW_XLS); export.setViewResolver(TableConstants.VIEW_XLS); export.setImageName(TableConstants.VIEW_XLS); export.setText(TableConstants.VIEW_XLS); export.setFileName("output.xls"); model.addExport(export); Row row = model.getRowInstance(); row.setHighlightRow(Boolean.FALSE); model.addRow(row); Column columnName = model.getColumnInstance(); columnName.setProperty("fullName"); columnName.setIntercept((AssemblerIntercept.class).getName()); model.addColumn(columnName); Column columnNickName = model.getColumnInstance(); columnNickName.setProperty("nickName"); model.addColumn(columnNickName); Column columnTerm = model.getColumnInstance(); columnTerm.setProperty("term"); model.addColumn(columnTerm); Column columnBorn = model.getColumnInstance(); columnBorn.setProperty("born"); columnBorn.setCell(TableConstants.DATE); model.addColumn(columnBorn); Column columnDied = model.getColumnInstance(); columnDied.setProperty("died"); columnDied.setCell(TableConstants.DATE); model.addColumn(columnDied); Column columnCareer = model.getColumnInstance(); columnCareer.setProperty("career"); model.addColumn(columnCareer); return model.assemble(); }}
上面的大部分代码是自解释性的,你将在下面看到如何构造一个TableModel,但是首先你应该注意到TableModel是构造表时需要交互的唯一对象。构造表的第一步就是使用TableModel来创建Table、Row、Column和Export。一旦你创建了一个model对象,你只需要将它添加到model中。除非你将它添加到TableModel,否则的话model将不会是用它。所有东西已经构建好后,你只需要调用model.assemble()方法来构造表了。

可能table.setOnInvokeAction("buildTable('assembler')");是最有趣的调用。当你使用表的actions(翻页、过滤、排序......),这个javascript方法将被调用。如果表的onInvokeAction空白,则默认的javascript方法将被提交(submit) ,正如你所期望的那样。

Assembler类的另一个方法---getTable():

public class Assembler { public String getTable(Map parameterMap, HttpServletRequest request) { WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); PresidentsDao presidentsDao = (PresidentsDao) webApplicationContext.getBean("presidentsDao"); Collection presidents = presidentsDao.getPresidents(); Context context = null; if (parameterMap == null) { context = new HttpServletRequestContext(request); } else { context = new HttpServletRequestContext(request, parameterMap); } TableModel model = new TableModelImpl(context); try { return build(model, presidents).toString(); } catch (Exception e) { e.printStackTrace(); } return ""; }}
这个方法调用比较频繁,它执行双重职责。它需要被Controller(如果使用Spring的话)在第一次调用,如果使用Struts就等同于Action类。 随后,当使用AJAX时,这个方法也需要被调用,但是这次将传入一个定制的parameterMap。parameterMap将包含eXtremeTable使用AJAX需要的所有参数。当你看了 Controller和JSP后,这点将更加清晰。

[edit]Controller
public class AssemblerController extends AbstractController { public String successView; public void setSuccessView(String successView) { this.successView = successView; } protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mv = new ModelAndView(successView); Assembler assembler = new Assembler(); Object viewData = assembler.getTable(null, request); request.setAttribute("assembler", viewData); return mv; }}
controller在被第一次调用时来构建表。它调用POJO并将表传给request。注意空值(null)如何使用parameterMap传输。这是因为第一次表被构造时,没有对应表需要知道的actions。

[edit]JSP
通过引入(importing)合适的javascript文件来开始构建JSP页面。唯一需要包含进工程的javascript文件是extremecomponents.js,其它的javascript文件申明都是DWR使用的。