﻿<?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-每日一得-随笔分类-dataBase</title><link>http://www.blogjava.net/alex/category/5491.html</link><description>不求多得,只求一得
about java,hibernate,spring,design,database,Ror,ruby,快速开发&lt;br/&gt;&lt;br/&gt;
最近关心的内容关键字:RoR
</description><language>zh-cn</language><lastBuildDate>Tue, 12 Jun 2007 16:18:54 GMT</lastBuildDate><pubDate>Tue, 12 Jun 2007 16:18:54 GMT</pubDate><ttl>60</ttl><item><title>Oracle 自动启动命令</title><link>http://www.blogjava.net/alex/archive/2007/06/12/123519.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 12 Jun 2007 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/06/12/123519.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/123519.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/06/12/123519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/123519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/123519.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">echo&nbsp;"begin&nbsp;to&nbsp;start&nbsp;oracle"<br>lsnrctl&nbsp;start<br>sqlplus&nbsp;/nolog&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">&lt;EOF<br></span><span style="COLOR: #ff0000">connect&nbsp;/as&nbsp;sysdba<br>startup<br>exit<br>exit<br>echo&nbsp;"oracle&nbsp;have&nbsp;started"</span></div>
<img src ="http://www.blogjava.net/alex/aggbug/123519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-06-12 09:13 <a href="http://www.blogjava.net/alex/archive/2007/06/12/123519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]插入图片到数据库(BLOB大字段保存对象)</title><link>http://www.blogjava.net/alex/archive/2007/03/28/107018.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Wed, 28 Mar 2007 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/03/28/107018.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/107018.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/03/28/107018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/107018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/107018.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/alex/archive/2007/03/28/107018.html'>阅读全文</a><img src ="http://www.blogjava.net/alex/aggbug/107018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-03-28 16:55 <a href="http://www.blogjava.net/alex/archive/2007/03/28/107018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>powerdesigner中外建问题</title><link>http://www.blogjava.net/alex/archive/2007/01/31/96861.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Wed, 31 Jan 2007 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/01/31/96861.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/96861.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/01/31/96861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/96861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/96861.html</trackback:ping><description><![CDATA[key words: pd, powerdesigner,外建<br /><br />在PD中建立外键碰到一个问题，如: forum(id,name)表，forum_thread(id,forum_id)表，需要将forum的id设为forum_thread的外建，指向forum_id,默认的在 PD中是将主键设为外建.<br /><br />需要如下设置才可以: <br /><br /><img height="522" alt="foreign_key.png" src="http://www.blogjava.net/images/blogjava_net/alex/images/foreign_key.png" width="685" border="0" /><img src ="http://www.blogjava.net/alex/aggbug/96861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-01-31 10:42 <a href="http://www.blogjava.net/alex/archive/2007/01/31/96861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]PowerDesigner 11 使用心得</title><link>http://www.blogjava.net/alex/archive/2007/01/17/94353.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Wed, 17 Jan 2007 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/01/17/94353.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/94353.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/01/17/94353.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/94353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/94353.html</trackback:ping><description><![CDATA[key words: powerdesign,power , design<br /><br />引言:<br />发现powerdesign的文档真的是不多，不过powerdesign还是很有用的，见到此类文档就收藏下吧.<br /><br />转自<a href="http://blog.csdn.net/edeed/archive/2006/02/10/596271.aspx" target="_blank">edeed</a><br /><br /> 附上一些使用pd11的心得：<br /><br />1、安装PD v11.0版<br /><br />2、由pdm生成建表脚本时，字段超过15字符就发生错误（oracle）<br />原因未知，解决办法是打开PDM后，会出现Database的菜单栏，进入Database － Edit Current DBMS －script－objects－column－maxlen，把value值调大(原为30)，比如改成60。出现表或者其它对象的长度也有这种错误的话都可以选择对应的objects照此种方法更改！<br />或者使用下面的这种方法：<br />生成建表脚本时会弹出Database generation提示框：把options － check model的小勾给去掉，就是不进行检查（不推荐）！<br />或者可以修改C:\Program Files\Sybase\PowerDesigner Trial 11\Resource Files\DBMS\oracl9i2.xdb文件<br />修改好后，再cdm转为pdm时，选择“Copy the DBMS definition in model”把把这个资源文件拷贝到模型中。<br /><br />3、生成的建表脚本中如何把对象的双引号去掉？<br />打开cdm的情况下，进入Tools－Model Options－Naming Convention，把Name和Code的标签的Charcter case选项设置成Uppercase或者Lowercase，只要不是Mixed Case就行！<br />或者选择Database-&gt;Edit current database-&gt;Script-&gt;Sql-&gt;Format，有一项CaseSensitivityUsingQuote，它的 comment为“Determines if the case sensitivity for identifiers is managed using double quotes”，表示是否适用双引号来规定标识符的大小写，可以看到右边的values默认值为“YES”,改为“No”即可！<br />或者在打开pdm的情况下，进入Tools－Model Options－Naming Convention，把Name和Code的标签的Charcter case选项设置成Uppercase就可以！<br /><br />4、建立一个表后,为何检测出现Existence of index的警告<br />A table should contain at least one column, one index, one key, and one reference.<br />可以不检查 Existence of index 这项，也就没有这个警告错误了！<br />意思是说没有给表建立索引，而一个表一般至少要有一个索引，这是一个警告，不用管也没有关系！<br /><br />5、创建一个表在修改字段的时候，一修改name的内容，code也跟着变化，如何让code不随着name变化<br />Name和Code 的右侧都有一个按钮“＝”，如果需要不同步的话，把这个按钮弹起来就可以了。<br />Tools-&gt;General Options-&gt;Dialog-&gt;Name to Code Mirroring (去掉)<br /><br />6、由CDM生成PDM时，自动生成的外键的重命名<br />PDM Generation Options-&gt;Detail-&gt;FK index names默认是%REFR%_FK，改为FK_%REFRCODE%，其中%REFRCODE%指的就是CDM中Relationship的code！另外自动生成的父字段的规则是PDM Generation Options-&gt;Detail-&gt;FK column name template中设置的，默认是%.3:PARENT%_%COLUMN%，可以改为Par%COLUMN%表示是父字段！<br /><br />7、如何防止一对一的关系生成两个引用（外键）<br />要定义关系的支配方向，占支配地位的实体（有D标志）变为父表。<br />在cdm中双击一对一关系-&gt;Detail-&gt;Dominant role选择支配关系<br /><br />8、修改报表模板中一些术语的定义<br />即文件：C:\Program Files\Sybase\PowerDesigner Trial 11\Resource Files\Report Languages\Chinese.xrl<br />Tools－Resources－Report Languages－选择Chinese－单击Properties或双击目标<br />修改某些对象的名称：Object Attributes\Physical Data Model\Column\<br />        ForeignKey：外键<br />        Mandatory：为空<br />        Primary：主键<br />        Table：表<br />用查找替换，把“表格”替换成“表”<br />修改显示的内容为别的：Values Mapping\Lists\Standard，添加TRUE的转化列为是，FALSE的转化列为空<br />另外Report－Title Page里可以设置标题信息<img src ="http://www.blogjava.net/alex/aggbug/94353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-01-17 09:55 <a href="http://www.blogjava.net/alex/archive/2007/01/17/94353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不要浪费资源 : 数据库连接池</title><link>http://www.blogjava.net/alex/archive/2007/01/04/91838.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 04 Jan 2007 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/01/04/91838.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/91838.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/01/04/91838.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/91838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/91838.html</trackback:ping><description><![CDATA[key words: 连接池 数据库<br /><br />发现一个有意思的现象，好多人在开发过程中不知道是出于训练自己编码还是为了重新发明轮子，总之明明已经存在的功能他非要自己实现一遍。<br /><br />今天又碰到一个。<br /><br />jdbc的连接，好多人也喜欢自己实现一个连接池，但是对于app server来说本身一般都有支持连接池的，为什么不用呢?<br />写了一通又长又臭的代码，自己以为牛B的很，其实算个球啊。<br /><br /><strong>不要浪费，不要自己发明轮子，你不是最牛的，一定还有比你更牛的！<br /></strong><br />对于weblogic或者oracle以及ibm的产品来说，大家还是比较习惯于用容器的jndi,但是即使对于tomcat，我个人也建议用tomcat自带的。<br /><br />附: jndi连接数据库<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> Connection getConnection(String inputJNDI) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_102_758_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_758_Open_Text.style.display='none'; Codehighlighter1_102_758_Closed_Image.style.display='inline'; Codehighlighter1_102_758_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_102_758_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_102_758_Closed_Text.style.display='none'; Codehighlighter1_102_758_Open_Image.style.display='inline'; Codehighlighter1_102_758_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />      DBMException </span><span id="Codehighlighter1_102_758_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_102_758_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Connection conn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    String strConnJNDI </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_171_571_Open_Image" onclick="this.style.display='none'; Codehighlighter1_171_571_Open_Text.style.display='none'; Codehighlighter1_171_571_Closed_Image.style.display='inline'; Codehighlighter1_171_571_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_171_571_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_571_Closed_Text.style.display='none'; Codehighlighter1_171_571_Open_Image.style.display='inline'; Codehighlighter1_171_571_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_171_571_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_171_571_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      Context ctx </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> InitialContext();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      _log.debug(ctx);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_268_395_Open_Image" onclick="this.style.display='none'; Codehighlighter1_268_395_Open_Text.style.display='none'; Codehighlighter1_268_395_Closed_Image.style.display='inline'; Codehighlighter1_268_395_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_268_395_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_268_395_Closed_Text.style.display='none'; Codehighlighter1_268_395_Open_Image.style.display='inline'; Codehighlighter1_268_395_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> inputJNDI) </span><span id="Codehighlighter1_268_395_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_268_395_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(inputJNDI.length() </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          strConnJNDI </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> inputJNDI;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          strConnJNDI </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dbJndiName;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_408_450_Open_Image" onclick="this.style.display='none'; Codehighlighter1_408_450_Open_Text.style.display='none'; Codehighlighter1_408_450_Closed_Image.style.display='inline'; Codehighlighter1_408_450_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_408_450_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_408_450_Closed_Text.style.display='none'; Codehighlighter1_408_450_Open_Image.style.display='inline'; Codehighlighter1_408_450_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_408_450_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_408_450_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        strConnJNDI </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dbJndiName;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      DataSource ds </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (DataSource) ctx.lookup(strConnJNDI);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      _log.debug(ds);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      conn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ds.getConnection();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_598_715_Open_Image" onclick="this.style.display='none'; Codehighlighter1_598_715_Open_Text.style.display='none'; Codehighlighter1_598_715_Closed_Image.style.display='inline'; Codehighlighter1_598_715_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_598_715_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_598_715_Closed_Text.style.display='none'; Codehighlighter1_598_715_Open_Image.style.display='inline'; Codehighlighter1_598_715_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (Exception ex) </span><span id="Codehighlighter1_598_715_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_598_715_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      _log.error(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">It's error to get connection</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, ex);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> DBMException(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Error to get connection</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    _log.debug(conn);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> conn;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />  }</span></span></div><br /><br />以此类推，类似于xml解析等的工作也没有必要自己一步一步地用dom或者什么乱七八糟的sax自己去搞一遍，搞了半天就使为了得到其中的一个value，何苦来着?    如果你不是为了做研究，那么，效率第一，安全第一.<br /><br />随便说说，也许有人不同意我的观点，没关系，尽管谈谈，哈哈  :)<img src ="http://www.blogjava.net/alex/aggbug/91838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-01-04 20:58 <a href="http://www.blogjava.net/alex/archive/2007/01/04/91838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]单用户实例下恢复master的方法</title><link>http://www.blogjava.net/alex/archive/2006/12/21/89289.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 21 Dec 2006 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/12/21/89289.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/89289.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/12/21/89289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/89289.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/89289.html</trackback:ping><description><![CDATA[key words: sql server,单用户,master恢复<br /><br /><span style="FONT-SIZE: 12px"> 作者:jankie<br />日期:2006-12-1<br /><br />一、MASTER数据库备份与恢复<br />   1、数据库master正常情况下对master进行(完全)备份;<br />若要恢复:<br />   2、停止SQL Server服务;<br />   3、以单用户实例的方式启动SQL Server,启动时不要把窗口关闭;(具体看二)<br />   4、然后再对MASTE数据库进行恢复即可;<br /><br />二、MSSQL单用户实例的启动方法:<br />  如何在单用户模式下启动SQL Server的命名实例（命令提示符）   <br />  在单用户模式下从命令提示符启动SQL Server 的命名实例     <br />  从命令提示符输入：     <br />  sqlservr.exe -c  -m   -s   {instancename}   <br /><br />例1:<br />  1、sqlserver.exe -c -m 回车(默认实例)<br />  2、sqlserver.exe -c -m -s benet (实例名为benet)<br />   <br />  说明在启动 sqlservr.exe之前，必须在命令窗口中切换到适当的目录<br />如:c:\program files\microsoft sql server\mssql\bin目录下<br /></span><img src ="http://www.blogjava.net/alex/aggbug/89289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-12-21 15:08 <a href="http://www.blogjava.net/alex/archive/2006/12/21/89289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]jdbc如何连接到sql server实例</title><link>http://www.blogjava.net/alex/archive/2006/12/17/88306.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sat, 16 Dec 2006 16:35:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/12/17/88306.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/88306.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/12/17/88306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/88306.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/88306.html</trackback:ping><description><![CDATA[
		<script><![CDATA[unction loadTOCNode(){}]]&gt;</script>
		<div class="disclaimer mt">
				<div class="label">注意：这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度，也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。</div>
		</div>
		<div class="articleProperty">
				<br />
		</div>
		<div class="section">
				<h2 class="subTitle" id="tocHeadRef">概要</h2>
				<script type="text/javascript"><![CDATA[oadTOCNode(1, 'summary');]]&gt;</script>
				<div class="sbody">
Microsoft SQL Server 2000 支持同一计算机上同时运行的多个 SQLServer 数据库引擎实例。 以下是两种类型的
SQLServer 数据库引擎实例： 默认和命名。 只能有, 任何计算机上运行一个默认实例并且由默认实例运行计算机上的名称标识它。
通常指定以下列格式： 计算机名和实例名称
<pre class="in_text">computer_name\instance_name<br /></pre>

要 MicrosoftSQLServer2000JDBC, 连接命名实例通过 SQL 服务器 2000 MicrosoftTextDriver 必须指定端口号与命名实例, 代替的命名实例名称相关联如前面。
</div>
				<h2 class="subTitle" id="tocHeadRef">更多信息</h2>
				<script type="text/javascript"><![CDATA[oadTOCNode(1, 'moreinformation');]]&gt;</script>
				<div class="sbody">
要查找 SQLServer 实例端口号, 请按照下列步骤：
<table class="list ol"><tbody><tr><td class="number"><font color="#ff1493">1.</font></td><td class="text"><font color="#ff1493">在 Microsoft SQL Server 2000 服务器, 启动 SQL Server 网络实用工具。</font></td></tr><tr><td class="number"><font color="#ff1493">2.</font></td><td class="text"><font color="#ff1493">要从  实例  下拉菜单实例依次,  常规  选项卡。</font></td></tr><tr><td class="number"><font color="#ff1493">3.</font></td><td class="text"><font color="#ff1493">TCP/IP, 依次  属性 。 注意， 在  属性  对话框中出现端口号为此实例。</font></td></tr></tbody></table><br />
当您连接到 SQLServer 通过 JDBC 连接 URL 中使用只要有该值,。 下面是典型连接 URL 的示例：<br /><br /><div class="indent">
jdbc:microsoft:sqlserver： / 1433;  yourServerName  / 用户 =  yourUser  ； 密码 =  yourPwd ：</div>
在本示例, 使用默认端口是 1433。 将此默认替换端口号为您命名实例。
</div>
		</div>
<img src ="http://www.blogjava.net/alex/aggbug/88306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-12-17 00:35 <a href="http://www.blogjava.net/alex/archive/2006/12/17/88306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql的外键问题</title><link>http://www.blogjava.net/alex/archive/2006/11/07/79523.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 07 Nov 2006 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/11/07/79523.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/79523.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/11/07/79523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/79523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/79523.html</trackback:ping><description><![CDATA[key words: mysql,外键,fm150<br /><br />这次在mysql中建立外键关联时发现问题:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">alter</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">table</span><span style="color: rgb(0, 0, 0);"> CHILD </span><span style="color: rgb(0, 0, 255);">add</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">constraint</span><span style="color: rgb(0, 0, 0);"> FK3D1FCFC74B18345 </span><span style="color: rgb(0, 0, 255);">foreign</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">key</span><span style="color: rgb(0, 0, 0);"> (PARENTID) </span><span style="color: rgb(0, 0, 255);">references</span><span style="color: rgb(0, 0, 0);"> PARENT;         <br /></span></div><br /><br />提示..fm150错误,最后发现是mysql的版本问题，我用的是4.1的，对外键不知道是不支持还是支持的有问题，下载5.0的解决.<br /><img src ="http://www.blogjava.net/alex/aggbug/79523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-11-07 09:44 <a href="http://www.blogjava.net/alex/archive/2006/11/07/79523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle分页的一个问题</title><link>http://www.blogjava.net/alex/archive/2006/09/20/70817.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Wed, 20 Sep 2006 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/09/20/70817.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/70817.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/09/20/70817.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/70817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/70817.html</trackback:ping><description><![CDATA[key words :Oracle分页 视图<br /><br />google了一下关于Oracle的分页方法，方法还不少，大多数效果差不多-有点恶心. 恶心也要作，不过后来就是大家都用得这种方式在我这里出现了新问题，奇怪的是怎么没有别人碰到?<br /><br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">String condition </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> teacher_id = </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> userId </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and school_id=</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">siteId;<br />sql </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> select * </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> from your_table where </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> condition </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rowid not in ( select rowid from your_table where</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> condition </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rownum &lt;= </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> (pageIndex </span><span style="COLOR: rgb(0,0,0)">-</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">) </span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> Constants.PAGE_NUMS </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">) </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rownum &lt;= </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> Constants.PAGE_NUMS ;</span></div><br />现在的问题是我需要按照table的某个字段排序，于是改成如下:<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">String condition </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> teacher_id = </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> userId </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and school_id=</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">siteId;<br />sql </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> select * </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> from your_table where </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> condition </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rowid not in ( select rowid from your_table where</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> condition </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rownum &lt;= </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> (pageIndex </span><span style="COLOR: rgb(0,0,0)">-</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">) </span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> Constants.PAGE_NUMS </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><font color="#ff1493">order by id desc</font>) </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rownum &lt;= </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> Constants.PAGE_NUMS + " <font color="#ff1493">order by id desc</font>";</span></div><br />这个sql有问题么?<br />答案是可能有问题，也可能没有问题，因为据说在8i的Oracle版本之前都不行，实际上也不尽然，在我的9i和10g我得到的是同样的错误 "<b>missing right parenthesis</b>",还有一位兄弟估计是DBA建议我去metalink打一个patch,埃，动作太大了，不敢动。<br /><br />问题还是要解决，试了下类似于select a.*,rownum r from (select * from table where ...) a where rownum &lt; 10 等的方法，效果一样，就是不能加嵌套的order by<br />最后，用视图的方法间接解决问题，因为我要解决的问题实际就是按某个字段排序，那么在视图里先对table进行排序，再在视图的基础上作操作就OK了.<br /><br />另，还有一种不错的实现方法，即用OracleCachedRowSet,分页也比较简单，有点类似于hibernate,由于时间关系没有时间去看，感兴趣的朋友可以看一下.<br /><br /><br />BTW: 对于视图可能rowid有问题，可以改成视图的某个主键替换<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">String condition </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> teacher_id = </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> userId </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> and school_id=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">siteId;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />sql </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> select * </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> from your_table where </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> condition </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> and <strong>id</strong> not in ( select <strong>id</strong> from your_table where</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> condition </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> and rownum &lt;= </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> (pageIndex </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> Constants.PAGE_NUMS </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">order by id desc) </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> and rownum &lt;= </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Constants.PAGE_NUMS </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> order by id desc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span></div><br /><br /><br /><img src ="http://www.blogjava.net/alex/aggbug/70817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-09-20 15:36 <a href="http://www.blogjava.net/alex/archive/2006/09/20/70817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]JDBMonitor全攻略</title><link>http://www.blogjava.net/alex/archive/2006/08/31/66800.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 31 Aug 2006 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/08/31/66800.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/66800.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/08/31/66800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/66800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/66800.html</trackback:ping><description><![CDATA[JDBMonitor是一个开源项目。使用它开发者可以很轻松为系统增加数据库执行日志功能。它使用十分方便，您所需要做的唯一事情就是在您系统的JDBC连接字符串前增加类似于 
"listenerconfig=/config.xml:url=" 的字符即可，不用写任何代码。 
<p>使用 
JDBMonitor，您可以把数据库执行情况记录通过各种方式记录下来，比如打印到控制台、输出到文件或者通过socket传送给远程客户端。JDBMonitor是可扩展的，您可以扩展它来将执行情况通过其他方式记录下来，您所需要做的就是写一个实现IDBListener接口的类即可。</p><p>JDBMonitor遵守 GNU Lesser General Public Licence (LGPL)协议。此协议包含在发行包中。</p><h2>入门</h2><p>几乎所有大型数据库应用都包含有自己的SQL执行日志功能，此功能不仅能帮助开发人员调试，而且可以为DBA（数据库管理员）提供系统的运行信息。</p><p>（1）很难将业务逻辑同日志代码分离</p><p>（2）降低了代码的可读性。</p><p>（3）降低了系统的运行速度。在记录日志的时候，程序会暂停运行等待直到记录完成，而I/O操作是相当耗时的。</p><p>（4）很难记录运行耗时、语句参数等其他信息</p><p>（5）很难为我们无法修改代码的系统（例如没有源代码的系统）或者很难增加记录日志功能代码的系统（比如系统使用了ORMapping）增加日志功能。</p><p>JDBMonitor 则不同：</p><p>（1）您最多只需要修改一行代码。您需要修改的代码就是这一行:Class.forName("com.cownew.JDBMonitor.jdbc.DBDriver") 
,然后再修改一下 JDBC连接字符串，只要从 “jdbc:db2://10.74.198.247:50000/app”修改成” 
listenerconfig=config.xml:url= 
jdbc:db2://10.74.198.247:50000/app”就可以了。在您使用WebLogic 
,Tomcat或其他服务器的数据源功能的时候，连修改代码这一步都是无需的。</p><p>（2）JDBMonitor另起一个线程来记录SQL，所以它不会对程序运行速度有任何影响。</p><p>（3）它是高度可扩展的，所以您可以扩展它来把执行情况通过其他方式记录。比如，您可以写一个扩展类，来通过电子邮件将日志发送出去。</p><h2>取得 JDBMonitor</h2><p>JDBMonitor的最新稳定版本可以在JDBMonitor的网站上取得：</p><p>http://www.cownew.com/JDBMonitor</p><h2>使用 JDBMonitor</h2><p>1 将 jdbmonitor.jar放到您系统的类路径下。</p><p>2 让系统加载 JDBMonitor的JDBC驱动。</p><p>这一步将会依您系统加载JDBC驱动的方式的不同而不同。</p><p>（1）如果您通过代码的形式加载JDBC驱动，例如：</p><p>   Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);<br />   
Connection cn = DriverManager.getConnection(……);</p><p>在这种情况下 ，您必须修改 
“Class.forName”这一句来加载JDBMonitor的JDBC驱动（“com.cownew.JDBMonitor.jdbc.DBDriver”），而非以前的数据库JDBC驱动。</p><p>例如：</p><p>Class.forName(“com.cownew.JDBMonitor.jdbc.DBDriver”);<br />   Connection cn = 
DriverManager.getConnection(……);</p><p>（2）如果您在配置文件中指定JDBC驱动，比如，数据源配置文件或者其他类似的文件。</p><p>请修改原来的  JDBC驱动类为 “com.cownew.JDBMonitor.jdbc.DBDriver” 。 <br /></p><p>3 让 JDBMonitor加载能够加载原来的JDBC驱动</p><p>JDBMonitor的工作原理就是截获JDBC驱动的SQL语句调用、记录SQL语句，然后将SQL语句重新转发给原来的JDBC驱动，所以JDBMonitor必须首先向DriverManager注册JDBC驱动。</p><p>原来的JDBC驱动定义在配置文件的“JdbcDrivers” 段中。 <br />&lt;JdbcDrivers&gt;<br />    
&lt;JdbcDriver class=" com.mysql.jdbc.Driver"/&gt;<br />  &lt;/JdbcDrivers&gt;</p><p>4 在原来的JDBC连接字符串前增加 JDBMonitor所需的信息。</p><p>您所需要做的就是将” listenerconfig=&lt;configfilepath&gt;:url=” 
增加到原来的JDBC连接字符串前。“&lt;configfilepath&gt;”代表配置文件的路径，下面集中路径都是合法的：</p><p>/com/jdbmonitor/config.xml <br />com/jdbmonitor/config.xml<br />c:/ jdbmonitor 
/config.xml</p><p>JDBMoinitor使用getClass().getResourceAsStream加载类似于“/com/jdbmonitor/config.xml” 
and “com/jdbmonitor/config.xml” 的类路径文件，使用 FileInputStream加载类似于 “c:/ jdbmonitor 
/config.xml”的配置文件。<br /></p><p>5 指定您要使用监听器：</p><p>您可以把数据库执行情况记录通过各种方式记录下来，比如打印到控制台、输出到文件或者通过socket传送给远程客户端。</p><p>我们已经开发了如下常用的监听器：FileDBListener、ConsoleDBListener、 
SocketDBListene、DataBaseDBListener。当然您也可以开发满足您要求的监听器。<br />监听器定义在配置文件的 
“Listeners”段中：</p><p>&lt;Listeners&gt;<br />    &lt;!--ConsoleDBListener no arguments--&gt;<br />    
&lt;Listener class="com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener" 
arg=""/&gt;<br />    <br />    &lt;!--the arguments of FileDBListener is the file to 
log the SQL statement --&gt;<br />    &lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.FileDBListener" 
arg="c:/aaa.txt"/&gt;<br />    <br />    &lt;!--the arguments of SocketDBListener is 
the bound socket port of the listener server --&gt;<br />    &lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.SocketDBListener" arg="9527"/&gt;<br />  
&lt;/Listeners&gt;</p><p>搞定！启动您的系统。耶！SQL语句被记录下来了，我们可以在控制台、文件甚至远程监视器中看到日志了。</p><h2>举例</h2><h3>mvnforum的例子：</h3><p>您可以从http://www.mvnForum.com得到mvnforum。我演示用的版本是1.0。</p><p>(1)打开webapp\WEB-INF\classes\ mvncore.xml，重新配置：</p><p>修改之前：</p><p>&lt;driver_class_name&gt;com.mysql.jdbc.Driver&lt;/driver_class_name&gt;<br />&lt;database_url&gt;listenerconfig=c:/log/jdbmonitor/config.xml:url= 
jdbc:mysql://localhost/mvnforum?useUnicode=true&amp;amp;characterEncoding=utf-8&lt;/database_url&gt;</p><p>修改之后： <br />&lt;driver_class_name&gt; com.cownew.JDBMonitor.jdbc.DBDriver 
&lt;/driver_class_name&gt;<br />        
&lt;database_url&gt;jdbc:mysql://localhost/mvnforum?useUnicode=true&amp;amp;characterEncoding=utf-8&lt;/database_url&gt;</p><p>(2)创建文件 c:/log/jdbmonitor/config.xml。我只想将SQL语句记录到文本文件中，所以我做如下配置： 
<br />&lt;config&gt;<br />  &lt;Listeners&gt;<br />    &lt;!--the arguments of 
FileDBListener is the file to log the SQL statement --&gt;<br />    &lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.FileDBListener" 
arg="c:/log.txt"/&gt;<br />  &lt;/Listeners&gt;<br />  &lt;JdbcDrivers&gt;<br />    
&lt;JdbcDriver class="com.mysql.jdbc.Driver"/&gt;<br />  
&lt;/JdbcDrivers&gt;<br />&lt;/config&gt;<br />(3) 将 
jdbmonitor.jar放到webapp\WEB-INF\lib下。<br />(4) 搞定！</p><p>Jive的例子：</p><p>您可以从http://www.jivesoftware.com得到Jive。我演示用的版本是 Jive 2.0 beta版。</p><h3>(1)打开<a href="http://localhost:8080/jive/admin/">http://localhost:8080/jive/admin/</a></h3><h3>“jdbc” 填为：com.cownew.JDBMonitor.jdbc.DBDriver</h3><h3>“server” 
填为：c:/log/jdbmonitor/config.xml:url=jdbc:mysql://locahost/jive<br />(2)将 
jdbmonitor.jar放到WEB-INF\lib下<br />(3) 象mvnforum中一样创建同样的 
c:/log/jdbmonitor/config.xml 文件.<br />(4) 搞定!</h3><p>代码方式的例子：</p><p>尽管直接在代码中指定系统所用的JDBC驱动类名和JDBC连接字符串是不推荐的，但是仍然有系统是这么做的。</p><p>比如：</p><p><strong>              
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");</strong><br /><strong>              
Connection conn = null;</strong><br /><strong>              PreparedStatement ps = 
null;</strong><br /><strong>              try</strong><br /><strong>              
{</strong><br /><strong>                     conn = 
DriverManager</strong><br /><strong>                                   
.getConnection("jdbc:odbc:MQIS");</strong><br /><strong>                     for 
(int i = 0; i &lt; 1000; i++)</strong><br /><strong>                     
{                    </strong><br /><strong>                            ps = 
conn.prepareStatement("update T_Material set 
fid=fid");</strong><br /><strong>                            
ps.execute();</strong><br /><strong>                            
ps.close();</strong><br /><strong>                     
}</strong><br /><strong>              } finally</strong><br /><strong>              
{</strong><br /><strong>                     ....          
</strong><br /><strong>              }</strong></p><p>（1）修改一下代码为：<br /> <strong>              
Class.forName("com.cownew.JDBMonitor.jdbc.DBDriver");</strong><br /><strong>              
Connection conn = null;</strong><br /><strong>              PreparedStatement ps = 
null;</strong><br /><strong>              try</strong><br /><strong>              
{</strong><br /><strong>                     conn = 
DriverManager.getConnection("listenerconfig= 
c:/log/jdbmonitor/config.xml:url=jdbc:odbc:MQIS");</strong><br /><strong>                     
for (int i = 0; i &lt; 1000; i++)</strong><br /><strong>                     
{</strong><br /><strong>                            ps = 
conn.prepareStatement("update T_Material set 
fid=fid");</strong><br /><strong>                            
ps.execute();</strong><br /><strong>                            
ps.close();</strong><br /><strong>                     
}</strong><br /><strong>              } finally</strong><br /><strong>              
{</strong><br /><strong>                     ....          
</strong><br /><strong>              }</strong></p><p>（2）创建c:/log/jdbmonitor/config.xml文件。我想记录SQL语句到文本文件中同时输出到控制台，这样可以辅助我进行调试，所以我配置如下： 
<br />&lt;config&gt;<br />  &lt;Listeners&gt;<br />    &lt;!--the arguments of 
FileDBListener is the file to log the SQL statement --&gt;<br />&lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.FileDBListener" 
arg="c:/log.txt"/&gt;</p><p>&lt;!--ConsoleDBListener no arguments--&gt;<br />&lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener" arg=""/&gt;<br />  
&lt;/Listeners&gt;<br />  &lt;JdbcDrivers&gt;<br />    &lt;JdbcDriver 
class="com.mysql.jdbc.Driver"/&gt;<br />  
&lt;/JdbcDrivers&gt;<br />&lt;/config&gt;<br />(3) 将 jdbmonitor.jar放到类路径下。<br />(4) 
搞定!</p><h2>监听器</h2><p>我们已经开发了如下常用的监听器：FileDBListener、ConsoleDBListener、 
SocketDBListener、DataBaseDBListener。</p><p><strong>1、ConsoleDBListener 控制台监听器</strong></p><p>ConsoleDBListener会将SQL语句打印到控制台中。</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113131636.jpg" twffan="done" height="113" width="579" /></p><p>这个监听器很容易配置：</p><p>&lt;Listener class="com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener" 
arg=""/&gt;</p><p><strong>2、FileDBListener 文件监听器</strong></p><p>FileDBListener 会将SQL语句保存到文本文件中。</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113136883.jpg" twffan="done" height="347" width="316" /></p><p>如下配置：</p><p>&lt;Listener class="com.cownew.JDBMonitor.listenerImpl.FileDBListener" 
arg="c:/aaa.txt"/&gt;</p><p><strong><em>arg="c:/aaa.txt"</em></strong>表示日志将保存到文件<strong><em>c:/aaa.txt</em></strong>中。</p><p><strong>3、SocketDBListener Socket监听器</strong></p><p>SocketDBListener是一个socket服务器，客户端连接到它上边以后就可以接收到它发出的SQL语句。</p><p>如下配置：</p><p>&lt;Listener class="com.cownew.JDBMonitor.listenerImpl.SocketDBListener" 
arg="9527"/&gt;</p><p><em><strong>arg="9527"</strong></em>表示服务器将在9527端口监听。</p><p>我们已经开发了如下两种客户端：SocketConsoleClient（Socket控制台客户端） 和 SocketSwingClient（Socket 
Swing客户端）。</p><p>SocketConsoleClient工作在控制台中：</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113136805.jpg" twffan="done" height="223" width="665" /></p><p>SocketSwingClient是一个Swing GUI客户端：</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113137863.jpg" twffan="done" height="300" width="495" /></p><p>您可以运行<em><strong>"java -classpath jdbmonitor.jar 
com.cownew.JDBMonitor.listenerImpl.sckListenerClient.SocketConsoleClient" 
</strong></em>来启动<em><strong>SocketConsoleClient</strong></em>，运行<em><strong>"java 
-classpath jdbmonitor.jar 
com.cownew.JDBMonitor.listenerImpl.sckListenerClient.SocketSwingClient"</strong></em>启动<em><strong>SocketSwingClient</strong></em>。</p><p>您可以编写符合您自己要求的客户端，具体细节请参考<em><strong>com.cownew.JDBMonitor.listenerImpl.sckListenerClient.ListenerClient</strong></em>和<em><strong>com.cownew.JDBMonitor.listenerImpl.sckListenerClient.IDBSocketClientListener</strong></em>.</p><p><strong>4、DataBaseDBListener</strong></p><p>DataBaseDBListener将会把SQL语句记录到数据库中：</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113137930.jpg" twffan="done" height="194" width="851" /></p><p>如下配置：</p><p><em><strong>&lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.DataBaseDBListener" 
<br />arg="dburl=jdbc:odbc:MQIS;user=;password=;logtable=T_Log_SQLLog"/&gt; 
</strong></em></p><p><em><strong>"dburl=jdbc:odbc:MQIS;user=;password=;"</strong></em>表示目标数据库的JDBC连接字符串。<em><strong>"logtable=T_Log_SQLLog"</strong></em> 
表示SQL记录将被保存到哪个表中，默认的是<em><strong>T_Log_SQLLog</strong></em>。</p><p>如果目标数据库用的JDBC驱动与被监控的数据库不同，请将它加入配置文件的 "JdbcDrivers" 部分，例如：</p><p><em><strong>&lt;config&gt;<br />&lt;Active&gt;true&lt;/Active&gt;<br />&lt;Listeners&gt;</strong></em></p><p><em><strong>&lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener" 
arg=""/&gt;<br /><br />&lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.DataBaseDBListener" 
<br />arg="dburl=jdbc:odbc:MQIS;user=;password=;logtable=T_Log_SQLLog"/&gt;<br />&lt;/Listeners&gt;<br />&lt;JdbcDrivers&gt;<br />&lt;JdbcDriver 
class="com.microsoft.jdbc.sqlserver.SQLServerDriver"/&gt;<br />&lt;JdbcDriver 
class="sun.jdbc.odbc.JdbcOdbcDriver"/&gt;<br />&lt;/JdbcDrivers&gt;<br />&lt;/config&gt;</strong></em></p><p>"<em><strong>T_Log_SQLLog</strong></em>"的结构是：</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113137716.jpg" twffan="done" height="110" width="243" /></p><p>"<em><strong>T_Log_SQLLog</strong></em>"的建库脚本在<em><strong>com/cownew/JDBMonitor/listenerImpl/dataBaseListener</strong></em>,(db2.sql,mssqlserver.sql,oracle.sql)。</p><p>DataBaseDBListener是跨数据库的，你可以把记录SQL到任何关系数据库中。</p><h2>FAQ:</h2><p>1 如果我暂时不想记录SQL语句执行怎么办？难道我要重新修改成原来的样子？</p><p>答：无须如此。您只要修改config.xml，增加<strong><em>&lt;Active&gt;false&lt;/Active&gt;</em></strong>到文件中即可。</p><p>如下： </p><p><strong><em>&lt;config&gt;</em></strong><br /><strong><em>  &lt;Active&gt; 
false &lt;/Active&gt;</em></strong><br /><strong><em>  
&lt;Listeners&gt;</em></strong><br /><strong><em>......</em></strong><br /><strong><em>&lt;/config&gt;</em></strong><strong></strong></p><h2>如何扩展JDBMonitor？</h2><p>我们已经开发了如下常用的监听器：FileDBListener、ConsoleDBListener、 
SocketDBListener、DataBaseDBListener。当然您也可以开发满足您要求的监听器。所有的监听器必须实现接口：com.cownew.JDBMonitor.commo. 
IDBListener。IDBListener有两个方法需要实现：</p><p><strong><em>public void init(String arg);</em></strong><br /><strong><em>public 
void logSql(SQLInfo info);</em></strong></p><p>JDBMonitor会将配置文件中监听器定义中“arg”的值传递给 
“init”方法、将代表SQL语句执行信息的SQLInfo传递给“logSql”方法。</p><p>更多信息请参考API文档。</p><img src ="http://www.blogjava.net/alex/aggbug/66800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-08-31 10:59 <a href="http://www.blogjava.net/alex/archive/2006/08/31/66800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]JDBC连接数据库经验集萃</title><link>http://www.blogjava.net/alex/archive/2006/08/29/66520.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 29 Aug 2006 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/08/29/66520.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/66520.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/08/29/66520.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/66520.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/66520.html</trackback:ping><description><![CDATA[
		<span style="font-family: 宋体;" lang="EN-US">
				<font size="4">Java
数据库连接（JDBC）由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的
API，使他们能够用纯Java API
来编写数据库应用程序。然而各个开发商的接口并不完全相同，所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。<br />一、连接各种数据库方式速查表<br />    下面罗列了各种数据库使用JDBC连接的方式，可以作为一个手册使用。<br /><br />    1</font>
		</span>
		<span style="font-family: 宋体;">
				<font size="4">、<span lang="EN-US">Oracle8/8i/9i</span>数据库（<span lang="EN-US">thin</span>模式）<span lang="EN-US"> <br />Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br />String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl</span>为数据库的<span lang="EN-US">SID <br />String user="test"; <br />String password="test"; <br />Connection conn= DriverManager.getConnection(url,user,password); <br /><br />    2</span>、<span lang="EN-US">DB2</span>数据库<span lang="EN-US"> <br />Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <br />String url="jdbc:db2://localhost:5000/sample"; //sample</span>为你的数据库名<span lang="EN-US"> <br />String user="admin"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); <br /><br />    3</span>、<span lang="EN-US">Sql Server7.0/2000</span>数据库<span lang="EN-US"> <br />Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <br />String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; <br />//mydb</span>为数据库<span lang="EN-US"> <br />String user="sa"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); <br /><br />    4</span>、<span lang="EN-US">Sybase</span>数据库<span lang="EN-US"> <br />Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <br />String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB</span>为你的数据库名<span lang="EN-US"> <br />Properties sysProps = System.getProperties(); <br />SysProps.put("user","userid"); <br />SysProps.put("password","user_password"); <br />Connection conn= DriverManager.getConnection(url, SysProps); <br /><br />    5</span>、<span lang="EN-US">Informix</span>数据库<span lang="EN-US"> <br />Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br />String url = <br />"jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; <br />user=testuser;password=testpassword"; //myDB</span>为数据库名<span lang="EN-US"> <br />Connection conn= DriverManager.getConnection(url); <br /><br />    6</span>、<span lang="EN-US">MySQL</span>数据库<span lang="EN-US"> <br />Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <br />String url ="jdbc:mysql://localhost/myDB?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <br />//myDB</span>为数据库名<span lang="EN-US"> <br />Connection conn= DriverManager.getConnection(url); <br /><br />    7</span>、<span lang="EN-US">PostgreSQL</span>数据库<span lang="EN-US"> <br />Class.forName("org.postgresql.Driver").newInstance(); <br />String url ="jdbc:postgresql://localhost/myDB" //myDB</span>为数据库名<span lang="EN-US"> <br />String user="myuser"; <br />String password="mypassword"; <br />Connection conn= DriverManager.getConnection(url,user,password); <br /></span></font>
		</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">
						<span lang="EN-US">
								<font size="4">
										<br />    8、access</font>
						</span>
						<font size="4">数据库直连用ODBC的<span lang="EN-US"><br />Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;<br />String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");<br />Connection conn = DriverManager.getConnection(url,"","");<br /> Statement stmtNew=conn.createStatement() ;<br /><o:p><br />二、JDBC连接MySql方式<br />    下面是使用JDBC连接MySql的一个小的教程     </o:p></span></font>
				</span>
		</p>
		<p>
				<font size="4">    1、查找驱动程序<br />    MySQL目前提供的java驱动程序为Connection/J，可以从MySQL官方网站下载，并找到mysql-connector-java-3.0.15-ga-bin.jar文件，此驱动程序为纯java驱动程序，不需做其他配置。<br /><br />    2、动态指定classpath<br />    <font color="#ff0000">如果需要执行时动态指定classpath，就在执行时采用－cp方式。否则将上面的.jar文件加入到classpath环境变量中。</font><br /><br />    3、加载驱动程序<br />try{<br />    Class.forName(com.mysql.jdbc.Driver);<br />    System.out.println(Success loading Mysql Driver!);<br />}catch(Exception e)<br />{<br />    System.out.println(Error loading Mysql Driver!);<br />    e.printStackTrace();<br />} <br /><br />    4、设置连接的url<br />    jdbc：mysql：//localhost/databasename[?pa=va][＆pa=va]<br /><br />三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧，这些技巧能够使我们更好地发挥系统的性能和实现更多的功能（系转载）。</font>
		</p>
		<p>
				<font size="4">　　1、在客户端软件开发中使用Thin驱动程序</font>
		</p>
		<p>
				<font size="4">　　在开发Java软件方面，Oracle的数据库提供了四种类型的驱动程序，二种用于应用软件、applets、
servlets等客户端软件，另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中，我们可以选择OCI驱动程序或Thin
驱动程序。OCI驱动程序利用Java本地化接口（JNI），通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序，它直
接与数据库进行通讯。为了获得最高的性能，Oracle建议在客户端软件的开发中使用OCI驱动程序，这似乎是正确的。但我建议使用Thin驱动程序，因
为通过多次测试发现，在通常情况下，Thin驱动程序的性能都超过了OCI驱动程序。</font>
		</p>
		<p>
				<font size="4">　　2、关闭自动提交功能，提高系统性能</font>
		</p>
		<p>
				<font size="4">　　在第一次建立与数据库的连接时，在缺省情况下，连接是在自动提交模式下的。为了获得更好的性能，可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能，如下所示：</font>
		</p>
		<p>
				<font size="4">　　conn.setAutoCommit(false);</font>
		</p>
		<p>
				<font size="4">　　值得注意的是，一旦关闭了自动提交功能，我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。</font>
		</p>
		<p>
				<font size="4">　　3、在动态SQL或有时间限制的命令中使用Statement对象</font>
		</p>
		<p>
				<font size="4">　　在执行SQL命令时，我们有二种选择：可以使用PreparedStatement对象，也可以使用
Statement对象。无论多少次地使用同一个SQL命令，PreparedStatement都只对它解析和编译一次。当使用Statement对象
时，每次执行一个SQL命令时，都会对它进行解析和编译。这可能会使你认为，使用PreparedStatement对象比使用Statement对象的
速度更快。然而，我进行的测试表明，在客户端软件中，情况并非如此。因此，在有时间限制的SQL操作中，除非成批地处理SQL命令，我们应当考虑使用
Statement对象。</font>
		</p>
		<p>
				<font size="4">　　此外，使用Statement对象也使得编写动态SQL命令更加简单，<b>因为我们可以将字符串连接在一起，建立一个有效的SQL命令</b>。因此，我认为，<font color="#ff0000">Statement对象可以使动态SQL命令的创建和执行变得更加简单。</font></font>
		</p>
		<p>
				<font size="4">　　4、利用helper函数对动态SQL命令进行格式化</font>
		</p>
		<p>
				<font size="4">　　在创建使用Statement对象执行的动态SQL命令时，我们需要处理一些格式化方面的问题。例如，如果我们
想创建一个将名字O'Reilly插入表中的SQL命令，则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是
创建一个完成替换操作的helper方法，然后在连接字符串心服用公式表达一个SQL命令时，使用创建的helper方法。与此类似的是，我们可以让
helper方法接受一个Date型的值，然后让它输出基于Oracle的to_date()函数的字符串表达式。</font>
		</p>
		<p>
				<font size="4">　　5、利用PreparedStatement对象提高数据库的总体效率</font>
		</p>
		<p>
				<font size="4">　　在使用PreparedStatement对象执行SQL命令时，命令被数据库进行解析和编译，然后被放到命令
缓冲区。然后，每当执行同一个PreparedStatement对象时，它就会被再解析一次，但不会被再次编译。在缓冲区中可以发现预编译的命令，并且
可以重新使用。在有大量用户的企业级应用软件中，经常会重复执行相同的SQL命令，使用PreparedStatement对象带来的编译次数的减少能够
提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务，我会建议在除动
态SQL命令之外的所有情况下使用PreparedStatement对象。</font>
		</p>
		<p>
				<font size="4">　　6、<font color="#ff0000">在成批处理重复的插入或更新操作中使用PreparedStatement对象</font></font>
		</p>
		<p>
				<font size="4">　　如果成批地处理插入和更新操作，就能够显著地减少它们所需要的时间。Oracle提供的Statement和
CallableStatement并不真正地支持批处理，只有PreparedStatement对象才真正地支持批处理。我们可以使用
addBatch()和executeBatch()方法选择标准的JDBC批处理，或者通过利用PreparedStatement对象的
setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批
处理机制，可以以如下所示的方式调用setExecuteBatch()：<br />PreparedStatement pstmt3D null;<br />try {<br />((OraclePreparedStatement)<br />pstmt).setExecuteBatch(30);<br />...<br />pstmt.executeUpdate();<br />} <br /></font>
		</p>
		<p>
				<font size="4">　　调用setExecuteBatch()时指定的值是一个上限，当达到该值时，就会自动地引发SQL命令执行，
标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch
()方法随时传输批处理任务。</font>
		</p>
		<p>
				<font size="4">　　7、使用Oracle locator方法插入、更新大对象（LOB）</font>
		</p>
		<p>
				<font size="4">　　Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理，尤其是
Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的
值，也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。
可以使用PreparedStatement对象插入或更新LOB，但需要使用locator才能获取LOB的值。<i><font color="#ff0000">由于存在这二个问题，因此，我建议使用
locator的方法来插入、更新或获取LOB的值。</font></i></font>
		</p>
		<p>
				<font size="4">　　8、使用SQL92语法调用存储过程</font>
		</p>
		<p>
				<font size="4">　　在调用存储过程时，我们可以使用SQL92或Oracle PL/SQL，由于使用Oracle PL/SQL并没有什么实际的好处，而且会给以后维护你的应用程序的开发人员带来麻烦，因此，我建议在调用存储过程时使用SQL92。</font>
		</p>
		<p>
				<font size="4">　　9、使用Object SQL将对象模式转移到数据库中</font>
		</p>
		<p>
				<font size="4">　　既然可以将Oracle的数据库作为一种面向对象的数据库来使用，就可以考虑将应用程序中的面向对象模式转到数
据库中。目前的方法是创建Java
bean作为伪装的数据库对象，将它们的属性映射到关系表中，然后在这些bean中添加方法。尽管这样作在Java中没有什么问题，但由于操作都是在数据
库之外进行的，因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术，可以通过创建一个新的数据库对象类型在数据库中模
仿其数据和操作，然后使用JPublisher等工具生成自己的Java
bean类。如果使用这种方式，不但Java应用程序可以使用应用软件的对象模式，其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的
对象模式。</font>
		</p>
		<p>
				<font size="4">　　10、利用SQL完成数据库内的操作</font>
		</p>
		<p>
				<font size="4">　　我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求，而不是使用Java等过程化的编程语言。</font>
		</p>
		<p>
				<font size="4">　　如果编程人员要在一个表中查找许多行，结果中的每个行都会查找其他表中的数据，最后，编程人员创建了独立的
UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的
SQL命令中完成任务，何必要让数据在网上流来流去的？我建议用户认真学习如何最大限度地发挥SQL的功能。 </font>
		</p>
<img src ="http://www.blogjava.net/alex/aggbug/66520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-08-29 22:01 <a href="http://www.blogjava.net/alex/archive/2006/08/29/66520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle中查询被锁的表并释放session</title><link>http://www.blogjava.net/alex/archive/2006/08/21/64895.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Mon, 21 Aug 2006 13:58:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/08/21/64895.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/64895.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/08/21/64895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/64895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/64895.html</trackback:ping><description><![CDATA[key words: 锁表 解锁<br />查询sql:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">SELECT</span><span style="color: rgb(0, 0, 0);"> A.OWNER,<br />A.</span><span style="color: rgb(255, 0, 255);">OBJECT_NAME</span><span style="color: rgb(0, 0, 0);">,<br />B.XIDUSN,<br />B.XIDSLOT,<br />B.XIDSQN,<br />B.SESSION_ID,<br />B.ORACLE_USERNAME, <br />B.OS_USER_NAME,<br />B.PROCESS, <br />B.LOCKED_MODE, <br />C.MACHINE,<br />C.STATUS,<br />C.SERVER,<br />C.SID,<br />C.SERIAL#,<br />C.PROGRAM<br /></span><span style="color: rgb(0, 0, 255);">FROM</span><span style="color: rgb(0, 0, 0);"> ALL_OBJECTS A,<br />V$LOCKED_OBJECT B,<br />SYS.GV_$SESSION C <br /></span><span style="color: rgb(0, 0, 255);">WHERE</span><span style="color: rgb(0, 0, 0);"> ( A.</span><span style="color: rgb(255, 0, 255);">OBJECT_ID</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(0, 0, 0);"> B.</span><span style="color: rgb(255, 0, 255);">OBJECT_ID</span><span style="color: rgb(0, 0, 0);"> )<br /></span><span style="color: rgb(128, 128, 128);">AND</span><span style="color: rgb(0, 0, 0);"> (B.PROCESS </span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(0, 0, 0);"> C.PROCESS )<br /></span><span style="color: rgb(0, 0, 255);">ORDER</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">BY</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0); font-weight: bold;">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">2</span><span style="color: rgb(0, 0, 0);"> </span></div><br />释放session Sql:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">alter</span><span style="color: rgb(0, 0, 0);"> system </span><span style="color: rgb(0, 0, 255);">kill</span><span style="color: rgb(0, 0, 0);"> session </span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">sid, serial#</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br /><br /></span><span style="color: rgb(0, 0, 255);">alter</span><span style="color: rgb(0, 0, 0);"> system </span><span style="color: rgb(0, 0, 255);">kill</span><span style="color: rgb(0, 0, 0);"> session </span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">379, 21132</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">alter</span><span style="color: rgb(0, 0, 0);"> system </span><span style="color: rgb(0, 0, 255);">kill</span><span style="color: rgb(0, 0, 0);"> session </span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">374, 6938</span><span style="color: rgb(255, 0, 0);">'</span></div><br /><img src ="http://www.blogjava.net/alex/aggbug/64895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-08-21 21:58 <a href="http://www.blogjava.net/alex/archive/2006/08/21/64895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle函数</title><link>http://www.blogjava.net/alex/archive/2006/07/31/61040.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Mon, 31 Jul 2006 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/31/61040.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/61040.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/31/61040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/61040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/61040.html</trackback:ping><description><![CDATA[Oracle常用的函数:<br /><br />sysdate<br />systimestamp<br />to_char <br />to_date:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> to_date(</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">06-5月-1957</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">DD-Mon-YY</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> dual;</span></div><br />nvl:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> nvl(sal,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">空</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> emp;</span></div><br /><br />decode:<br /><u><b><font color="#0000ff">decode</font></b></u>(条件,值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 /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">String sql </span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(0, 0, 0);"><br />        "</span><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> product_name,</span><span style="color: rgb(255, 0, 255);">sum</span><span style="color: rgb(0, 0, 0);">(decode(bill_month,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">"+chargePeriod+"</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,charge))</span><span style="color: rgb(128, 128, 128);">/</span><span style="color: rgb(128, 0, 0); font-weight: bold;">100</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> cur_charge,<br /></span><span style="color: rgb(255, 0, 255);">sum</span><span style="color: rgb(0, 0, 0);">(decode(bill_month,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">"+lastPeriod+"</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,charge))</span><span style="color: rgb(128, 128, 128);">/</span><span style="color: rgb(128, 0, 0); font-weight: bold;">100</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> last_charge, "<br />        </span><span style="color: rgb(128, 128, 128);">+</span><span style="color: rgb(0, 0, 0);"><br />        " </span><span style="color: rgb(255, 0, 255);">sum</span><span style="color: rgb(0, 0, 0);">(decode(bill_month,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">"+chargePeriod+"</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,bill_time_len))</span><span style="color: rgb(128, 128, 128);">/</span><span style="color: rgb(128, 0, 0); font-weight: bold;">60</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> cur_time,<br /></span><span style="color: rgb(255, 0, 255);">sum</span><span style="color: rgb(0, 0, 0);">(decode(bill_month,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">"+lastPeriod+"</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,bill_time_len))</span><span style="color: rgb(128, 128, 128);">/</span><span style="color: rgb(128, 0, 0); font-weight: bold;">60</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> last_time "<br />        </span><span style="color: rgb(128, 128, 128);">+</span><span style="color: rgb(0, 0, 0);"><br />        " </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> tl_acc_report "<br />        </span><span style="color: rgb(128, 128, 128);">+</span><span style="color: rgb(0, 0, 0);"><br />        " </span><span style="color: rgb(0, 0, 255);">group</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">by</span><span style="color: rgb(0, 0, 0);"> product_name ";<br /><br /><br /></span><span style="color: rgb(0, 0, 255);">SELECT</span><span style="color: rgb(0, 0, 0);"> sid,serial#,username,<br /><br />DECODE(command<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">0</span><span style="color: rgb(0, 0, 0);">,’None’<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">2</span><span style="color: rgb(0, 0, 0);">,’</span><span style="color: rgb(0, 0, 255);">Insert</span><span style="color: rgb(0, 0, 0);">’<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">3</span><span style="color: rgb(0, 0, 0);">,’</span><span style="color: rgb(0, 0, 255);">Select</span><span style="color: rgb(0, 0, 0);">’<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">6</span><span style="color: rgb(0, 0, 0);">,’</span><span style="color: rgb(0, 0, 255);">Update</span><span style="color: rgb(0, 0, 0);">’<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">7</span><span style="color: rgb(0, 0, 0);">,’</span><span style="color: rgb(0, 0, 255);">Delete</span><span style="color: rgb(0, 0, 0);">’<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">8</span><span style="color: rgb(0, 0, 0);">,’</span><span style="color: rgb(0, 0, 255);">Drop</span><span style="color: rgb(0, 0, 0);"><br /><br />,’Other’) cmd </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> des<br /></span></div><br /><img src ="http://www.blogjava.net/alex/aggbug/61040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-31 16:34 <a href="http://www.blogjava.net/alex/archive/2006/07/31/61040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle表连接</title><link>http://www.blogjava.net/alex/archive/2006/07/27/60426.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 27 Jul 2006 13:21:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/27/60426.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/60426.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/27/60426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/60426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/60426.html</trackback:ping><description><![CDATA[key words: 表连接 <br />内连接<br /><br />select statement from table1 join table2 on table1.fieled1 = table2.field2<br /><br />select statement from table1 ,table2 where table1.field1 = table2.field2<br /><br /><br />左连接<br /><br />select .....table1 left outer join table2 on table1....= table2.field<br /><br />select .... table1 ,table2 where table1.field1= table2.field(+)<br /><br />合并查询<br />union:获得并集，并自动去掉重复行，并且会以第一列的结果进行排序<br />union all: 获得并集，但不去掉重复行，也不排序<br /><br />子查询:<br />对于多行子查询，必须要用多行运算符(IN,NOT IN,EXISTS,NOT EXISTS,ALL,ANY)<br /><br /><img src ="http://www.blogjava.net/alex/aggbug/60426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-27 21:21 <a href="http://www.blogjava.net/alex/archive/2006/07/27/60426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]DB2与Oracle数据库之间远程复制</title><link>http://www.blogjava.net/alex/archive/2006/07/27/60409.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 27 Jul 2006 11:54:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/27/60409.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/60409.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/27/60409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/60409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/60409.html</trackback:ping><description><![CDATA[key words: 数据库复制  <br /><b class="art_title f18">come from <a href="http://www.pconline.com.cn/pcjob/other/data/db2/0607/822326_1.html">here</a></b><br /><br />一、背景 <br />　　DB2 联合数据库是分布式数据库管理的特殊形式。在联合数据库系统中，可以通过一个 SQL
命令来发出对多个数据源的命令请求。DB2 与非 DB2 数据库之间进行复制之前，首先需要保证非 DB2 数据源可以被 DB2 ESE
Version 8 federated database访问。对于DB2 Replication Version 8
所需的联合数据库功能可以在现有发布的 DB2 ESE Version 8 和 DB2 Connect Enterprise Edition
Version 8 中提供。<br /><br />　　"SQL复制"又称为"DB2复制"，是为 DB2 开发的两种数据复制类型中的一种，它是通过
SQL 进行的复制。在这里简单提一下，DB2 复制中的另一种"Q复制"是通过 Websphere MQ 消息队列进行的。在进行 SQL
复制时，Capture 程序读取 DB2 恢复日志以获取对指定源表的更改。该程序将更改保存到传输表格中，也称作变化数据表（changed
data table），Apply 程序并行读取更改并应用于目标事务，见图1。<br /><p align="center"><img alt="" src="http://www.pconline.com.cn/pcjob/other/data/db2/0607/pic/eyrgkwz1.jpg" border="0" /></p><p><br /><br /><br />　　图1：SQL复制的结构<br /><br />　　WebSphere II 全球信息集成复制，通过不同数据库之间的复制，有效的利用了数据资源，为提高效率提供了良好的平台。<br /><br />　　DB2 与非 DB2 数据库之间的复制需要用到 WebSphere II。本文力争通过复制实例让读者对不同数据库之间的复制有一个整体的概念。<br /><br />二、动机<br /><br />　　商业上出于很多原因使用复制，可以归纳为：<br /><br />分散：把数据分散到各个位置； <br />整合：把其他位置的数据联合起来； <br />交换：与其他位置进行双向的数据交换； <br />灵活应用：对上面提到的方式进行一些改变或者结合。<br /><br />　
　联合 (Federated)
数据库系统的诞生，利用了现有的数据资源，把不同商业数据库软件的数据整合到一起，很大程度的提高了数据利用率。联合数据库可以用一个SQL语句对分布在
不同地点的多种数据源发出请求。联合数据库系统可以把本地表和远程数据源联接起来，就像数据都在本地一样，并且可以通过对数据源进行分布请求来提高数据源
处理能力，还可以通过在联合服务器处理部分分布请求来补充数据源的 SQL 限制。<br /><br />　　联合数据库具有两个与其他应用服务器不同的特点：<br /><br />联合服务器可以被配置为接收全部或接收部分针对数据源的请求。联合服务器把这些请求分散到数据源。 <br />与其他应用服务器一样，一个联合服务器用 DRDA 通信协议（例如 SNA 和 TCP/IP）与 DB2 家族实例通信。然而，与其他应用服务器不同的是，与非 DB2 家族实例通信时用其他协议。<br /><br />　　图2描述了联合数据库系统的设置流程：<br /></p><p align="center"><img alt="" src="http://www.pconline.com.cn/pcjob/other/data/db2/0607/pic/eyrgkwz2.jpg" border="0" /></p><br />　　图2：联合数据库系统的设置流程<br /><br /><br />　
　WebSphere II 包括两种包装器（Wrapper），一种为关系型包装器，负责DB2 UDB, Informix, Oracle,
Microsoft SQL Server, Sybase, ODBC, OLE DB 等数据的复制。另一种为非关系型包装器，负责
Flatfile, Excel, XML 等非关系型数据的复制。<br /><br />　　包装器定义了一个负责本地数据库与远程数据库通信的库。包装器执
行很多任务，比如：它可以连接到数据源，包装器应用了数据源的标准连接API。它还可以给数据源提交请求。联合数据库系统可以操作远程联合系统的表。远程
表在本地联合数据库中虚拟存在，客户应用程序可以操作这些虚拟表，但是它们真正存在于远端数据库中。每个远程虚拟数据库，把联合数据库当作数据库客户端，
他们只对数据库客户端的请求有回应。因此联合数据库需要下载各种远程数据库的客户端。<br /><br />一个联合系统的构造，需要一个作为联合服务器的 DB2 实例，一个作为联合数据库的数据库，一个或多个数据源，和可以存取数据库和数据源的客户（用户和应用）。如果要完成远程不同数据库之间的复制，还需要应用DB2的数据复制功能。<br /><br />IBM
DB2 复制（在一些平台上被称为数据传播）是一个从一个位置到另一个位置复制 DB2
和/或其他数据库厂商数据的强大的，灵活的工具。IBM的复制支持数据转换，数据连接和过滤数据。可以在不同的平台之间搬运数据，也可以把数据分散到不同
的地点或从分散的地方把数据聚合到一个地方。可以在不同的系统之间交换数据。<br /><br />　　IBM复制由四个主要部分组成：管理 (Administrator)，Capture，Apply，警报监视器 (Alert Monitor)。<br /><br />　　管理的部分主要通过复制中心的图形界面来实现。通过复制中心可以定义复制源，定义从数据源到目标数据的地图。它也用来管理和监控本地和远程的 Capture 和 Apply 进程。从图3中可以看出复制中心图形界面对其他几个部分的支持关系。<br /><br /><br />　　图3：复制中心的应用<br /><br /><p align="center"><img alt="" src="http://www.pconline.com.cn/pcjob/other/data/db2/0607/pic/eyrgkwz3.jpg" border="0" /></p><br />　
　在源数据服务器上运行的 Capture 程序可以获取 DB2 源数据表中的变化。DB2 的源数据服务器可以为 DB2 在 z/os,
os/390 上的版本 6，7和8，也可以是 iseries 在 os/400 V5R2，或 DB2 在 Windows, Unix
系统中的版本 8。当定义数据源的时候会自动生成相应的触发器 (Triggers)，可以用来捕获数据源的变化。要复制的数据可以在 Capture
进程中通过选择列来进行过滤。被捕获的更改信息首先存放到本地的源数据所在的数据库的表中并且当更改应用到目标数据中之后会自动删除。<br /><br />　
　当对源表进行改动时，DB2 把相关的记录写入日志。这些日志服务于数据库发现和复制。Capture
程序通过数据库自动连接并获取日志记录。每个源表都有相应的 CD (change data)
表来获取数据的变化。当定义一个复制数据源时，复制中心自动生成 CD 表。<br /><br />对于 Apply 部分，捕获的改变通过 Apply 程序应用到目标表中。Apply
程序可以在任何服务器上运行并且必须对所用到的源服务器和目标服务器都有连通性。数据可以通过列，行进行过滤，可以进行合并（例如通过视图），也可以在
Apply 过程中通过 SQL 表达式进行传送。DB2
与其他相关的数据间进行复制的时候，必须通过联合数据库系统来进行昵称的创建。在本地机器上需要安装关系型包装器和非关系型包装器。对于本例中
db2&lt;-&gt;ORACLE之间的复制，需要安装关系型包装器。见图4。<br /><br />　　图4：进行远程复制关系图<br /><p align="center"><img alt="" src="http://www.pconline.com.cn/pcjob/other/data/db2/0607/pic/eyrgkwz4.jpg" border="0" /></p><p><br /><br />　　报警监视器用来进行对Capture和Apply部分的错误监控。</p><br /><p><br /></p><p><br /></p><br /><img src ="http://www.blogjava.net/alex/aggbug/60409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-27 19:54 <a href="http://www.blogjava.net/alex/archive/2006/07/27/60409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]在Oracle里设置访问多个SQL Server</title><link>http://www.blogjava.net/alex/archive/2006/07/27/60408.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 27 Jul 2006 11:49:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/27/60408.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/60408.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/27/60408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/60408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/60408.html</trackback:ping><description><![CDATA[
		<span class="main">
				<span class="myp111">
						<font id="zoom">如何在Oracle里设置访问多个SQL Server数据库？假设我们要在ORACLE里同时能访问SQL Server里默认的pubs和Northwind两个数据库。 <br /><br /><b>1、
在安装了ORACLE9i Standard Edition或者ORACLE9i Enterprise
Edition的windows机器上(IP:192.168.0.2), 产品要选了透明网关(Oracle Transparent
Gateway)里访问Microsoft SQL Server数据库</b><br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>$ORACLE9I_HOME\tg4msql\admin下新写initpubs.ora和initnorthwind.ora配置文件.<br />initpubs.ora内容如下:<br />HS_FDS_CONNECT_INFO="SERVER=SQLSERVER_HOSTNMAE;DATABASE=pubs"<br />HS_DB_NAME=pubs<br />HS_FDS_TRACE_LEVEL=OFF<br />HS_FDS_RECOVERY_ACCOUNT=RECOVER<br />HS_FDS_RECOVERY_PWD=RECOVER<br />initnorthwind.ora内容如下:<br />HS_FDS_CONNECT_INFO="SERVER=sqlserver_hostname;DATABASE=Northwind"<br />HS_DB_NAME=Northwind<br />HS_FDS_TRACE_LEVEL=OFF<br />HS_FDS_RECOVERY_ACCOUNT=RECOVER<br />HS_FDS_RECOVERY_PWD=RECOVER<br /><br />$ORACLE9I_HOME\network\admin 下listener.ora内容如下:<br />LISTENER =<br />  (DESCRIPTION_LIST =<br />   (DESCRIPTION =<br />    (ADDRESS_LIST =<br />    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))<br />  )<br />  )<br />  )<br /><br />SID_LIST_LISTENER =<br />  (SID_LIST =<br />  (SID_DESC =<br />  (GLOBAL_DBNAME = test9)<br />  (ORACLE_HOME = d:\oracle\ora92)<br />  (SID_NAME = test9)<br /> )<br />  (SID_DESC=<br />  (SID_NAME=pubs)<br />  (ORACLE_HOME=d:\Oracle\Ora92) <br />  (PROGRAM=tg4msql)<br />  )<br />  (SID_DESC=<br />  (SID_NAME=northwind)<br />  (ORACLE_HOME=d:\Oracle\Ora92) <br /> (PROGRAM=tg4msql)<br />    )<br />  )</ccid_code></pre></td></tr></tbody></table><br /><br />重启动这台做gateway的windows机器上(IP:192.168.0.2)TNSListener服务. <br /><br />(凡是按此步骤新增可访问的SQL Server数据库时，TNSListener服务都要重启动) <br /><br /><b>2、ORACLE8I，ORACLE9I的服务器端配置tnsnames.ora, 添加下面的内容:</b><br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>pubs =<br />  (DESCRIPTION =<br />  (ADDRESS_LIST =<br />    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))<br />    )<br />    (CONNECT_DATA =<br />    (SID = pubs)<br />    )<br />    (HS = pubs) <br />   )<br /><br />northwind =<br />  (DESCRIPTION =<br />  (ADDRESS_LIST =<br /> (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))<br />    )<br />    (CONNECT_DATA =<br />    (SID = northwind)<br />    )<br />    (HS = northwind) <br />   )   <br /> 保存tnsnames.ora后,在命令行下<br /> tnsping pubs<br /> tnsping northwind</ccid_code></pre></td></tr></tbody></table><br /><br />出现类似提示，即为成功 <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>Attempting to contact (DESCRIPTION = (ADDRESS_LIST = <br />(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)<br />(PORT = 1521))) (CONNECT_DATA = (SID = pubs)) (HS = pubs))<br />OK（20毫秒）<br />Attempting to contact (DESCRIPTION = (ADDRESS_LIST =<br /> (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)<br />(PORT = 1521))) (CONNECT_DATA = (SID = northwind)) (HS = northwind))<br />OK（20毫秒）</ccid_code></pre></td></tr></tbody></table><br /><br />设置数据库参数global_names=false。 <br /><br />设置global_names=false不要求建立的数据库链接和目的数据库的全局名称一致。global_names=true则要求, 多少有些不方便。 <br /><br />oracle9i和oracle8i都可以在DBA用户下用SQL命令改变global_names参数 <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>alter system set global_names=false;</ccid_code></pre></td></tr></tbody></table><br /><br />建立公有的数据库链接: <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>create public database link pubs <br />connect to testuser identified by testuser_pwd using 'pubs';<br />create public database link northwind <br />connect to testuser identified by testuser_pwd using 'northwind';<br />(假设SQL Server下pubs和northwind已有足够权限的用户登陆testuser,<br />密码为testuser_pwd)</ccid_code></pre></td></tr></tbody></table><br /><br />访问SQL Server下数据库里的数据: <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>select * from stores@pubs;<br />...... 	......<br />select * from region@northwind;<br />......  ......</ccid_code></pre></td></tr></tbody></table><br /><br /><b>3、使用时的注意事项</b><br /><br />ORACLE通过访问SQL Server的数据库链接时，用select * 的时候字段名是用双引号引起来的。 <br /><br />例如： <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>create table stores as select * from stores@pubs;<br />select zip from stores；<br />ERROR 位于第 1 行:<br />ORA-00904: 无效列名<br />select "zip" from stores;<br />zip<br />-----<br />98056<br />92789<br />96745<br />98014<br />90019<br />89076</ccid_code></pre></td></tr></tbody></table><br /><br />已选择6行。 <br /><br />用SQL Navigator或Toad看从SQL Server转移到ORACLE里的表的建表语句为: <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>CREATE TABLE stores<br />    ("stor_id"                      CHAR(4) NOT NULL,<br />    "stor_name"                    VARCHAR2(40),<br />    "stor_address"                 VARCHAR2(40),<br />    "city"                         VARCHAR2(20),<br />    "state"                        CHAR(2),<br />    "zip"                          CHAR(5))<br />  PCTFREE     10<br />  PCTUSED     40<br />  INITRANS    1<br />  MAXTRANS    255<br />  TABLESPACE  users<br />  STORAGE   (<br />    INITIAL     131072<br />    NEXT        131072<br />    PCTINCREASE 0<br />    MINEXTENTS  1<br />    MAXEXTENTS  2147483645<br />  )<br />/</ccid_code></pre></td></tr></tbody></table><br /><br /><b>总结:</b><br /><br />WINDOWS下ORACLE9i网关服务器在$ORACLE9I_HOME\tg4msql\admin目录下的initsqlserver_databaseid.ora <br /><br />WINDOWS下ORACLE9i网关服务器listener.ora里面 <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>(SID_DESC=<br />     		(SID_NAME=sqlserver_databaseid)<br />      		(ORACLE_HOME=d:\Oracle\Ora92) <br />      		(PROGRAM=tg4msql)<br />   	)<br />   	UNIX或WINDOWS下ORACLE8I,ORACLE9I服务器tnsnames.ora里面<br />	northwind =<br />	  (DESCRIPTION =<br />(ADDRESS_LIST =<br />	(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))<br />	    )<br />	(CONNECT_DATA =<br />	(SID = sqlserver_databaseid)<br />    		)<br />	(HS = sqlserver_databaseid) <br />   	   )</ccid_code></pre></td></tr></tbody></table><br /><br />sqlserver_databaseid一致才行.</font>
				</span>
		</span>
<img src ="http://www.blogjava.net/alex/aggbug/60408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-27 19:49 <a href="http://www.blogjava.net/alex/archive/2006/07/27/60408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]优化Oracle库表设计的若干方法</title><link>http://www.blogjava.net/alex/archive/2006/07/19/59052.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Wed, 19 Jul 2006 10:16:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/19/59052.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/59052.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/19/59052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/59052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/59052.html</trackback:ping><description><![CDATA[
		<p>key words: oracle优化 优化oracle  表设计优化 powerdesigner<br /><font class="f14" id="zoom"><strong></strong></font></p>
		<p>
				<font class="f14" id="zoom">
						<strong>
								<br />
						</strong>
				</font>
		</p>
		<p>
				<font class="f14" id="zoom">
						<strong>前言<br /><br /></strong>绝
大多数的Oracle数据库性能问题都是由于数据库设计不合理造成的，只有少部分问题根植于Database Buffer、Share
Pool、Redo Log
Buffer等内存模块配置不合理，I/O争用，CPU争用等DBA职责范围上。所以除非是面对一个业已完成不可变更的系统，否则我们不应过多地将关注点
投向内存、I/O、CPU等性能调整项目上，而应关注数据库表本身的设计是否合理，库表设计的合理性才是程序性能的真正执牛耳者。<br /><br />合理的数据库设计需要考虑以下的方面：<br /><br />·业务数据以何种方式表达。如一个员工有多个Email，你可以在T_EMPLOYEE表中建立多个Email字段如email_1、email_2、 email_3，也可以创建一个T_EMAIL子表来存储，甚至可以用逗号分隔开多个Email地址存放在一个字段中。<br /><br />·数据以何种方式物理存储。如大表的分区，表空间的合理设计等。<br /><br />·如何建立合理的数据表索引。表索引几乎是提高数据表查询性能最有效的方法，Oracle拥有类型丰富的数据表索引类型，如何取舍选择显得特别重要。<br /><br />本
文我们将目光主要聚焦于数据表的索引上，同时也将提及其他两点的内容。通过对一个简单的库表设计实例的分析引出设计中的不足，并逐一改正。考虑到手工编写
库表的SQL脚本原始且低效，我们将用目前最流行的库表设计工具PowerDesigner
10来讲述表设计的过程，所以在本文中你还会了解到一些相关的PowerDesigner的使用技巧。<br /><br /><strong>一个简单的例子</strong><br /><br />某个开发人员着手设计一个订单的系统，这个系统中有两个主要的业务表，分别是订单基本信息表和订单条目表，这两张表具有主从关系的表，其中T_ORDER是订单主表，而T_ORDER_ITEM是订单条目表。数据库设计人员的设计成果如图 1所示：<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 554px; height: 116px;" alt="合理设计优化Oracle库表设计的若干方法" src="http://www.51cto.com/files/uploadimg/20051031/1736190.gif" border="1" hspace="0" /><br /><br />图 1 订单主从表</div></td></tr></tbody></table><br /><br />ORDER_ID
是订单号，为T_ORDER的主键，通过名为SEQ_ORDER_ID的序列产生键值，而ITEM_ID是T_ORDER_ITEM表的主键，通过名为
SEQ_ORDER_ITEM的序列产生键值，T_ORDER_ITEM通过ORDER_ID外键关联到T_ORDER表。<br /><br />需求文档指出订单记录将通过以下两种方式来查询数据：<br /><br />·CLIENT + ORDER_DATE+IS_SHPPED：根据"客户＋订货日期+是否发货"条件查询订单及订单条目。<br /><br />·ORDER_DATE+IS_SHIPPED：根据"订货日期+是否发货"条件查询订单及订单条目。<br /><br />数
据库设计人员根据这个要求，在T_ORDER表的CLIENT、
ORDER_DATE及IS_SHPPED三字段上建立了一个复合索引IDX_ORDER_COMPOSITE；在T_ORDER_ITEM为外键
ORDER_ID建立IDX_ORDER_ITEM_ORDER_ID索引。<br /><br />让我们看一下该份设计的最终SQL脚本：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>/*订单表*/ <br /><br />create table T_ORDER (<br /><br />ORDER_ID NUMBER(10) not null, <br /><br />ADDRESS VARCHAR2(100), <br /><br />CLIENT VARCHAR2(60), <br /><br />ORDER_DATE CHAR(8), <br /><br />IS_SHIPPED CHAR(1), <br /><br />constraint PK_T_ORDER primary key (ORDER_ID)<br /><br />);<br /><br />create index IDX_CLIENT on T_ORDER (<br /><br />　CLIENT ASC, <br /><br />　ORDER_DATE ASC, <br /><br />　IS_SHIPPED ASC);<br /><br />/*订单条目子表*/<br /><br />create table T_ORDER_ITEM (<br /><br />　ITEM_ID NUMBER(10) not null,<br /><br />　ORDER_ID NUMBER(10), <br /><br />　ITEM VARCHAR2(20), <br /><br />　COUNT NUMBER(10), <br /><br />　constraint PK_T_ORDER_ITEM primary key (ITEM_ID)<br /><br />);<br /><br />create index IDX_ORDER_ITEM_ORDER_ID on T_ORDER_ITEM (<br /><br />　ORDER_ID ASC);<br /><br />　alter table T_ORDER_ITEM add constraint FK_T_ORDER__REFERENCE_T_ORDER foreign key (ORDER_ID) references T_ORDER (ORDER_ID);</td></tr></tbody></table></font>
				<font class="f14" id="zoom">
				</font>
		</p>
		<p>
				<font class="f14" id="zoom">
						<br />
						<br />我们承认在ER关系上，这份设计并不存在的缺陷，但却存在以下有待优化的地方：<br /><br />·没有将表数据和索引数据存储到不同的表空间中，而不加区别地将它们存储到同一表空间里。这样，不但会造成I/O竞争，也为数据库的维护工作带来不便。<br /><br />·ORACLE会自动为表的主键列创建一个普通B-Tree索引，但由于这两张表的主键值都通过序列提供，具有严格的顺序性（升序或降序），此时手工为其指定一个反键索引（reverse key index）将更加合理。<br /><br />·
在子表T_ORDER_ITEM外键列ORDER_ID上建立的IDX_ORDER_ITEM_ORDER_ID的普通B-Tree索引非常适合设置为压
缩型索引，即建立一个压缩型的B-Tree索引。因为一份订单会对应多个订单条目，这就意味着T_ORDER_ITEM表存在许多同值的
ORDER_ID列值，通过将其索引指定为压缩型的B-Tree索引，不但可以减少IDX_ORDER_ITEM_ORDER_ID所需的存储空间，还将
提高表操作的性能。<br /><br />·企图仅通过建立一个包含3字段IDX_ORDER_COMPOSITE复合索引满足如前所述的两种查询条件方式的索引是有问题的，事实上使用ORDER_DATE+IS_SHIPPED复合条件的查询将利用不到IDX_ORDER_COMPOSITE索引。 </font>
		</p>
		<p>
				<!--StartFragment -->
				<font class="f14" id="zoom"> <font class="f14" id="zoom"><strong>优化设计<br /><br /></strong>1、将表数据和索引数据分开表空间存储<br /><br />1.1 表数据和索引为何需要使用独立的表空间<br /><br />Oracle
强烈建立，任何一个应用程序的库表至少需要创建两个表空间，其中之一用于存储表数据，而另一个用于存储表索引数据。因为如果将表数据和索引数据放在一起，
表数据的I/O操作和索引的I/O操作将产生影响系统性能的I/O竞争，降低系统的响应效率。将表数据和索引数据存放在不同的表空间中（如一个为
APP_DATA，另一个为APP_IDX），并在物理层面将这两个表空间的数据文件放在不同的物理磁盘上，就可以避免这种竞争了。<br /><br />拥有独立的表空间，就意味着可以独立地为表数据和索引数据提供独立的物理存储参数，而不会发生相互影响，毕竟表数据和索引数据拥有不同的特性，而这些特性又直接影响了物理存储参数的设定。<br /><br />此外，表数据和索引数据独立存储，还会带来数据管理和维护上的方面。如你在迁移一个业务数据库时，为了降低数据大小，可以只迁出表数据的表空间，在目标数据库中通过重建索引的方式就可以生成索引数据了。<br /><br />1.2 表数据和索引使用不同表空间的SQL语法<br /><br />指定表数据及索引数据存储表空间语句最简单的形式如下。<br /><br />将表数据存储在APP_DATA表空间里：<br /><br />create table T_ORDER ( ORDER_ID NUMBER(10) not null, …)tablespace APP_DATA;<br /><br />将索引数据存储在APP_IDX表空间里：<br /><br />create index IDX_ORDER_ITEM_ORDER_ID on T_ORDER_ITEM ( ORDER_ID ASC)tablespace APP_IDX;<br /><br />1.3 PowerDesigner中如何操作<br /><br />1) 首先，必须创建两个表空间。通过Model-&gt;Tablespace...在List of Tablespaces中创建两个表空间：<br /><br /></font></font>
		</p>
		<table align="center" border="0" width="90%">
				<tbody>
						<tr>
								<td>
										<div align="center">
												<img style="width: 518px; height: 335px;" alt="合理设计优化Oracle库表设计的若干方法(2)" src="http://www.51cto.com/files/uploadimg/20051031/1736191.jpg" border="1" hspace="0" />
												<br />
												<br />图 2 创建表空间</div>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font class="f14" id="zoom">
						<font class="f14" id="zoom">
								<br />
								<br />2) 为每张表指定表数据存储的表空间。在设计区中双击表，打开Table Properties设计窗口，切换到options 页，按图 3所示指定表数据的存储表空间。<br /><br /></font>
				</font>
		</p>
		<table align="center" border="0" width="90%">
				<tbody>
						<tr>
								<td>
										<div align="center">
												<img style="width: 554px; height: 338px;" alt="合理设计优化Oracle库表设计的若干方法(2)" src="http://www.51cto.com/files/uploadimg/20051031/1736192.jpg" border="1" hspace="0" />
												<br />
												<br />图 3 指定表数据的存储表空间</div>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font class="f14" id="zoom">
						<font class="f14" id="zoom">
								<br />
								<br />3) 为每个索引指定索引数据的存储表空间。在Table Properties中切换到Indexes页，在这里列出了表的所有索引，双击需设置表空间的索引，在弹出的Index Properties窗口中切换到Options页，按如下方式指定索引的存储表空间。</font>
				</font>
		</p>
		<p>
				<br />
		</p>
		<p>
				<span class="top11">
						<br />
						<table align="center" border="0" width="90%">
								<tbody>
										<tr>
												<td>
														<div align="center">
																<img style="width: 498px; height: 382px;" alt="合理设计优化Oracle库表设计的若干方法(2)" src="http://www.51cto.com/files/uploadimg/20051031/1736193.jpg" border="1" hspace="0" />
																<br />
																<br />图 4 指定索引数据的存储表空间</div>
												</td>
										</tr>
								</tbody>
						</table>
						<p>
								<br />
								<br />将表空间的问题延展一下：一个应用系统库表的表空间可以进行更精细的划分。<br /><br />首先，如果表中存在LOB类型的字段，有为其指定一个特定的表空间，因为LOB类型的数据在物理存储结构的管理上和一般数据的策略有很大的不同，将其放在一个独立的表空间中，就可方便地设置其物理存储参数了。<br /><br />其
次，需要考虑库表数据的DML操作特性：根据DML（INSERT,UPDATE,DELETE）操作频繁程度，将几乎不发生任何DML操作的数据放在独
立的表空间中，因为极少DML操作的表可设置符合其特性的物理参数：如PCTFREE可置为0，其BUFFER_POOL指定为KEEP，以便将数据缓存
在KEEP数据缓存区中等等，不一而足。<br /><br />此外，还可以考虑按业务需要将不同的业务模块分开存放，这主要是考虑到备份问题。假设我们有一部分业务数据重要性很强，而其他的业务数据重要性相对较弱，这样就可以将两者分开存储，以便设置不同的备份策略。 <br /><br />当然，无节制的细化表空间也将带来管理上和部署上的复杂，根据业务需求合理地规划表空间以达到管理和性能上的最佳往往需要更多的权衡。</p>
						<p>
								<!--StartFragment --> <font class="f14" id="zoom">2、显式为主键列建立反向键索引<br /><br />2.1 反向键索引的原理和用途<br /><br />我
们知道Oracle会自动为表的主键列建立索引，这个默认的索引是普通的B-Tree索引。对于主键值是按顺序(递增或递减)加入的情况，默认的B-
Tree索引并不理想。这是因为如果索引列的值具有严格顺序时，随着数据行的插入，索引树的层级增长很快。搜索索引发生的I/O读写次数和索引树的层级数
成正比，也就是说，一棵具有5个层级的B-Tree索引，在最终读取到索引数据时最多可能发生多达5次I/O操作。因而，减少索引的层级数是索引性能调整
的一个重要方法。<br /><br />如果索引列的数据以严格的有序的方式插入，那么B-Tree索引树将变成一棵不对称的"歪树"，如图 5所示：<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 212px; height: 209px;" alt="合理设计优化Oracle库表设计的若干方法(3)" src="http://www.51cto.com/files/uploadimg/20051031/1736194.gif" border="1" hspace="0" /><br /><br />图 5不对称的B-Tree索引</div></td></tr></tbody></table><br /><br />而如果索引列的数据以随机值的方式插入，我们将得到一棵趋向对称的索引树，如图 6所示：<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 201px; height: 119px;" alt="合理设计优化Oracle库表设计的若干方法(3)" src="http://www.51cto.com/files/uploadimg/20051031/1736195.gif" border="1" hspace="0" /><br /><br />图 6对称的B-Tree索引 </div></td></tr></tbody></table><br /><br />比较图 5和图 6，在图 5中搜索到A块需要进行5次I/O操作，而图 6仅需要3次I/O操作。<br /><br />既
然索引列数据从序列中获取，其有序性无法规避，但在建立索引时，Oracle允许对索引列的值进行反向，即预先对列值进行比特位的反向，如
1000,10001,10011,10111,1100经过反向后的值将是0001,1001,1101,0011。显然经过位反向处理的有序数据变得
比较随机了，这样所得到的索引树就比较对称，从而提高表的查询性能。<br /><br />但反向键索引也有它局限性：如果在WHERE语句中，需要对索引列的
值进行范围性的搜索，如BETWEEN、&lt;、&gt;等，其反向键索引无法使用，此时，Oracle将执行全表扫描；只有对反向键索引列进行
&lt;&gt; 和 = 的比较操作时，其反向键索引才会得到使用。<br /><br />2.2 反向键索引的SQL语句<br /><br />回到我们上面的例子，由于T_ORDER和T_ORDER_ITEM的主键值来源于序列，主键值是有严格顺序的，所以我们应该摒弃默认的Oracle所提供的索引，而采取显式为主键指定一个反向键索引的方式。<br /><br />ORDER_ID为T_ORDER表的主键，主键名为PK_ORDER，我们为ORDER_ID列上建立一个反向键索引IDX_ORDER_ID，并使PK_ORDER_ID使用这个索引，其SQL语句如下：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>create table T_ORDER ( <br /><br />　ORDER_ID NUMBER(10) not null,<br /><br />　CLIENT VARCHAR2(60), <br /><br />　ADDRESS VARCHAR2(100),<br /><br />　ORDER_DATE CHAR(8));<br /><br />create
unique index IDX_ORDER_ID on T_ORDER ( ORDER_ID ASC) reverse;alter
table T_ORDER add constraint PK_ORDER primary key (ORDER_ID) using
index IDX_ORDER_ID;</td></tr></tbody></table><br /><br />要保证创建IDX_ORDER_ID的SQL语句在创建PK_ORDER主键的SQL语句之前，因为主键需要引用到这个反向键索引。<br /><br />由于主键列的数据是唯一的，所以为IDX_ORDER_ID加上unique限定，使其成为唯一型的索引。<br /><br />2.3 PowerdDesigner如何操作<br /><br />1)
首先，需要为ORDER_ID列建立一个反向键索引。打开T_ORDER的Table
Properties的窗口，切换到Indexes页，新建一个名为IDX_ORDER_ID的索引。填写完索引的名称后，双击这个索引，弹出Index
Properties窗口，在这个窗口的Columns中选择ORDER_ID列。然后，切换到Options页，按图 7的方式将其设置为反向键索引。<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 546px; height: 428px;" alt="合理设计优化Oracle库表设计的若干方法(3)" src="http://www.51cto.com/files/uploadimg/20051031/1736196.jpg" border="1" hspace="0" /><br /><br />图 7 设置反向键索引</div><div align="center"> </div></td></tr></tbody></table></font></p>
						<!--StartFragment -->
2) 显式指定主键PK_ORDER使用这个索引。在Table
Properties窗口中切换到Keys页，默认情况下，PowerDesigner为T_ORDER所指定的主键名为Key1，我们将其更名为
PK_ORDER，双击这个主键，弹出Key Properties窗口，切换到Options页，按图
8的方式为PK_ORDER指定IDX_ORDER_ID。<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 505px; height: 381px;" alt="合理设计优化Oracle库表设计的若干方法(4)" src="http://www.51cto.com/files/uploadimg/20051031/1736197.jpg" border="1" hspace="0" /><br /><br />图 8 为主键指定特定的索引</div></td></tr></tbody></table><br /><br />不可否认PowerDesigner确实是目前业界最强大易用的数据库设计工具，但很遗憾，当我们为表主键指定一个索引时，其产生的语句在顺序上有问题：即创建主键的语句位于创建索引语句之前：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>create table T_ORDER (…);alter table T_ORDER add constraint
PK_T_ORDER primary key (ORDER_ID) using index IDX_ORDER_ID;create
unique index IDX_ORDER_ID on T_ORDER ( ORDER_ID ASC) reverse;</td></tr></tbody></table><br /><br />我们可以通过对PowerDesigner生成SQL语句的设置进行调整，先生成创建表和索引的SQL语句，再创建为表添加主键和外键的SQL语句来达到曲线救国的目的，请看下一步。</span>
		</p>
		<p>
				<span class="top11">3)通过菜单Database-&gt;Generate Database...调出Database Configuration窗口，切换到Keys&amp;Indexes页，按图 9设置：</span>
		</p>
		<p>
				<br />
				<span class="top11">
				</span>
		</p>
		<p>
				<span class="top11">
						<br />
						<table align="center" border="0" width="90%">
								<tbody>
										<tr>
												<td>
														<div align="center">
																<img style="width: 554px; height: 485px;" alt="合理设计优化Oracle库表设计的若干方法(4)" src="http://www.51cto.com/files/uploadimg/20051031/1736198.jpg" border="1" hspace="0" />
																<br />
																<br />图 9 设置生成键和索引SQL的选项</div>
												</td>
										</tr>
								</tbody>
						</table>
						<br />
						<br />这里，我们将Primary Keys和Foreign keys的选项都取消，而将Indexes勾选，以达到只生成表的索引SQL语句的目的。<br /><br />点击"确定"后，生成创建数据库表及其索引的SQL语句，运行该SQL创建数据库后，再按图 10设置生成为表添加主键和外键的SQL语句：<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 554px; height: 486px;" alt="合理设计优化Oracle库表设计的若干方法(4)" src="http://www.51cto.com/files/uploadimg/20051031/1736199.jpg" border="1" hspace="0" /><br /><br />图 10 生成创建表主键和外键的SQL语句</div></td></tr></tbody></table><p><br /><br />除此设置外，还必须切换到Tables &amp; Views页下，取消所有选项，避免重新生成创建表的语句。 </p><p><!--StartFragment --> <font class="f14" id="zoom">3、将子表的外键列的索引改为压缩型<br /><br />3.1 压缩型索引的原理和用途<br /><br />在前面的例子中，由于一条订单会对应多条订单条目，所以T_ORDER_ITEM的ORDER_ID字段总会出现重复的值，如： <br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>ITEM_ID ORDER_ID ITEM COUNT<br /><br />1 100 101 1<br /><br />2 100 104 2<br /><br />3 100 201 3<br /><br />4 200 301 2<br /><br />5 200 401 1<br /><br />6 200 205 3</td></tr></tbody></table><br /><br />在ORDER_ID列上创建一个普通未压缩的B-Tree索引，则索引数据的物理上的存储形式如下：<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img alt="合理设计优化Oracle库表设计的若干方法(5)" src="http://www.51cto.com/files/uploadimg/20051031/17361910.jpg" border="0" /><br /><br />图 11 未进行压缩的索引存储</div></td></tr></tbody></table><br /><br />ORDER_ID的重复值在索引块中重复出现，这样不但增加了存储空间的需求，而且因为查询时需要读取更多的索引数据块，所以查询性能也会降低＝。让我们来看一下经过压缩后索引数据的存储方式： <br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img alt="合理设计优化Oracle库表设计的若干方法(5)" src="http://www.51cto.com/files/uploadimg/20051031/17361911.jpg" border="0" /><br /><br />图 12 进行压缩的索引存储</div></td></tr></tbody></table><br /><br />压缩型的索引消除了重复的索引值，将相同索引列值所关联的ROWID存储在一起。这样，不但节省了存储空间，查询效率也提高了，真可谓两全齐美了。<br /><br />对象T_ORDER和T_ORDER_ITEM这样的主从表进行查询时，一般情况下，我们都必须通过外键查询出子表所有关联的记录，所以在子表的外键上建立压缩型的索引是非常适合的。<br /><br />3.2 压缩型索引的SQL语句<br /><br />创建压缩型索引的SQL语句非常简单，在T_ORDER_ITEM的ORDER_ID上创建压缩型索引的SQL如下所示：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>create index IDX_ORDER_ITEM_ORDER_ID on T_ORDER_ITEM ( ORDER_ID ASC) compress;</td></tr></tbody></table><br /><br />需要在创建索引的语句后附上compress关键字就可以了。<br /><br />3.3 PowerDesigner如何创建压缩型索引<br /><br />1) 打开T_ORDER_ITEM表的Table Properties的窗口，切换到Indexes页，为ORDER_ID列创建一个名为IDX_ORDER_ITEM_ORDER_ID的索引。<br /><br />2) 双击IDX_ORDER_ITEM_ORDER_ID弹出Index Properties窗口，切换到Options页，按图 13将索引设置为压缩型：<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 455px; height: 403px;" alt="合理设计优化Oracle库表设计的若干方法(5)" src="http://www.51cto.com/files/uploadimg/20051031/17361912.jpg" border="1" hspace="0" /><br /><br />图 13 将索引指定为压缩型</div></td></tr></tbody></table><br /><br />4、建立满足需求的复合键索引 <br /><br />设计人员希望通过T_ORDER表上的IDX_ORDER_COMPOSITE复合索引满足以下两种组合条件的查询：<br /><br />·CLIENT + ORDER_DATE + IS_SHIPPED<br /><br />·ORDER_DATE + IS_SHIPPED<br /><br />为方便阐述，我们特地将IDX_ORDER_COMPOSITE的创建SQL语句再次列出：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>create index IDX_ORDER_COMPOSITE on T_ORDER ( CLIENT ASC, ORDER_DATE ASC, IS_SHIPPED ASC);</td></tr></tbody></table><br /><br />事实上，在CLIENT + ORDER_DATE + IS_SHIPPED 三列上所执行的复合条件查询会应用到这个索引，而在ORDER_DATE + IS_SHIPPED列上所执行的复合查询不会使用这个索引，因而将导致一个全表扫描的操作。<br /><br />可以用许多工具来了解查询语句的执行计划，通过SET AUTOTRACE ON来查询以上两个复合查询的执行计划：<br /><br />打开SQL/Plus，输入以下的语句：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>SQL&gt; set autotrace on<br /><br />SQL&gt; select * from t_order where CLIENT = '1' and ORDER_DATE='1' and IS_SHIPPED='1'; </td></tr></tbody></table><br /><br />分析得到的执行计划为：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>SELECT STATEMENT Optimizer=CHOOSETABLE ACCESS (BY INDEX ROWID) OF
'T_ORDER' INDEX (RANGE SCAN) OF 'IDX_ORDER_COMPOSITE' (NON-UNIQUE)</td></tr></tbody></table><br /><br />可见Oracle先利用IDX_ORDER_COMPOSITE得到满足条件的记录ROWID，再通过ROWID返回记录。<br /><br />而下面查询语句：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>SQL&gt; select * from t_order where ORDER_DATE='1' and IS_SHIPPED='1'</td></tr></tbody></table><br /><br />的执行计划则为：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>SELECT STATEMENT Optimizer=CHOOSE TABLE ACCESS (FULL) OF 'T_ORDER'</td></tr></tbody></table><br /><br />很明显，Oracle在T_ORDER表上执行了一个全表扫描的操作，没有用到IDX_ORDER_COMPOSITE索引。<br /><br />对复合列索引，我们得出这个结论：<br /><br />假设在COL_1,COL_2,…,COL_n这些列上建立了一个复合索引：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>create index IDX _COMPOSITE on TABLE1<br /><br />{<br /><br />COL_1,<br /><br />COL_2,<br /><br />…,<br /><br />COL_n<br /><br />} </td></tr></tbody></table><br /><br />则只有WHERE语句上包含COL_1(复合索引的第一个字段)的查询才会使用这个复合索引，而未包含COL_1的查询则不会使用这个复合索引。<br /><br />回到我们的例子，如何建立满足CLIENT + ORDER_DATE + IS_SHIPPED和ORDER_DATE + IS_SHIPPED两种查询的索引呢？<br /><br />考
虑到IS_SHIPPED列基数很小，只有两个可能的值：0,1。在这种情况下，有两种方案：第一，分别为CLIENT + ORDER_DATE +
IS_SHIPPED和ORDER_DATE +
IS_SHIPPED建立一个复合索引；第二，分别在CLIENT和ORDER_DATE列上建立一个索引，而IS_SHIPEED列不建立索引。<br /><br />第一种方案的查询效率最快，但因为CLIENT和ORDER_DATE在索引中会重复出现两次，占用较大的存储空间。第二种方案CLIENT和ORDER_DATE不会在索引存储出现两次，较为节省空间，查询效率比之于第一种方案会稍低一些，但影响不大。 <br /><br />我们采用第二种方案为CLIENT和ORDER_DATE分别创建索引IDX_CLIENT和IDX_ORDER_DATE，组合查询条件为CLIENT + ORDER_DATE + IS_SHIPPED时的执行计划为：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>SELECT STATEMENT Optimizer=CHOOSE TABLE ACCESS (BY INDEX ROWID) OF
'T_ORDER' AND-EQUAL INDEX (RANGE SCAN) OF 'IDX_CLIENT' (NON-UNIQUE)
INDEX (RANGE SCAN) OF 'IDX_ORDER_DATE' (NON-UNIQUE)</td></tr></tbody></table><br /><br />而组合条件为ORDER_DATE + IS_SHIPPED时的执行计划为：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>SELECT STATEMENT Optimizer=CHOOSE TABLE ACCESS (BY INDEX ROWID) OF 'T_ORDER' INDEX (RANGE SCAN) OF 'IDX_ORDER_DATE' (NON-UNIQUE)</td></tr></tbody></table><br /><br />通过这样的改造，我们得到了一个满足两种组合查询的执行计划。<br /><br /><strong>总结</strong><br /><br />贯穿本文的订单主从表实例结构上很简单，但是其粗糙的设计包含了许多问题，这也是许多对Oracle物理存储结构没有很好理解的数据库设计师容易忽视的地方。<br /><br />在一般情况下，这样的设计并不会导致严重系统的性能问题，但是精益求精是每一位优秀软件设计师的品质，此外，对于设计师，一定要清楚这样一条规律：对于等质的性能提升，在编码层面往往需要比设计层面付出更多的艰辛。<br /><br />在Oracle中提高数据库的性能需要考虑的问题，注意的误区还很多，本文涵盖是一些最常见的问题。下面，我们将提高数据库操作性能方法及一些误区作个小结： <br /><br />·对于大表，可以考虑创建分区表，分区表有范围分区、散列分区、列表分区和散列分区几种，通过它可以达到化大表为小表的目的。<br /><br />·考虑适量的数据冗余，如一个业务表有一个审批状态，审批需要经过多步，每一步对应审批表的一条记录，最后审批的那条记录决定了业务的状态。我们大可在业务表中存放一个审批状态的标志，以取消每次需要通过关联审批表获取业务审批状态的复杂的关联表查询。<br /><br />·
不要做太多的关联表查询，一些几乎不发生数据变动的表码表，如性别，学历，婚姻状态等表码表，可以考虑在应用程序启动时一次性地下载到应用程序的内存中缓
存起来，在从数据库获取结果集后，再由程序利用这些缓存的表码表数据来翻译这些表码字段，而不要在数据库中通过表间的关联查询方式来翻译这些字段。 <br /><br />·
常看到一些令我瞠目的设计：在需要进行频繁DML(INSERT,UPDATE,DELETE)操作的表的某些基数低的字段（如性别，婚姻状态）上创建位
图索引。位图索引是好东西，但它是有使用范围的，在OLTP系统中，需要进行频繁DML操作的表中不应该出现位图索引，位图索引只适用于几乎不进行DML
操作，只进行查询的DSS系统中。此外，聚簇和索引组织表也都更适合DSS系统，而非OLTP系统。</font> （完）</p></span>
		</p>
<img src ="http://www.blogjava.net/alex/aggbug/59052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-19 18:16 <a href="http://www.blogjava.net/alex/archive/2006/07/19/59052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]监控Oracle数据库的常用shell脚本</title><link>http://www.blogjava.net/alex/archive/2006/07/18/58801.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 18 Jul 2006 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/18/58801.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/58801.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/18/58801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/58801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/58801.html</trackback:ping><description><![CDATA[
		<p>
				<strong>key words: Oracle监控  shell脚本<br /></strong>
		</p>
		<p>
				<strong>前言<br /><br /></strong>这篇文章介绍了DBA每天在监控Oracle数
据库方面的职责，讲述了如何通过shell脚本来完成这些重复的监控工作。本文首先回顾了一些DBA常用的Unix命令，以及解释了如何通过Unix
Cron来定时执行DBA脚本。同时文章还介绍了8个重要的脚本来监控Oracle数据库：</p>
		<p>检查实例的可用性<br /><br />检查监听器的可用性<br /><br />检查alert日志文件中的错误信息<br /><br />在存放log文件的地方满以前清空旧的log文件<br /><br />分析table和index以获得更好的性能<br /><br />检查表空间的使用情况<br /><br />找出无效的对象<br /><br />监控用户和事务</p>
		<p>
				<b>DBA需要的Unix基本知识</b>
		</p>
		<p>
				<b>基本的UNIX命令</b>
				<br />
				<br />以下是一些常用的Unix命令：<br /><br />ps--显示进程　grep--搜索文件中的某种文本模式　mailx--读取或者发送mail　cat--连接文件或者显示它们　cut--选择显示的列　awk--模式匹配语言　df--显示剩余的磁盘空间<br /><br />以下是DBA如何使用这些命令的一些例子：<br /><br />显示服务器上的可用实例：</p>
		<table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
				<tbody>
						<tr>
								<td class="code" bgcolor="#e6e6e6">
										<pre>$ ps -ef | grep smon<br /><br />oracle 21832 1 0 Feb 24 ? 19:05 ora_smon_oradb1<br /><br />oracle 898 1 0 Feb 15 ? 0:00 ora_smon_oradb2<br /><br />dliu 25199 19038 0 10:48:57 pts/6 0:00 grep smon<br /><br />oracle 27798 1 0 05:43:54 ? 0:00 ora_smon_oradb3<br /><br />oracle 28781 1 0 Mar 03 ? 0:01 ora_smon_oradb4、</pre>
								</td>
						</tr>
				</tbody>
		</table>显示服务器上的可用监听器：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>$ ps -ef | grep listener | grep -v grep<br /><br />（译者注：grep命令应该加上-i参数，即grep -i listener，<br /><br />该参数的作用是忽略大小写，因为有些时候listener是大写的，这时就会看不到结果）<br /><br />oracle 23879 1 0 Feb 24 ? 33:36 /8.1.7/bin/tnslsnr listener_db1 -inherit<br /><br />oracle 27939 1 0 05:44:02 ? 0:00 /8.1.7/bin/tnslsnr listener_db2 -inherit<br /><br />oracle 23536 1 0 Feb 12 ? 4:19 /8.1.7/bin/tnslsnr listener_db3 -inherit<br /><br />oracle 28891 1 0 Mar 03 ? 0:01 /8.1.7/bin/tnslsnr listener_db4 -inherit</pre></td></tr></tbody></table>查看Oracle存档目录的文件系统使用情况<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>$ df -k | grep oraarch<br /><br />/dev/vx/dsk/proddg/oraarch 71123968 4754872 65850768 7% /u09/oraarch</pre></td></tr></tbody></table>统计alter.log文件中的行数：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>$ cat alert.log | wc -l<br /><br />2984<br /><br /></pre></td></tr></tbody></table>列出alert.log文件中的全部Oracle错误信息：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>$ grep ORA- alert.log<br /><br />ORA-00600: internal error code, arguments: [kcrrrfswda.1], [], [], [], [], []<br /><br />ORA-00600: internal error code, arguments: [1881], [25860496], [25857716], []</pre></td></tr></tbody></table><p><b>CRONTAB基本</b><br /><br />一个crontab文件中包含有六个字段：<br /><br />分钟 0-59 <br /><br />小时 0-23 <br /><br />月中的第几天 1-31 <br /><br />月份 1 - 12 <br /><br />星期几 0 - 6, with 0 = Sunday </p><p><b>Unix命令或者Shell脚本</b><br /><br />要编辑一个crontab文件，输入：Crontab -e<br /><br />要查看一个crontab文件，输入：</p><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>Crontab -l<br /><br />0 4 * * 5 /dba/admin/analyze_table.ksh<br /><br />30 3 * * 3,6 /dba/admin/hotbackup.ksh /dev/null 2&gt;&amp;1</pre></td></tr></tbody></table><p>在上面的例子中，第一行显示了一个分析表的脚本在每个星期5的4：00am运行。第二行显示了一个执行热备份的脚本在每个周三和周六的3：00a.m.运行。<br /><br /><b>监控数据库的常用Shell脚本</b><br /><br />以下提供的8个shell脚本覆盖了DBA每日监控工作的90%，你可能还需要修改UNIX的环境变量。</p><p><b>检查Oracle实例的可用性</b><br /><br />oratab文件中列出了服务器上的所有数据库</p><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>$ cat /var/opt/oracle/oratab<br /><br /><br />############################################################<br /><br /><br />## /var/opt/oracle/oratab##<br /><br /><br />############################################################<br /><br />oradb1:/u01/app/oracle/product/8.1.7:Y<br /><br />oradb2:/u01/app/oracle/product/8.1.7:Y<br /><br />oradb3:/u01/app/oracle/product/8.1.7:N<br /><br />oradb4:/u01/app/oracle/product/8.1.7:Y</pre></td></tr></tbody></table>以下的脚本检查oratab文件中列出的所有数据库，并且找出该数据库的状态（启动还是关闭）<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>##############################################################<br /><br /><br />## ckinstance.ksh ## ###################################################################<br /><br />ORATAB=/var/opt/oracle/oratab<br /><br />echo `date` <br /><br />echo Oracle Database(s) Status `hostname` : <br /><br />db=`egrep -i :Y|:N $ORATAB | cut -d: -f1 | grep -v # | grep -v *`<br /><br />pslist=`ps -ef | grep pmon`<br /><br />for i in $db ; do<br /><br />echo $pslist | grep ora_pmon_$i &gt; /dev/null 2&gt;$1<br /><br />if (( $? )); then<br /><br />echo Oracle Instance - $i: Down<br /><br />else<br /><br />echo Oracle Instance - $i: Up<br /><br />fi<br /><br />done <br /><br /></pre></td></tr></tbody></table>使用以下的命令来确认该脚本是可以执行的：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>$ chmod 744 ckinstance.ksh<br /><br />$ ls -l ckinstance.ksh<br /><br />-rwxr--r-- 1 oracle dba 657 Mar 5 22:59 ckinstance.ksh*</pre></td></tr></tbody></table>以下是实例可用性的报表：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>$ ckinstance.ksh<br /><br />Mon Mar 4 10:44:12 PST 2002 <br /><br />Oracle Database(s) Status for DBHOST server:<br /><br />Oracle Instance - oradb1: Up<br /><br />Oracle Instance - oradb2: Up<br /><br />Oracle Instance - oradb3: Down<br /><br />Oracle Instance - oradb4: Up </pre></td></tr></tbody></table><p><b>检查Oracle监听器的可用性</b><br /><br />以下有一个类似的脚本检查Oracle监听器。如果监听器停了，该脚本将会重新启动监听器：</p><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>#######################################################################<br /><br />## cklsnr.sh ##<br /><br />#######################################################################<br /><br />#!/bin/ksh<br /><br />DBALIST=primary.dba@company.com,another.dba@company.com;export DBALIST<br /><br />cd /var/opt/oracle<br /><br />rm -f lsnr.exist <br /><br />ps -ef | grep mylsnr | grep -v grep &gt; lsnr.exist<br /><br />if [ -s lsnr.exist ]<br /><br />then<br /><br />echo <br /><br />else<br /><br />echo Alert | mailx -s Listener ‘mylsnr‘ on `hostname` is down $DBALIST <br /><br />TNS_ADMIN=/var/opt/oracle; export TNS_ADMIN<br /><br />ORACLE_SID=db1; export ORACLE_SID <br /><br />ORAENV_ASK=NO; export ORAENV_ASK<br /><br />PATH=$PATH:/bin:/usr/local/bin; export PATH<br /><br />. oraenv<br /><br />LD_LIBRARY_PATH=${ORACLE_HOME}/lib;export LD_LIBRARY_PATH<br /><br />lsnrctl start mylsnr<br /><br />fi<br /><br /></pre></td></tr></tbody></table><p><b>检查Alert日志（ORA-XXXXX）</b><br /><br />每个脚本所使用的一些环境变量可以放到一个profile中：</p><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>####################################################################### <br /><br />## oracle.profile ## <br /><br />####################################################################### <br /><br />EDITOR=vi;export EDITOR ORACLE_BASE=/u01/app/oracle; export <br /><br />ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/8.1.7; export <br /><br />ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib; export <br /><br />LD_LIBRARY_PATH TNS_ADMIN=/var/opt/oracle;export <br /><br />TNS_ADMIN NLS_LANG=american; export <br /><br />NLS_LANG NLS_DATE_FORMAT=‘Mon DD YYYY HH24:MI:SS‘; export <br /><br />NLS_DATE_FORMAT ORATAB=/var/opt/oracle/oratab;export <br /><br />ORATAB PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/<br /><br />sbin:/usr/openwin/bin:/opt/bin:.; export <br /><br />PATH DBALIST=primary.dba@company.com,another.dba@company.com;export <br /><br />DBALIST </pre></td></tr></tbody></table>以下的脚本首先调用oracle.profile来设置全部的环境变量。如果发现任何的Oracle错误，该脚本还会给DBA发送一个警告的email。<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>####################################################################<br /><br />## ckalertlog.sh ##<br /><br />####################################################################<br /><br />#!/bin/ksh<br /><br />.. /etc/oracle.profile<br /><br />for SID in `cat $ORACLE_HOME/sidlist`<br /><br />do<br /><br />cd $ORACLE_BASE/admin/$SID/bdump<br /><br />if [ -f alert_${SID}.log ]<br /><br />then<br /><br />mv alert_${SID}.log alert_work.log<br /><br />touch alert_${SID}.log<br /><br />cat alert_work.log &gt;&gt; alert_${SID}.hist<br /><br />grep ORA- alert_work.log &gt; alert.err<br /><br />fi<br /><br />if [ `cat alert.err|wc -l` -gt 0 ]<br /><br />then<br /><br />mailx -s ${SID} ORACLE ALERT ERRORS $DBALIST &lt; alert.err<br /><br />fi<br /><br />rm -f alert.err<br /><br />rm -f alert_work.log<br /><br />done<br /><br /></pre></td></tr></tbody></table><b>清除旧的归档文件</b><br /><br />以下的脚本将会在log文件达到90%容量的时候清空旧的归档文件：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>$ df -k | grep arch<br /><br />Filesystem kbytes used avail capacity Mounted on<br /><br />/dev/vx/dsk/proddg/archive 71123968 30210248 40594232 43% /u08/archive<br /><br />#######################################################################<br /><br />## clean_arch.ksh ##<br /><br />#######################################################################<br /><br />#!/bin/ksh<br /><br />df -k | grep arch &gt; dfk.result<br /><br />archive_filesystem=`awk -F ‘{ print $6 }‘ dfk.result`<br /><br />archive_capacity=`awk -F ‘{ print $5 }‘ dfk.result`<br /><br />if [[ $archive_capacity &gt; 90% ]]<br /><br />then<br /><br />echo Filesystem ${archive_filesystem} is ${archive_capacity} filled<br /><br /># try one of the following option depend on your need<br /><br />find $archive_filesystem -type f -mtime +2 -exec rm -r {} ; <br /><br />tar <br /><br />rman<br /><br />fi<br /><br /></pre></td></tr></tbody></table><b>分析表和索引（以得到更好的性能）</b><br /><br />以下我将展示如果传送参数到一个脚本中：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>#################################################################### <br /><br />## analyze_table.sh ## <br /><br />####################################################################<br /><br />#!/bin/ksh <br /><br /># input parameter: 1: password # 2: SID <br /><br />if (($#&lt;1)) then echo "Please enter oracle user password as the first parameter !" exit 0 <br /><br />fi <br /><br />if (($#&lt;2)) then echo "Please enter instance name as the second parameter!" exit 0 <br /><br />fi <br /><br /></pre></td></tr></tbody></table>要传入参数以执行该脚本，输入：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>$ analyze_table.sh manager oradb1 </pre></td></tr></tbody></table>脚本的第一部分产生了一个analyze.sql文件，里面包含了分析表用的语句。脚本的第二部分分析全部的表：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>#####################################################################<br /><br />## analyze_table.sh ##<br /><br />#####################################################################<br /><br />sqlplus -s &lt; <!--<br--><br />oracle/$1@$2<br /><br />set heading off<br /><br />set feed off<br /><br />set pagesize 200<br /><br />set linesize 100<br /><br />spool analyze_table.sql<br /><br />select ANALYZE TABLE || owner || . || segment_name || <br /><br />ESTIMATE STATISTICS SAMPLE 10 PERCENT;<br /><br />from dba_segments<br /><br />where segment_type = TABLE<br /><br />and owner not in (SYS, SYSTEM);<br /><br />spool off<br /><br />exit<br /><br />!<br /><br />sqlplus -s &lt; <!--<br--><br />oracle/$1@$2<br /><br />@./analyze_table.sql<br /><br />exit<br /><br />! </pre></td></tr></tbody></table>以下是analyze.sql的一个例子：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>$ cat analyze.sql<br /><br />ANALYZE TABLE HIRWIN.JANUSAGE_SUMMARY ESTIMATE STATISTICS SAMPLE 10 PERCENT;<br /><br />ANALYZE TABLE HIRWIN.JANUSER_PROFILE ESTIMATE STATISTICS SAMPLE 10 PERCENT;<br /><br />ANALYZE TABLE APPSSYS.HIST_SYSTEM_ACTIVITY ESTIMATE STATISTICS SAMPLE 10 PERCENT;<br /><br />ANALYZE TABLE HTOMEH.QUEST_IM_VERSION ESTIMATE STATISTICS SAMPLE 10 PERCENT;<br /><br />ANALYZE TABLE JSTENZEL.HIST_SYS_ACT_0615 ESTIMATE STATISTICS SAMPLE 10 PERCENT;<br /><br />ANALYZE TABLE JSTENZEL.HISTORY_SYSTEM_0614 ESTIMATE STATISTICS SAMPLE 10 PERCENT;<br /><br />ANALYZE TABLE JSTENZEL.CALC_SUMMARY3 ESTIMATE STATISTICS SAMPLE 10 PERCENT;<br /><br />ANALYZE TABLE IMON.QUEST_IM_LOCK_TREE ESTIMATE STATISTICS SAMPLE 10 PERCENT;<br /><br />ANALYZE TABLE APPSSYS.HIST_USAGE_SUMMARY ESTIMATE STATISTICS SAMPLE 10 PERCENT;<br /><br />ANALYZE TABLE PATROL.P$LOCKCONFLICTTX ESTIMATE STATISTICS SAMPLE 10 PERCENT;<br /><br /></pre></td></tr></tbody></table><b>检查表空间的使用</b><br /><br />以下的脚本检测表空间的使用。如果表空间只剩下10%，它将会发送一个警告email。<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>#####################################################################<br /><br />## ck_tbsp.sh ##<br /><br />#####################################################################<br /><br />#!/bin/ksh<br /><br />sqlplus -s &lt; <!--<br--><br />oracle/$1@$2<br /><br />set feed off<br /><br />set linesize 100<br /><br />set pagesize 200<br /><br />spool tablespace.alert<br /><br />SELECT F.TABLESPACE_NAME,<br /><br />TO_CHAR ((T.TOTAL_SPACE - F.FREE_SPACE),999,999) "USED (MB)",<br /><br />TO_CHAR (F.FREE_SPACE, 999,999) "FREE (MB)",<br /><br />TO_CHAR (T.TOTAL_SPACE, 999,999) "TOTAL (MB)",<br /><br />TO_CHAR ((ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)),999)|| % PER_FREE<br /><br />FROM (<br /><br />SELECT TABLESPACE_NAME, <br /><br />ROUND (SUM (BLOCKS*(SELECT VALUE/1024<br /><br />FROM V\$PARAMETER <br /><br />WHERE NAME = db_block_size)/1024)<br /><br />) FREE_SPACE<br /><br />FROM DBA_FREE_SPACE<br /><br />GROUP BY TABLESPACE_NAME<br /><br />) F,<br /><br />(<br /><br />SELECT TABLESPACE_NAME,<br /><br />ROUND (SUM (BYTES/1048576)) TOTAL_SPACE<br /><br />FROM DBA_DATA_FILES<br /><br />GROUP BY TABLESPACE_NAME<br /><br />) T<br /><br />WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME<br /><br />AND (ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)) &lt; 10;<br /><br />spool off<br /><br />exit<br /><br />!<br /><br />if [ `cat tablespace.alert|wc -l` -gt 0 ]<br /><br />then<br /><br />cat tablespace.alert -l tablespace.alert &gt; tablespace.tmp<br /><br />mailx -s "TABLESPACE ALERT for ${2}" $DBALIST &lt; tablespace.tmp<br /><br />fi<br /><br /></pre></td></tr></tbody></table>警告email输出的例子如下：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>TABLESPACE_NAME USED (MB) FREE (MB) TOTAL (MB) PER_FREE <br /><br />------------------- --------- ----------- ------------------- ------------------<br /><br />SYSTEM 2,047 203 2,250 9 %<br /><br />STBS01 302 25 327 8 % <br /><br />STBS02 241 11 252 4 % <br /><br />STBS03 233 19 252 8 %</pre></td></tr></tbody></table><b>查找出无效的数据库对象</b><br /><br />以下查找出无效的数据库对象：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>#####################################################################</pre><pre>## invalid_object_alert.sh ##</pre><pre>##################################################################### </pre><pre>#!/bin/ksh . /etc/oracle.profile <br /><br />sqlplus -s &lt; <!--<br--><br />oracle/$1@$2 <br /><br />set feed off <br /><br />set heading off column object_name format a30 <br /><br />spool invalid_object.alert <br /><br />SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, </pre><pre>STATUS FROM DBA_OBJECTS WHERE STATUS = </pre><pre>INVALID ORDER BY OWNER, OBJECT_TYPE, OBJECT_NAME;<br /><br />spool off <br /><br />exit ! if [ `cat invalid_object.alert|wc -l` -gt 0 ] then <br /><br />mailx -s "INVALID OBJECTS for ${2}" $DBALIST &lt; invalid_object.alert <br /><br />fi$ cat invalid_object.alert<br /><br />OWNER OBJECT_NAME OBJECT_TYPE STATUS<br /><br />--------------------------------------------</pre><pre>HTOMEH DBMS_SHARED_POOL PACKAGE BODY INVALID<br /><br />HTOMEH X_$KCBFWAIT VIEW INVALID<br /><br />IMON IW_MON PACKAGE INVALID<br /><br />IMON IW_MON PACKAGE BODY INVALID<br /><br />IMON IW_ARCHIVED_LOG VIEW INVALID<br /><br />IMON IW_FILESTAT VIEW INVALID<br /><br />IMON IW_SQL_FULL_TEXT VIEW INVALID<br /><br />IMON IW_SYSTEM_EVENT1 VIEW INVALID<br /><br />IMON IW_SYSTEM_EVENT_CAT VIEW INVALIDLBAILEY CHECK_TABLESPACE_USAGE PROCEDURE INVALID<br /><br />PATROL P$AUTO_EXTEND_TBSP VIEW INVALID<br /><br />SYS DBMS_CRYPTO_TOOLKIT PACKAGE INVALID<br /><br />SYS DBMS_CRYPTO_TOOLKIT PACKAGE BODY INVALID<br /><br />SYS UPGRADE_SYSTEM_TYPES_TO_816 PROCEDURE INVALID<br /><br />SYS AQ$_DEQUEUE_HISTORY_T TYPE INVALID<br /><br />SYS HS_CLASS_CAPS VIEW INVALID SYS HS_CLASS_DD VIEW INVALID</pre></td></tr></tbody></table><b>监视用户和事务（死锁等）</b><br /><br />以下的脚本在死锁发生的时候发送一个警告e-mail：<br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>###################################################################<br /><br />## deadlock_alert.sh ##<br /><br />##################################################################</pre><pre>##!/bin/ksh<br /><br />.. /etc/oracle.profile<br /><br />sqlplus -s &lt; <!--<br--><br />oracle/$1@$2<br /><br />set feed off<br /><br />set heading off<br /><br />spool deadlock.alert<br /><br />SELECT SID, DECODE(BLOCK, 0, NO, YES ) BLOCKER,<br /><br />DECODE(REQUEST, 0, NO,YES ) WAITER<br /><br />FROM V$LOCK <br /><br />WHERE REQUEST &gt; 0 OR BLOCK &gt; 0 <br /><br />ORDER BY block DESC; <br /><br />spool off<br /><br />exit<br /><br />!<br /><br />if [ `cat deadlock.alert|wc -l` -gt 0 ]<br /><br />then<br /><br />mailx -s "DEADLOCK ALERT for ${2}" $DBALIST &lt; deadlock.alert<br /><br />fi</pre></td></tr></tbody></table><br /><br /><b>结论</b><br /><br /><table bordercolordark="#000000" bordercolorlight="#ffffff" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre>0,20,40 7-17 * * 1-5 /dba/scripts/ckinstance.sh &gt; /dev/null 2&gt;&amp;1<br /><br />0,20,40 7-17 * * 1-5 /dba/scripts/cklsnr.sh &gt; /dev/null 2&gt;&amp;1<br /><br />0,20,40 7-17 * * 1-5 /dba/scripts/ckalertlog.sh &gt; /dev/null 2&gt;&amp;1<br /><br />30 * * * 0-6 /dba/scripts/clean_arch.sh &gt; /dev/null 2&gt;&amp;1<br /><br />* 5 * * 1,3 /dba/scripts/analyze_table.sh &gt; /dev/null 2&gt;&amp;1<br /><br />* 5 * * 0-6 /dba/scripts/ck_tbsp.sh &gt; /dev/null 2&gt;&amp;1<br /><br />* 5 * * 0-6 /dba/scripts/invalid_object_alert.sh &gt; /dev/null 2&gt;&amp;1<br /><br />0,20,40 7-17 * * 1-5 /dba/scripts/deadlock_alert.sh &gt; /dev/null 2&gt;&amp;1</pre></td></tr></tbody></table><p>通过以上的脚本，可大大减轻你的工作。你可以使用这些是来做更重要的工作，例如性能调整。</p><img src ="http://www.blogjava.net/alex/aggbug/58801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-18 16:08 <a href="http://www.blogjava.net/alex/archive/2006/07/18/58801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]客户端连服务器的注意事项</title><link>http://www.blogjava.net/alex/archive/2006/07/17/58649.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Mon, 17 Jul 2006 14:31:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/17/58649.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/58649.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/17/58649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/58649.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/58649.html</trackback:ping><description><![CDATA[
		<p align="center">
				<strong>
						<font color="#ff0000">
								<br />
						</font>
				</strong>
		</p>
		<pre>									2003-05 余枫<br /><br />	ORACLE客户端连服务器的注意事项：<br /><br />        1. 通过SQL*NET协议，ORACLE客户端连服务器时一般需要配置sqlnet.ora和tnsnames.ora。<br />	   它们默认的目录在$ORACLE_HOME/network/admin 目录下<br /><br />	   也可以设置环境变量TNS_ADMIN指向你想用的sqlnet.ora和tnsnames.ora目录<br />	   例如：<br />	   TNS_ADMIN=/home/oracle/config/9.0.1;export TNS_ADMIN <br /><br />	   sqlnet.ora文件决定找数据库服务器别名的方式<br /><br />	   默认的参数有<br />	   NAMES.DEFAULT_DOMAIN = WORLD<br />	   NAMES.DIRECTORY_PATH = (TNSNAMES, ONAMES, HOSTNAME)<br /><br />	   如果你的ORACLE客户端和服务器默认的域名不一样，需要用#号注释第一行<br />	   #NAMES.DEFAULT_DOMAIN = WORLD<br />	   使它不起作用。<br /><br />           NAMES.DIRECTORY_PATH指定找服务器别名的顺序 (本地的tnsnames.ora文件, 命名服务器, 主机名方式)<br /><br />           服务器的sqlnet.ora里可以设置检查客户端是否alive的时间间隔<br />           sqlnet.expire_time = 10<br /><br />           tnsnames.ora文件里写数据库服务器别名的详细内容，有以下几种写法:<br /><br />           # 一般的写法           <br />           APPDB =<br />             (DESCRIPTION =<br />               (ADDRESS_LIST =<br />                 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))<br />               )<br />               (CONNECT_DATA =<br />                 (SERVICE_NAME = appdb)<br />               )<br />             )<br /><br />           # 明确标明用dedicated方式连接数据库<br />           APPD= <br />           (DESCRIPTION= <br />             (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.35)(PORT=1521))<br />             (CONNECT_DATA=<br />               (SERVICE_NAME=appdb)<br />               (SERVER=DEDICATED)))	<br /><br />           # 对多个listener端口做均衡负载方式连接数据库<br />           APPS =<br />             (DESCRIPTION =<br />             (ADDRESS_LIST =<br />                 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))<br />                 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1856))<br />              )<br />               (CONNECT_DATA =<br />                 (SERVICE_NAME = appdb)<br />               )<br />             )    <br /><br />     # 注意：如果数据库服务器用MTS，客户端程序需要用database link时最好明确指明客户端用dedicated直连方式,<br />     #       不然会遇到很多跟分布式环境有关的ORACLE BUG。<br />     #	    一般情况下数据库服务器用直接的连接会好一些，除非你的实时数据库连接数接近1000。<br /><br />        2. /etc/hosts (UNIX)<br />           或者windows\hosts(WIN98)  winnt\system32\drivers\etc\hosts (WIN2000)<br />           客户端需要写入数据库服务器IP地址和主机名的对应关系。<br /><br />           127.0.0.1       localhost<br />           192.168.0.35    oracledb	oracledb<br />           192.168.0.45    tomcat	tomcat<br />           202.84.10.193   bj_db   	bj_db    <br /><br />           有些时候我们配置好第一步后，tnsping 数据库服务器别名显示是成功的，<br />           但是sqlplus username/password@servicename不通,jdbc thin link 也不通的时候,         <br />           一定不要忘了在客户端做这一步，原因可能是DNS服务器里没有设置这个服务器IP地址和主机名的对应关系。<br /><br />           如果同时有私有IP和Internet上公有IP，私有IP写在前面，公有IP写在后面。<br /><br />           编辑前最好留一个备份，增加一行时也最好用复制粘贴，避免编辑hosts时空格或者tab字符错误。<br /><br />        3. UNIX下ORACLE多数据库的环境，OS客户端需要配置下面两个环境变量<br /><br />           ORACLE_SID=appdb;export ORACLE_SID <br />           TWO_TASK=appdb;export TWO_TASK  <br /><br />           来指定默认的目标数据库。<br /></pre>
<img src ="http://www.blogjava.net/alex/aggbug/58649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-17 22:31 <a href="http://www.blogjava.net/alex/archive/2006/07/17/58649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]在 Linux x86 上安装 Oracle 数据库 10g [官方文档]</title><link>http://www.blogjava.net/alex/archive/2006/07/13/57968.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 13 Jul 2006 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/13/57968.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/57968.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/13/57968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/57968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/57968.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 作者：John Smiley																																																																																学习在 RHEL 2.1、RHEL 3 或 SLES 8 上从头安装 Oracle 数据库 10g 的基础知识（仅用于评估）																																		...&nbsp;&nbsp;<a href='http://www.blogjava.net/alex/archive/2006/07/13/57968.html'>阅读全文</a><img src ="http://www.blogjava.net/alex/aggbug/57968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-13 13:57 <a href="http://www.blogjava.net/alex/archive/2006/07/13/57968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Oracle 9i的闪回查询概述</title><link>http://www.blogjava.net/alex/archive/2006/07/13/57913.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 13 Jul 2006 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/13/57913.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/57913.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/13/57913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/57913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/57913.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent">
				<font color="#993300" size="2">
						<strong>
						</strong>key words: Oracle闪回 flash<br /><br />　　1、Oracle 9i的闪回查询功能<br /><br />　
　在Oracle 9i之前，如果用户错误操作数据后，除了不完全恢复外，没有好的解决办法。Oracle
9i中提供闪回查询，由一个新的包DBMS_FLASH来实现。用户使用闪回查询可以及时取得误操作DML（Delete、Update、Insert）
前某一时间点数据库的映像视图，用户可以利用系统时间或系统改变号（SCN：System Change
Number）来指定这个只读视图，并可以针对错误进行相应的恢复措施。闪回查询功能完全依赖于自动回滚段管理（AUM），对于Drop等误操作不能恢
复。闪回特性可应用在以下方面：<br /><br />　　（1）自我维护过程中的修复：当一些重要的记录被意外删除，用户可以向后移动到一个时间点，查看丢失的行并把它们重新插入现在的表内恢复。<br /><br />　　（2）恢复Email和声音Email：当用户意外删除了Email或者声音信息时，可以通过移回到固定时间点来恢复删除。<br /><br />　　（3）账号平衡状况：可以查看以前的历史数据。如银行外币管理中用于记录特定时间的汇率。在以前，汇率变更被记录在一个历史表中，现在就可以通过闪回功能进行查询。<br /><br />　　（4）用于趋势分析的决策支持系统：决策支持系统和联机分析应用必须执行一个长时间的事务。使用闪回查询，这些应用可以对历史数据执行分析和建模。例如，特定产品如矿泉水随季节变化需求情况的变化。 <br /><br />　　2、回滚段概述<br /><br />　　回滚段用于存放数据修改之前的位置和值，回滚段的头部包含正在使用的该回滚段事务的信息。回滚段的作用如下：<br /><br />　　（1）事务回滚：当事务修改表中数据的时候，该数据修改前的值（即前影像）会存放在回滚段中，当用户回滚事务时，Oracle将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。 <br /><br />　　（2）事务恢复：当事务正在处理的时候，例程失败，回滚段的信息保存在重做日志文件中，Oracle将在下次打开数据库时利用回滚来恢复未提交的数据。<br /><br />　　（3）读一致性：当一个会话正在修改数据时，其它的会话将看不到该会话未提交的修改。而且，当一个语句正在执行时，该语句将看不到从该语句开始执行后的未提交的修改（语句级读一致性）。<br /><br />　　3、Oracle中Delete和Commit操作的流程分析 <br /><br />　　（1）删除（Delete）流程<br /><br />　　·Oracle读Block(数据块)到Buffer Cache（缓冲区）(如果该Block在Buffer中不存在)；<br /><br />　　·在Redo Log Buffer（重做日志缓冲区）中记录Delete操作的细节；<br /><br />　　·在相应回滚段段头的事物表中创建一个Undo（回滚）条目；<br /><br />　　·把将要删除的记录创建前镜像，存放到Undo Block（回滚块）中；<br /><br />　　·在Buffer Cache中的相应数据块上删除记录，并且标记相应的数据块为Dirty（脏）。<br /><br />　　（2）提交(Commit)流程<br /><br />　　·Oracle产生一个SCN；<br /><br />　　·在回滚段事物表中标记该事物状态为Commited；<br /><br />　　·LGWR（日志读写进程） Flush Log Buffer到日志文件； <br /><br />　　·如果此时数据块仍然在Buffer Cache中，那么SCN将被记录到Block Header上，这被称为快速提交；<br /><br />　　·如果Dirty Block已经被写回到磁盘，那么下一个访问这个Block的进程将会自回滚段中获取该事物的状态，确认该事物被提交。然后这个进程获得提交SCN并写回到Block Header上，这被称为延迟块清除。<br /><br />　　4、Oracle 9i中闪回查询操作实例<br /><br />　　进行闪回查询必须设置自动回滚段管理，在init.ora设置参数UNDO_MANAGEMENT=AUTO，参数UNDO_RETENTION=n，决定了能往前闪回的最大时间，值越大就需要越多Undo空间。<br /><br />　　例：Oracle 9i的Flashback Query操作。<br /><br />　　（1）创建闪回查询用户<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt; create user flashtest identified by flashtest; <br />SQL&gt; grant connect, resource to flashtest; <br />SQL&gt; grant execute on dbms_flashback to flashtest; <br />SQL&gt; connect flashtest/flashtest; </font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　（2）创建测试表，插入测试记录<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt; create table test(id number(3)); <br />SQL&gt; insert into test values (1); <br />SQL&gt; insert into test values(2); <br />SQL&gt; commit; <br />SQL&gt; create table rec_date(date_scn); </font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　注意：在执行步骤3或者步骤4之前，等待5分钟。<br /><br />　　（3）删除记录<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt; execute dbms_flashback.disable; <br />SQL&gt; insert into rec_date select sysdate from dual; <br />SQL&gt; commit; <br />SQL&gt; delete from test where id=1; <br />SQL&gt; commit; </font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　通过以上的操作，我们插入了两条记录，并删除了其中一条记录。在以下的操作中，我们将通过flashback query找到删除的记录<br /><br />　　（4）闪回查询<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt; DECLARE <br />Restore_scn date; <br />BEGIN <br />Select date_scn into restore_scn from rec_date; <br />Dbms_flashback.enable_at_time (restore_scn); <br />END; <br />SQL&gt; select * from test; <br />ID<br />1<br />2</font>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
						<br />
						<font color="#993300" size="2">　　可以看出，虽然删除记录并提交，但是通过闪回操作，仍能查询到删除前
的两条记录。需要注意Oracle每5分钟记录一次SCN，并将SCN和对应时间的映射进行纪录。如果原来插入的记录到做闪回操作的时间在5分钟之内，用
基于时间的闪回查询可能得不到记录，因为基于时间点的查询实际上是转化为最近的一次SCN，然后从这个SCN开始进行恢复。因此，如果需要精确的查询可以
采用基于SCN的闪回查询，可精确闪回到需要恢复的时间。可以通过DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER语句
获取SCN。</font>
				</p>
				<p>
						<font color="#993300" size="2">　　<strong><a href="http://dev.21tx.com/database/oracle/" target="_blank">Oracle</a> 10g的闪回查询概述</strong><br /><br />　　与Oracle 9i相比Oracle 10g的</font>
						<a href="http://flash.21tx.com/" target="_blank">
								<font color="#993300" size="2">Flash</font>
						</a>
						<font color="#993300" size="2">back有了非常大的改进，从普通的Flashback Query发展到了多种形式，主要表现在如下几方面新特性：<br /><br />　　1、Flashback Database<br /><br />　　Oracle Flashback Database特性允许通过SQL语句Flashback Database语句，让</font>
						<a href="http://dev.21tx.com/database/" target="_blank">
								<font color="#993300" size="2">数据库</font>
						</a>
						<font color="#993300" size="2">前
滚到当前的前一个时间点或者SCN，而不需要做时间点的恢复。闪回数据库可以迅速将数据库回到误操作或人为错误的前一个时间点，如Word中的"撤消"操
作，可以不利用备份就快速的实现基于时间点的恢复。Oracle通过创建新的Flashback
Logs（闪回日志），记录数据库的闪回操作。如果希望能闪回数据库，需要设置如下参数：DB_RECOVER_FILE_DEST日志的存放位置，
DB_RECOVER_FILE_DEST_SIZE恢复区的大小。在创建数据库的时候，Oracle将自动创建恢复区，但默认是关闭的，需要执行
alter database flashback on命令。<br /><br />　　例：执行Flashback Database命令格式。<br /><br /></font>
				</p>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt;flashback database to time to_timestamp(xxx);<br />SQL&gt;flashback database to scn xxx</font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　2、Flashback Table<br /><br />　　Oracle
Flashback Table特性允许利用Flashback Table语句，确保闪回到表的前一个时间点。与Oracle
9i中的Flashback Query相似，利用回滚段信息来恢复一个或一些表到以前的一个时间点（一个快照）。要注意的是，Flashback
Table不等于Flashback Query，Flashback
Query仅仅是查询以前的一个快照点而已，并不改变当前表的状态，而Flashback Table将改变当前表及附属对象一起回到以前的时间点。<br /><br />　　语法：<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">flashback table tablename to timestamp xxx或<br />flashback table tablename to scn xxx</font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　注意：如果需要闪回一个表，需要以下条件：<br /><br />　　·需要有flashback any table的系统权限或者是该表的flashback对象权限；<br /><br />　　·需要有该表的select,insert,delete,alter权限；<br /><br />　　·必须保证该表row movement。<br /><br />　　例：执行将test表闪回到2005年5月7日下午3点。<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt;flashback table test to timestamp to_timestamp(’2005-05-07 15:00:00’,’yyyy-mm-dd hh24:mi:ss’);</font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　3、Flashback Drop<br /><br />　　Oracle
Flashback Drop特性提供一个类似回收站的功能，用来恢复不小心被删除的表。当删除表时，Oracle
10g并不立刻释放被删除的表所占用的空间，而是将这个被删除的表进行自动重命名（为了避免同类对象名称的重复）并放进回收站中。所谓的回收站类似于</font>
				<a href="http://dev.21tx.com/os/windows/" target="_blank">
						<font color="#993300" size="2">Windows</font>
				</a>
				<font color="#993300" size="2">系统中的回收站，是一个虚拟的容器，用于存放所有被删除的对象，在回收站中被删除的对象将占用创建时的同样的空间。如果这个被删除的表需要进行恢复，就可利用Flashback Drop功能。<br /><br />　　例：进行一个删除表后恢复的简单测试。<br /><br />　　（1）显示回收站信息<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt;show recyclebin;</font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　可以看到，回收站中是没有任何结果的，表示没有任何表在回收站中。<br /><br />　　（2）创建一个表，并删除，再次显示回收站信息<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt;create table test_drop(name varchar2(10));<br />SQL&gt;drop table test_drop;<br />SQL&gt;show recyclebin;<br />ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME<br />TEST_DROP BIN$b+XkkO1RS5K10uKo9BfmuA==$0 TABLE 2005-05-07:14:30:47</font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　（3）对被删除的表进行恢复<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt;flashback table test_drop to before drop;或<br />SQL&gt;flashback table "BIN$b+XkkO1RS5K10uKo9BfmuA==$0" to before drop;</font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　（4）管理回收站<br /><br />　　清除回收站中的单个表：purge table test_drop<br /><br />　　清除整个回收站：purge recyclebin<br /><br />　　清除不同的对象回收站：purge user_recyclebin或purge dba_recyclebin<br /><br />　　（5）确认删除一个表<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt;drop table test_drop purge;</font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　如果删除一个表且不放到回收站中不能进行恢复，在drop语句中可以利用purge选项。<br /><br />　　4、Flash Version Query<br /><br />　
　Oracle Flashback Version
Query特性，利用保存的回滚信息，可以看到特定的表在时间段内的任何修改，如电影的回放一样，可以了解表在该期间的任何变化。Flashback
version
query一样依赖于AUM，提供了一个查看行改变的功能，能找到所有已经提交了的行的记录，分析出过去时间都执行了什么操作。Flashback
version query采用VERSIONS BETWEEN语句来进行查询，常用的方法：<br /><br />　　·VERSIONS_SCN - 系统改变号<br /><br />　　·VERSIONS_TIMESTAMP - 时间<br /><br />　
　例如：在test表中，时间1插入一条记录，时间2删除了这条记录，对于时间3执行select * from
test当然查询不到这条记录，只能看到该表最后的提交记录。这时如果利用Flash Table或者是Flash
Query，只能看到过去的某一时间点的一个快照，而利用Flashback Version
Query，能够把时间1、时间2的操作给记录下来，并详细的查询出对表进行的任何操作。<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt;select versions_starttime,versions_endtime, versions_xid,versions_operation,id <br />from test versions <br />between timestamp minvalue and maxvalue <br />order by versions_starttime;</font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　在上述查询中，列
versions_starttime、versions_endtime、versions_xid、versions_operation是伪列，还
有一些伪列，如versions_startscn和versions_endscn显示了该时刻的系统更改号。列versions_xid显示了更改该
行的事务标识符。<br /><br />　　当然，除了分析以上所有的变更之外，可以根据需要指定时间段，如显示在2005-05-07时间在15:30到16:30之间test表的所有变更。<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt;select id from test <br />versions
between timestamp to_date(’2005-05-07 15:30:00’,’yyyy-mm-dd
hh24:mi:ss’) and to_date(’2005-05-07 16:30:00’,’yyyy-mm-dd hh24:mi:ss’)</font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　5、Flashback Transaction Query<br /><br />　　Oracle Flashback Transaction Query特性确保检查数据库的任何改变在一个事务级别，可以利用此功能进行诊断</font>
				<a href="http://dev.21tx.com/database/problem/" target="_blank">
						<font color="#993300" size="2">问题</font>
				</a>
				<font color="#993300" size="2">、
性能分析和审计事务。它其实是Flashback Version Query查询的一个扩充，Flashback Version
Query说明了可以审计一段时间内表的所有改变，但是也仅仅是能发现问题，对于错误的事务，没有好的处理办法。而Flashback
Transaction
Query提供了从FLASHBACK_TRANSACTION_QUERY视图中获得事务的历史以及Undo_sql（回滚事务对应的sql语句），也
就是说审计一个事务到底做了什么，甚至可以回滚一个已经提交的事务。<br /><br />　　例：Flashback Transaction Query的操作实例。<br /><br />　　（1）在test表中删除记录，获得事务的标识XID，然后提交。<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt;delete from test where id=2;<br />SQL&gt;select xid from v$transaction;<br />XID<br />----------------<br />04001200AE010000<br />SQL&gt;commit;</font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　在测试中方便起见，在事务没有提交的时候，获得事务的XID为04001F0035000000。实际情况下，不可能去跟踪每个事务，想要获得已提交事务的XID，就必须通过上面的Flashback Version Query。<br /><br />　　（2）进行Flashback Transaction Query<br /><br /></font>
				<table class="txcode" align="center" border="0" cellpadding="0" cellspacing="0">
						<tbody>
								<tr>
										<td>
												<font color="#993300" size="2">SQL&gt;select * from FLASHBACK_TRANSACTION_QUERY<br />where xid=’04001F0035000000’;<br />UNDO_SQL<br />insert into "FLASHTEST"."TEST"("ID") values (’2’);</font>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<font color="#993300" size="2">　　注意：这个删除语句对应的是1个Insert语句，如果想回滚这个事务，执行这个Insert语句即可。<br /><br />　
　可以看到，Flashback Transaction
Query主要用于审计一个事务，并可以回滚一个已经提交的事务。如果确定出错的事务是最后一个事务，我们利用Flashback
Table或者Flashback
Query就可以解决问题。但是，如果执行了一个错误的事务之后，又执行了一系列正确的事务，那么上面的方法就无能为力，利用Flashback
Transaction Query可以查看或回滚这个错误的事务。<br /><br />　　<strong>结束语</strong><br /><br />　　通过上面的描述，可以看出闪回功能使用户恢复偶然的错误删除更加容易，增强了系统的可用性与读一致性。 </font>
		</span>
<img src ="http://www.blogjava.net/alex/aggbug/57913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-13 10:26 <a href="http://www.blogjava.net/alex/archive/2006/07/13/57913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>manage Oracle10g with oem method</title><link>http://www.blogjava.net/alex/archive/2006/07/11/57665.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 11 Jul 2006 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/11/57665.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/57665.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/11/57665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/57665.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/57665.html</trackback:ping><description><![CDATA[start the oem service:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">emctl start dbconsole</span></div><br />then type following addrese in browser:<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">http://yoursrv:</span><span style="color: rgb(0, 0, 0);">1561</span><span style="color: rgb(0, 0, 0);">/em</span></div><br /><br />it's convient.<br /><br />It's B/S model ,and it's C/S model at Oracle9i.<br /><br /><br /><img src ="http://www.blogjava.net/alex/aggbug/57665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-11 16:18 <a href="http://www.blogjava.net/alex/archive/2006/07/11/57665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Oracle常用数据字典查询</title><link>http://www.blogjava.net/alex/archive/2006/06/12/52203.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Mon, 12 Jun 2006 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/06/12/52203.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/52203.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/06/12/52203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/52203.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/52203.html</trackback:ping><description><![CDATA[
		<span style="font-size: 13px;">key words: 数据字典 用户 表 视图 <br /><br />1、用户<br /><br />
查看当前用户的缺省表空间<br />
SQL&gt;select username,default_tablespace from user_users;<br /><br />
查看当前用户的角色<br />
SQL&gt;select * from user_role_privs;<br /><br />
查看当前用户的系统权限和表级权限<br />
SQL&gt;select * from user_sys_privs;<br />
SQL&gt;select * from user_tab_privs;<br /><br />
显示当前会话所具有的权限<br />
SQL&gt;select * from session_privs;<br /><br />
显示指定用户所具有的系统权限<br />
SQL&gt;select * from dba_sys_privs where grantee='GAME';<br /><br /><br />
2、表<br /><br />
查看用户下所有的表<br />
SQL&gt;select * from user_tables;<br /><br />
查看名称包含log字符的表<br />
SQL&gt;select object_name,object_id from user_objects<br />
where instr(object_name,'LOG')&gt;0;<br /><br />
查看某表的创建时间<br />
SQL&gt;select object_name,created from user_objects where object_name=upper('&amp;table_name');<br /><br />
查看某表的大小<br />
SQL&gt;select sum(bytes)/(1024*1024) as "size(M)" from user_segments<br />
where segment_name=upper('&amp;table_name');<br /><br />
查看放在ORACLE的内存区里的表<br />
SQL&gt;select table_name,cache from user_tables where instr(cache,'Y')&gt;0;<br /><br />
3、索引<br /><br />
查看索引个数和类别<br />
SQL&gt;select index_name,index_type,table_name from user_indexes order by table_name;<br /><br />
查看索引被索引的字段<br />
SQL&gt;select * from user_ind_columns where index_name=upper('&amp;index_name');<br /><br />
查看索引的大小<br />
SQL&gt;select sum(bytes)/(1024*1024) as "size(M)" from user_segments<br />
where segment_name=upper('&amp;index_name');<br /><br />
4、序列号<br /><br />
查看序列号，last_number是当前值<br />
SQL&gt;select * from user_sequences;<br /><br />
5、视图<br /><br />
查看视图的名称<br />
SQL&gt;select view_name from user_views;<br /><br />
查看创建视图的select语句<br />
SQL&gt;set view_name,text_length from user_views;<br />
SQL&gt;set long 2000; 说明：可以根据视图的text_length值设定set long 的大小<br />
SQL&gt;select text from user_views where view_name=upper('&amp;view_name');<br /><br />
6、同义词<br /><br />
查看同义词的名称<br />
SQL&gt;select * from user_synonyms;<br /><br />
7、约束条件<br /><br />
查看某表的约束条件<br />
SQL&gt;select constraint_name, constraint_type,search_condition, r_constraint_name<br />
from user_constraints where table_name = upper('&amp;table_name');<br /><br />
SQL&gt;select c.constraint_name,c.constraint_type,cc.column_name<br />
from user_constraints c,user_cons_columns cc<br />
where c.owner = upper('&amp;table_owner') and c.table_name = upper('&amp;table_name')<br />
and c.owner = cc.owner and c.constraint_name = cc.constraint_name<br />
order by cc.position;<br /><br />
8、存储函数和过程<br /><br />
查看函数和过程的状态<br />
SQL&gt;select object_name,status from user_objects where object_type='FUNCTION';<br />
SQL&gt;select object_name,status from user_objects where object_type='PROCEDURE';<br /><br />
查看函数和过程的源代码<br />
SQL&gt;select text from all_source where owner=user and name=upper('&amp;plsql_name');</span>
<img src ="http://www.blogjava.net/alex/aggbug/52203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-06-12 14:25 <a href="http://www.blogjava.net/alex/archive/2006/06/12/52203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]oracle 问题精解[how to列表]</title><link>http://www.blogjava.net/alex/archive/2006/06/12/52191.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Mon, 12 Jun 2006 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/06/12/52191.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/52191.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/06/12/52191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/52191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/52191.html</trackback:ping><description><![CDATA[
		<span style="font-size: 13px;">Q1.怎样创建表？<br />
A. CREATE TABLE ROYAL_MTABLE<br />
(<br />
RM_INT_FIELD INTEGER,<br />
RM_STR_FIELD VARCHAR2(64)<br />
)<br />
CREATE TABLE ROYAL_DTABLE<br />
(<br />
RD_INT_FIELD INTEGER,<br />
RD_STR_FIELD VARCHAR2(32)<br />
)<br />
Q2.怎样删除表？<br />
A. DROP TABLE ROYAL_DTABLE;<br />
Q3.怎样创建视图？<br />
A. CREATE OR REPLACE VIEW ROYAL_MDVIEW AS<br />
SELECT T1.RM_STR_FIELD AS F1, T2.RD_STR_FIELD AS F2 FROM ROYAL_MTABLE T1, ROYAL_DTABLE T2<br />
WHERE T1.RM_INT_FIELD = T2.RM_INT_FIELD<br />
Q4.怎样删除视图？<br />
A. DROP VIEW ROYAL_MDVIEW;<br />
Q5.怎样给表添加字段？<br />
A. ALTER TABLE ROYAL_DTABLE ADD RM_INT_FIELD INTEGER;<br />
Q6.怎样删除表中某个字段？<br />
A. ALTER TABLE ROYAL_DTABLE DROP COLUMN RM_INT_FIELD;<br />
Q7.怎样给某个字段添加约束？<br />
A. ALTER TABLE ROYAL_MTABLE MODIFY RM_STR_FIELD NOT NULL;<br />
Q8.怎样去除某个字段上的约束？<br />
A. ALTER TABLE ROYAL_MTABLE MODIFY RM_STR_FIELD NULL;<br />
Q9.怎样给表加上主键？<br />
A. ALTER TABLE ROYAL_MTABLE ADD CONSTRAINT PK_ROYAL_MTABLE PRIMARY KEY (RM_INT_FIELD);<br />
Q10.怎样删除表的主键？<br />
A. ALTER TABLE ROYAL_MTABLE DROP CONSTRAINT PK_ROYAL_MTABLE CASCADE;<br />
Q11.怎样给表添加一个外键？<br />
A. ALTER TABLE ROYAL_DTABLE ADD CONSTRAINT FK_ROYAL_DTABLE FOREIGN KEY
(RM_INT_FIELD) REFERENCES ROYAL_MTABLE (RM_INT_FIELD) ON DELETE CASCADE;<br />
Q12.怎样删除表的一个外键？<br />
A. ALTER TABLE ROYAL_DTABLE DROP CONSTRAINT FK_ROYAL_DTABLE;<br />
Q13.怎样给字段加上CHECK？<br />
A. ALTER TABLE ROYAL_MTABLE ADD CONSTRAINT CHK_RM_STR_FIELD CHECK (RM_STR_FIELD IN ('Y','N'));<br />
Q14.怎样去掉字段上的CHECK？<br />
A. ALTER TABLE ROYAL_MTABLE DROP CONSTRAINT CHK_RM_STR_FIELD;<br />
Q15.怎样给字段设置默认值？<br />
A. ALTER TABLE ROYAL_DTABLE MODIFY RD_STR_FIELD DEFAULT 'ROYAL';<br />
Q16.怎样移去字段的默认值？<br />
A. ALTER TABLE ROYAL_DTABLE MODIFY RD_STR_FIELD DEFAULT NULL;<br />
Q17.怎样创建索引？<br />
A. CREATE UNIQUE INDEX IDX_ROYAL_DTABLE ON ROYAL_DTABLE (RM_INT_FIELD);<br />
Q18.怎样删除索引？<br />
A. DROP INDEX IDX_ROYAL_DTABLE;<br />
Q19.怎样创建用户？<br />
A. CREATE USER TESTUSER IDENTIFIED EXTERNALLY DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP PROFILE DEFAULT;<br />
Q20.怎样删除用户？<br />
A. DROP USER TESTUSER CASCADE;<br />
21.怎样将对象权限（object privileges）授予用户？<br />
A. GRANT SELECT, INSERT, UPDATE, DELETE, ALTER ON ROYAL_MTABLE TO TESTUSER;<br />
GRANT INSERT, UPDATE, DELETE ON ROYAL_DTABLE TO TESTUSER;<br />
GRANT SELECT, ALTER ON ROYAL_DTABLE TO TESTUSER WITH GRANT OPTION;<br />
Q22.怎样从用户收回对象权限？<br />
A. REVOKE SELECT, INSERT, UPDATE, DELETE, ALTER ON ROYAL_DTABLE FROM TESTUSER;<br />
Q23.怎样将角色权限（role privileges）授予用户？<br />
A. GRANT CONNECT TO TESTUSER WITH ADMIN OPTION;<br />
GRANT DBA TO TESTUSER;<br />
Q24.怎样从用户收回角色权限？<br />
A. REVOKE DBA FROM TESTUSER;<br />
Q25.怎样将系统权限（system privileges）授予用户？<br />
A. GRANT ALTER ANY TABLE TO TESTUSER WITH ADMIN OPTION;<br />
Q26.怎样从用户收回系统权限？<br />
A. REVOKE ALTER ANY TABLE FROM TESTUSER;<br />
Q27.怎样创建序列？<br />
A. CREATE SEQUENCE RM_INT_FIELD_SEQ<br />
MINvalue 1<br />
MAXvalue 999999999999999999999999999<br />
START WITH 1<br />
INCREMENT BY 1<br />
CACHE 10<br />
ORDER;<br />
Q28.怎样删除序列？<br />
A. DROP SEQUENCE RM_INT_FIELD_SEQ;<br />
Q29.怎样获取序列值？<br />
A. SELECT RM_INT_FIELD_SEQ.NEXTVAL FROM DUAL;<br />
Q30.怎样创建角色？<br />
A. CREATE ROLE TESTROLE;<br />
Q31.怎样删除角色？<br />
A. DROP ROLE TESTROLE;<br />
Q32.怎样将对象权限（object privileges）授予角色？<br />
A. GRANT SELECT, INSERT, UPDATE, DELETE, ALTER ON ROYAL_MTABLE TO TESTROLE;<br />
Q33.怎样从角色收回对象权限？<br />
A. REVOKE SELECT, INSERT, UPDATE, DELETE, ALTER ON ROYAL_MTABLE FROM TESTROLE;<br />
Q34.怎样将角色权限（role privileges）授予角色？<br />
A. GRANT DBA TO TESTROLE;<br />
Q35.怎样从角色收回角色权限？<br />
A. REVOKE DBA FROM TESTROLE;<br />
Q36.怎样将系统权限（system privileges）授予角色？<br />
A. GRANT CREATE TABLE TO TESTROLE;<br />
Q37.怎样从角色收回系统权限？<br />
A. REVOKE CREATE TABLE FROM TESTROLE;<br />
Q38.不等于条件有哪几种写法？（茴香豆问题<img src="http://bbs.chinaunix.net/images/smilies/icon_smile.gif" align="absmiddle" border="0" />）<br />
A. SELECT * FROM ROYAL_MTABLE WHERE RM_STR_FIELD != 'Y';<br />
SELECT * FROM ROYAL_MTABLE WHERE RM_STR_FIELD ^= 'Y';<br />
SELECT * FROM ROYAL_MTABLE WHERE RM_STR_FIELD &lt;&gt; 'Y';<br />
Q39.like子句的用法？<br />
A. SELECT * FROM ROYAL_DTABLE WHERE RD_STR_FIELD LIKE '%Y%';<br />
SELECT * FROM ROYAL_DTABLE WHERE RD_STR_FIELD LIKE '_Y%';<br />
Q40.请举出一个where子查询简单例子？<br />
A. SELECT * FROM ROYAL_DTABLE WHERE RM_INT_FIELD IN (SELECT RM_INT_FIELD FROM ROYAL_MTABLE WHERE RM_STR_FIELD NOT IN ('Y','B'));<br />
Q41.Oracle常用字符串处理函数有哪些？<br />
A. || 连接两个字符串； LENGTH 字符串长度； TRIM/LTRIM/RTRIM 截断串左（右）指定字符串（包括空串）； LOWER/UPPER 将字符串转换为小/大写，等等。<br />
例如：SELECT RM_INT_FIELD||'--'||RM_STR_FIELD||'YES' FROM ROYAL_MTABLE;<br />
Q42.Oracle支持哪些数字处理函数？<br />
A.
Oracle支持所有常用数字函数，包括（但不限于）+、-、*、/、ABS、COS、EXP、LN、LOG、MOD、POWER、ROUND、SIN、
SINH、SQRT、TAN、TRUNC、AVG、COUNT、MAX、MIN、SUM、GREATEST、LEAST等等。<br />
例如：<br />
SELECT GREATEST(3, 4, 5)*4 FROM DUAL; <br />
SELECT POWER(2,3) FROM DUAL;<br />
Q43.怎样取得数据库服务器当前日期、时间？<br />
A. SELECT SYSDATE FROM DUAL; <br />
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') FROM DUAL;<br />
Q44.怎样将字符串转换为日期、时间格式？<br />
A. SELECT TO_DATE('2002-11-27', 'YYYY-MM-DD') FROM DUAL;<br />
SELECT TO_DATE('2002-11-27 09:28:55', 'YYYY-MM-DD HH:MI:SS') FROM DUAL;<br />
Q45.常用日期函数有哪些？<br />
A. NEXT_DAY LAST_DAY ADD_MONTHS MONTHS_BETWEEN等等。<br />
例如：SELECT LAST_DAY(SYSDATE) FROM DUAL;<br />
Q46.能给出一个DECODE函数用法的例子吗？<br />
A. DECODE函数的格式为DECODE(value, if1, then1, if2, then2...,else)。假设表ROYAL_DTABLE中有如下数据：<br />
RD_INT_FIELD RD_STR_FIELD RM_INT_FIELD<br />
-------------------------------------<br />
1 royal 1<br />
2 bill 2<br />
3 joy 1<br /><br />
请观察如下SQL语句输出结果。<br />
SELECT DECODE(RD_STR_FIELD, 'royal', 'royaltest', 'bill', 'billgates', RD_STR_FIELD) AS DC FROM ROYAL_DTABLE;<br />
DC<br />
---------<br />
royaltest<br />
billgates<br />
joy<br /><br />
Q47.能给出一个group by、having和order by用法的例子吗？<br />
A. SQL&gt; SELECT * FROM ROYAL_MTABLE;<br />
RM_INT_FIELD RM_STR_FIELD<br />
-------------------------<br />
1 Y<br />
2 N<br />
3 Y<br />
SQL&gt; SELECT * FROM ROYAL_DTABLE;<br />
RD_INT_FIELD RD_STR_FIELD RM_INT_FIELD<br />
--------------------------------------<br />
1 royal 1<br />
2 bill 2<br />
3 joy 1<br />
SQL&gt; SELECT RM_INT_FIELD, SUM(RD_INT_FIELD) FROM ROYAL_DTABLE GROUP
BY RM_INT_FIELD HAVING SUM(RD_INT_FIELD) &gt;= 2 ORDER BY
SUM(RD_INT_FIELD) ASC;<br /><br />
RM_INT_FIELD SUM(RD_INT_FIELD)<br />
------------------------------<br />
2 2<br />
1 4<br />
Q48.Oracle有哪些常用数据字典？<br />
A.
USER_TABLES(TABS)、USER_TAB_COLUMNS(COLS)、USER_VIEWS、USER_SEQUENCES(SEQ)、
USER_CONSTRAINTS、USER_CONS_COLUMNS、USER_TAB_COMMENTS、USER_COL_COMMENTS、
USER_INDEXES(IND)、USER_IND_COLUMNS、USER_USERS、DBA_USERS、ALL_USERS、
USER_TABLESPACES等等。<br />
例如：SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_ROYAL_DTABLE';<br />
Q49.怎样将日期、时间插入date型字段中？<br />
A. INSERT INTO ROYAL_MTABLE (RM_INT_FIELD, RM_STR_FIELD, RM_DATE_FIELD) valueS (9, 'Y', TO_DATE('2002-05-23', 'YYYY-MM-DD'));<br />
INSERT INTO ROYAL_MTABLE (RM_INT_FIELD, RM_STR_FIELD, RM_DATE_FIELD)
valueS (10, 'Y', TO_DATE('2002-10-10 8:23:33', 'YYYY-MM-DD HH:MI:SS'));<br />
Q50.能介绍一下connect by的用法吗？<br />
A. connect by子句提供了遍历“树”的手段。<br />
假设有这样一个表：CREATE TABLE ROYAL_TREETABLE (ID INTEGER, PARENT_ID INTEGER, NAME VARCHAR2(32));<br />
表中有如下数据：<br />
ID PARENT_ID NAME<br />
-----------------<br />
2 1 AAA<br />
3 1 BBB<br />
4 2 CCC<br />
5 2 DDD<br />
6 4 EEE<br />
8 7 GGG<br />
假如我们现在需要从NAME = 'EEE'的记录开始，向上查找所有有父子关系的记录，可执行如下SQL语句：<br />
SELECT * FROM ROYAL_TREETABLE START WITH NAME = 'EEE' CONNECT BY ID = PRIOR PARENT_ID;<br />
ID PARENT_ID NAME<br />
-----------------<br />
6 4 EEE<br />
4 2 CCC<br />
2 1 AAA</span>
<img src ="http://www.blogjava.net/alex/aggbug/52191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-06-12 13:52 <a href="http://www.blogjava.net/alex/archive/2006/06/12/52191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle实现自动插入自增长序列</title><link>http://www.blogjava.net/alex/archive/2006/06/08/51429.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 08 Jun 2006 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/06/08/51429.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/51429.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/06/08/51429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/51429.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/51429.html</trackback:ping><description><![CDATA[key words: Oracle自增长 sequence<br /><br />SqlServer 和MySql都有自增长的功能，Oracle必须建一个对应的sequence,有时候感觉不是很方便 。<br /><br />这次要实现在SqlServer中插入一条记录的时候自动在Oracle中增加一条对应的记录，sequence就有问题。<br /><br />最后用触发器搞定:<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">create or replace trigger mytable_trig_autoinc<br />before insert on </span><span style="color: rgb(0, 0, 0);">mytable</span><br /><span style="color: rgb(0, 0, 0);">for each row<br />begin<br />  if (:new.id is null) then<br />    select </span><span style="color: rgb(0, 0, 0);">mytable</span><span style="color: rgb(0, 0, 0);">_seq.nextval into :new.id from dual</span><span style="color: rgb(0, 128, 0);">;<br /></span><span style="color: rgb(0, 0, 0);">  end if</span><span style="color: rgb(0, 128, 0);">;<br /></span><span style="color: rgb(0, 0, 0);">end</span><span style="color: rgb(0, 128, 0);">;<br /></span></div><br /><img src ="http://www.blogjava.net/alex/aggbug/51429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-06-08 18:07 <a href="http://www.blogjava.net/alex/archive/2006/06/08/51429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle启动错误</title><link>http://www.blogjava.net/alex/archive/2006/06/06/50789.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 06 Jun 2006 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/06/06/50789.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/50789.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/06/06/50789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/50789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/50789.html</trackback:ping><description><![CDATA[    key words: "  shared memory realm does not exist"  Oracle10g启动错误<br /><br />上次安装的Oracle10g启动出现了问题，提示:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">ORACLE not available<br />ORA-</span><span style="color: rgb(0, 0, 0);">27101</span><span style="color: rgb(0, 0, 0);">: shared memory realm does not exist<br />Linux Error: </span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">: No such file or directory</span></div><br /><br /><br />google了一下，有人有如下提议:<br /><u>make sure that both ORACLE_HOME and ORACLE_SID are written correctly.<br />In past, I've got same error because ORACLE_HOME in init script was<br />/opt/oracle/9iR1/ but the real ORACLE_HOME was /opt/oracle/9iR1 without ending slash.<br />Yes, a simple slash implies two different installation.<br />If in your scritps/programs you use sometime /opt/oracle/9iR1 and sometime /opt/oracle/9iR1/<br />(with ending slash) you'll fall in troubble!.<br />When u got "shared memory realm does not exist " at first check du a "ps -fe | grep ora"<br />in order to make sure if the instance is running.<br />also, if you want see that "shared memory realm" you can type "ipcs". If oracle is alive you can see a<br />huge segment of memory (aslo know as SGA)</u><br /><br /><br />最后检查结果好像也不是这个，是配置文件出错,即服务名不一致:<br /><br />其中SERVICE_NAME与SID_NAME一定要和.bash_profile中的ORACLE_SID相一致，否则无法启动<br /><br /><img src ="http://www.blogjava.net/alex/aggbug/50789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-06-06 16:02 <a href="http://www.blogjava.net/alex/archive/2006/06/06/50789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]RHEL AS 3 安装及启动 Oracle10g 指南</title><link>http://www.blogjava.net/alex/archive/2006/05/09/45191.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 09 May 2006 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/05/09/45191.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/45191.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/05/09/45191.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/45191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/45191.html</trackback:ping><description><![CDATA[
		<p>
				<font size="4">
						<strong>转自: <a href="http://blog.csdn.net/casularm/archive/2006/02/22/605382.aspx">这里</a><br /></strong>
				</font>
		</p>
		<p>
				<font size="4">
						<strong>1. 配置RedHat AS 3</strong>
				</font>
		</p>
		<p>
				<font size="3">操作系统版本： <br />Red Hat Enterprise Linux AS release 3 (Taroon)<br />Kernel 2.4.21-4.EL on an i686 <br />按照常规来安装操作系统,记得要安装开发工具(gcc等必要工具). </font>
		</p>
		<p>
				<font size="4">
						<strong>1.1 检查必要的硬件信息</strong>
				</font>
		</p>
		<p>
				<font size="3">
						<table>
								<tbody>
										<tr>
												<td>
														<strong>
																<font size="3">检查内容</font>
														</strong>
												</td>
												<td>
														<strong>
																<font size="3">最小值</font>
														</strong>
												</td>
												<td>
														<strong>
																<font size="3">检查命令参考</font>
														</strong>
												</td>
										</tr>
										<tr>
												<td>
														<font size="3">物理内存</font>
												</td>
												<td>
														<font size="3">512M</font>
												</td>
												<td>
														<font size="3"># grep MemTotal /proc/meminfo </font>
												</td>
										</tr>
										<tr>
												<td>
														<font size="3">交换空间</font>
												</td>
												<td>
														<font size="3">1.0 GB或者2倍内存大小</font>
												</td>
												<td>
														<font size="3"># grep SwapTotal /proc/meminfo </font>
												</td>
										</tr>
										<tr>
												<td>
														<font size="3">/tmp 空间</font>
												</td>
												<td>
														<font size="3">400 MB </font>
												</td>
												<td>
														<font size="3"># df -k /tmp </font>
												</td>
										</tr>
										<tr>
												<td>
														<font size="3">软件所需空间</font>
												</td>
												<td>
														<font size="3">2.5 GB </font>
												</td>
												<td>
														<font size="3"># df -k (空间越大越好,如果是正式系统,应该进行详尽的规划) </font>
												</td>
										</tr>
										<tr>
												<td>
														<font size="3">数据库文件</font>
												</td>
												<td>
														<font size="3">1.2 GB </font>
												</td>
												<td>
														<font size="3"># df -k (空间越大越好,如果是正式系统,应该进行详尽的规划) </font>
												</td>
										</tr>
								</tbody>
						</table>
				</font>
				<font size="3">检查完如上各项之后, 应该修改核心参数.执行如下命令:</font>
		</p>
		<p>
				<font color="#0000ff" size="3">#vi /etc/sysctl.conf</font>
		</p>
		<p>
				<font size="3">#注释:<br />#表示使用root用户操作,$表示使用oracle 用户进行操作.提示符后面的蓝色部分表示需要输入的命令，以下同． </font>
		</p>
		<p>
				<font size="3">在该文件末尾加入如下内容: <br /><font color="#000080">kernel.shmall = 2097152 <br />kernel.shmmax = 2147483648 <br />kernel.shmmni = 4096 <br />kernel.sem = 250 32000 100 128 <br />fs.file-max = 65536 <br />net.ipv4.ip_local_port_range = 1024 65000</font></font>
		</p>
		<p>
				<font size="3">编辑完之后,保存,执行 <font color="#0000ff"># /sbin/sysctl -p</font> 命令操作来使我们所做的变更生效. <br />注:上面kernel.shmmax/kernel.sem等是典型的核心参数配置.您可能需要根据您的实际环境进行适当的变动. </font>
		</p>
		<p>
				<font size="3">关于这些核心参数的说明在Oracle的 Oracle9i Installation Guide Release 2 (9.2.0.1.0) for UNIX Systems 中有很详细的说明.( </font>
				<a href="http://download-west.oracle.com/docs/html/A96167_01/toc.htm">
						<font size="3">http://download-west.oracle.com/docs/html/A96167_01/toc.htm</font>
				</a>
				<font size="3"> ) </font>
		</p>
		<p>
				<font size="3">然后,应该检查一下上面的操作是否正确: <br /><font color="#0000ff"># /sbin/sysctl -a | grep sem <br /># /sbin/sysctl -a | grep shm<br /># /sbin/sysctl -a | grep file-max<br /># /sbin/sysctl -a | grep ip_local_port_range</font></font>
		</p>
		<p>
				<font size="3">为Oracle用户设定Shell的限制<br />一般来说，出于性能上的考虑,还需要需要进行如下的设定，以便改进Oracle用户的有关 nofile(可打开的文件描述符的最大数)和nproc(单个用户可用的最大进程数量)</font>
		</p>
		<p>
				<font size="3">
						<font color="#0000ff"># vi /etc/security/limits.conf</font>
						<br /># 添加如下的行</font>
		</p>
		<p>
				<font color="#000080" size="3">*               soft    nproc   2047<br />*               hard    nproc   16384<br />*               soft    nofile  1024<br />*               hard    nofile  65536</font>
		</p>
		<p>
				<font size="3">添加如下的行到/etc/pam.d/login 文件： <br /><font color="#000080">session    required     /lib/security/pam_limits.so</font></font>
		</p>
		<p>
				<font size="3">编辑 /etc/profile 文件,添加如下部分： <br /><font color="#000080">if [ $USER = "oracle" ]; then  <br />        if [ $SHELL = "/bin/ksh" ]; then  <br />                ulimit -p 16384  <br />                ulimit -n 65536  <br />        else  <br />                ulimit -u 16384 -n 65536  <br />        fi  <br />fi<br /></font>之后，执行<font color="#0000ff">$ ulimit</font> 验证一下.</font>
		</p>
		<p>
				<font size="3">
						<font size="4">
								<strong>1.2 检查并安装相关补丁</strong>
						</font>
						<br />在这个版本的RHEL上安装Oracle,必须要有几个软件包. 确认以下 rpm包都已经安装: </font>
		</p>
		<p>
				<font size="3">make-3.79<br />binutils-2.11<br />openmotif-2.2.2-16<br />setarch-1.3-1 <br />compat-db-4.0.14.5<br />compat-gcc-7.3-2.96.122<br />compat-gcc-c++-7.3-2.96.122<br />compat-libstdc++-7.3-2.96.122<br />compat-libstdc++-devel-7.3-2.96.122</font>
		</p>
		<p>
				<font size="3">
						<font color="#0000ff"># rpm -qa | grep compat</font>
						<br /># 在机器上输出如下:</font>
		</p>
		<p>
				<font color="#800080" size="3">compat-gcc-c++-7.3-2.96.122<br />compat-libstdc++-7.3-2.96.122<br />compat-libstdc++-devel-7.3-2.96.122<br />compat-glibc-7.x-2.2.4.32.5<br />compat-db-4.0.14-5<br />compat-gcc-7.3-2.96.122</font>
		</p>
		<p>
				<font size="3">
						<font color="#0000ff"># rpm -qa | grep openmotif</font>
						<br />
						<font color="#800080">openmotif-devel-2.2.2-16<br />openmotif-2.2.2-16</font>
				</font>
		</p>
		<p>
				<font size="3">
						<font color="#0000ff"># rpm -qa | grep setarch</font>
						<br />
						<font color="#800080">setarch-1.3-1</font>
				</font>
		</p>
		<p>
				<br />
				<font size="3">上面显示的内容是在笔者已经安装了具体的RPM包之后的结果.一般情况下,你的系统上的输出结果和这个不同.如果个别包没有安装,把系统安装光盘mount上,找到具体的软件包(大多数在第三张光盘上),然后利用如下的命令来安装相应的包: <br /><font color="#0000ff"># rpm -ivh *.rpm</font></font>
		</p>
		<p>
				<font size="3">要额外注意的是,这些软件包之间是有依赖性的,先后的顺序要找好.否则会报告不能安装的错误. 此外，最好验证一下 gcc和glibc的版本(要求是gcc-3.2.3-2 或者更高): <br /><font color="#0000ff">#gcc -v <br />#rpm -q glibc</font></font>
		</p>
		<p>
				<font size="3">
						<font size="4">
								<strong>1.3 创建用户和相关的组</strong>
						</font>
						<br />
						<font color="#0000ff"># /usr/sbin/groupadd oinstall<br /># /usr/sbin/groupadd dba<br /># /usr/sbin/useradd -g oinstall -G dba oracle</font>　</font>
		</p>
		<p>
				<font size="3">如果只是测试目的的话，不创建oinstall组也没什么. 不过还是规范一点比较好.如果oracle 用户和dba组等已经存在，作适当的调整即可. </font>
		</p>
		<p>
				<font size="3">
						<font size="4">
								<strong>1.4 检查并调整环境变量</strong>
								<br />
						</font>登录为oracle用户</font>
		</p>
		<p>
				<font color="#0000ff" size="3"># su - oracle<br />$ cd <br />$ vi .bash_profile</font>
		</p>
		<p>
				<font size="3">#添加如下内容,你的具体值应该不会和这个完全相同. <br /><font color="#000080">export ORACLE_BASE=/oracle<br />export ORACLE_HOME=$ORACLE_BASE/product/dbse<br />export ORACLE_SID=orcl<br />export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin<br />export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib<br />export LC_CTYPE=en_US.UTF-8</font></font>
		</p>
		<p>
				<font size="3">然后执行 <br /><font color="#0000ff">$ source .bash_profile</font></font>
		</p>
		<p>
				<font size="3">使环境变量生效. /oracle 等目录应该建立好并做合适的授权. </font>
		</p>
		<p>
				<font size="3">
						<font size="4">
								<strong>2. 安装Orale10g</strong>
						</font>
						<br />mount安装盘.由于10g无法以root安装，以前面建的oracle用户登录.执行:</font>
		</p>
		<p>
				<font size="3">
						<font color="#0000ff">$ ./runInstaller</font>
				</font>
		</p>
		<p>
				<font size="3">按照提示安装即可，最后还需要以root运行两个脚本。</font>
		</p>
		<p>
				<font size="3">
						<font size="4">
								<strong>3. 配置TNS参数</strong>
						</font>
						<br />在 /oracle/product/dbse/network/admin/ 目录下有 listener.ora 和 tnsnames.ora 两个文件，设置如下：</font>
		</p>
		<p>
				<font color="#000080" size="3">#listener.ora<br />SID_LIST_LISTENER =<br />  (SID_LIST =<br />     (SID_DESC =<br />      (GLOBAL_DBNAME = orcl)<br />      (ORACLE_HOME = /oracle/product/dbse)<br />      (SID_NAME = orcl)<br />     )<br />  )</font>
		</p>
		<p>
				<font color="#000080" size="3">LISTENER =<br />  (DESCRIPTION_LIST =<br />    (DESCRIPTION =<br />        (ADDRESS_LIST =<br />      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))<br />        )<br />        (ADDRESS_LIST =<br />      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))<br />        )<br />    )<br />  )</font>
		</p>
		<p>
				<font color="#000080" size="3">#tnsnames.ora<br />ORCL =<br />  (DESCRIPTION =<br />    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))<br />    (CONNECT_DATA =<br />      (SERVER = DEDICATED)<br />      (SERVICE_NAME = orcl)<br />    )<br />  )</font>
		</p>
		<p>
				<font color="#000080" size="3">EXTPROC_CONNECTION_DATA =<br />  (DESCRIPTION =<br />      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))<br />        (CONNECT_DATA =<br />      (SID = PLSExtProc)<br />      (PRESENTATION = RO)<br />    )<br />  )</font>
		</p>
		<p>
				<font size="3">其中SERVICE_NAME与SID_NAME一定要和.bash_profile中的ORACLE_SID相一致，否则无法启动</font>
		</p>
		<p>
				<font size="3">
						<font size="4">
								<strong>4. 启动Oracle</strong>
						</font>
						<br />以oracle用户登录</font>
		</p>
		<p>
				<font size="3">
						<font size="4">
								<strong>4.1 启动TNS监听器</strong>
						</font>
						<br />
						<font color="#0000ff">$ lsnrctl start<br /></font>出现如下显示，表示监听服务成功开启<br /><font color="#800080">LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 22-FEB-2006 10:24:03</font></font>
		</p>
		<p>
				<font color="#800080" size="3">Copyright (c) 1991, 2005, Oracle.  All rights reserved.</font>
		</p>
		<p>
				<font color="#800080" size="3">Starting /oracle/product/dbse/bin/tnslsnr: please wait...</font>
		</p>
		<p>
				<font color="#800080" size="3">TNSLSNR for Linux: Version 10.2.0.1.0 - Production<br />System parameter file is /oracle/product/dbse/network/admin/listener.ora<br />Log messages written to /oracle/product/dbse/network/log/listener.log<br />Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))<br />Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))</font>
		</p>
		<p>
				<font color="#800080" size="3">Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))<br />STATUS of the LISTENER<br />------------------------<br />Alias                     LISTENER<br />Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production<br />Start Date                22-FEB-2006 10:24:03<br />Uptime                    0 days 0 hr. 0 min. 0 sec<br />Trace Level               off<br />Security                  ON: Local OS Authentication<br />SNMP                      OFF<br />Listener Parameter File   /oracle/product/dbse/network/admin/listener.ora<br />Listener Log File         /oracle/product/dbse/network/log/listener.log<br />Listening Endpoints Summary...<br />  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))<br />  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))<br />Services Summary...<br />Service "orcl" has 1 instance(s).<br />  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...<br />The command completed successfully</font>
		</p>
		<p>
				<br />
				<font size="3">
						<font size="4">
								<strong>4.2启动数据库</strong>
						</font>
				</font>
				<font size="3">
						<br />9i 之后已经没有 svrmgrl 了，所有的管理工作都通过 sqlplus 来完成： <br /><font color="#0000ff">$ sqlplus /nolog <br />SQL&gt; connect system/change_on_install as sysdba <br />SQL&gt; startup</font></font>
		</p>
		<p>
				<font size="3">出现如下显示，表示Oracle已经成功启动<br /><font color="#800080">ORACLE instance started.</font></font>
		</p>
		<p>
				<font color="#800080" size="3">Total System Global Area  285212672 bytes<br />Fixed Size                  1218968 bytes<br />Variable Size              88082024 bytes<br />Database Buffers          188743680 bytes<br />Redo Buffers                7168000 bytes<br />Database mounted.<br />Database opened.</font>
		</p>
		<p>
				<font color="#000000" size="3">
						<strong>4.3 自动启动与关闭</strong>
				</font>
		</p>
		<p>
				<font size="3">编辑 /etc/oratab ，把所有的 instance 的重启动标志设置成 'Y'，如: <br /><font color="#000080">orcl:/oracle/product/dbse:Y</font><br /><br />做一个启动脚本 /etc/init.d/dbora ，如下所示: <br /><br /><font color="#000080">#!/bin/sh <br /># description: Oracle auto start-stop script. <br /># chkconfig: - 20 80 <br /># <br /># Set ORA_HOME to be equivalent to the $ORACLE_HOME <br /># from which you wish to execute dbstart and dbshut; <br /># <br /># Set ORA_OWNER to the user id of the owner of the <br /># Oracle database in ORA_HOME. <br /><br />ORA_HOME=/oracle/product/dbse <br />ORA_OWNER=oracle <br />if [ ! -f $ORA_HOME/bin/dbstart ] <br />then <br />echo "Oracle startup: cannot start" <br />exit <br />fi <br />case "$1" in <br />'start') <br /><br /># Start the Oracle databases: <br /># The following command assumes that the oracle login <br /># will not prompt the user for any values <br /><br />su - $ORA_OWNER -c $ORA_HOME/bin/dbstart <br />su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start" <br />;; <br />'stop') <br /><br /># Stop the Oracle databases: <br /># The following command assumes that the oracle login <br /># will not prompt the user for any values <br /><br />su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop" <br />su - $ORA_OWNER -c $ORA_HOME/bin/dbshut <br />;; <br />'restart') <br />$0 stop <br />$0 start <br />;; <br />esac <br /></font><br />赋予执行权限 <br /><font color="#0000ff">chmod 750 /etc/init.d/dbora</font><br /><br />作成以下链接: <br /><font color="#0000ff">ln -s /etc/init.d/dbora /etc/rc0.d/K10dbora <br />ln -s /etc/init.d/dbora /etc/rc3.d/S99dbora</font><br /><br />执行以下命令: <br /><font color="#0000ff">chkconfig --level 345 dbora on</font><br /><br />这样就OK了。下次开关机的时候，Oracle也会随之启动/停止。</font>
		</p>
		<p>
				<font size="3">参考信息</font>
		</p>
		<p>
				<font size="3">http://www.dbanotes.net</font>
		</p>
<img src ="http://www.blogjava.net/alex/aggbug/45191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-05-09 13:12 <a href="http://www.blogjava.net/alex/archive/2006/05/09/45191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>