﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Think in Java -文章分类-精华文章</title><link>http://www.blogjava.net/yrj11320/category/4075.html</link><description>天生我才必有用，千金散尽还复来！
</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 08:18:23 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 08:18:23 GMT</pubDate><ttl>60</ttl><item><title>SQL语法大全</title><link>http://www.blogjava.net/yrj11320/articles/27820.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Thu, 12 Jan 2006 12:59:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/27820.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/27820.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/27820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/27820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/27820.html</trackback:ping><description><![CDATA[<P>--语 句 功 能<BR>--数据操作<BR>SELECT --从数据库表中检索数据行和列<BR>INSERT --向数据库表添加新数据行<BR>DELETE --从数据库表中删除数据行<BR>UPDATE --更新数据库表中的数据<BR>--数据定义<BR>CREATE TABLE --创建一个数据库表<BR>DROP TABLE --从数据库中删除表<BR>ALTER TABLE --修改数据库表结构<BR>CREATE VIEW --创建一个视图<BR>DROP VIEW --从数据库中删除视图<BR>CREATE INDEX --为数据库表创建一个索引<BR>DROP INDEX --从数据库中删除索引<BR>CREATE PROCEDURE --创建一个存储过程<BR>DROP PROCEDURE --从数据库中删除存储过程<BR>CREATE TRIGGER --创建一个触发器<BR>DROP TRIGGER --从数据库中删除触发器<BR>CREATE SCHEMA --向数据库添加一个新模式<BR>DROP SCHEMA --从数据库中删除一个模式<BR>CREATE DOMAIN --创建一个数据值域<BR>ALTER DOMAIN --改变域定义<BR>DROP DOMAIN --从数据库中删除一个域<BR>--数据控制<BR>GRANT --授予用户访问权限<BR>DENY --拒绝用户访问<BR>REVOKE --解除用户访问权限<BR>--事务控制<BR>COMMIT --结束当前事务<BR>ROLLBACK --中止当前事务<BR>SET TRANSACTION --定义当前事务数据访问特征<BR>--程序化SQL<BR>DECLARE --为查询设定游标<BR>EXPLAN --为查询描述数据访问计划<BR>OPEN --检索查询结果打开一个游标<BR>FETCH --检索一行查询结果<BR>CLOSE --关闭游标<BR>PREPARE --为动态执行准备SQL 语句<BR>EXECUTE --动态地执行SQL 语句<BR>DESCRIBE --描述准备好的查询 <BR>---局部变量<BR>declare @id char(10)<BR>--set @id = '10010001'<BR>select @id = '10010001' </P>
<P>---全局变量<BR>---必须以@@开头</P>
<P>--IF ELSE<BR>declare @x int @y int @z int<BR>select @x = 1 @y = 2 @z=3<BR>if @x &gt; @y<BR>print 'x &gt; y' --打印字符串'x &gt; y'<BR>else if @y &gt; @z<BR>print 'y &gt; z'<BR>else print 'z &gt; y'</P>
<P>--CASE<BR>use pangu<BR>update employee<BR>set e_wage =<BR>case<BR>when job_level = ’1’ then e_wage*1.08<BR>when job_level = ’2’ then e_wage*1.07<BR>when job_level = ’3’ then e_wage*1.06<BR>else e_wage*1.05<BR>end</P>
<P>--WHILE CONTINUE BREAK<BR>declare @x int @y int @c int<BR>select @x = 1 @y=1<BR>while @x &lt; 3<BR>begin<BR>print @x --打印变量x 的值<BR>while @y &lt; 3<BR>begin<BR>select @c = <A href="mailto:100*@x">100*@x</A> + @y<BR>print @c --打印变量c 的值<BR>select @y = @y + 1<BR>end<BR>select @x = @x + 1<BR>select @y = 1<BR>end</P>
<P>--WAITFOR<BR>--例 等待1 小时2 分零3 秒后才执行SELECT 语句<BR>waitfor delay ’01:02:03’<BR>select * from employee<BR>--例 等到晚上11 点零8 分后才执行SELECT 语句<BR>waitfor time ’23:08:00’<BR>select * from employee</P>
<P>***SELECT***</P>
<P>select *(列名) from table_name(表名) where column_name operator value<BR>ex:(宿主)<BR>select * from stock_information where stockid = str(nid)<BR>stockname = 'str_name' <BR>stockname like '% find this %' <BR>stockname like '[a-zA-Z]%' --------- ([]指定值的范围)<BR>stockname like '[^F-M]%' --------- (^排除指定范围)<BR>--------- 只能在使用like关键字的where子句中使用通配符)<BR>or stockpath = 'stock_path'<BR>or stocknumber &lt; 1000<BR>and stockindex = 24<BR>not stock*** = 'man'<BR>stocknumber between 20 and 100<BR>stocknumber in(10,20,30)<BR>order by stockid desc(asc) --------- 排序，desc-降序，asc-升序<BR>order by 1,2 --------- by列号<BR>stockname = (select stockname from stock_information where stockid = 4)<BR>--------- 子查询<BR>--------- 除非能确保内层select只返回一个行的值，<BR>--------- 否则应在外层where子句中用一个in限定符<BR>select distinct column_name form table_name --------- distinct指定检索独有的列值，不重复<BR>select stocknumber ,stocknumber + 10 = stocknumber + 10 from table_name<BR>select stockname , stocknumber = count(*) from table_name group by stockname<BR>--------- group by 将表按行分组,指定列中有相同的值<BR>having count(*) = 2 --------- having选定指定的组</P>
<P>select * <BR>from table1, table2 <BR>where table1.id *= table2.id -------- 左外部连接，table1中有的而table2中没有得以null表示<BR>table1.id =* table2.id -------- 右外部连接 </P>
<P>select stockname from table1<BR>union [all] ----- union合并查询结果集，all-保留重复行<BR>select stockname from table2</P>
<P>***insert***</P>
<P>insert into table_name (Stock_name,Stock_number) value (xxx,xxxx)<BR>value (select Stockname , Stocknumber from Stock_table2)---value为select语句</P>
<P>***update***</P>
<P>update table_name set Stockname = xxx [where Stockid = 3]<BR>Stockname = default<BR>Stockname = null<BR>Stocknumber = Stockname + 4</P>
<P>***delete***</P>
<P>delete from table_name where Stockid = 3<BR>truncate table_name ----------- 删除表中所有行，仍保持表的完整性<BR>drop table table_name --------------- 完全删除表</P>
<P>***alter table*** --- 修改数据库表结构</P>
<P>alter table database.owner.table_name add column_name char(2) null .....<BR>sp_help table_name ---- 显示表已有特征<BR>create table table_name (name char(20), age smallint, lname varchar(30))<BR>insert into table_name select ......... ----- 实现删除列的方法（创建新表）<BR>alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束</P>
<P>***function(/*常用函数*/)***</P>
<P>----统计函数----<BR>***G --求平均值<BR>COUNT --统计数目<BR>MAX --求最大值<BR>MIN --求最小值<BR>SUM --求和</P>
<P>--***G<BR>use pangu<BR>select avg(e_wage) as dept_avgWage<BR>from employee<BR>group by dept_id</P>
<P>--MAX<BR>--求工资最高的员工姓名<BR>use pangu<BR>select e_name<BR>from employee<BR>where e_wage =<BR>(select max(e_wage)<BR>from employee)</P>
<P>--STDEV()<BR>--STDEV()函数返回表达式中所有数据的标准差</P>
<P>--STDEVP()<BR>--STDEVP()函数返回总体标准差</P>
<P>--VAR()<BR>--VAR()函数返回表达式中所有值的统计变异数</P>
<P>--VARP()<BR>--VARP()函数返回总体变异数</P>
<P>----算术函数----</P>
<P>/***三角函数***/<BR>SIN(float_expression) --返回以弧度表示的角的正弦<BR>COS(float_expression) --返回以弧度表示的角的余弦<BR>TAN(float_expression) --返回以弧度表示的角的正切<BR>COT(float_expression) --返回以弧度表示的角的余切<BR>/***反三角函数***/<BR>ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角<BR>ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角<BR>ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角<BR>ATAN2(float_expression1,float_expression2) <BR>--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角<BR>DEGREES(numeric_expression)<BR>--把弧度转换为角度返回与表达式相同的数据类型可为<BR>--INTEGER/MONEY/REAL/FLOAT 类型<BR>RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为<BR>--INTEGER/MONEY/REAL/FLOAT 类型<BR>EXP(float_expression) --返回表达式的指数值<BR>LOG(float_expression) --返回表达式的自然对数值<BR>LOG10(float_expression)--返回表达式的以10 为底的对数值<BR>SQRT(float_expression) --返回表达式的平方根<BR>/***取近似值函数***/<BR>CEILING(numeric_expression) --返回&gt;=表达式的最小整数返回的数据类型与表达式相同可为<BR>--INTEGER/MONEY/REAL/FLOAT 类型<BR>FLOOR(numeric_expression) --返回&lt;=表达式的最小整数返回的数据类型与表达式相同可为<BR>--INTEGER/MONEY/REAL/FLOAT 类型<BR>ROUND(numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据<BR>--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型<BR>ABS(numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为<BR>--INTEGER/MONEY/REAL/FLOAT 类型<BR>SIGN(numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型<BR>--与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型<BR>PI() --返回值为π 即3.1415926535897936<BR>RAND([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数</P>
<P>----字符串函数----<BR>ASCII() --函数返回字符表达式最左端字符的ASCII 码值<BR>CHAR() --函数用于将ASCII 码转换为字符<BR>--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值<BR>LOWER() --函数把字符串全部转换为小写<BR>UPPER() --函数把字符串全部转换为大写<BR>STR() --函数把数值型数据转换为字符型数据<BR>LTRIM() --函数把字符串头部的空格去掉<BR>RTRIM() --函数把字符串尾部的空格去掉<BR>LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串<BR>CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置<BR>SOUNDEX() --函数返回一个四位字符码 <BR>--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值 <BR>DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异<BR>--0 两个SOUNDEX 函数返回值的第一个字符不同<BR>--1 两个SOUNDEX 函数返回值的第一个字符相同<BR>--2 两个SOUNDEX 函数返回值的第一二个字符相同<BR>--3 两个SOUNDEX 函数返回值的第一二三个字符相同<BR>--4 两个SOUNDEX 函数返回值完全相同</P>
<P>QUOTENAME() --函数返回被特定字符括起来的字符串<BR>/*select quotename('abc', '{') quotename('abc')<BR>运行结果如下<BR>----------------------------------{<BR>{abc} [abc]*/</P>
<P>REPLICATE() --函数返回一个重复character_expression 指定次数的字符串<BR>/*select replicate('abc', 3) replicate( 'abc', -2)<BR>运行结果如下<BR>----------- -----------<BR>abcabcabc NULL*/</P>
<P>REVERSE() --函数将指定的字符串的字符排列顺序颠倒<BR>REPLACE() --函数返回被替换了指定子串的字符串<BR>/*select replace('abc123g', '123', 'def')<BR>运行结果如下<BR>----------- -----------<BR>abcdefg*/</P>
<P>SPACE() --函数返回一个有指定长度的空白字符串<BR>STUFF() --函数用另一子串替换字符串指定位置长度的子串</P>
<P>----数据类型转换函数----<BR>CAST() 函数语法如下<BR>CAST() (&lt;expression&gt; AS &lt;data_ type&gt;[ length ])<BR>CONVERT() 函数语法如下<BR>CONVERT() (&lt;data_ type&gt;[ length ], &lt;expression&gt; [, style])</P>
<P>select cast(100+99 as char) convert(varchar(12), getdate())<BR>运行结果如下<BR>------------------------------ ------------<BR>199 Jan 15 2000</P>
<P>----日期函数----<BR>DAY() --函数返回date_expression 中的日期值<BR>MONTH() --函数返回date_expression 中的月份值<BR>YEAR() --函数返回date_expression 中的年份值<BR>DATEADD(&lt;datepart&gt; ,&lt;number&gt; ,&lt;date&gt;) <BR>--函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期<BR>DATEDIFF(&lt;datepart&gt; ,&lt;number&gt; ,&lt;date&gt;)<BR>--函数返回两个指定日期在datepart 方面的不同之处<BR>DATENAME(&lt;datepart&gt; , &lt;date&gt;) --函数以字符串的形式返回日期的指定部分<BR>DATEPART(&lt;datepart&gt; , &lt;date&gt;) --函数以整数值的形式返回日期的指定部分<BR>GETDATE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间</P>
<P>----系统函数----<BR>APP_NAME() --函数返回当前执行的应用程序的名称<BR>COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值<BR>COL_LENGTH(&lt;'table_name'&gt;, &lt;'column_name'&gt;) --函数返回表中指定字段的长度值<BR>COL_NAME(&lt;table_id&gt;, &lt;column_id&gt;) --函数返回表中指定字段的名称即列名<BR>DATALENGTH() --函数返回数据表达式的数据的实际长度<BR>DB_ID(['database_name']) --函数返回数据库的编号<BR>DB_NAME(database_id) --函数返回数据库的名称<BR>HOST_ID() --函数返回服务器端计算机的名称<BR>HOST_NAME() --函数返回服务器端计算机的名称<BR>IDENTITY(&lt;data_type&gt;[, seed increment]) [AS column_name])<BR>--IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中<BR>/*select identity(int, 1, 1) as column_name<BR>into newtable<BR>from oldtable*/<BR>ISDATE() --函数判断所给定的表达式是否为合理日期<BR>ISNULL(&lt;check_expression&gt;, &lt;replacement_value&gt;) --函数将表达式中的NULL 值用指定值替换<BR>ISNUMERIC() --函数判断所给定的表达式是否为合理的数值<BR>NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值<BR>NULLIF(&lt;expression1&gt;, &lt;expression2&gt;)<BR>--NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值</P><img src ="http://www.blogjava.net/yrj11320/aggbug/27820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2006-01-12 20:59 <a href="http://www.blogjava.net/yrj11320/articles/27820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML语言剖析-frameset </title><link>http://www.blogjava.net/yrj11320/articles/17996.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Thu, 03 Nov 2005 10:55:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/17996.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/17996.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/17996.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/17996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/17996.html</trackback:ping><description><![CDATA[<P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD class=article><SPAN>&lt;FRAMESET&gt; &lt;FRAME&gt; <BR>&lt;NOFRAMES&gt; <BR>&lt;IFRAME&gt; </SPAN></TD></TR>
<TR>
<TD class=article bgColor=#bbd1d1>
<DIV style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体"><FONT color=#ca00ca>■ 框架概念 ：</FONT></DIV></TD></TR>
<TR>
<TD class=article><SPAN>所谓框架便是网页画面分成几个框窗，同时取得多个 URL。只　要 &lt;FRAMESET&gt; &lt;FRAME&gt; 即可，而所有框架标记　要放在一个总起的 html 档，这个档案只记录了该框架 如何划分，不会显示任何资料，所以不必放入 &lt;BODY&gt; 标记，浏览这框架必须读取这档 案而不是其它框窗的档案。&lt;FRAMESET&gt; 是用以划分框窗，每一框窗由一个 &lt;FRAME&gt; 标 记所标示，&lt;FRAME&gt;必须在 &lt;FRAMESET&gt; 范围中使用。如下例： </SPAN>
<P><SPAN>&lt;<FONT color=#ff80c0>frameset</FONT> cols="50%,*"&gt; </SPAN></P>
<DD><SPAN>&lt;<FONT color=#0058b0>frame</FONT> name="hello" src="up2u.html"&gt; </SPAN>
<DD><SPAN>&lt;<FONT color=#0058b0>frame</FONT> name="hi" src="me2.html"&gt; <BR>&lt;<FONT color=#ff80c0>/frameset</FONT>&gt; </SPAN>
<P><SPAN>此例中 &lt;FRAMESET&gt; 把画面分成左右两相等部分，左便是显示 up2u.html，右边则会显示 me2.html 这档案，&lt;FRAME&gt; 标记所标示的框窗永远是按由上而下、由左至右的次序。 </SPAN></P>
<P><SPAN>本节与 Composer 教室的【运用框架】大部分相同，只是本节增加了内容及较为详细，正 如其它篇章一样并不会提及网页制作工具，若馈下学会了 HTML 相信你亦不会选用 Composer ， FrontPage 一类的工具了。 </SPAN></P></DD></TD></TR>
<TR>
<TD class=article bgColor=#bbd1d1>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD>
<DIV style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体"><FONT color=#ca00ca>■ &lt;FRAMESET&gt; &lt;FRAME&gt; ：</FONT></DIV></TD>
<TD align=right>
<DIV style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体">▲Top</DIV></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD class=article><SPAN>&lt;FRAMESET&gt; 称框架标记，用以宣告HTML文件为框架模式，并设定视窗如何分割。 <BR>&lt;FRAME&gt; 则只是设定某一个框窗内的参数属性。 </SPAN>
<P><SPAN>&lt;FRAMESET&gt; 参数设定： <BR>例子：&lt;frameset <FONT color=#ff0000>rows</FONT>="90,*" <FONT color=#ff0000>frameborder</FONT>="0" <FONT color=#ff0000>border</FONT>=0 <FONT color=#ff0000>framespacing</FONT>="2" <FONT color=#ff0000>bordercolor</FONT>="#008000"&gt; </SPAN></P>
<UL>
<LI type=square><SPAN><FONT color=#1b07a3>COLS="<FONT color=#ff0080>90,*</FONT>"</FONT> <BR>垂直切割画面(如分左右两个画面)，接受<FONT color=#ff0080>整数值</FONT>、<FONT color=#ff0080>百分数</FONT>， <FONT color=#ff0080>*</FONT> 则代表占用馀下空 间。数值的个数代表分成的视窗数目且以逗号分隔。例如 COLS="30,*,50%" 可以 切成三个视窗，第一个视窗是 30 pixels 的宽度，为一绝对分割，第二个视窗是当 分配完第一及第三个视窗後剩下的空间，第三个视窗则占整个画面的 50% 宽度 为 一相对分割。<FONT color=#fbb339>您可自己调整数字</FONT>。 </SPAN>
<LI type=square><SPAN><FONT color=#1b07a3>ROWS="<FONT color=#ff0080>120,*</FONT>"</FONT> <BR>就是横向切割，将画面上下分开，数值设定同上。唯 COLS 与 ROWS 两参数尽量 不要同在一个 &lt;FRAMESET&gt; 标记中，因 Netacape 偶然不能显示这类形的框架，尽 采用多重分割。 </SPAN>
<LI type=square><SPAN><FONT color=#1b07a3>frameborder="<FONT color=#ff0080>0</FONT>"</FONT> <BR>设定框架的边框，其值只有 0 和 1 ， 0 表示不要边框， 1 表示要显示边框。（避 免使用 yes 或 no ） </SPAN>
<LI type=square><SPAN><FONT color=#1b07a3>border="<FONT color=#ff0080>0</FONT>"</FONT> <BR>设定框架的边框厚度，以 pixels 为单位。 </SPAN>
<LI type=square><SPAN><FONT color=#1b07a3>bordercolor="<FONT color=#ff0080>#008000</FONT>"</FONT> <BR>设定框架的边框颜色。</SPAN> 
<LI type=square><SPAN><FONT color=#1b07a3>framespacing="<FONT color=#ff0080>5</FONT>"</FONT> <BR>表示框架与框架间的保留空白的距离。 </SPAN></LI></UL>
<P><SPAN>&lt;FRAME&gt; 参数设定： <BR>例子：&lt;frame <FONT color=#ff0000>name</FONT>="top" <FONT color=#ff0000>src</FONT>="a.html" <FONT color=#ff0000>marginwidth</FONT>="5" <FONT color=#ff0000>marginheight</FONT>="5" <FONT color=#ff0000>scrolling</FONT>="Auto" <FONT color=#ff0000>frameborder</FONT>="0" <FONT color=#ff0000>noresize</FONT> <FONT color=#ff0000>framespacing</FONT>="6" <FONT color=#ff0000>bordercolor</FONT>="#0000FF"&gt; </SPAN></P>
<UL>
<LI><SPAN><FONT color=#1b07a3>SRC="<FONT color=#ff0080>a.html</FONT>"</FONT><BR>设定此框窗中要显示的网页档案名称，每个框窗一定要对应著一个网页档案。你可 使用绝对路径或相对路径，有关此两者详见於【连结进阶】。 </SPAN>
<LI><SPAN><FONT color=#1b07a3>NAME="<FONT color=#ff0080>top</FONT>"</FONT><BR>设定这个框窗的名称，这样才能指定框架来作连结，必须但任意命名。 </SPAN>
<LI><SPAN><FONT color=#1b07a3>frameborder=<FONT color=#ff0080>0</FONT></FONT><BR>设定框架的边框，其值只有 0 和 1 ， 0 表示不要边框， 1 表示要显示边框。（避 免使用 yes 或 no ） </SPAN>
<LI><SPAN><FONT color=#1b07a3>framespacing="<FONT color=#ff0080>6</FONT>"</FONT><BR>表示框架与框架间的保留空白的距离。 </SPAN>
<LI><SPAN><FONT color=#1b07a3>bordercolor="<FONT color=#ff0080>#008000</FONT>"</FONT><BR>设定框架的边框颜色。颜色值请参考【HTML 剖析】。 </SPAN>
<LI><SPAN><FONT color=#1b07a3>scrolling="<FONT color=#ff0080>Auto</FONT>"</FONT><BR>设定是否要显示卷轴，YES 表示要显示卷轴，NO 表示无论如何都不要显示， AUTO是视情况显示。 </SPAN>
<LI><SPAN><FONT color=#1b07a3>noresize</FONT><BR>设定不让使用者可以改变这个框框的大小，亦没有设定此参数，使用者可以很随 意地拉动框架，改变其大小。 </SPAN>
<LI><SPAN><FONT color=#1b07a3>marginhight=<FONT color=#ff0080>5</FONT></FONT><BR>表示框架高度部份边缘所保留的空间。 </SPAN>
<LI><SPAN><FONT color=#1b07a3>marginwidth=<FONT color=#ff0080>5</FONT></FONT><BR>表示框架宽度部份边缘所保留的空间。 </SPAN></LI></UL><SPAN>以下是一些例子：（与 Composer 教室的【运用框架】相同） </SPAN>
<P>
<TABLE cellSpacing=2 cellPadding=2 width="100%" border=0>
<TBODY>
<TR>
<TD width=110 bgColor=#fde2bf><SPAN>例子</SPAN></TD>
<TD bgColor=#fbdff8><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体">HTML Code</SPAN></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=2 width=100 border=1>
<TBODY>
<TR>
<TD>&nbsp;</TD></TR>
<TR>
<TD width=20 height=60>&nbsp;</TD></TR></TBODY></TABLE></TD>
<TD width=366><SPAN>&lt;frameset rows="80,*"&gt; </SPAN>
<DD><SPAN>&lt;frame name="top" src="a.html"&gt; </SPAN>
<DD><SPAN>&lt;frame name="bottom" src="b.html"&gt; <BR>&lt;/frameset&gt;</SPAN> </DD></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=2 cellPadding=2 width="100%" border=0>
<TBODY>
<TR>
<TD width=110 bgColor=#fde2bf><SPAN>例子</SPAN></TD>
<TD bgColor=#fbdff8><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体">HTML Code</SPAN></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=2 width=100 border=1>
<TBODY>
<TR>
<TD>&nbsp;</TD></TR>
<TR>
<TD width=20 height=40>&nbsp;</TD></TR>
<TR>
<TD>&nbsp;</TD></TR></TBODY></TABLE></TD>
<TD width=366><SPAN>&lt;frameset rows="80,*,80"&gt; </SPAN>
<DD><SPAN>&lt;frame name="top" src="a.html"&gt; </SPAN>
<DD><SPAN>&lt;frame name="middle" src="b.html"&gt; </SPAN>
<DD><SPAN>&lt;frame name="bottom" src="c.html"&gt; <BR>&lt;/frameset&gt;</SPAN> </DD></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=2 cellPadding=2 width="100%" border=0>
<TBODY>
<TR>
<TD width=110 bgColor=#fde2bf><SPAN>例子</SPAN></TD>
<TD bgColor=#fbdff8><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体">HTML Code</SPAN></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=2 width=100 border=1>
<TBODY>
<TR>
<TD>&nbsp;</TD>
<TD width=80 rowSpan=2>&nbsp;</TD></TR>
<TR>
<TD width=20 height=60>&nbsp;</TD></TR></TBODY></TABLE></TD>
<TD width=366><SPAN>&lt;frameset cols="150,*"&gt; <BR>&lt;frameset rows="80,*"&gt; </SPAN>
<DD><SPAN>&lt;frame name="upper_left" src="a.html"&gt; </SPAN>
<DD><SPAN>&lt;frame name="lower_left" src="b.html"&gt; <BR>&lt;/frameset&gt; </SPAN>
<DD><SPAN>&lt;frame name="right" src="c.html"&gt; <BR>&lt;/frameset&gt;</SPAN> </DD></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=2 cellPadding=2 width="100%" border=0>
<TBODY>
<TR>
<TD width=110 bgColor=#fde2bf><SPAN>例子</SPAN></TD>
<TD bgColor=#fbdff8><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体">HTML Code</SPAN></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=2 width=100 border=1>
<TBODY>
<TR>
<TD colSpan=2>&nbsp;</TD></TR>
<TR>
<TD width=20 height=60>&nbsp;</TD>
<TD width=80>&nbsp;</TD></TR></TBODY></TABLE></TD>
<TD width=366><SPAN>&lt;frameset rows="80,*"&gt; </SPAN>
<DD><SPAN>&lt;frame name="top" src="a.html"&gt; <BR>&lt;frameset cols="150,*"&gt; </SPAN>
<DD><SPAN>&lt;frame name="lower_left" src="b.html"&gt; </SPAN>
<DD><SPAN>&lt;frame name="lower_right" src="c.html"&gt; <BR>&lt;/frameset&gt; <BR>&lt;/frameset&gt;</SPAN> </DD></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=2 cellPadding=2 width="100%" border=0>
<TBODY>
<TR>
<TD width=110 bgColor=#fde2bf><SPAN>例子</SPAN></TD>
<TD bgColor=#fbdff8><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体">HTML Code</SPAN></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=2 width=100 border=1>
<TBODY>
<TR>
<TD width=20 rowSpan=2>&nbsp;</TD>
<TD width=80>&nbsp;</TD></TR>
<TR>
<TD height=60>&nbsp;</TD></TR></TBODY></TABLE></TD>
<TD width=366><SPAN>&lt;frameset cols="150,*"&gt; </SPAN>
<DD><SPAN>&lt;frame name="left" src="a.html"&gt; <BR>&lt;frameset rows="80,*"&gt; </SPAN>
<DD><SPAN>&lt;frame name="upper_right" src="b.html"&gt; </SPAN>
<DD><SPAN>&lt;frame name="lower_right" src="c.html"&gt; <BR>&lt;/frameset&gt; <BR>&lt;/frameset&gt;</SPAN> </DD></TD></TR></TBODY></TABLE></P></TD></TR>
<TR>
<TD class=article bgColor=#bbd1d1>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD>
<DIV style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体"><FONT color=#ca00ca>■ &lt;NOFRAMES&gt; ：</FONT></DIV></TD>
<TD align=right>
<DIV style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体">▲Top</DIV></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD class=article><SPAN>当别人使用的浏览器太旧，不支援框架这个功能时，他看到的将会是一片空白。为了避免 这种情况，可使用 <FONT color=#ff0000>&lt;NOFRAMES&gt;</FONT> 这个标记，当使用者的浏览器看不到框架时，他就会看 到 <FONT color=#ff0000>&lt;NOFRAMES&gt;</FONT> 与 <FONT color=#ff0000>&lt;/NOFRAMES&gt;</FONT> 之间的内容，而不是一片空白。这些内容可以是提醒 浏览转用新的浏览器的字句，甚至是一个没有框架的网页或能自动切换至没有框架的版本 亦可。 </SPAN>
<P><SPAN>应用方法： <BR>在&lt;frameset&gt; 标记范围加入 &lt;/NOFRAMES&gt; 标记，以下是一个例子： </SPAN></P>
<DL>
<DT><SPAN>&lt;frameset rows="80,*"&gt; </SPAN>
<DD><SPAN><FONT color=#008000>&lt;noframes&gt; <BR>&lt;body&gt; <BR>很抱歉，馈下使用的浏览器不支援框架功能，请转用新的浏览器。 <BR>&lt;/body&gt; <BR>&lt;/noframes&gt;</FONT> </SPAN>
<DD><SPAN>&lt;frame name="top" src="a.html"&gt; </SPAN>
<DD><SPAN>&lt;frame name="bottom" src="b.html"&gt; </SPAN>
<DT><SPAN>&lt;/frameset&gt; </SPAN></DT></DL>
<P><SPAN>若浏览器支援框架，那堋它不会理会 &lt;noframes&gt; 中的东西，但若浏览器不支援框架，由 於不认识所有框架标记，不明的标记会被略过，标记包围的东西便被解读出来，所以放在 &lt;noframes&gt;范围内的文字会被显示。 </SPAN></P></TD></TR>
<TR>
<TD class=article bgColor=#bbd1d1>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD>
<DIV style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体"><FONT color=#ca00ca>■ &lt;IFRAME&gt; ：</FONT></DIV></TD>
<TD align=right>
<DIV style="FONT-SIZE: 9pt; FONT-FAMILY: 新细明体">▲Top</DIV></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD class=article><SPAN><FONT color=#ff0000>这标记只适用於 IE。</FONT> 它的作用是在一页网页中间插入一个框窗以显示另一个文件。它是 一个围堵标记，但围著的字句只有在浏览器不支援 iframe 标记时才会显示，如&lt;noframes&gt; 一样，可以放些提醒字句之类。通常 iframe 配合一个辨认浏览器的 Java Script 会较好，若 javascript 认出该浏览器并非 Internet Explorer 便会切换至另一版本。 </SPAN>
<P><SPAN>&lt;iframe&gt; 的参数设定如下： <BR>例子： &lt;iframe <FONT color=#ff0000>src</FONT>="iframe.html" <FONT color=#ff0000>name</FONT>="test" <FONT color=#ff0000>align</FONT>="MIDDLE" <FONT color=#ff0000>width</FONT>="300" <FONT color=#ff0000>height</FONT>="100" <FONT color=#ff0000>marginwidth</FONT>="1" <FONT color=#ff0000>marginheight</FONT>="1" <FONT color=#ff0000>frameborder</FONT>="1" scrolling="Yes"&gt; </SPAN></P>
<UL>
<LI><SPAN><FONT color=#ff0000>src</FONT>="iframe.html" <BR>欲显示於此框窗的文件来源除档案名称，必要加上相对或绝对路径。 </SPAN>
<LI><SPAN><FONT color=#ff0000>name</FONT>="test" <BR>此框窗名称，这是连结标记的 target 参数所　要的， </SPAN>
<LI><SPAN><FONT color=#ff0000>align</FONT>="MIDDLE" <BR>可选值为 left, right, top, middle, bottom，作用不大 </SPAN>
<LI><SPAN><FONT color=#ff0000>width</FONT>="300" <FONT color=#ff0000>height</FONT>="100" <BR>框窗的宽及长，以 pixels 为单位。 </SPAN>
<LI><SPAN><FONT color=#ff0000>marginwidth</FONT>="1" <FONT color=#ff0000>marginheight</FONT>="1" <BR>该插入的文件与框边所保留的空间。 </SPAN>
<LI><SPAN><FONT color=#ff0000>frameborder</FONT>="1" <BR>使用 1 表示显示边框， 0 则不显示。（可以是 yes 或 no） </SPAN>
<LI><SPAN><FONT color=#ff0000>scrolling</FONT>="Yes" <BR>使用 Yes 表示容许卷动（内定）， No 则不容许卷动。 </SPAN></LI></UL></TD></TR></TBODY></TABLE></P><img src ="http://www.blogjava.net/yrj11320/aggbug/17996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-11-03 18:55 <a href="http://www.blogjava.net/yrj11320/articles/17996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详细为您解析JSP的环境引擎--Websphere</title><link>http://www.blogjava.net/yrj11320/articles/17584.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Mon, 31 Oct 2005 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/17584.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/17584.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/17584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/17584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/17584.html</trackback:ping><description><![CDATA[WebSphere<A href="http://dev.21tx.com/java/as/" target=_blank><FONT color=#3366cc>应用服务器</FONT></A>使您能够为<A href="http://dev.21tx.com/java/jsp/" target=_blank><FONT color=#3366cc>Servlet</FONT></A>的开发实现“一次写成，各处使用”的目的。该产品包括一个基于<A href="http://dev.21tx.com/java/" target=_blank><FONT color=#3366cc>Java</FONT></A>的Servlet引擎，独立于Web<A href="http://www.21tx.com/server/" target=_blank><FONT color=#3366cc>服务器</FONT></A>和它所基于的<A href="http://dev.21tx.com/os/" target=_blank><FONT color=#3366cc>操作系统</FONT></A>。WebSphere应用服务器提供了<SPAN id=tech_art_center><!-- Copyright 1999-2000 ThruPort Technologies http://www.thruport.com --><!-- end dynamic banner insert --></SPAN>服务器插件的选项，与大多数流行的应用程序设计接口（API）兼容。所支持的 Web 服务器有:<BR><BR>IBM HTTP 服务器<BR>Apache Server<BR>Domino<BR><A href="http://dev.21tx.com/corp/lotus/" target=_blank><FONT color=#3366cc>Lotus</FONT></A> Domino Go Webserver<BR>Netscape Ent<A href="http://dev.21tx.com/corp/solution/erp/" target=_blank><FONT color=#3366cc>ERP</FONT></A>rise Server<BR>Netscape FastTrack Server<BR>Microsoft Internet Information Server<BR><BR>除了 Servlet 引擎及插件外，WebSphere应用服务器还提供：<BR><BR>1. JavaSoft Java Servlet API 实现，以及这些 API 的扩展和附加。<BR><BR>2. 示例和文档，示例 Servlet 和 Web 站点应用程序演示了简单和高级技术。联机和可打印文档供您快速入门，并帮助掌握服务器高级功能的使用演示基本类及其扩展的示例应用程序。<BR><BR>3. WebSphere应用服务器的管理器，使用图形界面，易于: <BR><BR>(1) 为装入本地和远程的 Servlet 设置选项 <BR>(2) 设置初始化参数<BR>(3) 管理 Servlet<BR>(4) 指定 Servlet 别名 <BR>(5) 创建 Servlet 链和过滤 <BR>(6) 启用轻量级目录访问协议（LDAP）目录支持<BR>(7) 记录 Servlet 消息<BR>(8) 启用 JVM 调试<BR>(9) 监控 WebSphere应用服务器 使用的资源<BR>(10) 监控已装入 Servlet、活动 Servlet 会话和 <A href="http://dev.21tx.com/java/adv/jdbc/" target=_blank><FONT color=#3366cc>JDBC</FONT></A> 连接 <BR>(11) 控错误、事件、异常情况和日志输出 <BR>(12) 创建转储和数据快照<BR>(13) 动态地启用和禁用跟踪<BR>4. 缓存和再使用与 JDBC-从属<A href="http://dev.21tx.com/database/" target=_blank><FONT color=#3366cc>数据库</FONT></A>连接的连接管理功能。当一个 Servlet 需要数据库连接时，它可从可用连接的缓冲池获得，从而消除了为每个请求打开一个新连接的所需花费的系统开销。<BR><BR>5. 附加的 Java 类，遵循 JavaBeans 规范，允许程序员访问 JDBC-从属数据库。当隐藏使用关系数据库的复杂度时，这些数据访问 Bean 可提供增强功能。它们可用于可视集成开发环境中。<BR><BR>6. <A href="http://dev.21tx.com/java/jsp/" target=_blank><FONT color=#3366cc>JSP</FONT></A>的动态页面内容支持。JSP 技术使您能够通过服务器端脚本生成动态 Web 页面。其结果是将呈示逻辑（例如，定义 Web 站点结构和外观的 HTML 代码）从业务逻辑（例如，访问数据库以获得要显示在 Web 站点上的信息的 Java 编码信息）中分隔出来。灵活性方面，JSP 文件可包括任何直接插入的 Java 的组合：<SERVLET> 标记、NCSA 标记和 JavaBean。<BR><BR>7. 启用 LDAP（轻量级目录访问协议）支持的目录服务。<BR><BR>8. 用于集成WebSphere应用服务器和Web服务器（如Apache Server） 到Tivoli 管理环境（Tivoli Management Environment）以获得分布式监控和操作的模块和命令行界面。Tivoli 模块并不与WebSphere应用服务器一起发行，请访问Web 站点（http://www.software.ibm.com/webservers/appserv/）以获得更多信息。<BR><BR>9. 包含了eNetworkDispatcher、WebTrafficeExpress代理服务器和AFS分布式文件系统，可以提供可伸缩的Web服务器环境。 WebSphere Applecation Server的总体结构如下图所示：<BR><BR>
<CENTER><IMG src="http://image.21tx.com/image/20050627/17601.jpg"></CENTER><BR><BR>其基本工作过程：<BR><BR>客户发出请求后，由HttpServer将Servlet调用请求交给Application Server，由Application Server 和Java Servlet Engine 执 行 用 户 调 用 的Servlet 进 行数据库连接，将Sql请求发送给数据库进行处理。<BR><BR>数据库将结果返回Appliction Server。Servlet生成动态页面后，将处理结果交给HttpServer。HttpServer将页面返回给用户。<BR><BR>WebSphere应用服务器对JSP的支持是通过JSP处理器来实现的。在 Web 服务器上安装 WebSphere应用服务器时，Web 服务器的配置被设置成将对 JSP 文件（即文件扩展名为 .jsp）的 HTTP 请求传递至 WebSphere应用服务器。<BR><BR>WebSphere应用服务器配置则被设置成将 JSP 文件传递至其 JSP 处理器（pageCompile）。JSP 处理器对每一个 JSP 文件创建并编译 Servlet。该处理器还为每个 JSP 文件产生两个文件：<BR><BR>(1) java 文件：包含可用于 Servlet 的 Java 语言代码；<BR><BR>(2) class 文件：编译过的 Servlet。<BR><BR>JSP 处理器把 .java 和 .class 文件放在目录 servletspagecompileJSP_file_path 下，其中 JSP_file_path 是 JSP 源文件所在的目录路径。例如，若JSP 文件在WebSphereAppServersamplesWebBank 目录下，则.java 和.class 文件就在WebSphereAppServerservletspagecompileWebSphereApp ServersamplesWebBank 目录下。<BR><BR>.java 和 .class 文件的文件名相同。处理器使用了命名约定，该命名约定包括将下划线字符和后缀添加到 JSP 文件名中。例如，如果 JSP 文件名是 login.jsp，则生成的文件为 _login_xjsp.java 和 _login_xjsp.class。<BR><BR>如同所有的 Servlet，由 JSP 文件生成的 Servlet 是 javax.servlet.http.HttpServlet的子类或子孙类。如果 Servlet 类是软件包的一部分，则 Servlet Java 代码包含了用于一些必需类和软件包语句的导入语句。<BR><BR>如果 JSP 文件包含 JSP 语法（例如指令和 scriptlets），则 JSP 处理器会将 JSP 语法转换成等价的 Java 代码。如果 JSP 文件包含 HTML 标记，则处理器添加 Java 代码，以使 Servlet 能一个接一个字符地输出 HTML。<BR><BR>Websphere由于面向专业人员，要完全掌握有一定的难度。另外，Websphere本身有2G多的容量，需要256M以上内存支持，系统要求很高。<BR><BR><A href="http://dev.21tx.com/web/" target=_blank><FONT color=#3366cc>Web</FONT></A>sphere的安装<BR><BR>Websphere在<A href="http://dev.21tx.com/os/linux/" target=_blank><FONT color=#3366cc>Linux</FONT></A>下的安装<BR><BR>1．以超级用户root 登入Linux系统，在控制台（Console）或 图形Xwindow X终端进行以下<SPAN id=tech_art_center><!-- Copyright 1999-2000 ThruPort Technologies http://www.thruport.com --><!-- end dynamic banner insert --></SPAN>所有步骤的操作，推荐使用X终端。<BR><BR>2．装载本次大赛IBM我爱Linux Web应用开发盘，在命令行敲入：mount /mnt/cdrom <BR><BR>3．进入光盘根目录，在命令行敲入：cd /mnt/cdrom<BR><BR>4．运行光盘安装程序，在命令行敲入：./install.sh.安装画面自动进入如图所示，因为您要进入高级组进行应用程序开发大赛，所以按照安装画面提示，我们选择敲入：A, 进入高级组安装。<BR><BR>
<CENTER><IMG src="http://image.21tx.com/image/20050627/17609.gif"></CENTER><BR><BR>5．进入高级组安装画面如图所示。此次IBM我爱Linux Web应用大赛使用了众多的IBM 应用软件，为了减少大赛参与者众多的产品安装使用问题，本光盘针对TurboLinux DataServer 中文版6.1进行了大量的定制工作，使您能更简便地安装应用大赛软件。<BR><BR>为了您能成功地参加此次大奖赛，希望您采用我们捆绑的TurboLinux作为Linux系统平台。按照画面提示敲入：Y, 进行下一步自动安装。<BR><BR>
<CENTER><IMG src="http://image.21tx.com/image/20050627/17611.gif"></CENTER><BR><BR>6．安装程序自动安装进行中的画面，此画面显示自动安装了IBM <A href="http://dev.21tx.com/java/base/jdk/" target=_blank><FONT color=#3366cc>JDK</FONT></A>, IBM HTTP Server, IBM SSL Modules …等等众多的应用软件，具体请参考您安装的实际情况。<BR><BR>
<CENTER><IMG src="http://image.21tx.com/image/20050627/17617.gif"></CENTER><BR><BR>7．IBM HTTP Server 是以 Apache HTTP Server 为<A href="http://dev.21tx.com/java/base/" target=_blank><FONT color=#3366cc>基础</FONT></A>进行开发的WWW<A href="http://www.21tx.com/server/" target=_blank><FONT color=#3366cc>服务器</FONT></A>，并在Apache原来的基础上加入了SSL和在线网页HTTP Server配置的功能。<BR><BR>为了使您能安全地进行远程WEB 方式的配置、管理HTTP Server，您必须为您的HTTP管理服务器设置访问用户和访问用户密码。安装过程中程序会自动提示您输入管理用户名称（缺省用户名为：admin, 直接按回车即为缺省用户），和管理用户密码（密码需输入两次，且两次密码相同）。具体如画面所示。 <BR><BR>
<CENTER><IMG src="http://image.21tx.com/image/20050627/17621.gif"></CENTER><BR><BR>8．接下来，安装程序就会自动安装IBM <A href="http://dev.21tx.com/database/db2/" target=_blank><FONT color=#3366cc>DB2</FONT></A> UDB 工作组版<A href="http://dev.21tx.com/database/" target=_blank><FONT color=#3366cc>数据库</FONT></A> V7.1，此过程无需任何人工干预，系统会自动完成。如图所示。 
<CENTER><IMG src="http://image.21tx.com/image/20050627/17628.gif"></CENTER><BR><BR>9．显示IBM DB2 安装成功的状态。 
<CENTER><IMG src="http://image.21tx.com/image/20050627/17637.gif"></CENTER><BR><BR>10．系统自动安装完IBM DB2数据库后，自动进入IBM WebSphere <A href="http://dev.21tx.com/java/as/" target=_blank><FONT color=#3366cc>应用服务器</FONT></A>和相关应用软件的安装阶段，自动装入Websphere Application Server、相关文档、IBM VisualAge for <A href="http://dev.21tx.com/java/" target=_blank><FONT color=#3366cc>Java</FONT></A> for Linux 3.0、WebSphere 应用开发实例模板EasyPortal … 其中有些软件包比较大，如VisualAge for Java, 安装时间可能比较长，请耐心等待系统自动安装结束。如图所示。 
<CENTER><IMG src="http://image.21tx.com/image/20050627/17644.gif"></CENTER><BR><BR>11．显示整个高级组应用软件安装成功，并可进入实用阶段。 
<CENTER><IMG src="http://image.21tx.com/image/20050627/17647.gif"></CENTER><BR><BR>12．安装成功后，后台IBM DB2 和 IBM HTTP 应该是已正常启动，您应可以在浏览器中浏览到本机的主页。在Xwindow 中启动 Netscape，URL 栏中敲入：http://localhost or http://your_host_ip or http://your_host_name , 若后台IBM HTTP Server正常启动，应该看到画面 
<CENTER><IMG src="http://image.21tx.com/image/20050627/17656.jpg"><BR><BR>注意：如果您没有看到首页画面，IBM HTTP Server 可能没有正常启动，主要原因是由于您在安装<A href="http://dev.21tx.com/os/linux/" target=_blank><FONT color=#3366cc>Linux</FONT></A>系统过程中‘主机名’命名的问题。您可以使用以下方法解决问题：<BR><BR>A. 查询您当前Li<SPAN id=tech_art_center><!-- Copyright 1999-2000 ThruPort Technologies http://www.thruport.com --><!-- end dynamic banner insert --></SPAN>nux系统的主机名，敲入命令：hostname <BR><BR>B. 假设系统返回应答为：linux.cn.ibm.com<BR><BR>C. 紧接着，敲入命令：ping linux.cn.ibm.com,察看是否能通过此主机名连通主机，若能连通，请跳过D. 进入 E. 。<BR><BR>D. 如果不能正常ping 通 linux.cn.ibm.com，敲入命令：vi /etc/hosts 编辑文件. <BR><BR>在文件最后加入此行:<BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>xxx.xxx.xxx.xxx yourhostname.com yourhost</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>此处 xxx.xxx.xxx.xxx 是您安装Linux系统实际使用的数字IP地址，譬如：192.168.1.100, 此IP地址必须能直接ping 通 （ping 192.168.1.100） <BR><BR>E. 编辑IBM HTTP 配置文件，敲入命令: vi /opt/IBMHTTPServer/conf/httpd.conf <BR><BR>寻找到以 #ServerName your.machine.com开头的这一行，在其后另加入一行： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>ServerName yourhostname</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>F. 重新启动IBM HTTP Server <A href="http://www.21tx.com/server/" target=_blank><FONT color=#3366cc>服务器</FONT></A>，敲入命令： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>/opt/IBMHTTPServer/bin/apachectl restart</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>即可正常启动HTTP 服务器。 <BR><BR><A href="http://dev.21tx.com/web/" target=_blank><FONT color=#3366cc>Web</FONT></A>sphere在NT下的安装 <BR><BR>在<A href="http://dev.21tx.com/os/windows/" target=_blank><FONT color=#3366cc>Windows</FONT></A>下安装WebSphere必须要求有128兆内存以上，要是256兆就更好了。<A href="http://dev.21tx.com/os/" target=_blank><FONT color=#3366cc>操作系统</FONT></A>要求Windows NT（Pack 3）。安装之前，必须要有Web服务器，可以是如下之一： <BR><BR>IBM HTTP 服务器版本 Windows NT 版（WebSphere<A href="http://dev.21tx.com/java/as/" target=_blank><FONT color=#3366cc>应用服务器</FONT></A>安装光盘包括IBM HTTP 服务器） <BR><BR>Apache Server 版本 Windows NT 版 <BR><BR>Domino 版本 5.0 Windows NT 版 <BR><BR><A href="http://dev.21tx.com/corp/lotus/" target=_blank><FONT color=#3366cc>Lotus</FONT></A> Domino Go Webserver 版本 4 Windows NT 版 <BR><BR>Microsoft Internet Information Server 版本 3.x以上 Windows NT 版 <BR><BR>Netscape Ent<A href="http://dev.21tx.com/corp/solution/erp/" target=_blank><FONT color=#3366cc>ERP</FONT></A>rise Server 版本 3.01 和 版本 3.51 Windows NT 版（建议使用版本 3.5.1） <BR><BR>Netscape FastTrack Server 版本 3.01 Windows NT 版 <BR><BR>还需要<A href="http://dev.21tx.com/java/" target=_blank><FONT color=#3366cc>Java</FONT></A> 开发组件（<A href="http://dev.21tx.com/java/base/jdk/" target=_blank><FONT color=#3366cc>JDK</FONT></A>），这里，我们建议使用与 WebSphere应用服务器一起提供的 JDK。还需要Java <A href="http://dev.21tx.com/java/jsp/" target=_blank><FONT color=#3366cc>Servlet</FONT></A> API，WebSphere应用服务器包括 JSDK 版本 2.0 或更高版本。 <BR><BR>当然，还需要Web浏览器和<A href="http://dev.21tx.com/java/applet/" target=_blank><FONT color=#3366cc>Applet</FONT></A>viewer或者支持JDK1.1 的浏览器。例如： Netscape Navigator 4.06 或 4.0.7、或者带有修正包的 Microsoft Internet Explorer 4.01 或更高版本、或者Sun HotJava 1.1 或更高版本。 <BR><BR>有一些旧的浏览器不能够正确地处理启用本机语言支持的文本。如果在用户界面上看到外来字符，例如“sEnable”，而不是“Enable”，可以通过升级浏览器校正。 <BR><BR>第一步：安装Web服务器： <BR><BR>如果打算安装 IBM HTTP 服务器，就必须在安装 WebSphere应用服务器之前安装它。WebSphere应用服务器安装光盘有IBM HTTP Server。安装WebSphere应用服务器会更改 Web 服务器 httpd.conf 文件。 <BR><BR>但是，如果Web 服务器是在安装 WebSphere应用服务器之后安装的，就不会进行更改，并且 WebSphere应用服务器也不能够正确运行。安装 IBM HTTP 服务器之后，需要一些配置以启用 SSL 支持。具体如何配置，参阅 IBM HTTP 服务器文档以获得指示信息。 <BR><BR>对于计划安装其它的Web 服务器（如Apache Server），也请在安装 WebSphere应用服务器之前安装它。 <BR><BR>第二步：安装之前： <BR><BR>在安装之前，如果系统中有旧版本的WebSphere，要先把旧的版本卸载了。然后再安装新的版本。卸装之前，最好先备份 WebSphere应用服务器版本 1.x 文件。 <BR><BR>(1) 文件备份 <BR><BR>从Windows NT 卸装以前版本的 WebSphere应用服务器之前，确保要移植的文件已经或者将要保存。安装 WebSphere应用服务器版本 2.0 时显示出的图形用户界面备份 WebSphere应用服务器目录中的文件，包括类、领域、Servlet、属性文件，其中，属性文件包括servlet.properties、admin_port.properties、rules.properties、jvm.properties、aliases.properties、connmgr.properties、userprofile.properties。如果有文件驻留在这四个目录之外（例如，如果在 WebSphere应用服务器 安装中创建自己的目录），在安装 WebSphere应用服务器 版本 2.0. 之前，在 WebSphere应用服务器 安装之外的位置备份文件。 <BR><BR>(2) 卸载前一版本 <BR><BR>对于 Windows NT，使用开始 --&gt; 控制面板中的添加/删除选项，或从开始 --&gt; 程序 --&gt; IBM WebSphere --&gt; WebSphere应用服务器版本1.x 卸装。 <BR><BR>注意：当已安装了某版本的 WebSphere应用服务器，它将复制Web 站点配置文件作为备份文件，然后修改原始配置文件。当使用 Web 服务器时这个已被修改过的文件就成为活动的配置文件。当卸装 WebSphere应用服务器时，不会恢复以前的配置文件，它仍然是备份文件。为了使这些设置再次活动，必须将它们从备份文件转换为活动的 Web 服务器配置文件。 <BR><BR>另外，需要清除 CLASSPATH。安装版本2.0之前要删除这些信息。对于在 Windows NT 上使用Go Webserver 的Web服务器来说，当安装 WebSphere应用服务器时能自动卸装Go Webserver 上的 Java 支持。其它的请查阅有关文档。 <BR><BR>第三步：安装WebSphere服务器： <BR><BR>在即将安装 WebSphere应用服务器之前，请确保已经： <BR><BR>(1)备份所有未通过安装程序自动备份的文件 <BR><BR>(2) 安装您计划使用的 Web 服务器。Web 服务器必须在安装 WebSphere应用服务器之前安装。 <BR><BR>(3) 安装之前要确保Web 服务器已经停止运行。 <BR><BR>注意：在WebSphere应用服务器的安装期间，如果指定使用 IBM HTTP 服务器或 Apache Server，将提示您确认 Web 服务器 httpd.conf 文件的位置。 <BR><BR>在 Windows NT 上，插入 WebSphere应用服务器安装光盘，转至以 Windows NT 操作系统命名的子目录，运行可执行安装程序（setup.exe）。一系列面板将指导您完成安装。 <BR><BR>配置 WebSphere应用服务器 <BR><BR>下面介绍如何配置WebSphere应用服务器，以使它和它的组件以能够协同工作。完成这些任务之后，WebSphere应用服务器通过缺省的配置就能够运行几乎所有的功能。 <BR><BR>(1) 配置 Apache Server <BR><BR>如果使用Apache Server作为Web服务器，在httpd.conf文件中加入此行： <BR><BR>AddModule mod_app_server.c。 <BR><BR>(2) 使用<A href="http://dev.21tx.com/database/" target=_blank><FONT color=#3366cc>数据库</FONT></A>。 <BR><BR>要保证WebSphere应用服务器与关系数据库（如 <A href="http://dev.21tx.com/database/oracle/" target=_blank><FONT color=#3366cc>Oracle</FONT></A> 或 <A href="http://dev.21tx.com/database/db2/" target=_blank><FONT color=#3366cc>DB2</FONT></A>）的连接：将.zip 文件加到文件 /properties/bootstrap.properties 中的 java.classpath 属性。也可以使用 WebSphere应用服务器的管理器界面的 Java 引擎页面来指定文件。同样，确保 java.classpath 包含用于数据库连接的有效的<A href="http://drivers.21tx.com/" target=_blank><FONT color=#3366cc>驱动</FONT></A>程序。 <BR><BR>(3) 运行模式 <BR><BR>ose.mode 属性是用来控制WebSphere应用服务器是作为Web 服务器的一部分（进程内），还是在独立模式下运行（进程外）。该属性在 /properties/bootstrap.properties 文件中。ose.mode 缺省值是 out。Apache Server 或 IBM HTTP 服务器要求设置 ose.mode 属性必须为 out，就是说WebSphere应用服务器必须运行在独立模式下。 <BR><BR>对于其它 Web 服务器，可以将ose.mode 为 in 并且作为 Web 服务器的一部分运行 WebSphere应用服务器。 但是通常都不这么做。如有必要需要复位 ose.mode就是说将ose.mode的值设为out。 <BR><BR>例如，如果从作为 Webserver 一部分运行的 Netscape Enterprise Server （ose.mode=in）转换为 IBM HTTP 服务器（要求 ose.mode=out），就别忘了在运行 IBM HTTP 服务器之前，要将ose.mode 属性更改为 out。 <BR><BR>除了可以手工编辑 bootstrap.properties 文件之外，管理器界面的 Java 引擎页面提供了一个简单的方法来锁住该ose.mode属性值。 <BR><BR>Java 引擎页面提供了一个可用来指示是以 Web 服务器的一部分（ose.mode=in）或以独立模式（ose.mode=out）运行 WebSphere应用服务器的单选按钮。 <BR><BR>作为 Web 服务器一部分运行 WebSphere应用服务器为Servlet 和其它应用程序提供较高的性能，但安全性较差。作为 Web 服务器的一部分运行 WebSphere应用服务器，允许当关闭 Web 服务器时 WebSphere应用服务器自动停止。在独立模式下运行 WebSphere应用服务器需要其它步骤。 <BR><BR>启动和停止 WebSphere应用服务器 <BR><BR>在启动 Web 服务器的时候，WebSphere应用服务器会自动启动。 <BR><BR>如果将 WebSphere应用服务器作为Web 服务器的一部分运行，当关闭 Web 服务器时 WebSphere应用服务器 将自动停止。如果以独立模式运行，WebSphere应用服务器不会自动停止。 <BR><BR>当在Windows NT 上进程外运行 WebSphere应用服务器 时，停止 Web 服务器之后，需要手动停止 WebSphere Servlet 服务以停止 WebSphere应用服务器。方法是：从开始 --&gt; 设置 --&gt; 控制面板 --&gt; 中选择 WebSphere Servlet 服务，并按“停止”按钮。 <BR><BR>安装的检查和故障寻找 <BR><BR>要验证 WebSphere应用服务器是否已安装好并正确配置，可调用 WebSphere应用服务器提供的 snoop servlet。使用Web 浏览器在地址栏中输入： http://your.server.name/servlet/snoop。Snoop Servlet 应该回送客户机发送的 HTTP 请求及 servlet 的初始化参数。SnoopServlet 和其它 servlet 的代码位于/servlets 目录。如果Servlet失败： <BR><BR>(1) 如果你原来通过手工编辑更改过 .properties 文件或更改了WebSphere应用服务器的配置，先看看这些文件以是否引入非法的或不正确的值。特别要检查 /properties/bootstrap.properties 文件。 <BR><BR>(2) 为Web 服务器打开本地日志和跟踪。先找到 WebSphere应用服务器 bootstrap.properties 文件。然后把ose.trace.enabled 和ose.trace.to.webserver 属性都设为true。停止 Web 服务器并重启动。如果 WebSphere应用服务器运行在独立模式，当停止 Web 服务器时它不会相应停止。检查 Web 服务器出错日志及 WebSphere应用服务器 /logs 目录下的日志。看看错误原因。 <BR><BR>(3) 启用调试控制台并重新启动 Web 服务器。WebSphere应用服务器的调试控制台是用来收集和查看跟踪及监控数据的。例如，从调试控制台，可以作为一组启动和停止列在收集和监控服务器数据中的监控程序。 <BR><BR>在调试控制台的服务器控制台中，允许查看 servlet 的 stdout 和 stderr 流。缺省情况下，并没有启动控制台。在WebSphere应用服务器 debug.properties 文件中设置将debug.server.console.enabled 属性设置为为true，然后重新启动Web 服务器使得改动生效。 <BR><BR>或者，也可以在Web中运行 http://your.server.name/servlet/DebugConsoleServlet来启用调试控制台。在 Windows NT 上，要成功地查看调试控制台，必须配置 Windows NT 以允许一个或多个服务与 Windows 桌面交互。 <BR><BR>如果使用作为 Windows NT 服务运行的 Web 服务器： <BR><BR>选择开始 --&gt; 设置 --&gt; 控制面板 --&gt; 服务。 <BR><BR>选择 Web 服务器相应的服务。 <BR><BR>单击启动按钮。 <BR><BR>在结果对话框中，选择允许服务与桌面交互的复选框。 <BR><BR>重新启动 Web 服务器以使更改生效。 <BR><BR>对于微软的IIS服务器，对与 Web 服务器相关的每个服务（如 Web 发布和 FTP服务），执行以上过程。这些服务必须允许与 Windows NT 桌面交互。 <BR><BR>如果 WebSphere应用服务器运行时未启动任何 Web 服务器相关的进程，则需要为WebSphere Servlet 服务执行以上过程，从而允许服务与桌面交互。 <BR></CENTER><img src ="http://www.blogjava.net/yrj11320/aggbug/17584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-31 20:34 <a href="http://www.blogjava.net/yrj11320/articles/17584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBuilder2005实战JSP之日志和部署</title><link>http://www.blogjava.net/yrj11320/articles/17583.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Mon, 31 Oct 2005 12:28:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/17583.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/17583.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/17583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/17583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/17583.html</trackback:ping><description><![CDATA[<STRONG>用户登录和退出日志<BR><BR></STRONG>　　当用户登录系统时，在日志表中插入一条记录，记录用户登录的时间，在用户退出系统时记录用户退出系统的时间。<BR><BR>　　我们利用HttpSessionBindingListener接口来完成记录登录和退出日志的功能，该接口中定义了两个方法： <BR><BR>　　·valueBound(HttpSessionBindingEvent event)<BR><BR>　　·valueUnbound(HttpSessionBindingEvent event)<BR><BR>　　如果一个类实现了HttpSessionBindingListener接口，当对象通过session.setAttribute()被绑定到Session中时，则对象的接口方法valueBound()被自动调用，当对象从session中移出时(通过调用session.invalidate()、session.removeAttribute()或session自动过期时)，valueUnbound()方法将被自动调用。<BR><BR>　　下面我们使User.<A href="http://dev.21tx.com/java/" target=_blank><FONT color=#3366cc>Java</FONT></A>类实现HttpSessionBindingListener接口，调整后的代码如下所示：<BR><BR>　　代码清单 18 实现了HttpSessionBindingListener的User.java<BR><BR>
<TABLE class=txcode cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD>1. package bookstore;<BR>2. import javax.<A href="http://dev.21tx.com/java/jsp/" target=_blank><FONT color=#3366cc>Servlet</FONT></A>.http.HttpSessionBindingListener;<BR>3. import javax.servlet.http.HttpSessionBindingEvent;<BR>4. import java.sql.*;<BR>5. import java.text.SimpleDate表单at;<BR>6. import java.util.Date;<BR>7. <BR>8. public class User implements HttpSessionBindingListener<BR>9. {<BR>10. 　…<BR><B>11. 　private String loginDatetime;//用户登录时间<BR>12. 　…<BR>13. 　public void valueBound(HttpSessionBindingEvent event)<BR>14. 　{<BR>15. 　　Connection conn = null;<BR>16. 　　String sqlStr = "insert into T_LOGIN_LOG(ID, USER_ID, DT_LOGIN) " +<BR>17. 　　　　　　" values(SEQ_LOGIN_LOG_ID.NEXTVAL,?,? )";<BR>18. 　　try<BR>19. 　　{<BR>20. 　　　conn = DBConnection.getConnection();<BR>21. 　　　PreparedStatement pStat = conn.prepareStatement(sqlStr);<BR>22. 　　　loginDatetime = getCurrDatetimeStr(); //当前时间串<BR>23. 　　　pStat.setString(1, userId);<BR>24. 　　　pStat.setString(2, loginDatetime);<BR>25. 　　　pStat.executeUpdate();<BR>26. <BR>27. 　　} catch (SQLException e)<BR>28. 　　{<BR>29. 　　　throw new RuntimeException(<BR>30. 　　　　"用户登陆日志写入出错");<BR>31. 　　} finally<BR>32. 　{<BR>33. 　try<BR>34. 　{<BR>35. 　　if (conn != null)<BR>36. 　　{<BR>37. 　　　conn.close();<BR>38. 　　}<BR>39. 　} catch (SQLException ex)<BR>40. 　{<BR>41. 　　ex.printStackTrace();<BR>42. 　}<BR>43. 　}<BR>44. }<BR>45. <BR>46. public void valueUnbound(HttpSessionBindingEvent event)<BR>47. {<BR>48. 　Connection conn = null;<BR>49. 　String sqlStr = " update T_LOGIN_LOG set DT_LONOUT = ? " +<BR>50. 　　　　　" where USER_ID=? and DT_LOGIN = ?";<BR>51. 　try<BR>52. 　{<BR>53. 　　conn = DBConnection.getConnection();<BR>54. 　　PreparedStatement pStat = conn.prepareStatement(sqlStr);<BR>55. 　　pStat.setString(1, getCurrDatetimeStr());<BR>56. 　　pStat.setString(2, userId);<BR>57. 　　pStat.setString(3, loginDatetime);<BR>58. 　　pStat.executeUpdate();<BR>59. <BR>60. 　} catch (SQLException e)<BR>61. 　{<BR>62. 　　throw new RuntimeException(<BR>63. 　　　"用户退出日志写入出错");<BR>64. 　} finally<BR>65. 　{<BR>66. 　　try<BR>67. 　　{<BR>68. 　　　if (conn != null)<BR>69. 　　　{<BR>70. 　　　　conn.close();<BR>71. 　　　}<BR>72. 　　} catch (SQLException ex)<BR>73. 　　{<BR>74. 　　　ex.printStackTrace();<BR>75. 　　}<BR>76. 　}<BR>77. }<BR>78. <BR>79. //获取当前时间字串，以yyyyMMddHHmmss格式返回，如20050505010101<BR>80. private static String getCurrDatetimeStr()<BR>81. {<BR>82. 　SimpleDate表单at sdf = new SimpleDate表单at("yyyyMMddHHmmss");<BR>83. 　return sdf.表单at(new Date());<BR>84. }</B><BR>85. }</TD></TR></TBODY></TABLE><BR>　　valueBound()方法向T_LOGIN_LOG表插入一条登录日志，在valueUnbound()方法中更新日志表的退出时间，此外第80~84行提供了一个获取当前时间串的方法getCurrDatetimeStr()，通过该方法获取登录和退出时间点的时间字符串。<BR><BR>　　下面通过描述用户登录系统直到退出时所经历的步骤说明程序如何记录用户的登录和退出时间的：<BR><BR>　　1．用户通过login.<A href="http://dev.21tx.com/java/jsp/" target=_blank><FONT color=#3366cc>JSP</FONT></A>输入密码登录后，程序转向switch.jsp控制页面。<BR><BR>　　2．在switch.jsp中，我们通过session.setAttribute("ses_userBean", userBean)方法将User.java类的对象userBean绑定到session中。<BR><BR>　　3．此时userBean对象的HttpSessionBindingListener接口方法valueBound()被调用，向T_LOGIN_LOG表插入一条登录日志。<BR><BR>　　4．switch.jsp转向welcome.jsp页面。<BR><BR>　　5．用户点击welcome.jsp页面中的链接退出系统时，转向quit.jsp页面。<BR><BR>　　6．quit.jsp调用session.invalidate()方法，userBean对象从session中清除。<BR><BR>　　7．此时userBean对象的HttpSessionBindingListener接口方法valueUnbound()方法被调用，更新日志的退出时间，关闭浏览器窗口。<BR><BR>　　HttpSessionBindingListener接口是<A href="http://dev.21tx.com/web/" target=_blank><FONT color=#3366cc>Web</FONT></A>容器的事件接口，实现接口的类在某个事件发生时自动被调用，Web容器有多个这样的事件接口，它们分别是：<BR><BR>　　·ServletContextListener 接口：Web容器启动和销毁的事件处理接口，接口中定义了两个方法。<BR><BR>　　·ServletContextAttributeListener接口：Web上下文属性发生更改时的事件处理接口。<BR><BR>　　·HttpSessionListener接口：Session创建和销毁事件的事件处理接口。<BR><BR>　　·HttpSessionAttributeListener接口：Session会话中属性对象更改的事件处理接口，该接口和我们在前面使用的HttpSessionBindingListener接口相似。<BR><BR>　　此外在<A href="http://dev.21tx.com/java/j2ee/" target=_blank><FONT color=#3366cc>J2EE</FONT></A>1.4中还提供了另外两个事件处理接口，它们是：<BR><BR>　　·ServletRequestListener接口：Request请求对象创建和销毁事件处理接口。<BR><BR>　　·ServletRequestAttributeListener接口：更改Request中属性对象时的事件处理接口。<BR><STRONG>程序部署<BR><BR></STRONG>　　在<A href="http://dev.21tx.com/web/" target=_blank><FONT color=#3366cc>Web</FONT></A>程序开发完成后，我们开始着手程序部署的工作，我们希望将这个Web应用程序部署到Tomcat5.0的Web<A href="http://dev.21tx.com/java/as/" target=_blank><FONT color=#3366cc>应用服务器</FONT></A>中。<BR><BR>　　首先我们设置Web应用程序的默认首页，然后再将整个Web程序打成一个WAR档案文件包。<BR><BR>　　1．设置默认访问的页面，双击工程窗格中的webModule节点，<A href="http://dev.21tx.com/java/base/jbuilder/" target=_blank><FONT color=#3366cc>JBuilder</FONT></A>在内容窗格显示如下的页面：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG hspace=3 src="http://image.21tx.com/image/20050524/10278.jpg" align=center vspace=1 border=1><BR>图 26 设置Web程序默认访问的页面</DIV></TD></TR></TBODY></TABLE><BR>　　点击Welcome files列表右边的Add…按钮，在弹出的对话框中录入login.<A href="http://dev.21tx.com/java/jsp/" target=_blank><FONT color=#3366cc>JSP</FONT></A>并按确定按钮，将login.jsp页面作为默认页面，这样web.<A href="http://dev.21tx.com/web/xml/" target=_blank><FONT color=#3366cc>XML</FONT></A>部署描述文件中将新增以下粗体的部署信息：<BR><BR>　　代码清单 19 Web应用程序默认页面<BR><BR>
<TABLE class=txcode cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD>1. …<BR>2. ＜web-app＞<BR>3. ＜display-name＞webModule＜/display-name＞<BR><B>4. ＜welcome-file-list＞<BR>5. ＜welcome-file＞login.jsp＜/welcome-file＞<BR>6. ＜/welcome-file-list＞</B><BR>7. …<BR>8. ＜/web-app＞</TD></TR></TBODY></TABLE><BR>　　当用户在URL中没有指定具体的访问文件名时，Web容器自动查看URI下是否有login.jsp文件，如果直接调出这个文件。<BR><BR>　　2．在工程窗格中的资源树中右击webModule节点，Properties…-＞Build-＞在Build设置面中，将Build Web archive设置为When building project or module选项，如下图所示：<BR><BR>
<TABLE width="90%" align=center>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG hspace=3 src="http://image.21tx.com/image/20050524/10281.jpg" align=center vspace=1 border=1><BR>图 27 设置在Rebuild工程或Web模块时创建WAR档案文件</DIV></TD></TR></TBODY></TABLE><BR>　　3．在工程窗格中右击chapter13.jpx，在弹出的菜单中选择Rebuild编译整个工程。<BR><BR>　　4．编译完成后，在工程根目录下将产生一个webModule.war文件。<BR><BR>　　5．拷贝webModule.war文件至＜JBuilder2005安装目录＞/thirdparty/jakarta-tomcat-5.0.27/webapps目录下。<BR><BR>　　这样就完成Web应用程序的部署了，下面我们启动Tomcat 5.0 Web应用程序<A href="http://www.21tx.com/server/" target=_blank><FONT color=#3366cc>服务器</FONT></A>，并访问刚才部署的webModule.war应用程序。<BR><BR>　　1．双击＜JBuilder2005安装目录＞/thirdparty/jakarta-tomcat-5.0.27/bin下的startup.bat启动Tomcat 5.0 Web应用服务器（请保证这时JBuilder中没有运行Web应用程序，以免冲突）。<BR><BR>　　2．打开IE，键入http://localhost:8080/webModule，将正确访问到刚才部署的Web应用程序，如下图所示：<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG hspace=3 src="http://image.21tx.com/image/20050524/10284.jpg" align=center vspace=1 border=1><BR>图 28 部署后login.jsp的访问效果</DIV></TD></TR></TBODY></TABLE><BR>　　Tomcat 服务器默认工作于8080端口，所以在机器名后需要添加端口号，可以通过更改Tomca位于conf目录下的server.xml配置文件可以更改这个端口号。<BR><BR>　　由于我们的web应用程序的WAR文件名为webModule.war，web服务器启动后，会自动将WAR文件解压到webModule目录下，所以必须通过http://localhost:8080/webModule访问。此外，由于默认访问页面为login.jsp，所以没有指定具体的页面时，login.jsp页面被调用访问。<img src ="http://www.blogjava.net/yrj11320/aggbug/17583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-31 20:28 <a href="http://www.blogjava.net/yrj11320/articles/17583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle培训教材</title><link>http://www.blogjava.net/yrj11320/articles/17446.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Sun, 30 Oct 2005 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/17446.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/17446.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/17446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/17446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/17446.html</trackback:ping><description><![CDATA[一.SQL语言简介1. SQL概述<BR>SQL是一种面向数据库的通用数据处理语言规范，能完成以下几类功能：提取查询数据，插入修改删除数据，生成修改和删除数据库对象，数据库安全控制，数据库完整性及数据保护控制。<BR><BR>数据库对象包括表、视图、索引、同义词、簇、触发器、函数、过程、包、数据库链、快照等（表空间、回滚段、角色、用户）。数据库通过对表的操作来管理存储在其中的数据。<BR>2. 数据库查询<BR>1)&nbsp;&nbsp;&nbsp; 用SELECT语句从表中提取查询数据。语法为<BR><BR>SELECT [DISTINCT] {column1,column2,…} FROM tablename WHERE {conditions} GROUP BY {conditions} ORDER BY {expressions} [ASC/DESC]; <BR><BR>说明：SELECT子句用于指定检索数据库的中哪些列，FROM子句用于指定从哪一个表或视图中检索数据。<BR><BR>2)&nbsp;&nbsp;&nbsp; SELECT中的操作符及多表查询WHERE子句。(LIKE,IS,…)<BR><BR>&nbsp; WHERE子句中的条件可以是一个包含等号或不等号的条件表达式，也可以是一个含有IN、NOT IN、BETWEEN、LIKE、IS NOT NULL等比较运算符的条件式，还可以是由单一的条件表达通过逻辑运算符组合成复合条件。<BR><BR>比较操作符 =&nbsp; &gt;&nbsp; &lt;&nbsp; &gt;=&nbsp; &lt;=&nbsp; !=&nbsp; &lt;&gt; <BR><BR>SQL操作符 BETWEEN … AND…&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp; LIKE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IS NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT BETWEEN … AND… NOT IN NOT LIKE&nbsp;&nbsp; IS NOT NULL<BR><BR>逻辑操作符 AND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR&nbsp; NOT<BR><BR>3)&nbsp;&nbsp;&nbsp; ORDER BY&nbsp;&nbsp; 子句<BR><BR>ORDER BY 子句使得SQL在显示查询结果时将各返回行按顺序排列，返回行的排列顺序由ORDER BY 子句指定的表达式的值确定。<BR><BR>4)&nbsp;&nbsp;&nbsp; 连接查询<BR><BR>利用SELECT语句进行数据库查询时，可以把多个表、视图的数据结合起来，使得查询结果的每一行中包含来自多个表达式或视图的数据，这种操作被称为连接查询。<BR><BR>连接查询的方法是在SELECT命令的FROM子句中指定两个或多个将被连接查询的表或视图，并且在WHERE子句告诉ORACLE如何把多个表的数据进行合并。根据WHERE子句中的条件表达式是等还是不等式，可以把连接查询分为等式连接和不等式连接。<BR><BR>5)&nbsp;&nbsp;&nbsp; 子查询<BR><BR>如果某一个SELECT命令（查询1）出现在另一个SQL命令（查询2）的一个子句中，则称查询1是查询2的子查询。<BR><BR>&nbsp;<BR>3.&nbsp;&nbsp;&nbsp;&nbsp; 基本数据类型（NUMBER,VARCHAR2,DATE）&nbsp; <BR>&nbsp;ORACEL支持下列内部数据类型：<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2 变长字符串，最长为2000字符。<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp; 数值型。<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变长字符数据，最长为2G字节。<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日期型。<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二进制数据，最长为255字节。<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG RAW&nbsp; 变长二进制数据，最长为2G字节。<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二六进制串，表示表的行的唯一地址。<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定长字符数据，最长为255。<BR><BR>&nbsp;<BR>4.&nbsp;&nbsp;&nbsp;&nbsp; 常用函数用法：<BR>&nbsp;&nbsp;&nbsp;&nbsp; 一个函数类似于一个算符，它操作数据项，返回一个结果。函数在格式上不同于算符，它个具有变元，可操作0个、一个、二个或多个变元，形式为：<BR><BR>函数名（变元，变元，…）<BR><BR>函数具有下列一般类形：<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单行函数<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分组函数<BR><BR>1）单行函数对查询的表或视图的每一行返回一个结果行。它有数值函数，字符函数，日期函数，转换函数等。<BR><BR>2）分组函数返回的结果是基于行组而不是单行，所以分组函数不同于单行函数。在许多分组函数中可有下列选项：<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DISTRNCT 该选项使分组函数只考虑变元表达式中的不同值。<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALL该选项使分组函数考虑全部值，包含全部重复。<BR><BR>全部分组函数（除COUNT（*）外）忽略空值。如果具有分组函数的查询，没有返回行或只有空值（分组函数的变元取值的行），则分组函数返回空值。<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单行函数<BR><BR>1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数字函数<BR><BR>ABS&nbsp; 取绝对值&nbsp; POWER 乘方&nbsp;&nbsp; LN&nbsp;&nbsp; 10为底数取冪<BR><BR>SQRT 平方根&nbsp;&nbsp;&nbsp;&nbsp; EXP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e的n次乘方&nbsp; LOG(m,n)&nbsp;&nbsp; m为底数n取冪 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<BR><BR>数学运算函数:ACOS ATAN ATAN2 COS COSH&nbsp; SIGN SIN SINH TAN TANH <BR><BR>CEIL&nbsp;&nbsp; 大于或等于取整数&nbsp;&nbsp; <BR><BR>FLOOR &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小于或等于取整数<BR><BR>MOD&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取余数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>ROUND(n,m)&nbsp;&nbsp; 按m的位数取四舍五入值如果round(日期): 中午12以后将是明天的日期. round(sysdate,'Y')是年的第一天<BR><BR>TRUNC(n,m) 按m的位数取前面的数值如果trunc(日期), 确省的是去掉时间<BR><BR>&nbsp;<BR><BR>2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符函数<BR><BR>CHR&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按数据库的字符集由数字返回字符&nbsp; <BR><BR>CONCAT(c1,c2)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把两个字符c1,c2组合成一个字符, 和 || 相同<BR><BR>REPLACE(c,s,r)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把字符c里出现s的字符替换成r, 返回新字符 <BR><BR>SUBSTR(c,m,n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m大于0,字符c从前面m处开始取n位字符,m等于0和1一样, <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m小与0,字符c从后面m处开始取n位字符<BR><BR>TRANSLATE(c,f1,t1)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 字符c按f1到t1的规则转换成新的字符串<BR><BR>INITCAP &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符首字母大写,其它字符小写<BR><BR>LOWER &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符全部小写<BR><BR>UPPER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符全部大写<BR><BR>LTRIM(c1,c2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 去掉字符c1左边出现的字符c2<BR><BR>RTRIM(c1,c2) <BR><BR>TRIM(c1,c2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 去掉字符c1左右两边的字符c2<BR><BR>LPAD(c1,n,c2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符c1按制定的位数n显示不足的位数用c2字符串替换左边的空位<BR><BR>RPAD(c1,n,c2)<BR><BR>&nbsp;<BR><BR>3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日期函数<BR><BR>ADD_MONTHS(d,n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日期值加n月<BR><BR>LAST_DAY(d) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回当月的最后一天的日期<BR><BR>MONTHS_BETWEEN(d1,d2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两个日期值间的月份,d1&lt;d2 返回负数<BR><BR>NEXT_DAY(d) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回日期值下一天的日期<BR><BR>SYSDATE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前的系统时间<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DUAL是SYS用户下一个空表，它只有一个字段dummy<BR><BR>4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转换函数(1)<BR><BR>TO_CHAR(date,'日期显示格式') &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>TO_CHAR(number) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于显示或报表的格式对齐<BR><BR>TO_DATE(char,'日期显示格式') &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>TO_LOB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把long字段转换成lob字段<BR><BR>TO_NUMBER(char)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于计算或者比较大小 <BR><BR>&nbsp;<BR><BR>5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转换函数(2)<BR><BR>to_date里日期显示格式<BR><BR>YYYY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 年&nbsp;&nbsp; YEAR&nbsp;&nbsp;&nbsp; YYY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YY&nbsp; Y<BR><BR>Q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 季度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>MM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 月&nbsp;&nbsp; MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MON&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>W&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 星期 (week of month)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WW, IW (week of year) &nbsp;&nbsp; <BR><BR>(说明：周计是按ISO标准,从1月1日的星期数到后面七天为一周,不一定是从周一到周日) <BR><BR>DD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日&nbsp;&nbsp; DAY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DY&nbsp; <BR><BR>HH24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小时&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HH12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HH&nbsp; <BR><BR>MI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分钟&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>SS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 秒<BR><BR>如果想固定日期的显示格式可以在数据库的参数文件initorasid.ora里新写一行参数 NL2005-9-26_FORMAT=yyyy-mm-dd hh24:mi:ss可以在UNIX环境变量或者NT的注册表里的设置 NL2005-9-26_FORMAT=yyyy-mm-dd hh24:mi:ss<BR><BR>&nbsp;<BR><BR>6)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转换函数(3)<BR><BR>如果想固定日期的显示格式可以用alter session命令改变<BR><BR>SQL&gt; alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';<BR><BR>它的作用顺序如下:<BR><BR>initialization parameter<BR><BR>Environment variable<BR><BR>ALTER SESSION command<BR><BR>&nbsp;<BR><BR>7)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转换函数 (4)<BR><BR>to_char(number)里数字显示格式<BR><BR>9&nbsp;&nbsp;&nbsp;&nbsp; 数字位<BR><BR>0&nbsp;&nbsp;&nbsp;&nbsp; 数字前面补0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_char(-1200,'00000.00')<BR><BR>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小数点的位置&nbsp;&nbsp;&nbsp; <BR><BR>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标记位置的逗号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用在数字显示格式的左边&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>L&nbsp;&nbsp;&nbsp;&nbsp; 根据数据库字符集加货币符号&nbsp;&nbsp;&nbsp; to_char(-1200,'L9999.99')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>B&nbsp;&nbsp;&nbsp;&nbsp; 把数字0显示为空格,用在数字显示格式的右边<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>MI&nbsp; 右边的负数标记 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_char(-1200,'9999.99MI')<BR><BR>PR&nbsp;&nbsp;&nbsp; 括起来的负数&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_char(-1200,'9999.99PR')<BR><BR>EEEE&nbsp;&nbsp;&nbsp;&nbsp; 用指数方式表示&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_char(-1200,'9999.99EEEE')<BR><BR>&nbsp;<BR><BR>8)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入字符,返回数字的函数<BR><BR>instr(c1,c2)&nbsp;&nbsp;&nbsp;&nbsp; 字符c2出现在c1的位置, 不出现, 返回0, 常用于模糊查询<BR><BR>length(c)&nbsp; 按数据库的字符集,算出字符c的长度,跟数据库的字符集有关, 一个汉字长度为1<BR><BR>&nbsp;<BR><BR>9)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有逻辑比较的函数NVL(EXPR1, EXPR2)函数<BR><BR>解释:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF EXPR1=NULL &nbsp;&nbsp;&nbsp;&nbsp; RETURN EXPR2<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE &nbsp;&nbsp; RETURN EXPR1<BR><BR>10)&nbsp;&nbsp;&nbsp; DECODE(AA﹐V1﹐R1﹐V2﹐R2....)函数<BR><BR>解释: IF AA=V1 THEN RETURN R1<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF AA=V2 THEN RETURN R2<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ..…<BR><BR>&nbsp; ELSE<BR><BR>&nbsp; RETURN NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>举例: decode(id,1,'dept sale',2,'dept tech')<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 集合函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经常和group by一起使用 <BR><BR>1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 集合函数列表<BR><BR>AVG &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DISTINCT | ALL | N)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取平均值<BR><BR>COUNT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DISTINCT | ALL | N | expr | * )&nbsp;&nbsp;&nbsp;&nbsp; 统计数量<BR><BR>MAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DISTINCT | ALL | N)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取最大值<BR><BR>MIN &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DISTINCT | ALL | N)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取最小值<BR><BR>SUM &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DISTINCT | ALL | N)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取合计值<BR><BR>STDDEV &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DISTINCT | ALL | N)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取偏差值,如果组里选择的内容都相同,结果为0<BR><BR>VARIANCE (DISTINCT | ALL | N)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取平方偏差值<BR><BR>&nbsp;<BR><BR>2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用集合函数的语法<BR><BR>SELECT column, group_function FROM table<BR><BR>WHERE condition&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GROUP BY group_by_expression<BR><BR>HAVING group_condition&nbsp; ORDER BY column;<BR><BR><BR><BR>3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用count时的注意事项<BR><BR>SELECT COUNT(*) FROM table;<BR><BR>SELECT COUNT(常量) FROM table;<BR><BR>&nbsp;<BR><BR>都是统计表中记录数量,如果没有PK后者要好一些<BR><BR>SELECT COUNT(all 字段名) FROM table;<BR><BR>SELECT COUNT(字段名) FROM table;<BR><BR>&nbsp;<BR><BR>不会统计为NULL的字段的数量<BR><BR>SUM,AVG时都会忽略为NULL的字段<BR><BR>&nbsp;<BR><BR>4)&nbsp;&nbsp;&nbsp; 用group by时的限制条件<BR><BR>SELECT字段名不能随意, 要包含在GROUP BY的字段里<BR><BR>&nbsp;GROUP BY后ORDER BY时不能用位置符号和别名<BR><BR>&nbsp;限制GROUP BY的显示结果, 用HAVING条件<BR><BR>&nbsp;<BR><BR>5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子<BR><BR>SQL&gt; select title,sum(salary) payroll from s_emp<BR><BR>where title like 'VP%'&nbsp;&nbsp; group by title <BR><BR>having sum(salary)&gt;5000&nbsp;&nbsp;&nbsp; order by sum(salary) desc;<BR><BR><BR><BR>找出某表里字段重复的记录数, 并显示<BR><BR>SQL&gt; select (duplicate field names) from table_name<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; group by (list out fields) having count(*)&gt;1;<BR>5. 数据操纵语言命令：<BR>数据库操纵语言（DML）命令用于查询和操纵模式对象中的数据，它不隐式地提交当前事务。它包含UPDATE、INSERT、DELETE、EXPLAIN PLAN、SELECT和LOCK TABLE 等命令。下面简单介绍一下：<BR><BR>1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPDATE tablename SET {column1=expression1,column2=expression2,…} WHERE {conditions};<BR><BR>例如：S&nbsp;&nbsp;&nbsp;&nbsp; QL&gt;UPDATE EMP <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET JOB =’MANAGER’<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE ENAME=’MAPTIN’;<BR><BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL &gt;SELECT * FROM EMP;<BR><BR>UPDATE子句指明了要修改的数据库是EMP,并用WHERE子句限制了只对名字(ENAME)为’MARTIN’的职工的数据进行修改,SET子句则说明修改的方式,即把’MARTION’的工作名称(JOB)改为’MARAGER’.<BR><BR>&nbsp;<BR><BR>2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO tablename {column1,column2,…} VALUES {expression1,expression2,…};<BR><BR>例如：SQL&gt;SELECT INTO DEPT（DNAME， DEPTNO）<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VALUES （‘ACCOUNTING’，10）<BR><BR>&nbsp;<BR><BR>3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DELETE FROM tablename WHERE {conditions};<BR><BR>例如：SQL&gt;DELETE FROM EMP <BR><BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE EMPNO = 7654;<BR><BR>DELETE命令删除一条记录,而且DELETE命令只能删除整行,而不能删除某行中的部分数据.<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 事务控制命令<BR><BR>提交命令(COMMIT):可以使数据库的修改永久化.设置AUTOCOMMIT为允许状态:SQL &gt;SET AUTOCOMMIT ON;<BR><BR>回滚命令(ROLLBACK):消除上一个COMMIT命令后的所做的全部修改,使得数据库的内容恢复到上一个COMMIT执行后的状态.使用方法是:<BR><BR>SQL&gt;ROLLBACK;<BR><BR>&nbsp;<BR>二.Oracle扩展PL/SQL简介1. PL/SQL概述。<BR>PL/SQL是Oracle对SQL规范的扩展，是一种块结构语言，即构成一个PL/SQL程序的基本单位（过程、函数和无名块）是逻辑块，可包含任何数目的嵌套了快。这种程序结构支持逐步求精方法解决问题。一个块（或子块）将逻辑上相关的说明和语句组合在一起，其形式为：<BR><BR>DECLARE<BR><BR>---说明<BR><BR>BEGIN<BR><BR>---语句序列<BR><BR>EXCEPTION<BR><BR>---例外处理程序<BR><BR>END；<BR><BR>它有以下优点:<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持SQL;<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生产率高;<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 性能好;<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可称植性;<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与ORACLE集成.<BR><BR>&nbsp;<BR>2. PL/SQL体系结构<BR>PL/SQL运行系统是种技术，不是一种独立产品，可认为这种技术是PL/SQL块和子程序的一种机，它可接收任何有效的PL/SQL块或子程序。如图所示：<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR><BR>PL/SQL块<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PL/SQL机<BR><BR>&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>PL/SQL块<BR><BR>过程性语句<BR><BR>执行器<BR><BR>SQL语句<BR>&nbsp;<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>PL/SQL机可执行过程性语句，而将SQL语句发送到ORACLE服务器上的SQL语句执行器。在ORACLE预编译程序或OCI程序中可嵌入无名的PL/SQL块。如果ORACLE具有PROCEDURAL选件，有名的PL/SQL块（子程序）可单独编译，永久地存储在数据库中，准备执行。<BR><BR>&nbsp;<BR><BR>&nbsp;<BR>3. PL/SQL基础：<BR>PL/SQL有一字符集、保留字、标点、数据类型、严密语法等，它与SQL有相同表示，现重点介绍。<BR><BR>1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据类型：如下表所示<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>数据类型<BR><BR>子类型<BR><BR>纯量类型<BR><BR>数值<BR><BR>BINARY_INTEGER<BR><BR>NATURAL,POSITIVE<BR><BR>NUMBER<BR><BR>DEC,DECIMAL,DOUBLE PRECISION,PLOAT,INTEGER,INT,NUMERIC,REAL,SMALLINT<BR><BR>字符<BR><BR>CHAR<BR><BR>CHARACTER,STRING<BR><BR>VARCHAR2<BR><BR>VARCHAR<BR><BR>LONG<BR><BR>&nbsp;<BR><BR>LONG RAW<BR><BR>&nbsp;<BR><BR>RAW<BR><BR>&nbsp;<BR><BR>RAWID<BR><BR>&nbsp;<BR><BR>逻辑<BR><BR>BOOLEAN<BR><BR>&nbsp;<BR><BR>日期<BR><BR>DATE<BR><BR>&nbsp;<BR><BR>组合<BR><BR>类型<BR><BR>记录<BR><BR>RECORD<BR><BR>&nbsp;<BR><BR>表<BR><BR>TABLE<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量和常量<BR><BR>在PL/SQL程序中可将值存储在变量和常量中，当程序执行时，变量的值可以改变，而常量的值不能改变。<BR><BR>&nbsp;<BR><BR>3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序块式结构：<BR><BR>DECLARE<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量说明部分；<BR><BR>BEGIN<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行语句部分；<BR><BR>[EXCEPTION<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例外处理部分；]<BR><BR>END;<BR><BR>&nbsp;<BR>4. 控制语句：<BR>分支语句：<BR><BR>IF condition THEN<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sequence_of_statements;<BR><BR>END IF;<BR><BR>&nbsp;<BR><BR>IF condition THEN<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sequence_of_statement1;<BR><BR>ELSE<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sequence_of_statement2;<BR><BR>END IF;<BR><BR>&nbsp;<BR><BR>IF condition1 THEN<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sequence_of_statement1;<BR><BR>ELSIF condition2 THEN<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sequence_of_statement2;<BR><BR>ELSIF condition3 THEN<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sequence_of_statement3;<BR><BR>END IF; <BR><BR>&nbsp;<BR><BR>&nbsp;<BR>5. 循环语句：<BR>LOOP<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sequence_of_statements;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF condition THEN<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXIT;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END IF;<BR><BR>END LOOP;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHILE condition LOOP<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sequence_of_statements;<BR><BR>END LOOP;<BR><BR>&nbsp;<BR><BR>FOR counter IN lower_bound..higher_bound LOOP<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sequence_of_statements;<BR><BR>END LOOP;<BR><BR>&nbsp;<BR>6. 子程序：<BR>存储过程：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE PROCEDURE 过程名 (参数说明1，参数说明2， 。。。) IS<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [局部说明]<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行语句；<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END 过程名；<BR><BR>&nbsp;<BR><BR>存储函数：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE FUNCTION 函数名 (参数说明1，参数说明2， 。。。)<BR><BR>RETURN 类型 IS<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [局部说明]<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行语句；<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END 函数名；<BR>三.Decode()函数使用技巧1. 含义解释：<BR>&nbsp;&nbsp;DECODE(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)<BR><BR>该函数的含义如下：<BR>IF 条件=值1 THEN<BR>　　　　RETURN(翻译值1)<BR>ELSIF 条件=值2 THEN<BR>　　　　RETURN(翻译值2)<BR>　　　　......<BR>ELSIF 条件=值n THEN<BR>　　　　RETURN(翻译值n)<BR><BR>ELSE<BR>　　　　RETURN(缺省值)<BR>END IF<BR>2. 使用方法： <BR>1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比较大小<BR>select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值<BR>sign()函数根据某个值是0、正数还是负数，分别返回0、1、-1<BR><BR>例如：<BR>变量1=10，变量2=20<BR>则sign(变量1-变量2)返回-1，decode解码结果为“变量1”，达到了取较小值的目的。<BR><BR>表、视图结构转化<BR>现有一个商品销售表sale，表结构为：<BR>month　　　 char(6)　　　　　 --月份<BR>sell　　　　number(10,2)　　　--月销售金额<BR><BR>现有数据为：<BR>200001　　1000<BR>200002　　1100<BR>200003　　1200<BR>200004　　1300<BR>200005　　1400<BR>200006　　1500<BR>200007　　1600<BR>200101　　1100<BR>200202　　1200<BR>200301　　1300<BR><BR>想要转化为以下结构的数据：<BR>year　　　char(4)　　　　　 --年份<BR>month1　　number(10,2)　　　--1月销售金额<BR>month2　　number(10,2)　　　--2月销售金额<BR>month3　　number(10,2)　　　--3月销售金额<BR>month4　　number(10,2)　　　--4月销售金额<BR>month5　　number(10,2)　　　--5月销售金额<BR>month6　　number(10,2)　　　--6月销售金额<BR>month7　　number(10,2)　　　--7月销售金额<BR>month8　　number(10,2)　　　--8月销售金额<BR>month9　　number(10,2)　　　--9月销售金额<BR>month10　　number(10,2)　　　--10月销售金额<BR>month11　　number(10,2)　　　--11月销售金额<BR>month12　　number(10,2)　　　--12月销售金额<BR><BR>结构转化的SQL语句为：<BR>create or replace view<BR>v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)<BR>as<BR>　　　　select <BR>　　　　substrb(month,1,4),<BR>　　　　sum(decode(substrb(month,5,2),'01',sell,0)),<BR>　　　　sum(decode(substrb(month,5,2),'02',sell,0)),<BR>　　　　sum(decode(substrb(month,5,2),'03',sell,0)),<BR>　　　　sum(decode(substrb(month,5,2),'04',sell,0)),<BR>　　　　sum(decode(substrb(month,5,2),'05',sell,0)),<BR>　　　　sum(decode(substrb(month,5,2),'06',sell,0)),<BR>　　　　sum(decode(substrb(month,5,2),'07',sell,0)),<BR>　　　　sum(decode(substrb(month,5,2),'08',sell,0)),<BR>　　　　sum(decode(substrb(month,5,2),'09',sell,0)),<BR>　　　　sum(decode(substrb(month,5,2),'10',sell,0)),<BR>　　　　sum(decode(substrb(month,5,2),'11',sell,0)),<BR>　　　　sum(decode(substrb(month,5,2),'12',sell,0))<BR>　　　　from sale<BR>　　　　group by substrb(month,1,4);<BR>四.NULL 使用详解1. 含义解释： <BR>问：什么是NULL？<BR>答：在我们不知道具体有什么数据的时候，也即未知，可以用NULL，我们称它为空，ORACLE中，含有空值的表列长度为零。<BR>ORACLE允许任何一种数据类型的字段为空，除了以下两种情况：<BR>1、主键字段（primary key），<BR>2、定义时已经加了NOT NULL限制条件的字段<BR><BR>说明：<BR>1、等价于没有任何值、是未知数。<BR>2、NULL与0、空字符串、空格都不同。<BR>3、对空值做加、减、乘、除等运算操作，结果仍为空。<BR>4、NULL的处理使用NVL函数。<BR>5、比较时使用关键字用“is null”和“is not null”。<BR>6、空值不能被索引，所以查询时有些符合条件的数据可能查不出来，count(*)中，用nvl(列名,0)处理后再查。<BR>7、排序时比其他数据都大（索引默认是降序排列，小→大），所以NULL值总是排在最后。<BR>2. 使用方法： <BR>SQL&gt; select 1 from dual where null=null;<BR><BR>&nbsp;<BR><BR>没有查到记录<BR><BR>&nbsp;<BR><BR>SQL&gt; select 1 from dual where null='';<BR><BR>&nbsp;<BR><BR>没有查到记录<BR><BR>&nbsp;<BR><BR>SQL&gt; select 1 from dual where ''=''; <BR><BR>&nbsp;<BR><BR>没有查到记录<BR><BR>&nbsp;<BR><BR>SQL&gt; select 1 from dual where null is null;<BR><BR>&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<BR><BR>---------<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<BR><BR>&nbsp;<BR><BR>SQL&gt; select 1 from dual where nvl(null,0)=nvl(null,0);<BR><BR>&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<BR><BR>---------<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<BR><BR>&nbsp;<BR><BR>对空值做加、减、乘、除等运算操作，结果仍为空。<BR><BR>SQL&gt; select 1+null from dual;<BR><BR>SQL&gt; select 1-null from dual;<BR><BR>SQL&gt; select 1*null from dual;<BR><BR>SQL&gt; select 1/null from dual;<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>查询到一个记录.<BR><BR>&nbsp;<BR><BR>注：这个记录就是SQL语句中的那个null<BR><BR>&nbsp;<BR><BR>设置某些列为空值<BR><BR>update table1 set 列1=NULL where 列1 is not null;<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>现有一个商品销售表sale，表结构为：<BR><BR>month　　　 char(6)　　　　　 --月份<BR><BR>sell　　　　number(10,2)　　　--月销售金额<BR><BR>&nbsp;<BR><BR>create table sale (month char(6),sell number);<BR><BR>insert into sale values('200001',1000);<BR><BR>insert into sale values('200002',1100);<BR><BR>insert into sale values('200003',1200);<BR><BR>insert into sale values('200004',1300);<BR><BR>insert into sale values('200005',1400);<BR><BR>insert into sale values('200006',1500);<BR><BR>insert into sale values('200007',1600);<BR><BR>insert into sale values('200101',1100);<BR><BR>insert into sale values('200202',1200);<BR><BR>insert into sale values('200301',1300);<BR><BR>insert into sale values('200008',1000);<BR><BR>insert into sale(month) values('200009');（注意：这条记录的sell值为空）<BR><BR>commit;<BR><BR>共输入12条记录<BR><BR>&nbsp;<BR><BR>SQL&gt; select * from sale where sell like '%';<BR><BR>&nbsp;<BR><BR>MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELL<BR><BR>------ ---------<BR><BR>200001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>200002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>200003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>200004&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<BR><BR>200005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1400<BR><BR>200006&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500<BR><BR>200007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600<BR><BR>200101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>200202&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>200301&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<BR><BR>200008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>&nbsp;<BR><BR>查询到11记录.<BR><BR>&nbsp;<BR><BR>结果说明：<BR><BR>查询结果说明此SQL语句查询不出列值为NULL的字段<BR><BR>此时需对字段为NULL的情况另外处理。<BR><BR>SQL&gt; select * from sale where sell like '%' or sell is null;<BR><BR>SQL&gt; select * from sale where nvl(sell,0) like '%';<BR><BR>&nbsp;<BR><BR>MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELL<BR><BR>------ ---------<BR><BR>200001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>200002&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;1100<BR><BR>200003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>200004&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<BR><BR>200005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1400<BR><BR>200006&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500<BR><BR>200007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600<BR><BR>200101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>200202&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>200301&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<BR><BR>200008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>200009<BR><BR>&nbsp;<BR><BR>查询到12记录.<BR><BR>&nbsp;<BR><BR>Oracle的空值就是这么的用法，我们最好熟悉它的约定，以防查出的结果不正确。<BR>五.如何查找、删除表中重复的记录1. 问题提出： <BR>当我们想要为一个表创建唯一索引时，如果该表有重复的记录，则无法创建成功。 <BR>2. 方法原理： <BR>1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle中，每一条记录都有一个rowid，rowid在整个数据库中是唯一的，<BR>　 rowid确定了每条记录是在ORACLE中的哪一个数据文件、块、行上。<BR><BR>2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在重复的记录中，可能所有列的内容都相同，但rowid不会相同，所以只要确定出重复记录中<BR>　 那些具有最大rowid的就可以了，其余全部删除。<BR><BR>3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下语句用到了3项技巧：rowid、子查询、别名。<BR>3. 实现方法： <BR>SQL&gt; create table a (<BR><BR>&nbsp; 2&nbsp; bm char(4),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --编码<BR><BR>&nbsp; 3&nbsp; mc varchar2(20)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --名称<BR><BR>&nbsp; 4&nbsp; )<BR><BR>&nbsp; 5&nbsp; /<BR><BR>&nbsp;<BR><BR>表已建立.<BR><BR>&nbsp;<BR><BR>SQL&gt; insert into a values('1111','1111');<BR><BR>SQL&gt; insert into a values('1112','1111');<BR><BR>SQL&gt; insert into a values('1113','1111');<BR><BR>SQL&gt; insert into a values('1114','1111');<BR><BR>&nbsp;<BR><BR>SQL&gt; insert into a select * from a;<BR><BR>&nbsp;<BR><BR>插入4个记录.<BR><BR>&nbsp;<BR><BR>SQL&gt; commit;<BR><BR>&nbsp;<BR><BR>完全提交.<BR><BR>&nbsp;<BR><BR>SQL&gt; select rowid,bm,mc from a;<BR><BR>&nbsp;<BR><BR>ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BM&nbsp;&nbsp; MC<BR><BR>------------------ ---- -------<BR><BR>000000D5.0000.0002 1111 1111<BR><BR>000000D5.0001.0002 1112 1111<BR><BR>000000D5.0002.0002 1113 1111<BR><BR>000000D5.0003.0002 1114 1111<BR><BR>000000D5.0004.0002 1111 1111<BR><BR>000000D5.0005.0002 1112 1111<BR><BR>000000D5.0006.0002 1113 1111<BR><BR>000000D5.0007.0002 1114 1111<BR><BR>&nbsp;<BR><BR>查询到8记录.<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>查出重复记录<BR><BR>SQL&gt; select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);<BR><BR>&nbsp;<BR><BR>ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BM&nbsp;&nbsp; MC<BR><BR>------------------ ---- --------------------<BR><BR>000000D5.0000.0002 1111 1111<BR><BR>000000D5.0001.0002 1112 1111<BR><BR>000000D5.0002.0002 1113 1111<BR><BR>000000D5.0003.0002 1114 1111<BR><BR>&nbsp;<BR><BR>删除重复记录<BR><BR>SQL&gt; delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);<BR><BR>&nbsp;<BR><BR>删除4个记录.<BR><BR>&nbsp;<BR><BR>SQL&gt; select rowid,bm,mc from a;<BR><BR>&nbsp;<BR><BR>ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BM&nbsp;&nbsp; MC<BR><BR>------------------ ---- --------------------<BR><BR>000000D5.0004.0002 1111 1111<BR><BR>000000D5.0005.0002 1112 1111<BR><BR>000000D5.0006.0002 1113 1111<BR><BR>000000D5.0007.0002 1114 1111<BR>六.如何正确利用Rownum来限制查询所返回的行数1. 含义解释： <BR>1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rownum是oracle系统顺序分配为从查询返回的行的编号，返回的第一行分配的是1，第二行是2，依此类推，这个伪字段可以用于限制查询返回的总行数。<BR><BR>2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rownum不能以任何基表的名称作为前缀。 <BR>2. 使用方法： <BR>现有一个商品销售表sale，表结构为：<BR><BR>month　　　 char(6)　　　　　 --月份<BR><BR>sell　　　　number(10,2)　　　--月销售金额<BR><BR>&nbsp;<BR><BR>create table sale (month char(6),sell number);<BR><BR>insert into sale values('200001',1000);<BR><BR>insert into sale values('200002',1100);<BR><BR>insert into sale values('200003',1200);<BR><BR>insert into sale values('200004',1300);<BR><BR>insert into sale values('200005',1400);<BR><BR>insert into sale values('200006',1500);<BR><BR>insert into sale values('200007',1600);<BR><BR>insert into sale values('200101',1100);<BR><BR>insert into sale values('200202',1200);<BR><BR>insert into sale values('200301',1300);<BR><BR>insert into sale values('200008',1000);<BR><BR>commit;<BR><BR>&nbsp;<BR><BR>SQL&gt; select rownum,month,sell from sale where rownum=1;（可以用在限制返回记录条数的地方，保证不出错，如：隐式游标）<BR><BR>&nbsp;<BR><BR>&nbsp;&nbsp; ROWNUM MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELL<BR><BR>--------- ------ ---------<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>&nbsp;<BR><BR>SQL&gt; select rownum,month,sell from sale where rownum=2;（1以上都查不到记录）<BR><BR>&nbsp;<BR><BR>没有查到记录<BR><BR>&nbsp;<BR><BR>SQL&gt; select rownum,month,sell from sale where rownum&gt;5;<BR><BR>（由于rownum是一个总是从1开始的伪列，Oracle 认为这种条件不成立，查不到记录）<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>没有查到记录<BR><BR>&nbsp;<BR><BR>只返回前3条纪录<BR><BR>SQL&gt; select rownum,month,sell from sale where rownum&lt;4;<BR><BR>&nbsp;<BR><BR>&nbsp;&nbsp; ROWNUM MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELL<BR><BR>--------- ------ ---------<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>&nbsp;<BR><BR>&nbsp;<BR><BR>如何用rownum实现大于、小于逻辑？（返回rownum在4—10之间的数据）（minus操作，速度会受影响）<BR><BR>SQL&gt; select rownum,month,sell from sale where rownum&lt;10<BR><BR>&nbsp; 2&nbsp; minus<BR><BR>&nbsp; 3&nbsp; select rownum,month,sell from sale where rownum&lt;5;<BR><BR>&nbsp;<BR><BR>&nbsp;&nbsp; ROWNUM MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELL<BR><BR>--------- ------ ---------<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 200005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1400<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 200006&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 200007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 200101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 200202&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>&nbsp;<BR><BR>想按日期排序，并且用rownum标出正确序号（有小到大）<BR><BR>SQL&gt; select rownum,month,sell from sale order by month;<BR><BR>&nbsp;<BR><BR>&nbsp;&nbsp; ROWNUM MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELL<BR><BR>--------- ------ ---------<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;2 200002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 200005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1400<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 200006&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 200007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11 200008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 200101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 200202&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 200301&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;1300<BR><BR>&nbsp;<BR><BR>查询到11记录.<BR><BR>&nbsp;<BR><BR>可以发现，rownum并没有实现我们的意图，系统是按照记录入库时的顺序给记录排的号，rowid也是顺序分配的<BR><BR>&nbsp;<BR><BR>SQL&gt; select rowid,rownum,month,sell from sale order by rowid;<BR><BR>&nbsp;<BR><BR>ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROWNUM MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELL<BR><BR>------------------ --------- ------ ---------<BR><BR>000000E4.0000.0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;1 200001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>000000E4.0001.0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>000000E4.0002.0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>000000E4.0003.0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<BR><BR>000000E4.0004.0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 200005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1400<BR><BR>000000E4.0005.0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 200006&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500<BR><BR>000000E4.0006.0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 200007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600<BR><BR>000000E4.0007.0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 200101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>000000E4.0008.0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 200202&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>000000E4.0009.0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 200301&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<BR><BR>000000E4.000A.0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11 200008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>&nbsp;<BR><BR>查询到11记录.<BR><BR>&nbsp;<BR><BR>正确用法，使用子查询<BR><BR>SQL&gt; select rownum,month,sell from (select month,sell from sale group by month,sell) where rownum&lt;13;<BR><BR>&nbsp;<BR><BR>&nbsp;&nbsp; ROWNUM MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELL<BR><BR>--------- ------ ---------<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 200005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1400<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 200006&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 200007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 200008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 200101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 200202&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11 200301&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<BR><BR>&nbsp;<BR><BR>按销售金额排序，并且用rownum标出正确序号（有小到大）<BR><BR>SQL&gt; select rownum,month,sell from (select sell,month from sale group by sell,month) where rownum&lt;13;<BR><BR>&nbsp;<BR><BR>&nbsp;&nbsp; ROWNUM MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELL<BR><BR>--------- ------ ---------<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 200003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 200202&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1200<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 200004&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 200301&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 200005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1400<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 200006&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11 200007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600<BR><BR>&nbsp;<BR><BR>查询到11记录.<BR><BR>&nbsp;<BR><BR>利用以上方法，如在打印报表时，想在查出的数据中自动加上行号，就可以利用rownum。<BR><BR>&nbsp;<BR><BR>返回第5—9条纪录，按月份排序<BR><BR>SQL&gt; select * from (select rownum row_id ,month,sell <BR><BR>&nbsp; 2&nbsp; from (select month,sell from sale group by month,sell)) <BR><BR>&nbsp; 3&nbsp; where row_id between 5 and 9;<BR><BR>&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp; ROW_ID MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELL<BR><BR>---------- ------ ----------<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 200005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1400<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 200006&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 200007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 200008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 200101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<img src ="http://www.blogjava.net/yrj11320/aggbug/17446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-30 17:30 <a href="http://www.blogjava.net/yrj11320/articles/17446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[代码人生][分享]SQl语句学习专题 </title><link>http://www.blogjava.net/yrj11320/articles/17445.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Sun, 30 Oct 2005 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/17445.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/17445.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/17445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/17445.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/17445.html</trackback:ping><description><![CDATA[<P>SQL语句集锦 <BR></P>
<P>--语 句&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;功 能 <BR>--数据操作 <BR>SELECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--从数据库表中检索数据行和列 <BR>INSERT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--向数据库表添加新数据行 <BR>DELETE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--从数据库表中删除数据行 <BR>UPDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--更新数据库表中的数据 <BR>--数据定义 <BR>CREATE TABLE&nbsp;&nbsp;&nbsp;&nbsp;--创建一个数据库表 <BR>DROP TABLE&nbsp;&nbsp;&nbsp;&nbsp; --从数据库中删除表 <BR>ALTER TABLE&nbsp;&nbsp;&nbsp;&nbsp; --修改数据库表结构 <BR>CREATE VIEW&nbsp;&nbsp;&nbsp;&nbsp; --创建一个视图 <BR>DROP VIEW&nbsp;&nbsp;&nbsp;&nbsp; --从数据库中删除视图 <BR>CREATE INDEX&nbsp;&nbsp;&nbsp;&nbsp;--为数据库表创建一个索引 <BR>DROP INDEX&nbsp;&nbsp;&nbsp;&nbsp; --从数据库中删除索引 <BR>CREATE PROCEDURE&nbsp;&nbsp; --创建一个存储过程 <BR>DROP PROCEDURE&nbsp;&nbsp;&nbsp;&nbsp;--从数据库中删除存储过程 <BR>CREATE TRIGGER&nbsp;&nbsp;&nbsp;&nbsp;--创建一个触发器 <BR>DROP TRIGGER&nbsp;&nbsp;&nbsp;&nbsp;--从数据库中删除触发器 <BR>CREATE SCHEMA&nbsp;&nbsp;&nbsp;&nbsp;--向数据库添加一个新模式 <BR>DROP SCHEMA&nbsp;&nbsp;&nbsp;&nbsp; --从数据库中删除一个模式 <BR>CREATE DOMAIN&nbsp;&nbsp;&nbsp;&nbsp;--创建一个数据值域 <BR>ALTER DOMAIN&nbsp;&nbsp;&nbsp;&nbsp;--改变域定义 <BR>DROP DOMAIN&nbsp;&nbsp;&nbsp;&nbsp; --从数据库中删除一个域 <BR>--数据控制 <BR>GRANT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--授予用户访问权限 <BR>DENY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--拒绝用户访问 <BR>REVOKE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--解除用户访问权限 <BR>--事务控制 <BR>COMMIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--结束当前事务 <BR>ROLLBACK&nbsp;&nbsp;&nbsp;&nbsp; --中止当前事务 <BR>SET TRANSACTION&nbsp;&nbsp;&nbsp;&nbsp;--定义当前事务数据访问特征 <BR>--程序化SQL <BR>DECLARE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--为查询设定游标 <BR>EXPLAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--为查询描述数据访问计划 <BR>OPEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--检索查询结果打开一个游标 <BR>FETCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--检索一行查询结果 <BR>CLOSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--关闭游标 <BR>PREPARE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--为动态执行准备SQL 语句 <BR>EXECUTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--动态地执行SQL 语句 <BR>DESCRIBE&nbsp;&nbsp;&nbsp;&nbsp; --描述准备好的查询 </P>
<P><BR>&nbsp; </P>
<P>---局部变量 <BR>declare @id char(10) <BR>--set @id = '10010001' <BR>select @id = '10010001' </P>
<P><BR>&nbsp; </P>
<P>---全局变量 <BR>---必须以@@开头 </P>
<P><BR>&nbsp; </P>
<P>--IF ELSE <BR>declare @x int @y int @z int <BR>select @x = 1 @y = 2 @z=3 <BR>if @x &gt; @y <BR>print 'x &gt; y' --打印字符串'x &gt; y' <BR>else if @y &gt; @z <BR>print 'y &gt; z' <BR>else print 'z &gt; y' </P>
<P><BR>&nbsp; </P>
<P>--CASE <BR>use pangu <BR>update employee <BR>set e_wage = <BR>case <BR>&nbsp;&nbsp;when job_level = ’1’ then e_wage*1.08 <BR>&nbsp;&nbsp;when job_level = ’2’ then e_wage*1.07 <BR>&nbsp;&nbsp;when job_level = ’3’ then e_wage*1.06 <BR>&nbsp;&nbsp;else e_wage*1.05 <BR>end </P>
<P><BR>&nbsp; </P>
<P>--WHILE CONTINUE BREAK <BR>declare @x int @y int @c int <BR>select @x = 1 @y=1 <BR>while @x &lt; 3 <BR>begin <BR>&nbsp;&nbsp;print @x --打印变量x 的值 <BR>&nbsp;&nbsp;while @y &lt; 3 <BR>&nbsp;&nbsp; begin <BR>&nbsp;&nbsp;&nbsp;&nbsp;select @c = 100*@x + @y <BR>&nbsp;&nbsp;&nbsp;&nbsp;print @c --打印变量c 的值 <BR>&nbsp;&nbsp;&nbsp;&nbsp;select @y = @y + 1 <BR>&nbsp;&nbsp; end <BR>&nbsp;&nbsp;select @x = @x + 1 <BR>&nbsp;&nbsp;select @y = 1 <BR>end </P>
<P><BR>&nbsp; </P>
<P>--WAITFOR <BR>--例 等待1 小时2 分零3 秒后才执行SELECT 语句 <BR>waitfor delay ’01:02:03’ <BR>select * from employee <BR>--例 等到晚上11 点零8 分后才执行SELECT 语句 <BR>waitfor time ’23:08:00’ <BR>select * from employee </P>
<P><BR><BR>&nbsp; </P>
<P>***SELECT***</P>
<P><BR>&nbsp; </P>
<P>&nbsp;&nbsp; select *(列名) from table_name(表名) where column_name operator value <BR>&nbsp;&nbsp; ex:(宿主) <BR>&nbsp;&nbsp;select * from stock_information where stockid&nbsp;&nbsp; = str(nid) <BR>&nbsp;&nbsp;&nbsp;&nbsp; stockname = 'str_name' <BR>&nbsp;&nbsp;&nbsp;&nbsp; stockname like '% find this %' <BR>&nbsp;&nbsp;&nbsp;&nbsp; stockname like '[a-zA-Z]%' --------- ([]指定值的范围) <BR>&nbsp;&nbsp;&nbsp;&nbsp; stockname like '[^F-M]%'&nbsp;&nbsp; --------- (^排除指定范围) <BR>&nbsp;&nbsp;&nbsp;&nbsp; --------- 只能在使用like关键字的where子句中使用通配符) <BR>&nbsp;&nbsp;&nbsp;&nbsp; or stockpath = 'stock_path' <BR>&nbsp;&nbsp;&nbsp;&nbsp; or stocknumber &lt; 1000 <BR>&nbsp;&nbsp;&nbsp;&nbsp; and stockindex = 24 <BR>&nbsp;&nbsp;&nbsp;&nbsp; not stock*** = 'man' <BR>&nbsp;&nbsp;&nbsp;&nbsp; stocknumber between 20 and 100 <BR>&nbsp;&nbsp;&nbsp;&nbsp; stocknumber in(10,20,30) <BR>&nbsp;&nbsp;&nbsp;&nbsp; order by stockid desc(asc) --------- 排序，desc-降序，asc-升序 <BR>&nbsp;&nbsp;&nbsp;&nbsp; order by 1,2 --------- by列号 <BR>&nbsp;&nbsp;&nbsp;&nbsp; stockname = (select stockname from stock_information&nbsp;&nbsp;where stockid&nbsp;&nbsp;= 4) <BR>&nbsp;&nbsp;&nbsp;&nbsp; --------- 子查询 <BR>&nbsp;&nbsp;&nbsp;&nbsp; --------- 除非能确保内层select只返回一个行的值， <BR>&nbsp;&nbsp;&nbsp;&nbsp; --------- 否则应在外层where子句中用一个in限定符 <BR>&nbsp;&nbsp;select distinct column_name form table_name --------- distinct指定检索独有的列值，不重复 <BR>&nbsp;&nbsp;select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name <BR>&nbsp;&nbsp;select stockname , "stocknumber" = count(*) from table_name group by stockname <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--------- group by 将表按行分组,指定列中有相同的值 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;having count(*) = 2&nbsp;&nbsp;---------&nbsp;&nbsp;having选定指定的组 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;select * <BR>&nbsp;&nbsp;from table1, table2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;where table1.id *= table2.id -------- 左外部连接，table1中有的而table2中没有得以null表示 <BR>&nbsp;&nbsp;&nbsp;&nbsp; table1.id =* table2.id -------- 右外部连接 </P>
<P><BR>&nbsp; </P>
<P>&nbsp;&nbsp;select stockname from table1 <BR>&nbsp;&nbsp;union [all]&nbsp;&nbsp;-----&nbsp;&nbsp;union合并查询结果集，all-保留重复行 <BR>&nbsp;&nbsp;select stockname from table2 </P>
<P><BR>&nbsp; </P>
<P>***insert***</P>
<P><BR>&nbsp; </P>
<P>&nbsp;&nbsp;insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx") <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value (select Stockname , Stocknumber from Stock_table2)---value为select语句 </P>
<P><BR>&nbsp; </P>
<P>***update***</P>
<P><BR>&nbsp; </P>
<P>&nbsp;&nbsp;update table_name set Stockname = "xxx" [where Stockid = 3] <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stockname = default <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stockname = null <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stocknumber = Stockname + 4 </P>
<P><BR>&nbsp; </P>
<P>***delete***</P>
<P><BR>&nbsp; </P>
<P>&nbsp;&nbsp;delete from table_name where Stockid = 3 <BR>&nbsp;&nbsp;truncate table_name ----------- 删除表中所有行，仍保持表的完整性 <BR>&nbsp;&nbsp;drop table table_name --------------- 完全删除表 </P>
<P><BR>&nbsp; </P>
<P>***alter table*** --- 修改数据库表结构</P>
<P><BR>&nbsp; </P>
<P>&nbsp;&nbsp;alter table database.owner.table_name add column_name char(2) null ..... <BR>&nbsp;&nbsp;sp_help table_name ---- 显示表已有特征 <BR>&nbsp;&nbsp;create table table_name (name char(20), age smallint, lname varchar(30)) <BR>&nbsp;&nbsp;insert into table_name select ......... ----- 实现删除列的方法（创建新表） <BR>&nbsp;&nbsp;alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束 <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>***function(/*常用函数*/)*** </P>
<P><BR>&nbsp; </P>
<P>----统计函数---- <BR>AVG&nbsp;&nbsp;&nbsp;&nbsp;--求平均值 <BR>COUNT&nbsp;&nbsp; --统计数目 <BR>MAX&nbsp;&nbsp;&nbsp;&nbsp;--求最大值 <BR>MIN&nbsp;&nbsp;&nbsp;&nbsp;--求最小值 <BR>SUM&nbsp;&nbsp;&nbsp;&nbsp;--求和 </P>
<P><BR>&nbsp; </P>
<P>--AVG <BR>use pangu <BR>select avg(e_wage) as dept_avgWage <BR>from employee <BR>group by dept_id </P>
<P><BR>&nbsp; </P>
<P>--MAX <BR>--求工资最高的员工姓名 <BR>use pangu <BR>select e_name <BR>from employee <BR>where e_wage = <BR>(select max(e_wage) <BR>&nbsp;&nbsp;from employee) </P>
<P><BR>&nbsp; </P>
<P>--STDEV() <BR>--STDEV()函数返回表达式中所有数据的标准差 </P>
<P><BR>&nbsp; </P>
<P>--STDEVP() <BR>--STDEVP()函数返回总体标准差 </P>
<P><BR>&nbsp; </P>
<P>--VAR() <BR>--VAR()函数返回表达式中所有值的统计变异数 </P>
<P><BR>&nbsp; </P>
<P>--VARP() <BR>--VARP()函数返回总体变异数 </P>
<P><BR>&nbsp; </P>
<P>----算术函数----</P>
<P><BR>&nbsp; </P>
<P>/***三角函数***/ <BR>SIN(float_expression) --返回以弧度表示的角的正弦 <BR>COS(float_expression) --返回以弧度表示的角的余弦 <BR>TAN(float_expression) --返回以弧度表示的角的正切 <BR>COT(float_expression) --返回以弧度表示的角的余切 <BR>/***反三角函数***/ <BR>ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角 <BR>ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角 <BR>ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角 <BR>ATAN2(float_expression1,float_expression2) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角 <BR>DEGREES(numeric_expression) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --把弧度转换为角度返回与表达式相同的数据类型可为 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--INTEGER/MONEY/REAL/FLOAT 类型 <BR>RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--INTEGER/MONEY/REAL/FLOAT 类型 <BR>EXP(float_expression)&nbsp;&nbsp;--返回表达式的指数值 <BR>LOG(float_expression)&nbsp;&nbsp;--返回表达式的自然对数值 <BR>LOG10(float_expression)--返回表达式的以10 为底的对数值 <BR>SQRT(float_expression) --返回表达式的平方根 <BR>/***取近似值函数***/ <BR>CEILING(numeric_expression)&nbsp;&nbsp;--返回&gt;=表达式的最小整数返回的数据类型与表达式相同可为 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--INTEGER/MONEY/REAL/FLOAT 类型 <BR>FLOOR(numeric_expression)&nbsp;&nbsp;&nbsp;&nbsp;--返回&lt;=表达式的最小整数返回的数据类型与表达式相同可为 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--INTEGER/MONEY/REAL/FLOAT 类型 <BR>ROUND(numeric_expression)&nbsp;&nbsp;&nbsp;&nbsp;--返回以integer_expression 为精度的四舍五入值返回的数据 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型 <BR>ABS(numeric_expression)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--返回表达式的绝对值返回的数据类型与表达式相同可为 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--INTEGER/MONEY/REAL/FLOAT 类型 <BR>SIGN(numeric_expression)&nbsp;&nbsp;&nbsp;&nbsp; --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型 <BR>PI()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --返回值为π 即3.1415926535897936 <BR>RAND([integer_expression])&nbsp;&nbsp; --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数 </P>
<P><BR>&nbsp; </P>
<P><BR>----字符串函数---- <BR>ASCII()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --函数返回字符表达式最左端字符的ASCII 码值 <BR>CHAR()&nbsp;&nbsp; --函数用于将ASCII 码转换为字符 <BR>&nbsp;&nbsp;&nbsp;&nbsp;--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值 <BR>LOWER()&nbsp;&nbsp; --函数把字符串全部转换为小写 <BR>UPPER()&nbsp;&nbsp; --函数把字符串全部转换为大写 <BR>STR()&nbsp;&nbsp; --函数把数值型数据转换为字符型数据 <BR>LTRIM()&nbsp;&nbsp; --函数把字符串头部的空格去掉 <BR>RTRIM()&nbsp;&nbsp; --函数把字符串尾部的空格去掉 <BR>LEFT(),RIGHT(),SUBSTRING()&nbsp;&nbsp;--函数返回部分字符串 <BR>CHARINDEX(),PATINDEX()&nbsp;&nbsp;--函数返回字符串中某个指定的子串出现的开始位置 <BR>SOUNDEX()&nbsp;&nbsp;--函数返回一个四位字符码 <BR>&nbsp;&nbsp;&nbsp;&nbsp;--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值&nbsp;&nbsp;&nbsp;&nbsp; <BR>DIFFERENCE()&nbsp;&nbsp;&nbsp;&nbsp;--函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异 <BR>&nbsp;&nbsp;&nbsp;&nbsp;--0 两个SOUNDEX 函数返回值的第一个字符不同 <BR>&nbsp;&nbsp;&nbsp;&nbsp;--1 两个SOUNDEX 函数返回值的第一个字符相同 <BR>&nbsp;&nbsp;&nbsp;&nbsp;--2 两个SOUNDEX 函数返回值的第一二个字符相同 <BR>&nbsp;&nbsp;&nbsp;&nbsp;--3 两个SOUNDEX 函数返回值的第一二三个字符相同 <BR>&nbsp;&nbsp;&nbsp;&nbsp;--4 两个SOUNDEX 函数返回值完全相同 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P><BR>&nbsp; </P>
<P>QUOTENAME()&nbsp;&nbsp;--函数返回被特定字符括起来的字符串 <BR>/*select quotename('abc', '{') quotename('abc') <BR>运行结果如下 <BR>----------------------------------{ <BR>{abc} [abc]*/ </P>
<P><BR>&nbsp; </P>
<P>REPLICATE()&nbsp;&nbsp;&nbsp;&nbsp; --函数返回一个重复character_expression 指定次数的字符串 <BR>/*select replicate('abc', 3) replicate( 'abc', -2) <BR>运行结果如下 <BR>----------- ----------- <BR>abcabcabc NULL*/ </P>
<P><BR>&nbsp; </P>
<P>REVERSE()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --函数将指定的字符串的字符排列顺序颠倒 <BR>REPLACE()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --函数返回被替换了指定子串的字符串 <BR>/*select replace('abc123g', '123', 'def') <BR>运行结果如下 <BR>----------- ----------- <BR>abcdefg*/ </P>
<P><BR>&nbsp; </P>
<P>SPACE()&nbsp;&nbsp; --函数返回一个有指定长度的空白字符串 <BR>STUFF()&nbsp;&nbsp; --函数用另一子串替换字符串指定位置长度的子串 </P>
<P><BR>&nbsp; </P>
<P><BR>----数据类型转换函数---- <BR>CAST() 函数语法如下 <BR>CAST() (&lt;expression&gt; AS &lt;data_ type&gt;[ length ]) <BR>CONVERT() 函数语法如下 <BR>CONVERT() (&lt;data_ type&gt;[ length ], &lt;expression&gt; [, style]) </P>
<P><BR>&nbsp; </P>
<P>select cast(100+99 as char) convert(varchar(12), getdate()) <BR>运行结果如下 <BR>------------------------------ ------------ <BR>199&nbsp;&nbsp; Jan 15 2000 </P>
<P><BR>&nbsp; </P>
<P>----日期函数---- <BR>DAY()&nbsp;&nbsp; --函数返回date_expression 中的日期值 <BR>MONTH()&nbsp;&nbsp; --函数返回date_expression 中的月份值 <BR>YEAR()&nbsp;&nbsp; --函数返回date_expression 中的年份值 <BR>DATEADD(&lt;datepart&gt; ,&lt;number&gt; ,&lt;date&gt;) <BR>&nbsp;&nbsp;&nbsp;&nbsp;--函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期 <BR>DATEDIFF(&lt;datepart&gt; ,&lt;number&gt; ,&lt;date&gt;) <BR>&nbsp;&nbsp;&nbsp;&nbsp;--函数返回两个指定日期在datepart 方面的不同之处 <BR>DATENAME(&lt;datepart&gt; , &lt;date&gt;)&nbsp;&nbsp;--函数以字符串的形式返回日期的指定部分 <BR>DATEPART(&lt;datepart&gt; , &lt;date&gt;)&nbsp;&nbsp;--函数以整数值的形式返回日期的指定部分 <BR>GETDATE()&nbsp;&nbsp;--函数以DATETIME 的缺省格式返回系统当前的日期和时间 </P>
<P><BR>&nbsp; </P>
<P align=left>----系统函数---- <BR>APP_NAME()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--函数返回当前执行的应用程序的名称 <BR>COALESCE()&nbsp;&nbsp;--函数返回众多表达式中第一个非NULL 表达式的值 <BR>COL_LENGTH(&lt;'table_name'&gt;, &lt;'column_name'&gt;) --函数返回表中指定字段的长度值 <BR>COL_NAME(&lt;table_id&gt;, &lt;column_id&gt;)&nbsp;&nbsp; --函数返回表中指定字段的名称即列名 <BR>DATALENGTH() --函数返回数据表达式的数据的实际长度 <BR>DB_ID(['database_name']) --函数返回数据库的编号 <BR>DB_NAME(database_id)&nbsp;&nbsp;--函数返回数据库的名称 <BR>HOST_ID()&nbsp;&nbsp;&nbsp;&nbsp; --函数返回服务器端计算机的名称 <BR>HOST_NAME()&nbsp;&nbsp;&nbsp;&nbsp; --函数返回服务器端计算机的名称 <BR>IDENTITY(&lt;data_type&gt;[, seed increment]) [AS column_name]) <BR>--IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中 <BR>/*select identity(int, 1, 1) as column_name <BR>into newtable <BR>from oldtable*/ <BR>ISDATE()&nbsp;&nbsp;--函数判断所给定的表达式是否为合理日期 <BR>ISNULL(&lt;check_expression&gt;, &lt;replacement_value&gt;) --函数将表达式中的NULL 值用指定值替换 <BR>ISNUMERIC()&nbsp;&nbsp;--函数判断所给定的表达式是否为合理的数值 <BR>NEWID()&nbsp;&nbsp; --函数返回一个UNIQUEIDENTIFIER 类型的数值 <BR>NULLIF(&lt;expression1&gt;, &lt;expression2&gt;) <BR>--NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值 <BR><BR><BR><STRONG><FONT size=5>精妙SQL语句</FONT></STRONG><A name=3739></A> <BR></P>
<P>精妙SQL语句 <BR>说明：复制表(只复制结构,源表名：a 新表名：b) <BR>SQL: select * into b from a where 1&lt;&gt;1 <BR>说明：拷贝表(拷贝数据,源表名：a 目标表名：b) <BR>SQL: insert into b(a, b, c) select d,e,f from b; <BR>说明：显示文章、提交人和最后回复时间 <BR>SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b <BR>说明：外连接查询(表名1：a 表名2：b) <BR>SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c <BR>说明：日程安排提前五分钟提醒 <BR>SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())&gt;5 </P>
<P>说明：两张关联表，删除主表中已经在副表中没有的信息 <BR>SQL: <BR>delete from info where not exists ( select * from infobz where info.infid=infobz.infid ) <BR>说明：-- <BR>SQL: <BR>SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE <BR>FROM TABLE1, <BR>(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE <BR>FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND <BR>FROM TABLE2 <BR>WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X, <BR>(SELECT NUM, UPD_DATE, STOCK_ONHAND <BR>FROM TABLE2 <BR>WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = <BR>TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y, <BR>WHERE X.NUM = Y.NUM （+） <BR>AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) &lt;&gt; X.STOCK_ONHAND ) B <BR>WHERE A.NUM = B.NUM <BR>说明：-- <BR>SQL: <BR>select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&amp;strdepartmentname&amp;"' and 专业名称='"&amp;strprofessionname&amp;"' order by 性别,生源地,高考总成绩 <BR>说明： <BR>从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源） <BR>SQL: <BR>SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV, <BR>SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC <BR>FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration <BR>FROM TELFEESTAND a, TELFEE b <BR>WHERE a.tel = b.telfax) a <BR>GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') <BR>说明：四表联查问题： <BR>SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... <BR>说明：得到表中最小的未使用的ID号 <BR>SQL: <BR>SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID <BR>FROM Handle <BR>WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a) <BR></P><img src ="http://www.blogjava.net/yrj11320/aggbug/17445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-30 17:24 <a href="http://www.blogjava.net/yrj11320/articles/17445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle常用函数列表速查</title><link>http://www.blogjava.net/yrj11320/articles/17442.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Sun, 30 Oct 2005 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/17442.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/17442.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/17442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/17442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/17442.html</trackback:ping><description><![CDATA[PL/SQL单行函数和组函数详解<BR><BR>　 函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数，这些函数都可被称为SQL或PL/SQL语句，函数主要分为两大类： <BR>　　 单行函数<BR><BR>　　 组函数 <BR><BR>　　本文将讨论如何利用单行函数以及使用规则。<BR><BR>　　SQL中的单行函数<BR><BR>　　SQL和PL/SQL中自带很多类型的函数，有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据，因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中，例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。<BR>SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)<BR><BR>　　单行函数也可以在其他语句中使用，如update的SET子句，INSERT的VALUES子句，DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数，所以我们的注意力也集中在SELECT语句中。<BR><BR>　　NULL和单行函数<BR><BR>　　在如何理解NULL上开始是很困难的，就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值，算术操作符的任何一个操作数为NULL值，结果均为提个NULL值,这个规则也适合很多函数，只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的，因为他能直接处理NULL值，NVL有两个参数：NVL(x1,x2),x1和x2都式表达式，当x1为null时返回X2,否则返回x1。<BR><BR>　　下面我们看看emp数据表它包含了薪水、奖金两项，需要计算总的补偿<BR>column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2<BR><BR>　　不是简单的将薪水和奖金加起来就可以了，如果某一行是null值那么结果就将是null，比如下面的例子：<BR>update empset salary=(salary+bonus)*1.1<BR><BR>　　这个语句中，雇员的工资和奖金都将更新为一个新的值，但是如果没有奖金，即 salary + null,那么就会得出错误的结论，这个时候就要使用nvl函数来排除null值的影响。<BR>所以正确的语句是：<BR>update empset salary=(salary+nvl(bonus,0)*1.1<BR>单行字符串函数<BR><BR>　　单行字符串函数用于操作字符串数据，他们大多数有一个或多个参数，其中绝大多数返回字符串<BR><BR>　　ASCII()<BR>　　 c1是一字符串，返回c1第一个字母的ASCII码，他的逆函数是CHR()<BR>SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122<BR><BR>　　CHR(＜i＞)[NCHAR_CS]<BR>　　 i是一个数字，函数返回十进制表示的字符<BR>select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B<BR>
<P>　　CONCAT(,)<BR>　　 c1,c2均为字符串，函数将c2连接到c1的后面，如果c1为null,将返回c2.如果c2为null,则返回c1，如果c1、c2都为null，则返回null。他和操作符||返回的结果相同<BR>select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda<BR><BR>　　INITCAP()<BR>　　 c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格，控制字符，标点符号限制。<BR>select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici<BR><BR>　　INSTR(,[,＜i＞[,]])<BR>　　 c1,c2均为字符串，i,j为整数。函数返回c2在c1中第j次出现的位置，搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数，那么搜索将从右到左进行，但是位置的计算还是从左到右，i和j的缺省值为1.<BR>select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2<BR><BR>　　INSTRB(,[,i[,j])<BR>　　 与INSTR（）函数一样，只是他返回的是字节，对于单字节INSTRB()等于INSTR()<BR><BR>　　LENGTH()<BR>　　 c1为字符串，返回c1的长度，如果c1为null，那么将返回null值。<BR>select LENGTH('Ipso Facto') ergo from dualergo10<BR><BR>　　LENGTHb()<BR>　　 与LENGTH()一样，返回字节。<BR><BR>　　lower()<BR>　　 返回c的小写字符，经常出现在where子串中<BR>select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite<BR><BR>　　LPAD(,＜i＞[,])<BR>　　 c1,c2均为字符串，i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格，参见RPAD。<BR>select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe<BR><BR>　　LTRIM(,)<BR>　　 把c1中最左边的字符去掉，使其第一个字符不在c2中，如果没有c2，那么c1就不会改变。<BR>select LTRIM('Mississippi','Mis') from dualLTRppi<BR><BR>　　RPAD(,＜i＞[,]) <BR>　　 在c1的右侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格,其他与LPAD相似<BR>RTRIM(,)<BR>　　 把c1中最右边的字符去掉，使其第后一个字符不在c2中，如果没有c2，那么c1就不会改变。<BR><BR>　　REPLACE(,[,])<BR>　　 c1,c2,c3都是字符串，函数用c3代替出现在c1中的c2后返回。<BR>select REPLACE('uptown','up','down') from dualREPLACEdowntown<BR><BR>　STBSTR(,＜i＞[,])<BR>　　 c1为一字符串，i,j为整数，从c1的第i位开始返回长度为j的子字符串，如果j为空，则直到串的尾部。<BR>select SUBSTR('Message',1,4) from dualSUBSMess <BR><BR><BR>　　SUBSTRB(,＜i＞[,])<BR>　　 与SUBSTR大致相同，只是I,J是以字节计算。<BR><BR>　　SOUNDEX()<BR>　　 返回与c1发音相似的词<BR>select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250<BR><BR>　　TRANSLATE(,,)<BR>　　 将c1中与c2相同的字符以c3代替<BR>select TRANSLATE('fumble','uf','ar') test from dualTEXTramble <BR><BR>　　TRIM([[]] from c3)<BR>　　 将c3串中的第一个，最后一个，或者都删除。<BR>select TRIM(' space padded ') trim from dual TRIMspace padded<BR><BR>　　UPPER()<BR>　　 返回c1的大写，常出现where子串中<BR>select name from dual where UPPER(name) LIKE 'KI%'NAMEKING<BR>单行数字函数<BR><BR>　　单行数字函数操作数字数据，执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作数和值都是弧度而不是角度，oracle没有提供内建的弧度和角度的转换函数。<BR><BR>　　ABS()<BR>　　 返回n的绝对值<BR><BR>　　ACOS()<BR>　　 反余玄函数，返回-1到1之间的数。n表示弧度<BR>select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0 <BR><BR>　　ASIN()<BR>　　 反正玄函数，返回-1到1，n表示弧度<BR></P>
<P>　　ATAN()<BR>　　 反正切函数，返回n的反正切值，n表示弧度。<BR><BR>　　CEIL()<BR>　　 返回大于或等于n的最小整数。<BR><BR>　　COS()<BR>　　 返回n的余玄值，n为弧度<BR><BR>　　COSH()<BR>　　 返回n的双曲余玄值，n 为数字。<BR>select COSH(&lt;1.4&gt;) FROM dualCOSH(1.4)2.15089847<BR><BR>　　EXP()<BR>　　 返回e的n次幂，e=2.71828183.<BR><BR>　　FLOOR()<BR>　　 返回小于等于N的最大整数。<BR><BR>　　LN()<BR>　　 返回N的自然对数，N必须大于0<BR><BR>　　LOG(,)<BR>　　 返回以n1为底n2的对数<BR><BR>　　MOD()<BR>　　 返回n1除以n2的余数，<BR><BR>　　POWER(,)<BR>　　 返回n1的n2次方<BR><BR>　　ROUND(,)<BR>　　 返回舍入小数点右边n2位的n1的值，n2的缺省值为0，这回将小数点最接近的整数，如果n2为负数就舍入到小数点左边相应的位上，n2必须是整数。<BR>select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54<BR><BR>　　SIGN()<BR>　　 如果n为负数，返回-1,如果n为正数，返回1，如果n=0返回0.<BR><BR>　　SIN（)<BR>　　 返回n的正玄值,n为弧度。<BR></P>
<P>　　SINH()<BR>　　 返回n的双曲正玄值,n为弧度。<BR><BR>　　SQRT()<BR>　　 返回n的平方根,n为弧度<BR><BR>　　TAN（)<BR>　　 返回n的正切值,n为弧度<BR><BR>　　TANH()<BR>　　 返回n的双曲正切值,n为弧度<BR><BR>　　TRUNC(,)<BR>　　 返回截尾到n2位小数的n1的值，n2缺省设置为0，当n2为缺省设置时会将n1截尾为整数，如果n2为负值，就截尾在小数点左边相应的位上。<BR><BR>　单行日期函数 <BR><BR><BR>　　单行日期函数操作DATA数据类型，绝大多数都有DATA数据类型的参数，绝大多数返回的也是DATA数据类型的值。<BR><BR>　　ADD_MONTHS(,＜i＞)<BR>　　 返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数，那么数据库将隐式的他转换成整数，将会截去小数点后面的部分。<BR><BR>　　LAST_DAY()<BR>　　 函数返回包含日期d的月份的最后一天 <BR><BR>　　MONTHS_BETWEEN(,)<BR>　　 返回d1和d2之间月的数目,如果d1和d2的日的日期都相同，或者都使该月的最后一天，那么将返回一个整数，否则会返回的结果将包含一个分数。<BR><BR>　　NEW_TIME(,,)<BR>　　 d1是一个日期数据类型，当时区tz1中的日期和时间是d时，返回时区tz2中的日期和时间。tz1和tz2时字符串。<BR>NEXT_DAY(,)<BR>　　 返回日期d后由dow给出的条件的第一天，dow使用当前会话中给出的语言指定了一周中的某一天，返回的时间分量与d的时间分量相同。<BR>select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004 <BR><BR>　　ROUND([,])<BR>　　 将日期d按照fmt指定的格式舍入，fmt为字符串。<BR><BR>　　SYADATE<BR>　　 函数没有参数，返回当前日期和时间。<BR><BR>　　TRUNC([,]) <BR>　　 返回由fmt指定的单位的日期d.<BR>单行转换函数<BR><BR>　　单行转换函数用于操作多数据类型，在数据类型之间进行转换。<BR><BR>　　CHARTORWID()<BR>　　 c 使一个字符串，函数将c转换为RWID数据类型。<BR>SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA') <BR><BR>　　CONVERT(,[,])<BR>　　 c尾字符串，dset、sset是两个字符集，函数将字符串c由sset字符集转换为dset字符集，sset的缺省设置为数据库的字符集。<BR><BR>　　HEXTORAW()<BR>　　 x为16进制的字符串，函数将16进制的x转换为RAW数据类型。<BR><BR>　　RAWTOHEX()<BR>　　 x是RAW数据类型字符串，函数将RAW数据类转换为16进制的数据类型。<BR><BR>　　ROWIDTOCHAR()<BR>　　 函数将ROWID数据类型转换为CHAR数据类型。<BR></P>
<P>　　TO_CHAR([[,)<BR>　　 x是一个data或number数据类型，函数将x转换成fmt指定格式的char数据类型，如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符，以及货币符号。<BR>NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"<BR><BR>　　TO_DATE([,[,）<BR>　　 c表示字符串，fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。<BR><BR>　　TO_MULTI_BYTE()<BR>　　 c表示一个字符串，函数将c的担子截字符转换成多字节字符。<BR><BR>　　TO_NUMBER([,[,)<BR>　　 c表示字符串，fmt表示一个特殊格式的字符串，函数返回值按照fmt指定的格式显示。nlsparm表示语言，函数将返回c代表的数字。<BR><BR>　　TO_SINGLE_BYTE()<BR>　　 将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用<BR><BR>　　其它单行函数<BR><BR>　　BFILENAME( <BR>,)<BR>　　 dir是一个directory类型的对象，file为一文件名。函数返回一个空的BFILE位置值指示符，函数用于初始化BFILE变量或者是BFILE列。<BR><BR>　　DECODE(,,[,,,[])<BR>　　 x是一个表达式，m1是一个匹配表达式，x与m1比较，如果m1等于x，那么返回r1,否则,x与m2比较，依次类推m3,m4,m5....直到有返回结果。<BR><BR>　　DUMP(,[,[,[,]]])<BR>　　 x是一个表达式或字符，fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。<BR></P>
<P>　　EMPTY_BLOB()<BR>　　 该函数没有参数，函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。<BR><BR>　　EMPTY_CLOB()<BR>　　 该函数没有参数，函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。<BR><BR>　　GREATEST()<BR>　　 exp_list是一列表达式，返回其中最大的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，那么返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。<BR><BR>　LEAST()<BR>　　 exp_list是一列表达式，返回其中最小的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，将返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。 <BR><BR><BR>　　UID<BR>　　 该函数没有参数，返回唯一标示当前数据库用户的整数。<BR><BR>　　USER<BR>　　 返回当前用户的用户名<BR><BR>　　USERENV()<BR>　　 基于opt返回包含当前会话信息。opt的可选值为：<BR><BR>　　ISDBA　 　　会话中SYSDBA脚色响应，返回TRUE <BR>　　 SESSIONID 　返回审计会话标示符<BR>　　 ENTRYID 　　返回可用的审计项标示符 <BR>　　 INSTANCE　　在会话连接后，返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。<BR>　　 LANGUAGE　　返回语言、地域、数据库设置的字符集。<BR>　　 LANG　　　　返回语言名称的ISO缩写。<BR>　　 TERMINAL　　为当前会话使用的终端或计算机返回操作系统的标示符。<BR><BR>　　VSIZE()<BR>　　 x是一个表达式。返回x内部表示的字节数。<BR>SQL中的组函数<BR><BR>　　组函数也叫集合函数，返回基于多个行的单一结果，行的准确数量无法确定，除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是，在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.<BR><BR>　　组（多行）函数<BR><BR>　　与单行函数相比，oracle提供了丰富的基于组的，多行的函数。这些函数可以在select或select的having子句中使用，当用于select子串时常常都和GROUP BY一起使用。<BR><BR>　　AVG([{DISYINCT|ALL}])<BR>　　 返回数值的平均值。缺省设置为ALL.<BR>SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413<BR><BR>　　COUNT({*|DISTINCT|ALL} )<BR>　　 返回查询中行的数目，缺省设置是ALL,*表示返回所有的行。<BR><BR>　　MAX([{DISTINCT|ALL}])<BR>　　 返回选择列表项目的最大值，如果x是字符串数据类型，他返回一个VARCHAR2数据类型，如果X是一个DATA数据类型，返回一个日期，如果X是numeric数据类型，返回一个数字。注意distinct和all不起作用，应为最大值与这两种设置是相同的。<BR><BR>　　MIN([{DISTINCT|ALL}])<BR>　　 返回选择列表项目的最小值。<BR><BR>　　STDDEV([{DISTINCT|ALL}])<BR>　　 返回选者的列表项目的标准差，所谓标准差是方差的平方根。<BR><BR>　　SUM([{DISTINCT|ALL}])<BR>　　 返回选择列表项目的数值的总和。<BR><BR>　　VARIANCE([{DISTINCT|ALL}])<BR>　　 返回选择列表项目的统计方差。<BR><BR>　　用GROUP BY给数据分组<BR><BR>　　正如题目暗示的那样组函数就是操作那些已经分好组的数据，我们告诉数据库用GROUP BY怎样给数据分组或者分类，当我们在SELECT语句的SELECT子句中使用组函数时，我们必须把为分组或非常数列放置在GROUP BY子句中，如果没有用group by进行专门处理，那么缺省的分类是将整个结果设为一类。<BR>select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982<BR><BR>　　在这个例子中，我们用state字段分类；如果我们要将结果按照zip_codes排序,可以用ORDER BY语句，ORDER BY子句可以使用列或组函数。<BR>select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982<BR></P>
<P>　用HAVING子句限制分组数据<BR><BR>　　现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数，组函数只能用于两个子串中，组函数不能用于WHERE子串中，例如下面的查询是错误的：<BR>错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)&gt;10000 GROUP BY sales_clerk<BR><BR>　　这个语句中数据库不知道SUM()是什么，当我们需要指示数据库对行分组，然后限制分组后的行的输出时，正确的方法是使用HAVING语句：<BR>SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)&gt;10000;<BR><BR>　　嵌套函数<BR><BR>　　函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置，函数遵循由内到外，由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。<BR><BR>　　嵌套函数可以包括在组函数中嵌套单行函数，或者组函数嵌套入单行函数或组函数中。比如下面的例子：<BR>SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,COUNT(DISTINCT job) jobs,COUNT(DISTINCT mgr) mgrsFROM empGROUP BY deptno;DEPTNO CNT JOBS MGRS------ --- ---- ----10 4 4 220 4 3 430 3 3 2</P><img src ="http://www.blogjava.net/yrj11320/aggbug/17442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-30 17:12 <a href="http://www.blogjava.net/yrj11320/articles/17442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决MVC下分页显示的问题</title><link>http://www.blogjava.net/yrj11320/articles/16909.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Wed, 26 Oct 2005 10:40:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/16909.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/16909.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/16909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/16909.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/16909.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我是用Struts的，当然就要使用到MVC这个模式，分页的时候也是这样的。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先要有一个和数据库链接的bean,我们暂时叫DBUtil吧，这里面封装了很多和数据库有关的东西，比如有查询，修改，插入等方法，这是一个基本的类，这里我们用到的是查询，这个方法返回的...&nbsp;&nbsp;<a href='http://www.blogjava.net/yrj11320/articles/16909.html'>阅读全文</a><img src ="http://www.blogjava.net/yrj11320/aggbug/16909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-26 18:40 <a href="http://www.blogjava.net/yrj11320/articles/16909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP分页技术实现</title><link>http://www.blogjava.net/yrj11320/articles/16908.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Wed, 26 Oct 2005 10:35:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/16908.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/16908.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/16908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/16908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/16908.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 目前比较广泛使用的分页方式是将查询结果缓存在HttpSession或有状态bean中，翻页的时候从缓存中取出一页数据显示。这种方法有两个主要的缺点：一是用户可能看到的是过期数据；二是如果数据量非常大时第一次查询遍历结果集会耗费很长时间，并且缓存的数据也会占用大量内存，效率明显下降。　　其它常见的方法还有每次翻页都查询一次数据库，从ResultSet中只取出一页数据（使用rs.last();rs.g...&nbsp;&nbsp;<a href='http://www.blogjava.net/yrj11320/articles/16908.html'>阅读全文</a><img src ="http://www.blogjava.net/yrj11320/aggbug/16908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-26 18:35 <a href="http://www.blogjava.net/yrj11320/articles/16908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE应用中与Oracle数据库的连接(OCI方式、thin方式和JdbcOdbc桥方式)</title><link>http://www.blogjava.net/yrj11320/articles/16587.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Mon, 24 Oct 2005 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/16587.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/16587.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/16587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/16587.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/16587.html</trackback:ping><description><![CDATA[在J2EE应用程序开发中，应用程序与数据库连接的建立是我们经常遇到的问题之一。在这里我主要谈谈在本地应用程序中通过OCI方式、thin方式和JdbcOdbc桥方式连接Oracle数据库，在iPlanet Application Server 6.5和Sun Java System Application Server 7中对Oracle数据库连接池的配置以及应用中如何从连接池中获得连接 <BR><BR>一、本地通过JDBC获得Oracle数据库连接 <BR><BR>通过JDBC获得Oracle数据库连接，有三种方式：OCI方式、thin方式和JdbcOdbc桥方式。OCI方式依赖于本地的动态链接库，如果在本地安装了Oracle数据库客户端可以采用该方式；而thin方式为纯java的数据库连接方式；JdbcOdbc桥方式依赖于本地ODBC数据库源的配置，这种方式一般不太被采用。 <BR><BR>1、OCI方式 <BR><BR>先在本地安装Oracle客户端，安装完之后，在安装的路径中可以找到…/jdbc/lib/classes12.zip文件，我们在环境变量classpath中设置classes12.zip所在的路径。 <BR><BR>然后通过以下的数据库连接类，在本地通过OCI方式获得Oracle数据库连接 <BR><BR>/** <BR>* 在本地获得数据库连接 <BR>*/ <BR><BR>package com.j2ee.db; <BR><BR>import java.util.*; <BR>import java.sql.*; <BR>import javax.sql.*; <BR>import java.io.*; <BR>import oracle.jdbc.driver.*; <BR>import javax.naming.*; <BR><BR>/** <BR>* 通过OCI方式获得Oracle数据库连接 <BR>*/ <BR>public class DbConnection <BR>{ <BR>final static String sDBDriver = "oracle.jdbc.driver.OracleDriver"; <BR>final static String sConnStr = "jdbc:oracle:oci8:sr/sr@ora199"; <BR><BR>/** <BR>* <BR>*/ <BR>public DbConnection() <BR>{ <BR>} <BR><BR>/** <BR>* 获得Oracle数据库连接 <BR>*/ <BR>public java.sql.Connection connectDbByOci() <BR>{ <BR>java.sql.Connection conn=null; <BR>try <BR>{ <BR>Class.forName(sDBDriver); <BR>conn = DriverManager.getConnection(sConnStr); <BR>} <BR>catch (Exception e) <BR>{ <BR>System.out.println("ERROR:"+e.getMessage()); <BR>} <BR>return conn; <BR>} <BR>} <BR>在连接字符串 "jdbc:oracle:oci8:sr/sr@ora199" 中，"sr/sr"为Oracle用户的用户名和口令，"ora199"为数据库服务名。 <BR><BR>2、thin方式 <BR><BR>先到Oracle技术网（http://otn.oracle.com/global/cn/software/tech/java/sqlj_jdbc/index.html）下载Oracle JDBC Drivers，同样地将下载后的zip文件的路径设置在环境变量classpath。 <BR><BR>然后通过以下的数据库连接类，在本地通过thin方式获得Oracle数据库连接。 <BR><BR>/** <BR>* 在本地获得数据库连接 <BR>*/ <BR><BR>package com.j2ee.db; <BR><BR>import java.util.*; <BR>import java.sql.*; <BR>import javax.sql.*; <BR>import java.io.*; <BR>import oracle.jdbc.driver.*; <BR>import javax.naming.*; <BR><BR>/** <BR>* 通过thin方式获得Oracle数据库连接 <BR>*/ <BR>public class DbConnection <BR>{ <BR>private String sConnStr = ""; <BR><BR>/** <BR>* 缺省构造器 <BR>*/ <BR>public DbConnection() <BR>{ <BR>sConnStr = "jdbc:oracle:thin:@10.1.4.199:1521:ora199"; <BR>} <BR><BR>/** <BR>* @param ip,serviceName <BR>*/ <BR>public DbConnection(String ip,String serviceName) <BR>{ <BR>sConnStr = "jdbc:oracle:thin:@"+ip+":1521:"+serviceName; <BR>} <BR><BR>/** <BR>* 通过thin方式获得Oracle数据库的连接. <BR>*/ <BR>public java.sql.Connection connectDbByThin() <BR>{ <BR>java.sql.Connection conn=null; <BR>try <BR>{ <BR>Class.forName(sDBDriver); <BR>conn = DriverManager.getConnection(sConnStr,"sr","sr"); <BR>} <BR>catch (Exception e) <BR>{ <BR>System.out.println("ERROR:"+e.getMessage()); <BR>} <BR>return conn; <BR>} <BR><BR>/**<BR><BR>* 通过thin方式获得Oracle数据库的连接. <BR>* @param userId,password <BR>*/ <BR>public java.sql.Connection connectByJdbc(String userId,String password) <BR>{ <BR>java.sql.Connection conn=null; <BR>try <BR>{ <BR>Class.forName(sDBDriver); <BR>conn = DriverManager.getConnection(sConnStr,userId,password); <BR>} <BR>catch (Exception e) <BR>{ <BR>System.out.println("ERROR:"+e.getMessage()); <BR>} <BR>return conn; <BR>} <BR>} <BR>这种方式运用起来比较灵活，简单，具有较强的移植性和适用性。只要注意连接字符串"jdbc:oracle:thin:@10.1.4.199:1521:ora199"中具体参数的设置即可 <BR><BR>3、JdbcOdbc桥方式 <BR><BR>先通过管理工具中的数据源来添加本地对Oracle数据库的连接，然后通过以下的数据库连接类，在本地通过JdbcOdbc桥方式获得Oracle数据库连接。 <BR><BR>/** <BR>* 在本地获得数据库连接 <BR>*/ <BR><BR>package com.j2ee.db; <BR><BR>import java.util.*; <BR>import java.sql.*; <BR>import javax.sql.*; <BR>import java.io.*; <BR>import oracle.jdbc.driver.*; <BR>import javax.naming.*; <BR><BR>/** <BR>* 通过JdbcOdbc桥方式获得Oracle数据库连接 <BR>*/ <BR>public class DbConnection <BR>{ <BR>/** <BR>* <BR>*/ <BR>public DbConnection() <BR>{ <BR>} <BR><BR>/** <BR>* 获得Oracle数据库连接 <BR>*/ <BR>public java.sql.Connection connectDbByJdbcOdbcBridge() <BR>{ <BR>java.sql.Connection conn=null; <BR>try <BR>{ <BR>Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); <BR>con=DriverManager.getConnection("jdbc:odbc:ora199","sr","sr"); <BR>} <BR>catch (Exception e) <BR>{ <BR>System.out.println("ERROR:"+e.getMessage()); <BR>} <BR>return conn; <BR>} <BR>} <BR>在getConnection方法中第一个参数"jdbc:odbc:ora199" 中的"ora199"为本地ODBC数据源的数据源名称，第二个参数和第三个参数分别为Oracle的用户名和口令。 <BR><BR>二、通过连接池获得Oracle数据库连接 <BR><BR>这部分主要讲述在iPlanet Application Server 6.5和Sun Java System Application Server 7中Oracle数据库连接池的配置，以及在应用中如何通过连接池获得数据库的连接。 <BR><BR>1、iPlanet Application Server 6.5连接池的配置 <BR><BR>先打开iPlanet Application Server 6.5的管理控制台，选中"database"面板，再选择"External JDBC Drivers"选项后，点击"Add…"按钮，在弹出的对话框中，添加一个名为"ora-type4"的JDBC Driver。 <BR><BR><BR>Driver Classpath：该参数填写classes12.zip文件的物理路径。 <BR><BR>然后在"External JDBC DataSources"中选择"Add…"，在弹出的对话框中添加一个JNDI名称为"credit2"的数据源。 <BR><BR><BR>DriverType：选择刚添加好的"ora-type4"； <BR><BR>Datasource：ora199，为Oracle数据库服务名； <BR><BR>Datasource：ora199，为Oracle数据库服务名； <BR><BR>Connection Pool Parameters：图中显示的是缺省设置，可以根据自己环境情况来更改这些设置。 <BR><BR>保存完设置后，在"DataSource Selection Box"中，选择刚添加的"credit2"数据源，再选择"Vendor Specific Properties"按钮。在对话中添加一个URL属性。 <BR><BR><BR>至此，iPlanet Application Server 6.5中的数据库连接池配置完毕，重起服务使之生效。 <BR><BR>2、Sun Java System Application Server 7连接池的配置 <BR><BR>在配置之前将classes12.zip文件置于…/server1/lib目录下。通过浏览器的4848端口打开Sun Java System Application Server 7的管理界面，选择"server1"->"JDBC"-> "Connection Pools"下的"New…" <BR><BR><BR>添加一个名称为"MyConnectionPool"的Oracle数据库连接池。"Next"下一步。 <BR><BR><BR>在"General"中填写"Datasource Classname"。 <BR><BR><BR>在"Properties"中将不需要的属性删除，同时添加"URL"属性。 <BR><BR>"dataSourceName"中填写Oracle数据库服务名。 <BR><BR>以下连接池的缺省设置，可以根据自己环境的情况作相应的调整。<BR><BR>选择"Finish"完成连接池的设置。 <BR><BR>下一步为"MyConnectionPool"连接池创建一个JNDI，以便应用程序能够通过该名称获得连接池中的连接。 "server1"->"JDBC"-> "JDBC Resources"下的"New…" <BR><BR><BR>至此，Sun Java System Application Server7中的数据库连接池配置完毕，重起服务使之生效。 <BR><BR>3、通过连接池获得连接 <BR><BR>以上在iPlanet Application Server 6.5和Sun Java System Application Server7中配置的连接池都可以通过以下的数据库连接类，从连接池中获得Oracle数据库连接。 <BR><BR>/** <BR>* 从连接池中获得数据库连接 <BR>*/ <BR><BR>package com.j2ee.db; <BR><BR>import java.util.*; <BR>import java.sql.*; <BR>import javax.sql.*; <BR>import java.io.*; <BR>import oracle.jdbc.driver.*; <BR>import javax.naming.*; <BR><BR>/** <BR>* 通过连接池方式获得Oracle数据库连接 <BR>*/ <BR>public class DbConnection <BR>{ <BR>/** <BR>* <BR>*/ <BR>public DbConnection() <BR>{ <BR>} <BR><BR>/** <BR>* 获得Oracle数据库连接 <BR>*/ <BR>public java.sql.Connection connectDbByConnectionPool() <BR>{ <BR>java.sql.Connection conn=null; <BR>try <BR>{ <BR>Context ctx = new InitialContext(); <BR>DataSource ds = (DataSource)ctx.lookup("jdbc/credit2"); <BR>conn=ds.getConnection(); <BR>} <BR>catch (Exception e) <BR>{ <BR>System.out.println("ERROR:"+e.getMessage()); <BR>} <BR>return conn; <BR>} <BR>} <BR>4、使用连接池的优点使用连接池的优点主要体现在两个方面：对数据库的连接统一进行配置、管理、监控，以及对数据库连接池的参数进行优化调整，<br>同时对应用中没有关闭或其他原因造成没有关闭的数据库连接由连接池统一进行管理。便于应用的移植和后端数据库的切换，<br>因为在应用中通过统一的JNDI获得数据库的连接，而具体连接的是哪一台机器上的数据库与应用无关<img src ="http://www.blogjava.net/yrj11320/aggbug/16587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-24 15:04 <a href="http://www.blogjava.net/yrj11320/articles/16587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts框架 </title><link>http://www.blogjava.net/yrj11320/articles/16491.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Sun, 23 Oct 2005 12:49:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/16491.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/16491.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/16491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/16491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/16491.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;目录&nbsp;序…………………………………………………………………………………………………1目录…………………………………………………………………………………………………2Struts框架1.&nbsp;&nbsp;&nbsp; struts压缩包内容………………………………………………………………………32.&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/yrj11320/articles/16491.html'>阅读全文</a><img src ="http://www.blogjava.net/yrj11320/aggbug/16491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-23 20:49 <a href="http://www.blogjava.net/yrj11320/articles/16491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB的核心技术应用</title><link>http://www.blogjava.net/yrj11320/articles/16474.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Sun, 23 Oct 2005 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/16474.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/16474.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/16474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/16474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/16474.html</trackback:ping><description><![CDATA[一、EJB技术简介&nbsp;<BR>　　EJB的全称是Enterprise&nbsp;java&nbsp;bean。是JAVA中的商业应用组件技术。EJB结构中的角色&nbsp;EJB&nbsp;组件结构是基于组件的分布式计算结构，是分布式应用系统中的组件。<BR>　　一个完整的基于EJB的分布式计算结构由六个角色组成，这六个角色可以由不同的开发商提供，每个角色所作的工作必须遵循Sun公司提供的EJB规范，以保证彼此之间的兼容性。这六个角色分别是EJB组件开发者(Enterprise&nbsp;Bean&nbsp;Provider)&nbsp;、应用组合者(Application&nbsp;Assembler)、部署者(Deployer)、EJB&nbsp;服务器提供者(EJB&nbsp;Server&nbsp;Provider)、EJB&nbsp;容器提供者(EJB&nbsp;Container&nbsp;Provider)、系统管理员(System&nbsp;Administrator)：<BR>　　二、EJB中各角色的分析<BR>　　1、EJB组件开发者(Enterprise&nbsp;Bean&nbsp;Provider)<BR>　　EJB组件开发者负责开发执行商业逻辑规则的EJB组件，开发出的EJB组件打包成ejb-jar文件。EJB组件开发者负责定义EJB的remote和home接口，编写执行商业逻辑的EJB&nbsp;class,提供部署EJB的部署文件(deployment&nbsp;descriptor)。部署文件包含EJB的名字，EJB用到的资源配置，如JDBC等。EJB组件开发者是典型的商业应用开发领域专家。<BR>　　EJB组件开发者不需要精通系统级的编程，因此，不需要知道一些系统级的处理细节，如事务、同步、安全、分布式计算等。<BR>　　2、应用组合者(Application&nbsp;Assembler)<BR>　　应用组合者负责利用各种EJB组合一个完整的应用系统。应用组合者有时需要提供一些相关的程序，如在一个电子商务系统里，应用组合者需要提供JSP(Java&nbsp;Server&nbsp;Page)程序。<BR>　　应用组合者必须掌握所用的EJB的home和remote接口，但不需要知道这些接口的实现。<BR>　　3、部署者(Deployer)<BR>　　部署者负责将ejb-jar文件部署到用户的系统环境中。系统环境包含某种EJB&nbsp;Server和EJB&nbsp;Container。部署者必须保证所有由EJB组件开发者在部署文件中声明的资源可用，例如，部署者必须配置好EJB所需的数据库资源。<BR>　　部署过程分两步：部署者首先利用EJB&nbsp;Container提供的工具生成一些类和接口，使EJB&nbsp;Container能够利用这些类和接口在运行状态管理EJB。&nbsp;部署者安装EJB组件和其他在上一步生成的类到EJB&nbsp;Container中。&nbsp;部署者是某个EJB运行环境的专家。<BR>　　某些情况下，部署者在部署时还需要了解EJB包含的业务方法，以便在部署完成后，写一些简单的程序测试。<BR>　　4、EJB&nbsp;服务器提供者(EJB&nbsp;Server&nbsp;Provider)<BR>　　EJB&nbsp;服务器提供者是系统领域的专家，精通分布式交易管理，分布式对象管理及其它系统级的服务。EJB&nbsp;服务器提供者一般由操作系统开发商、中间件开发商或数据库开发商提供。<BR>　　在目前的EJB规范中，假定EJB&nbsp;服务器提供者和EJB&nbsp;容器提供者来自同一个开发商，所以，没有定义EJB&nbsp;服务器提供者和EJB容器提供者之间的接口标准。<BR>　　5、EJB&nbsp;容器提供者(EJB&nbsp;Container&nbsp;Provider)<BR>　　EJB&nbsp;容器提供者提供以下功能：<BR>　　提供EJB部署工具为部署好的EJB组件提供运行环境&nbsp;。EJB容器负责为EJB提供交易管理，安全管理等服务。<BR>　　EJB&nbsp;容器提供者必须是系统级的编程专家，还要具备一些应用领域的经验。EJB&nbsp;容器提供者的工作主要集中在开发一个可伸缩的，具有交易管理功能的集成在EJB&nbsp;服务器中的容器。EJB&nbsp;容器提供者为EJB组件开发者提供了一组标准的、易用的API访问EJB&nbsp;容器，使EJB组件开发者不需要了解EJB服务器中的各种技术细节。<BR>　　EJB容器提供者负责提供系统监测工具用来实时监测EJB容器和运行在容器中的EJB组件状态。<BR>　　6、系统管理员(System&nbsp;Administrator)<BR>　　系统管理员负责为EJB服务器和容器提供一个企业级的计算和网络环境。<BR>　　系统管理员负责利用EJB&nbsp;服务器和容器提供的监测管理工具监测EJB组件的运行情况。<BR>　　三、EJB的体系结构：<BR>　　EJB分布式应用程序是基于对象组件模型的，低层的事务服务用了API技术。EJB技术简化了用JAVA语言编写的企业应用系统的开发，配置。EJB技术定义了一组可重用的组件：Enterprise&nbsp;Beans。你可以利用这些组件，象搭积木一样的建立你的分布式应用程序。当你把代码写好之后，这些组件就被组合到特定的文件中去。每个文件有一个或多个Enterprise&nbsp;Beans，在加上一些配置参数。最后，这些Enterprise&nbsp;Beans被配置到一个装了EJB容器的平台上。客户能够通过这些Beans的home接口，定位到某个beans，并产生这个beans的一个实例。这样，客户就能够调用Beans的应用方法和远程接口。<BR>　　EJB服务器作为容器和低层平台的桥梁管理着EJB容器和函数。它向EJB容器提供了访问系统服务的能力。例如：数据库的管理和事务的管理，或者对于其它的Enterprise的应用服务器。所有的EJB&nbsp;实例都运行在EJB容器中。容器提供了系统级的服务，控制了EJB的生命周期。EJB中的有一些易于使用的管理工具如：Security--配置描述器（The&nbsp;Deployment&nbsp;descriptor）定义了客户能够访问的不同的应用函数。容器通过只允许授权的客户访问这些函数来达到这个效果。Remote&nbsp;Connectivity--容器为远程链接管理着低层的通信issues，而且对Enterprise&nbsp;Beas的开发者和客户都隐藏了通信细节。EJB的开发者在编写应用方法的时候，就象是在条用本地的平台一样的。客户也不清楚他们调用的方法可能是在远程被处理的。Life&nbsp;Cycle&nbsp;managment--客户简单的创建一个Enterprise&nbsp;beans的实例，并通常取消一个实例。而容器管理着Enterprise&nbsp;Beans的实例，使Enterprise&nbsp;Beans实现最大的效能和内存利用率。容器能够这样来激活和使Enterprise&nbsp;Beans失效，保持众多客户共享的实例池。等等。　　Trasction&nbsp;management-配置描述器定义了Enterprise&nbsp;beans&nbsp;的事务处理的需求。容器管理着那些管理分布式事务处理的复杂的issues。这些事务可能要在不同的平台之间更新数据库。容器使这些事务之间互相独立，互不干扰。保证所有的更新数据库都是成功发生的，否者，就回滚到事务处理之前的状态。<BR>　　EJB&nbsp;组件是基于分布式事务处理的企业级应用程序的组件。所有的EJB都有如下的特点：EJB包含了处理企业数据的应用逻辑。定义了EJB的客户界面。这样的界面不受容器和服务器的影响。于是，当一个EJB被集合到一个应用程序中去时，不用更改代码和重新编译。EJB能够被定制&nbsp;各种系统级的服务，例如安全和事务处理的特性，都不是属于EJB类的。而是由配置和组装应用程序的工具来实现。&nbsp;有两种类型的EJB:&nbsp;Session&nbsp;beans&nbsp;和&nbsp;entity&nbsp;beans.Session&nbsp;beans是一种作为单用户执行的对象。作为对远程的任务请求的相应，容器产生一个Session&nbsp;beans&nbsp;的实例。一个Session&nbsp;beans有一个用户.从某种程度上来说，一个Session&nbsp;bean&nbsp;对于服务器来说就代表了它的那个用户.Session&nbsp;beans&nbsp;也能用于事务，它能够更新共享的数据，但它不直接描绘这些共享的数据。Session&nbsp;beans&nbsp;的生命周期是相对较短的。典型的是，只有当用户保持会话的时候，Session&nbsp;beans&nbsp;才是活着的。一旦用户退出了，Session&nbsp;beans&nbsp;就不再与用户相联系了。Session&nbsp;beans被看成是瞬时的，因为如果容器崩溃了，那么用户必须重新建立一个新的Session对象来继续会话。<BR>　　Session&nbsp;bean典型的声明了与用户的互操作或者会话。也就是说，Session&nbsp;bean了在客户会话期间，通过方法的调用，掌握用户的信息。一个具有状态的Session&nbsp;bean称为有状态的Session&nbsp;bean.当用户终止与Session&nbsp;beans互操作的时候.会话终止了，而且，bean&nbsp;也不再拥有状态值。Session&nbsp;bean也可能是一个无状态的&nbsp;session&nbsp;bean.无状态的Session&nbsp;beans并不掌握它的客户的信息或者状态。用户能够调用beans的方法来完成一些操作。但是，beans只是在方法调用的时候才知道用户的参数变量。当方法调用完成以后，beans并不继续保持这些参数变量。这样，所有的无状态的session&nbsp;beans的实例都是相同的，除非它正在方法调用期间。这样，无状态的Session&nbsp;beans就能够支持多个用户.容器能够声明一个无状态的Session&nbsp;beans.能够将任何Session&nbsp;beans指定给任何用户.<BR>　　Entity&nbsp;Beans对数据库中的数据提供了一种对象的视图。例如：一个Entity&nbsp;bean能够模拟数据库表中一行相关的数据。多个client能够共享访问同一个Entity&nbsp;bean.多个client也能够同时的访问同一个Entity&nbsp;bean.Entity&nbsp;beans通过事务的上下文来访问或更新下层的数据。这样，数据的完整性就能够被保证。Entity&nbsp;Beans能存活相对教长的时间，并且状态是持续的。只要数据库中的数据存在，Entity&nbsp;beans就一直存活。而不是按照应用程序或者服务进程来说的。即使EJB容器崩溃了，Entity&nbsp;beans也是存活的。Entity&nbsp;Beans生命周期能够被容器或者&nbsp;Beans自己管理。如果由容器控制着保证&nbsp;Entity&nbsp;beans持续的issus。如果由Beans自己管理，就必须写Entity&nbsp;beans的代码，包括访问数据库的调用。<BR>　　Entity&nbsp;Beans是由主键（primary&nbsp;key&nbsp;一种唯一的对象标识符）标识的。通常，主键与标识数据库中的一块数据，例如一个表中的一行，的主键是相同的。主键是client能够定位特定的数据块。<BR>　　四、开发EJB<BR>　　1、类介绍：<BR>　　开发EJB的主要步骤一般来说，整个的开发步骤（开发，配置，组装）包括如下几个方面。开发：首先要定义三个类：Bean类本身，Bean的本地和远程接口类。&nbsp;配置：配置包括产生配置描述器--这是一个XML文件、声明了Enterprise&nbsp;Bean的属性、绑定了bean的class文件（包括stub文件和skeleton文件）。最后将这些配置都放到一个jar文件中。还需要在配置器中定义环境属性。组装应用程序：包括将Enterprise&nbsp;beans安装到Server服务器中，测试各层的连接情况。程序组装器将若干个Enterprise&nbsp;Beans与其它的组件结合起来。组合成一个完整的应用程序。或者将若干个Enterprise&nbsp;beans组合成一个复杂的Enterprise&nbsp;Bean。管理Enterprise&nbsp;Bean。&nbsp;<BR>　　我们必须定义和编写一些EJB中的基本类。如Enterprise&nbsp;bean类：这是Enterprise&nbsp;bean内部应用逻辑的实现。编写Enterprise&nbsp;bean的远程接口类。编写Enterprise&nbsp;bean的本地接口类。说明主键类，主键类只是对于Entity&nbsp;bean才需要的。在Enterprise&nbsp;bean的配置描述器中指定主键的名字。Enterprise&nbsp;beans提供者定义了远程接口和本地接口，实现了EJB类本身。Remote接口中提供了客户调用EJB实现的应用逻辑函数的接口。而home接口提供了产生和定位remote接口实例的方法。&nbsp;<BR>　　在Enterprise&nbsp;bean本身类的实现，本地home接口，远程remote接口之间并没有正式的联系（例如继承关系）。但是，在三个类里声明的方法却必须遵守EJB里面定义的规范。例如：&nbsp;你在Enterprise&nbsp;bean里面声明了一个应用程序的方法或者说应用逻辑。也在beans的remote接口中声明了这个方法，那么，这两个地方必须要同样的名字。Bean的实现里面必须至少有一个Create()方法：ejbCreate()。但是可以有多个带有不同参数的create()方法。　　在home接口中，也必须有相同的方法定义（参数的个数相同）。EjbCreate()方法返回的一个容器管理的持久对象。它们都返回一个容器管理持久性的主键值。但是，在home的相应的Create()方法中返回值的类型是remote接口。<BR>　　注意：实体bean的实现的ejbCreate方法有点不同。实体bean可以不定义ejbCreate方法。如果实体只是通过应用程序或通过数据库管理程序的途径被加到数据库中，实体bean就省略了ejbCreate方法。EjbCreate返回的值是主键类型。如果ejbCreate方法是容器管理持久性的实体bean的方法，它的返回值就是NULL类型。如果实体bean实现了Bean管理的持久性，ejbCreate方法就返回值类型就是主键类型。容器的任务是把各接口和Enterprise&nbsp;bean的实现类结合起来。保证在编译时和运行时，各接口和实现类是相对应的。&nbsp;<BR>　　EJB的实现类，各接口要从不同的基类中继承下来。一个会话bean必须实现基类javax.ejb.SessionBean。而实体bean必须实现基类javax.ejb.EntiyBean。这些EJB的基类都是从javax.ejb.EnterpriseBean继承而来。而javax.ejb.EnterpriseBean又是从java.io.Serializable继承而来。每一个Enterprise&nbsp;Bean都必须有一个remote接口。Remote接口定义了应用程序规定客户可以调用的逻辑操作。这些是一些可以由客户调用的公共的方法，通常由Enterprise&nbsp;beans类来实现。注意，Enterprise&nbsp;bean的客户并不直接访问Bean。而是通过remote接口来访问。Enterprise&nbsp;bean类的remote接口扩展了javax.ejb.EJBObject类的公共java接口。而Javax.ejb.EJBObject是所有remote接口的基类。其代码如下：&nbsp;<BR>　　package&nbsp;javax.ejb;&nbsp;<BR>　　public&nbsp;interface&nbsp;EJBObject&nbsp;extends&nbsp;java.rmi.Remote{&nbsp;<BR>　　public&nbsp;EJBHome&nbsp;getEJBHome()&nbsp;throws&nbsp;java.rmi.RemoteException;&nbsp;<BR>　　public&nbsp;Object&nbsp;getPrimaryKey()&nbsp;throws&nbsp;java.rmi.RemoteException;&nbsp;<BR>　　public&nbsp;void&nbsp;Remove()&nbsp;throws&nbsp;java.rmi.RemtoeException,&nbsp;java.rmi.RemoveException&nbsp;<BR>　　public&nbsp;Handle&nbsp;getHandle()&nbsp;throws&nbsp;java.rmi.RemoteException;<BR>　　boolean&nbsp;isIdentical&nbsp;(EJBObject&nbsp;p0)&nbsp;throws&nbsp;java.rmi.RemoteException;&nbsp;<BR>　　}&nbsp;<BR>　　getEJBHome()方法允许你取得一个相关的Home接口。对于&nbsp;实体Bean，用getPrimaryKey（）方法获得实体Bean的主键值。Remove（）可以删除一个Enterprise&nbsp;bean。具体的语义在各种不同类型的enterprise&nbsp;beans的生命周期中，由上下文中解释的。方法getHandle（）返回了一个Enterprise&nbsp;bean实例的持久的句柄。IsIndentical()方法允许你去比较Enterprise&nbsp;beans是否相同。<BR>　　2、方法：&nbsp;<BR>　　所有的remote接口中的方法必须声明为公共（public）的，并必须抛出java.rmi.RemotException异常。另外，所有的remote接口中的方法定义的参数和都必须是在RMI-IIOP中有效的。对每一个在remote接口中定义的方法，在Enterprise&nbsp;bean&nbsp;类里面都要有相应的方法。相应的方法必须要有同样的名字，同样类型和数量的参数，同样的返回值，而且还要抛出同样的例外。&nbsp;如下代码显示了一个ATM例子的会话bean的remote接口Atm，。里面声明了一个应用方法transfer（）。黑体部分表示EJB规范中必须要有的内容。Remote接口必须扩展javax.ejb.EJBObject类。从客户端调用的Enterprise&nbsp;bean的每一个方法都必须在remote接口中声明。Transfer（）方法抛出了两个意外。其中InSufficientFundsException例外是应用程序定义的意外。&nbsp;<BR>　　Public&nbsp;interface&nbsp;Atm&nbsp;extends&nbsp;javax.ejb.EJBObject{&nbsp;<BR>　　Public&nbsp;void&nbsp;transfer(String&nbsp;Source,&nbsp;String&nbsp;Target,&nbsp;float&nbsp;amount)<BR>　　Throws&nbsp;java.rmi.RemoteException,&nbsp;InSufficientFundsException;&nbsp;<BR>　　}&nbsp;<BR>　　Home接口必须定义一个或多个的Create()方法。每一个这样的Create()方法都必须命名为Create。并且，它的参数，不管是类型还是数量都必须与bean类里面的ejbCreate()方法对应。注意，home接口中的Create()方法和bean类中ejbCreate()方法的返回值类型是不同的。实体bean的home接口还包含find（）方法。&nbsp;每一个Home接口都扩展了javax.ejb.EJBHome接口。如下代码显示了javax.ejb.EJBHome接口的定义：&nbsp;<BR>　　package&nbsp;javax.ejb;&nbsp;<BR>　　public&nbsp;interface&nbsp;EJBHome&nbsp;extends&nbsp;java.rmi.Remote()&nbsp;{&nbsp;<BR>　　void&nbsp;remove(Handle&nbsp;handle)&nbsp;throws&nbsp;java.rmi.RemoteException,RemoveException;&nbsp;<BR>　　void&nbsp;remove(Object&nbsp;primarykey)&nbsp;throws&nbsp;java.rmi.RemoteException,RemoveException;&nbsp;<BR>　　EJBMetaData&nbsp;getEJBMetaData()&nbsp;throws&nbsp;RemoteException;&nbsp;<BR>　　Homehandle&nbsp;getHomeHandle()&nbsp;throws&nbsp;RemoteException;&nbsp;<BR>　　}<BR>　　这里提供了两个remove（）方法来删除Enterprise&nbsp;bean的实例。第一个remove方法是通过句柄来删除一个Enterprise&nbsp;bean的实例。第二个remove方法通过主键来删除一个Enterprise&nbsp;bean的实例。&nbsp;在众多的Enterprise&nbsp;bean实例中，句柄唯一的标识一个实例。一个句柄与它引用的Enterprise&nbsp;bean有相同的生命期。考虑一个实体对象，客户可以通过一个句柄来重新获得相应的Enterprise&nbsp;bean的实例。一个句柄能够对应一个Enterprise&nbsp;bean对象的多个实例。例如，即使当Enterprise&nbsp;bean对象所在的主机崩溃了，或者Enterprise&nbsp;bean对象在不同的机器之间移动，句柄仍是有效的。这里的句柄是Serialized句柄，与CORBA中的字符串化的CORBA对象的引用是相似的概念。在EJBHome接口中的第二个remove操作通过其主键来决定要删除的Enterprise&nbsp;bean。主键可以是扩展了Java&nbsp;Object类的任何类型，但是，必须要实现Java的Serializable接口。主键是标识实体bean的主要的方法。通常，主键是数据库中的一个关键字，唯一的定义了由实体bean代表的数据。&nbsp;<BR>　　方法getEJBMetaData（）返回了Enterprise&nbsp;bean对象的metadata接口。这个接口允许客户获得Enterprise&nbsp;bean的metadata信息。当开发工具来编译链接应用程序的时候，或者配置工具来配置的时候，可能会用到metadata信息。Javax.ejb.EJBMetadata接口提供了获得javax.ejb.EJBHome接口，home类，remote接口，还有获得主键的方法。也提供了一个isSesson()的方法来确定在放这个home接口的对象是会话bean还是实体bean。IsStatelessSession()方法指示这个会话bean是有状态还是无状态的。如下代码显示了javax.ejb.EJBMetadata接口的定义部分的代码。<BR>　　Public&nbsp;javax.ejb;&nbsp;Public&nbsp;interface&nbsp;EJBMetaData{&nbsp;<BR>　　EJBHome&nbsp;getEJBHome();<BR>　　Class&nbsp;getHomeInterfaceClass();&nbsp;<BR>　　Class&nbsp;getRemoteInterfaceClasss();<BR>　　Class&nbsp;getPrimaryKeyClass();&nbsp;<BR>　　Boolean&nbsp;isSession();<BR>　　Boolean&nbsp;isStatelesssSession();&nbsp;<BR>　　}&nbsp;<BR>　　对每一个Create（）方法，EJB规范定义了如下的命名约定。它的返回值是会话bean的remote接口的类型。方法的名字只能是Create()。对会话bean类中的每一个ejbCreate()方法都必须有一个Create()与之对应。&nbsp;对于每一个Create()方法的参数的类型和数量都必须与会话bean类中的ejbCreate()方法相对应。方法必须抛出java.rmi.RemoteException例外。&nbsp;方法必须抛出javax.rmi.CreateExeption例外。&nbsp;Create（）方法的参数是用来初始化新的会话bean对象的。&nbsp;如下代码显示了一个会话bean对象的不同的Create()方法，其中必须的部分用粗体显示：&nbsp;<BR>　　public&nbsp;interface&nbsp;AtmHome&nbsp;extends&nbsp;javax.ejb.EJBHome{&nbsp;<BR>　　Atm&nbsp;create()&nbsp;throws&nbsp;java.rmi.RemoteException,javax.ejb.CreateException;&nbsp;<BR>　　Atm&nbsp;create(Profile&nbsp;preferredProfile)&nbsp;<BR>　　Throws&nbsp;java.rmi.RemoteExeption,javax.ehrows&nbsp;java.rmi.RemoteException,RemoveException;&nbsp;<BR>　　EJBMetaData&nbsp;getEJBMetaData()&nbsp;throws&nbsp;RemoteException;&nbsp;<BR>　　Homehandle&nbsp;getHomeHandle()&nbsp;throws&nbsp;RemoteException;&nbsp;<BR>　　}<BR>　　这里提供了两个remove（）方法来删除Enterprise&nbsp;bean的实例。第一个remove方法是通过句柄来删除一个Enterprise&nbsp;bean的实例。第二个remove方法通过主键来删除一个Enterprise&nbsp;bean的实例。在众多的Enterprise&nbsp;bean实例中，句柄唯一的标识一个实例。一个句柄与它引用的Enterprise&nbsp;bean有相同的生命期。考虑一个实体对象，客户可以通过一个句柄来重新获得相应的Enterprise&nbsp;bean的实例。一个句柄能够对应一个Enterprise&nbsp;bean对象的多个实例。例如，即使当Enterprise&nbsp;bean对象所在的主机崩溃了，或者Enterprise&nbsp;bean对象在不同的机器之间移动，句柄仍是有效的。这里的句柄是Serialized句柄，与CORBA中的字符串化的CORBA对象的引用是相似的概念。&nbsp;<BR>　　在EJBHome接口中的第二个remove操作通过其主键来决定要删除的Enterprise&nbsp;bean。主键可以是扩展了Java&nbsp;Object类的任何类型，但是，必须要实现Java的Serializable接口。主键是标识实体bean的主要的方法。通常，主键是数据库中的一个关键字，唯一的定义了由实体bean代表的数据。方法getEJBMetaData（）返回了Enterprise&nbsp;bean对象的metadata接口。这个接口允许客户获得Enterprise&nbsp;bean的metadata信息。当开发工具来编译链接应用程序的时候，或者配置工具来配置的时候，可能会用到metadata信息。Javax.ejb.EJBMetadata接口提供了获得javax.ejb.EJBHome接口，home类，remote接口，还有获得主键的方法。也提供了一个isSesson()的方法来确定在放这个home接口的对象是会话bean还是实体bean。IsStatelessSession()方法指示这个会话bean是有状态还是无状态的。如下代码显示了javax.ejb.EJBMetadata接口的定义部分的代码。<BR>　　Public&nbsp;javax.ejb;&nbsp;<BR>　　Public&nbsp;interface&nbsp;EJBMetaData{&nbsp;<BR>　　EJBHome&nbsp;getEJBHome();&nbsp;<BR>　　Class&nbsp;getHomeInterfaceClass();<BR>　　Class&nbsp;getRemoteInterfaceClasss();&nbsp;<BR>　　Class&nbsp;getPrimaryKeyClass();&nbsp;<BR>　　Boolean&nbsp;isSession();&nbsp;<BR>　　Boolean&nbsp;isStatelesssSession();&nbsp;<BR>　　}&nbsp;<BR>　　五、EJB的编程环境：<BR>　　1、&nbsp;使用Jbuilder<BR>　　Jbuilder与EJB&nbsp;Container能够进行无缝连接。Jbuilder和Inprise的应用服务器包括了所有的开发和配置Enterprise&nbsp;Beans的工具以及所需要的库：运行和管理Enterprise&nbsp;Bean的容器、命名服务、&nbsp;事务服务、Java数据库、开发Enterprise&nbsp;Beans所需要的API、一个增强的java-to-iiop编译器，支持值类型和RMI信号等等。&nbsp;<BR>　　Jbuilder还提供了一个快速开发应用程序Enterprise&nbsp;Beans的工具和向导。通过简单而且直观的步骤，向导帮助你建立一个Enterprise&nbsp;Bean。自己设定某些缺省值，产生了bean的模板，在上面，我们可以增加我们自己的应用逻辑。Jbuilder也提供了一个EJB的接口生成向导。向导在Enterprise&nbsp;Bean的公共方法基础上生成了Remote接口和Home接口。Jbuilder还提供一个配置器的向导帮助我们逐步的建立XML描述器文件。并将生成的Stubs集中到一个jar文件中。<BR>　　2、使用Jbuilder之外的集成环境：&nbsp;<BR>　　如果你使用其它的除了别的集成环境（IDE）。要确定使用了集成环境IDE所带的容器工具。也要验证IDE是否支持EJB规范的相应的版本，还要确定它是否正确的支持EJB的API。&nbsp;<BR>　　要确定JD到所支持的EJB容器的版本。可以通过检查Inprise的安装说明来确定EJB容器所支持的支持JDK的版本。&nbsp;<BR>　　在配置Enterprise&nbsp;Bean的时候，你必须使用Inprise的应用服务器所提供的工具。这些工具能够编辑和修改第三方的代理商提供的Inprise配置描述器。还能够验证配置描述器，能够验证bean的源代码。&nbsp;<BR>　　六、一个简单的HELLO例子&nbsp;<BR>　　1、安装Apusic&nbsp;Application&nbsp;Server&nbsp;<BR>　　Note:以下以Linux为例，来说明Apusic&nbsp;Application&nbsp;Server的安装过程。其他平台的安装，可参考Apusic&nbsp;Application&nbsp;Server安装手册。&nbsp;<BR>　　下载JDK1.2，Apusic&nbsp;Application&nbsp;Server必须运行在JDK1.2以上环境中。可从以下站点下载最新JDK。&nbsp;<BR>　　<A href="http://java.sun.com/">http://java.sun.com</A>&nbsp;<BR>　　下载Apusic&nbsp;Application&nbsp;Server<BR>　　Apusic&nbsp;Application&nbsp;Server&nbsp;试用版可从以下网址得到：&nbsp;<BR>　　<A href="http://www.apusic.com/download/enter.jsp">http://www.apusic.com/download/enter.jsp</A>&nbsp;<BR>　　在下载完成后，你可以得到一个包裹文件apusic.zip，选定安装目录，假设安装到/usr下，则用以下命令：<BR>　　　　　cd&nbsp;/usr<BR>　　jar&nbsp;xvf&nbsp;apusic.zip&nbsp;<BR>　　/usr下会出现一个目录apusic，Apusic&nbsp;Application&nbsp;Server的所有程序都被解压到/usr/apusic下。&nbsp;<BR>　　将以下路径加入到CLASSPATH中&nbsp;<BR>　　/usr/apusic/lib/apusic.jar<BR>　　$JAVA_HOME/lib/tools.jar&nbsp;<BR>　　用以下命令运行Apusic&nbsp;Application&nbsp;Server&nbsp;<BR>　　java&nbsp;-Xms64m&nbsp;com.apusic.server.Main&nbsp;-root&nbsp;/usr/apusic&nbsp;<BR>　　2、定义EJB远程接口(Remote&nbsp;Interface)<BR>　　任何一个EJB都是通过Remote&nbsp;Interface被调用，EJB开发者首先要在Remote&nbsp;Interface中定义这个EJB可以被外界调用的所有方法。执行Remote&nbsp;Interface的类由EJB生成工具生成。&nbsp;<BR>　　以下是HelloBean的Remote&nbsp;Inteface程序：&nbsp;<BR>　　package&nbsp;ejb.hello;<BR>　　import&nbsp;java.rmi.RemoteException;<BR>　　import&nbsp;java.rmi.Remote;<BR>　　import&nbsp;javax.ejb.*;<BR>　　public&nbsp;interface&nbsp;Hello&nbsp;extends&nbsp;EJBObject,&nbsp;Remote&nbsp;{<BR>　　file://this&nbsp;method&nbsp;just&nbsp;get&nbsp;"Hello&nbsp;World"&nbsp;from&nbsp;HelloBean.<BR>　　public&nbsp;String&nbsp;getHello()&nbsp;throws&nbsp;RemoteException;<BR>　　}<BR>　　3、定义Home&nbsp;Interface<BR>　　EJB容器通过EJB的Home&nbsp;Interface来创建EJB实例，和Remote&nbsp;Interface一样，执行Home&nbsp;Interface的类由EJB生成工具生成。&nbsp;<BR>　　以下是HelloBean&nbsp;的Home&nbsp;Interface程序：&nbsp;<BR>　　package&nbsp;ejb.hello;&nbsp;<BR>　　import&nbsp;javax.ejb.*;<BR>　　import&nbsp;java.rmi.Remote;<BR>　　import&nbsp;java.rmi.RemoteException;<BR>　　import&nbsp;java.util.*;<BR>　　/**<BR>　　*&nbsp;This&nbsp;interface&nbsp;is&nbsp;extremely&nbsp;simple&nbsp;it&nbsp;declares&nbsp;only<BR>　　*&nbsp;one&nbsp;create&nbsp;method.<BR>　　*/<BR>　　public&nbsp;interface&nbsp;HelloHome&nbsp;extends&nbsp;EJBHome&nbsp;{<BR>　　public&nbsp;Hello&nbsp;create()&nbsp;throws&nbsp;CreateException,&nbsp;<BR>　　RemoteException;<BR>　　}<BR>　　4、写EJB类<BR>　　在EJB类中，编程者必须给出在Remote&nbsp;Interface中定义的远程方法的具体实现。EJB类中还包括一些&nbsp;EJB规范中定义的必须实现的方法，这些方法都有比较统一的实现模版，编程者只需花费精力在具体业务方法的实现上。&nbsp;<BR>　　以下是HelloBean的代码：&nbsp;<BR>　　package&nbsp;ejb.hello;<BR>　　import&nbsp;javax.ejb.*;<BR>　　import&nbsp;java.util.*;<BR>　　import&nbsp;java.rmi.*;<BR>　　public&nbsp;class&nbsp;HelloBean&nbsp;implements&nbsp;SessionBean&nbsp;{<BR>　　static&nbsp;final&nbsp;boolean&nbsp;verbose&nbsp;=&nbsp;true;<BR>　　private&nbsp;transient&nbsp;SessionContext&nbsp;ctx;<BR>　　//&nbsp;Implement&nbsp;the&nbsp;methods&nbsp;in&nbsp;the&nbsp;SessionBean<BR>　　//&nbsp;interface<BR>　　public&nbsp;void&nbsp;ejbActivate()&nbsp;{<BR>　　if&nbsp;(verbose)<BR>　　System.out.println("ejbActivate&nbsp;called");<BR>　　}<BR>　　public&nbsp;void&nbsp;ejbRemove()&nbsp;{<BR>　　if&nbsp;(verbose)<BR>　　System.out.println("ejbRemove&nbsp;called");<BR>　　}<BR>　　public&nbsp;void&nbsp;ejbPassivate()&nbsp;{<BR>　　if&nbsp;(verbose)<BR>　　System.out.println("ejbPassivate&nbsp;called");<BR>　　}<BR>　　/**<BR>　　*&nbsp;Sets&nbsp;the&nbsp;session&nbsp;context.<BR>　　*<BR>　　*&nbsp;@param&nbsp;SessionContext<BR>　　*/<BR>　　public&nbsp;void&nbsp;setSessionContext(SessionContext&nbsp;ctx)&nbsp;{&nbsp;<BR>　　if&nbsp;(verbose)<BR>　　System.out.println("setSessionContext&nbsp;called");<BR>　　this.ctx&nbsp;=&nbsp;ctx;<BR>　　}<BR>　　/**<BR>　　*&nbsp;This&nbsp;method&nbsp;corresponds&nbsp;to&nbsp;the&nbsp;create&nbsp;method&nbsp;in<BR>　　*&nbsp;the&nbsp;home&nbsp;interface&nbsp;HelloHome.java.&nbsp;<BR>　　*&nbsp;The&nbsp;parameter&nbsp;sets&nbsp;of&nbsp;the&nbsp;two&nbsp;methods&nbsp;are&nbsp;<BR>　　*&nbsp;identical.&nbsp;When&nbsp;the&nbsp;client&nbsp;calls&nbsp;<BR>　　*&nbsp;HelloHome.create(),&nbsp;the&nbsp;container&nbsp;allocates&nbsp;an&nbsp;<BR>　　*&nbsp;instance&nbsp;of&nbsp;the&nbsp;EJBean&nbsp;and&nbsp;calls&nbsp;ejbCreate().&nbsp;<BR>　　*/&nbsp;<BR>　　public&nbsp;void&nbsp;ejbCreate&nbsp;()&nbsp;{<BR>　　if&nbsp;(verbose)<BR>　　System.out.println("ejbCreate&nbsp;called");<BR>　　}<BR>　　/**<BR>　　*&nbsp;****&nbsp;HERE&nbsp;IS&nbsp;THE&nbsp;BUSINESS&nbsp;LOGIC&nbsp;*****<BR>　　*&nbsp;the&nbsp;getHello&nbsp;just&nbsp;return&nbsp;a&nbsp;"Hello&nbsp;World"&nbsp;string.<BR>　　*/<BR>　　public&nbsp;String&nbsp;getHello()<BR>　　throws&nbsp;RemoteException<BR>　　{<BR>　　return("Hello&nbsp;World");<BR>　　}<BR>　　}<BR>　　5、创建ejb-jar.xml文件<BR>　　ejb-jar.xml文件是EJB的部署描述文件，包含EJB的各种配置信息，如是有状态Bean(Stateful&nbsp;Bean)&nbsp;还是无状态Bean(Stateless&nbsp;Bean)，交易类型等。ejb-jar.xml文件的详细信息请参阅EJB规范。以下是HelloBean的配置文件：<BR>　　＜?xml&nbsp;version="1.0"?＞<BR>　　＜!DOCTYPE&nbsp;ejb-jar&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;Microsystems&nbsp;Inc.//DTD&nbsp;Enterprise&nbsp;JavaBeans&nbsp;1.2//EN"&nbsp;"http://java.sun.com/j2ee/dtds/ejb-jar_1_2.dtd"＞<BR>　　＜ejb-jar＞<BR>　　＜enterprise-beans＞<BR>　　＜session＞<BR>　　＜ejb-name＞Hello＜/ejb-name＞<BR>　　＜home＞ejb.hello.HelloHome＜/home＞<BR>　　＜remote＞ejb.hello.Hello＜/remote＞<BR>　　＜ejb-class＞ejb.hello.HelloBean＜/ejb-class＞<BR>　　＜session-type＞Stateless＜/session-type＞<BR>　　＜transaction-type＞Container＜/transaction-type＞<BR>　　＜/session＞&nbsp;<BR>　　＜/enterprise-beans＞<BR>　　＜assembly-descriptor＞<BR>　　＜container-transaction＞<BR>　　＜method＞<BR>　　＜ejb-name＞Hello＜/ejb-name＞<BR>　　＜method-name＞*＜/method-name＞<BR>　　＜/method＞<BR>　　＜trans-attribute＞Required＜/trans-attribute＞<BR>　　＜/container-transaction＞&nbsp;<BR>　　＜/assembly-descriptor＞<BR>　　＜/ejb-jar＞<BR>　　　　6、编译和部署<BR>　　　　编译Java源文件并将编译后class和ejb-jar.xml打包到Hello.jar&nbsp;<BR>　　　　mkdir&nbsp;build<BR>　　　　mkdir&nbsp;build/META-INF<BR>　　cp&nbsp;ejb-jar.xml&nbsp;build/META-INF<BR>　　　　javac&nbsp;-d&nbsp;build&nbsp;*.java<BR>　　　　cd&nbsp;build<BR>　　jar&nbsp;cvf&nbsp;Hello.jar&nbsp;META-INF&nbsp;ejb<BR>　　　　cd&nbsp;..&nbsp;<BR>　　用EJB工具生成可部署到Apusic&nbsp;Application&nbsp;Server中运行的jar文件:&nbsp;<BR>　　java&nbsp;com.apusic.ejb.utils.EJBGen&nbsp;-d&nbsp;/usr/apusic/classes/Hello.jar&nbsp;build/Hello.jar&nbsp;<BR>　　增加/usr/apusic/classes/Hello.jar到CLASSPATH中&nbsp;<BR>　　将Hello.jar加入到Apusic&nbsp;Application&nbsp;Server配置文件中。在/usr/apusic/config/server.xml&nbsp;加入以下几行：&nbsp;<BR>　　＜module＞<BR>　　＜ejb＞<BR>　　＜ejb-uri＞classes/Hello.jar＜/ejb-uri＞<BR>　　＜bean＞<BR>　　＜ejb-name＞Hello＜/ejb-name＞<BR>　　＜jndi-name＞HelloHome＜/jndi-name＞<BR>　　＜/bean＞<BR>　　＜/ejb＞<BR>　　＜/module＞<BR>　　启动服务器&nbsp;<BR>　　java&nbsp;-Xms64m&nbsp;com.apusic.server.Main&nbsp;-root&nbsp;/usr/apusic<BR>　　7、写客户端调用程序<BR>　　您可以从Java&nbsp;Client，JSP，Servlet或别的EJB调用HelloBean。&nbsp;<BR>　　调用EJB有以下几个步骤：&nbsp;<BR>　　通过JNDI(Java&nbsp;Naming&nbsp;Directory&nbsp;Interface)得到EJB&nbsp;Home&nbsp;Interface&nbsp;<BR>　　通过EJB&nbsp;Home&nbsp;Interface&nbsp;创建EJB对象，并得到其Remote&nbsp;Interface&nbsp;<BR>　　通过Remote&nbsp;Interface调用EJB方法&nbsp;<BR>　　以下是一个从Java&nbsp;Client中调用HelloBean的例子：<BR>　　package&nbsp;ejb.hello;<BR>　　import&nbsp;javax.naming.Context;<BR>　　import&nbsp;javax.naming.InitialContext;<BR>　　import&nbsp;java.util.Hashtable;<BR>　　import&nbsp;javax.ejb.*;<BR>　　import&nbsp;java.rmi.RemoteException;<BR>　　<BR>　　/**<BR>　　*&nbsp;@author&nbsp;Copyright&nbsp;(c)&nbsp;2000&nbsp;by&nbsp;Apusic,&nbsp;Inc.&nbsp;All&nbsp;Rights&nbsp;Reserved.<BR>　　*/<BR>　　public&nbsp;class&nbsp;HelloClient{<BR>　　public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[]){<BR>　　String&nbsp;url&nbsp;=&nbsp;"rmi://localhost:6888";<BR>　　Context&nbsp;initCtx&nbsp;=&nbsp;null;<BR>　　HelloHome&nbsp;hellohome&nbsp;=&nbsp;null;<BR>　　try{<BR>　　Hashtable&nbsp;env&nbsp;=&nbsp;new&nbsp;Hashtable();<BR>　　env.put(Context.INITIAL_CONTEXT_FACTORY,<BR>　　"com.apusic.jndi.InitialContextFactory");&nbsp;<BR>　　env.put(Context.PROVIDER_URL,&nbsp;url);&nbsp;<BR>　　initCtx&nbsp;=&nbsp;new&nbsp;InitialContext(env);<BR>　　}catch(Exception&nbsp;e){<BR>　　System.out.println("Cannot&nbsp;get&nbsp;initial&nbsp;context:&nbsp;"&nbsp;+&nbsp;e.getMessage());<BR>　　System.exit(1);<BR>　　}<BR>　　try{<BR>　　hellohome&nbsp;=&nbsp;(HelloHome)initCtx.lookup("HelloHome");&nbsp;<BR>　　Hello&nbsp;hello&nbsp;=&nbsp;hellohome.create();<BR>　　String&nbsp;s&nbsp;=&nbsp;hello.getHello();<BR>　　System.out.println(s);&nbsp;<BR>　　}catch(Exception&nbsp;e){<BR>　　System.out.println(e.getMessage());<BR>　　System.exit(1);<BR>　　}&nbsp;<BR>　　}<BR>　　}<BR>　　运行HelloClient，可得到以下输出：&nbsp;<BR>　　Hello&nbsp;World&nbsp; <BR><img src ="http://www.blogjava.net/yrj11320/aggbug/16474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-23 14:50 <a href="http://www.blogjava.net/yrj11320/articles/16474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBuilder7+WebLogic7.0的配置和EJB开发</title><link>http://www.blogjava.net/yrj11320/articles/16458.html</link><dc:creator>不胖用砖拍</dc:creator><author>不胖用砖拍</author><pubDate>Sat, 22 Oct 2005 16:11:00 GMT</pubDate><guid>http://www.blogjava.net/yrj11320/articles/16458.html</guid><wfw:comment>http://www.blogjava.net/yrj11320/comments/16458.html</wfw:comment><comments>http://www.blogjava.net/yrj11320/articles/16458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yrj11320/comments/commentRss/16458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yrj11320/services/trackbacks/16458.html</trackback:ping><description><![CDATA[Borland公司推出Jbuilder 7后，引起了很多JAVA爱好者的关注，本文是根据在Borland公司的网站上的一篇有关Jbuilder 7综合Weblogic Server 7.0的文章为主要内容来写的。综合自己的经验，目的希望大家能顺利的搭建一个比较普遍流行的J2EE环境，并学会开发基本的EJB程序。<BR><BR><B>１、创建一个Weblogic Server域</B><BR><BR>本文假设你已经正确安装了这两个软件。值得注意的是在Weblogic Server 7.0安装的时候，最后要你设置一个Server，你可以在安装的时候设置也可以在安装完了后从开始菜单<BR>——>程序——>Bea Weblogic Platform7.0——>Configuration Wizard来设置。在设置的时候不要选择第一个WLS Examples，选最后一个WLS Domain（如图１）。第一个是设置了一个范例域，有一些范例程序和连接池设置、数据源，在你运行的时候会出现连接池设置不对的问题。第三个是创建一个空的域，默认域名是mydomain，接下来选择默认的Single Server，接下来的一步默认域目录是H:\bea\user_projects\，接下来的一步默认按next，填写了用户名和密码后next，最后创建一个域。<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/bea Configuration.jpg"><BR>                                 （图1）<BR><BR><B>  2、在Jbuilder 7下设置Weblogic Server 7</B><BR>　（1）运行Jbuilder 7后，选择Tools——>Configure Servers，弹出的窗口如图２所示。<BR>　在左边选择Weblogic Server 6.x+，选择右边面板上的Enable Server选项后，在Home directory里写上你的Weblogic Home目录H:/bea/weblogic700/server（我这里安装在H盘上，如果你的机器上是别的盘请自行更改）。在Class标签下新增四个在Jbuilder根目录下的lib目录下的.jar文件，分别为jaxrpc.jar、jds.jar、jdsremote.jar、jdsserver.jar。并按照如图的顺序按move up按钮将jaxrpc.jar移到第一个。这些.jar文件在你开发Entity Bean的时候如果使用了JdataStore数据库的时候会起作用。<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/Configure server.jpg"><BR>                                 （图２）<BR><BR>选择上面的Custom 标签（如图3）将JDK Installation Directory设置你的JDK安装目录如：<BR>H:/bea/jdk131_02、BEA Home Directory设置你的BEA的安装目录如：H:/bea、DomainDirectory设置你的域目录如：H:/bea/user_projects/mydomain。接下来填写用户名和密码，用户名和密码就是你在设置Weblogic Server域的时候你设置的用户名和密码。填写Domain Name、Server Name如 ：mydomain、myserver后，单击OK退出。<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/custom.jpg"><BR>                                （图3）<BR><BR>（2）选择Tools->Enterprise Setup，单击CORBA面板上的New，弹出如图4所示的窗口，在Name<BR> for this configuration里填写 WelLogic 7.0，在Path for ORB Tools里填写 h:/bea/weblogic700/server，在Library for projects 里选择 WebLogic 6.x+ Deploy，在IDL compiler command里填写idlj.exe， 在Commnad option for output directory 里填写任意一个目录比如：h:\temp单击OK退出。<BR>（３）选择Project->Default Project properties选择Server标签，在Single services for all service in project在下拉列表中选择WebLogic Application Server 6.x+，单击OK退出，配置完毕。这里的两个选项Single services for all service in project和Modular Services provided by different servers，第一个是在项目里用一个服务，后面这个是在项目里用不同的服务的意思，比如：jsp和servlet可以用Tomcat的，而ejb是用Weblogic的。这里选择在项目里用一个服务。<BR> <IMG src="http://www.javaresearch.org/members/wengchiyuan/images/edit Configuration.jpg"><BR>                                 (图４)<BR>３、在配置好的环境下开发一个session beans<BR><BR>（１）   创建一个项目<BR><BR>选择File——>New选择Project面板下的 Project项。在Name中填入TestSes，Directory里填写你的项目要放的位置，其他的默认，单击Finish。<BR><BR>（２）   创建一个Session Bean模块<BR><BR>选择File——>New选择Enterprise面板下的EJB Module，选择OK。在出现的窗口后，在Name里填写TestSesMod，在Version里选择EJB 2.0 compliant。<BR><BR><B><BR>（３）   创建一个Session Bean</B><BR>在Jbuilder里，EJB可以可视化的创建，在右边的空面板里点击鼠标右键，选择Create EJB在子菜单里选择Session Bean，如图５所示。现在已经创建了一个可视化的Session Bean，在Bean的设置面板中你可以改变Bean的名字，在这里在Bean Name里输入TestSes。现在开始创建一个方法，在TestSes上点击鼠标右键，选择Add后选择Method（如图６）在Name里填getName，Return type填String，Interfaces里选Remote。在左边的点testses旁边的+号，在下面拉下来的但个JAVA文件里双击TestSesBean.java，在getName方法里加入如下代码：<BR>Public String getName(){<BR>      return "Testing Successful";<BR>}<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/session bean.jpg"><BR>                                  （图５）<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/addmethod.jpg"><BR>                                  （图６）<BR>（４）   创建配置JAR文件<BR><BR>　要运行Session Bean，首先要编译这个项目。选择Project下的Make Project TestSes.jpx，编译完了后这时你也可以看到TestSesBean.java旁边多了个+号，点击这个+号你可以看到几个由容器产生的文件。你可以在左边的面板里看到TestSesMod.jar文件。双击TestSesMod.jar可以在左边看到部署描述（如图７）。<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/description.jpg"><BR>                                  (图７)<BR>（５）   创建运行期的设置<BR><BR>　Jbuilder允许用户为不同的应用程序创建运行期设置。<BR>　　选择Run ——>Configuration Name，在出来的Project Properties窗口里Run面板是默认选择上了的，点击New来创建一个新的运行期设置。在弹出来的Runtime Properties点击Server标签在Configuration name里输入一个设置名，这里输入Server（如图８）后按OK后再点OK退出。<BR>（６）   在Jbuilder里运行Weblogic<BR>选择菜单Run下的Run Project运行Weblogic Server<BR>（７）   部署EJB到Webloigc Server上去<BR>　　右击TestSesMod.jar，在弹出的面板里选择Deploy option of TestSesMod.jar，再选择Deploy（如图９）。<BR>（８）   远程部署<BR>　　这里简单的介绍一下怎么在远程的Weblogic Server上部署应用。即使是在远程部署的话，在本机上也需要装有应用服务器，如果你在Weblogic Server7.0上部署的话，在Jbuilder里选择Tools ——>Enterprise Deployment，在弹出的窗口里修改Admin url，为远程的服务器的主机名和端口号。并设置正确的用户名和密码。<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/server.jpg"><BR>                                    （图８）<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/deploy.jpg"><BR>                                     （图９）<BR>（９）   创建一个客户端测试程序来测试你的Session Bean<BR>  　在Jbuilder里选择File——>New选择Enterprise标签里的EJB Test Client，点击OK。在弹出来的窗口里的Name里输入TestSesTestClient，单击OK结束。<BR>在文件的main()方法里加入如下代码：<BR>  public static void main(String[] args) {<BR>    TestSesTestClient client = new TestSesTestClient();<BR>    try{<BR>     client.create();<BR>     String name=client.getName();<BR>     System.out.println ("Name form the Test client="+name);<BR>    }<BR>    catch (Exception ex){}<BR>}<BR>　（１０）运行客户端测试程序<BR>　　要运行测试程序的话，先要为它加一个运行期设置。在Run——>Configuration里选择New在弹出的窗口里选择Run下的Application。在上面的Configuration name里输入Client，在Main里点选旁边的按钮，在弹出的窗口里选择Browse标签下的testses下的TestSesTestClient。一路OK完成。右击TestSesTestClient.java，单击Run Using Client后，运行Client程序。运行成功后如图１０所示。Client得到了调用了Session Bean的方法，返回了Testing Successful。<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/success.jpg"><BR>                                （图１０）<BR>４、常见错误解答<BR>错误１：WebLogic Server cannot start: config.xml not found<BR>错误代码描述：<BR><Info> <Management> <140013> <C:\bea\user_projects\.\config.xml not found> <BR>C:\bea\user_projects\.\config.xml not found <BR>Since no config.xml was found, the fileRealm.properties file will not be used. <BR>Would you like the server to create a default configuration and boot? (y/n):<BR>问题发生时机：<BR>在Jbuilder上运行Weblogic Server时，在Weblogic 6.x+ http:7001页上。<BR>产生原因：<BR>Weblogic域目录没有正确设置<BR>解决方法：<BR>选择Tools——>Configure Servers，左边选择Weblogic Server 6.x+，选择右边的Custom标签，　<BR>检查你的域目录是否正确。如：h:\bea\user_projects\mydomain。<BR><BR>错误２：Authentication for user <username> denied<BR>错误代码描述：<BR><Critical> <WebLogicServer> <000364> <Server failed during initialization. <BR>Exception:java.lang.SecurityException: Authentication for user username denied <BR>java.lang.SecurityException: Authentication for user username denied.<BR>问题发生时机：<BR>在Jbuilder上运行Weblogic Server时，在Weblogic 6.x+ http:7001页上。<BR>产生原因：<BR>在Jbuilder里用户名、密码填写错误<BR>解决方法：<BR>选择Tools——>Configure Servers，左边选择Weblogic Server 6.x+，选择右边的Custom标签，　<BR>检查你的用户名和密码是否正确。<BR><BR>错误３：Deployment of Web application failed<BR>错误代码描述：<BR>Exception:weblogic.management.ApplicationException: Prepare failed. Task Id = 0 <BR>Module: TestWebApp Error: weblogic.j2ee.DeploymentException: Cannot deploy <BR>ServletContext(id=2545674,name=TestWebApp,context-path=/TestWebApp) from <BR>C:\bea\user_projects\mydomain\myserver\upload\TestWebApp\TestWebApp.war on myserver <BR>because there is already a webapp named <BR>ServletContext(id=5684736,name=TestWebApp,contextpath=/<BR>TestWebApp) loaded from C:\Documents and <BR>Settings\spati\jbproject\TestWebApp\TestWebApp, which is using the context path <BR>/TestWebApp.<BR>问题发生时机：<BR>部署WAR文件的时候<BR>产生原因：<BR>可能是你已经在Weblogic上部署了一个相同名称的应用了。<BR>解决方法：<BR>选择Project——>Project Properties，选择Server标签，在Services列表里先选上jsp/servlet，把右边的Map project webapps at runtime的勾去掉，就可以安全的部署了。如果问题还是存在的话，你就只有重新新建一个WEB应用程序，把你做的程序都拷贝到新的应用上再部署了。<BR><BR>　错误４：NameNotFoundException from test client<BR>　错误代码描述：<BR>　　javax.naming.NameNotFoundException: Unable to resolve 'TestSes' Resolved: <BR>''Unresolved:'TestSes'; remaining name 'TestSes'<BR>　问题发生时机：<BR>　　部署完EJB JAR文件后，运行TestClient的时候<BR>　产生原因：<BR>　　TestClient不能找到EJB的JNDI名。<BR>　解决方法：<BR>打开Weblogic Server console检查部署是否有错，在Deployments——>EJB里找到EJB的模块名。检查名称后，点击右边窗口的Deploy，如果JAR部署正确的话，你将在右边的窗口的Deployment状态是true。<BR><BR>　错误5：test client run failed<BR>　错误代码描述：<BR>　　javax.naming.CommunicationException. Root exception is java.net.ConnectException: <BR>t3://localhost:7001: Destination unreachable; nested exception is: <BR>java.net.ConnectException: Connection refused: connect; No available router to destination<BR>　问题发生时机：<BR>　　部署完EJB JAR文件后，运行TestClient的时候<BR>  产生原因：<BR>　　test Client和Weblogic通信出现问题<BR>　解决方法：<BR>　　如果你的Weblogic是在别的主机上或者端口号改变了的话，请你在TestSesTestClient.java里修改原来的有关主机名和端口的代码。<BR><BR>　　好了，到现在为止，你已经可以搭建一个流行的J2EE环境并基本上了解了EJB在Jbuilder上的实现。希望大家多提意见，如果有问题请与作者联系。Email：flyingwcy@163.com。<BR><img src ="http://www.blogjava.net/yrj11320/aggbug/16458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yrj11320/" target="_blank">不胖用砖拍</a> 2005-10-23 00:11 <a href="http://www.blogjava.net/yrj11320/articles/16458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>