﻿<?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-孤灯野火-文章分类-数据库</title><link>http://www.blogjava.net/liudawei/category/46358.html</link><description>畅想的天空</description><language>zh-cn</language><lastBuildDate>Thu, 01 Dec 2011 04:44:55 GMT</lastBuildDate><pubDate>Thu, 01 Dec 2011 04:44:55 GMT</pubDate><ttl>60</ttl><item><title>Oracle创建临时表</title><link>http://www.blogjava.net/liudawei/articles/364123.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Thu, 17 Nov 2011 10:45:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/364123.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/364123.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/364123.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/364123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/364123.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #626a0f; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f4f0e8; "><div style="line-height: 25px; ">当缓存中间数据时候，需要创建一个临时表，其实oracle本身在这方面就已经考虑很全了，除非有些高级应用，我再考虑自己创建临时表。目前所有使用Oracle作为数据库支撑平台的应用，大部分数据量比较庞大的系统，即表的数据量一般情况下都是在百万级以上的数据量。当然在Oracle中创建分区是一种不错的选择，但是当你发现你的应用有多张表关联的时候，并且这些表大部分都是比较庞大，而你关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快，那么这个时候我考虑在Oracle中创建&#8220;临时表&#8221;。</div><div style="line-height: 25px; ">&nbsp;</div><div style="line-height: 25px; ">&nbsp;我对临时表的理解：在Oracle中创建一张表，这个表不用于其他的什么功能，主要用于自己的软件系统一些特有功能才用的，而当你用完之后表中的数据就没用了。Oracle的临时表创建之后基本不占用表空间，如果你没有指定临时表（包括临时表的索引）存放的表空的时候，你插入到临时表的数据是存放在ORACLE系统的临时表空间中（TEMP）。</div><div style="line-height: 25px; ">&nbsp;</div><div style="line-height: 25px; ">&nbsp;</div><div style="line-height: 25px; ">2、临时表的创建</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">创建Oracle临时表，可以有两种类型的临时表：</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">会话级的临时表</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">事务级的临时表。</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">1） 会话级的临时表因为这这个临时表中的数据和你的当前会话有关系，当你当前SESSION不退出的情况下，临时表中的数据就还存在，而当你退出当前SESSION的时候，临时表中的数据就全部没有了，当然这个时候你如果以另外一个SESSION登陆的时候是看不到另外一个SESSION中插入到临时表中的数据的。即两个不同的SESSION所插入的数据是互不相干的。当某一个SESSION退出之后临时表中的数据就被截断（truncate table，即数据清空）了。会话级的临时表创建方法：</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">Create Global Temporary Table Table_Name</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">(Col1 Type1,Col2 Type2...) On Commit Preserve Rows；</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">举例：</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">create global temporary table Student</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">(Stu_id Number(5),</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">Class_id &nbsp;Number(5),</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">Stu_Name Varchar2(8),</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">Stu_Memo varchar2(200)) on Commit Preserve Rows ;</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">2） 事务级临时表是指该临时表与事务相关，当进行事务提交或者事务回滚的时候，临时表中的数据将自行被截断，其他的内容和会话级的临时表的一致（包括退出SESSION的时候，事务级的临时表也会被自动截断）。事务级临时表的创建方法：</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">Create Global Temporary Table Table_Name</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">(Col1 Type1,Col2 Type2...) On Commit Delete Rows；</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">举例：</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">create global temporary table Classes</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">(Class_id Number(5),</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">Class_Name Varchar2(8),</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">Class_Memo varchar2(200)) on Commit delete Rows ;</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">3） &nbsp;两中类型临时表的区别</div><div style="line-height: 25px; ">会话级临时表采用on commit preserve rows；而事务级则采用on commit delete rows；用法上，会话级别只有当会话结束临时表中的数据才会被截断，而且事务级临时表则不管是commit、rollback或者是会话结束，临时表中的数据都将被截断</div><div style="line-height: 25px; ">&nbsp;</div><div style="line-height: 25px; ">4）什么时候使用临时表</div><div style="line-height: 25px; ">&nbsp;</div><div style="line-height: 25px; ">1）、当某一个SQL语句关联的表在2张及以上，并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中</div><div style="line-height: 25px; ">2）、程序执行过程中可能需要存放一些临时的数据，这些数据在整个程序的会话过程中都需要用的等等。</div><div style="line-height: 25px; ">&nbsp;</div><div style="line-height: 25px; ">&nbsp;</div><div style="line-height: 25px; ">3．例子：略</div><div style="line-height: 25px; ">4．临时表的不足之处</div><div style="line-height: 25px; ">&nbsp;</div><div style="line-height: 25px; ">&nbsp;&nbsp; &nbsp;1）不支持lob对象，这也许是设计者基于运行效率的考虑，但实际应用中确实需要此功能时就无法使用临时表了。</div><div style="line-height: 25px; ">2）不支持主外键关系</div><div style="line-height: 25px; ">&nbsp;</div><div style="line-height: 25px; ">所以，由于以上原因，我们可以自己创建临时表，以弥补oracle临时表的不足之处</div><div style="line-height: 25px; ">&nbsp;</div><div style="line-height: 25px; ">上面的都是本人经过测试的，但下面是在网上搜索到的方法，本人具体没有测试过，不过觉得可行性很强，有时间测试下</div><div style="line-height: 25px; ">&nbsp;</div><div style="line-height: 25px; ">&nbsp;&nbsp; 创建方法：</div><div style="line-height: 25px; ">&nbsp;&nbsp; &nbsp; &nbsp;1、以常规表的形式创建临时数据表的表结构，但要在每一个表的主键中加入一个 SessionID &lt;NUMBER&gt; 列以区分不同的会话。（可以有lob列和主外键）</div><div style="line-height: 25px; ">2、写一个用户注销触发器，在用户结束会话的时候删除本次会话所插入的所有记录(SessionID等于本次会话ID的记录)。</div><div style="line-height: 25px; ">3、程序写入数据时，要顺便将当前的会话ID(SessionID)写入表中。</div><div style="line-height: 25px; ">4、程序读取数据时，只读取与当前会话ID相同的记录即可。</div><div style="line-height: 25px; ">&nbsp;&nbsp; 功能增强的扩展设计：</div><div style="line-height: 25px; ">　　1、可以在数据表上建立一个视图，视图对记录的筛选条件就是当前会话的SessionID。</div><div style="line-height: 25px; ">　　2、数据表中的SessionID列可以通过Trigger实现，以实现对应用层的透明性。</div><div style="line-height: 25px; ">　　3、高级用户可以访问全局数据，以实现更加复杂的功能。</div><div style="line-height: 25px; "></div><div style="line-height: 25px; ">　　扩展临时表的优点：</div><div style="line-height: 25px; ">　　1、实现了与Oracle的基于会话的临时表相同的功能。</div><div style="line-height: 25px; ">　　2、支持SDO_GEOMETRY等lob数据类型。</div><div style="line-height: 25px; ">　　3、支持表间的主外键连接，且主外键连接也是基于会话的。</div><div style="line-height: 25px; ">　　4、高级用户可以访问全局数据，以实现更加复杂的功能</div></span><img src ="http://www.blogjava.net/liudawei/aggbug/364123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-11-17 18:45 <a href="http://www.blogjava.net/liudawei/articles/364123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE 中ROWNUM用法总结! </title><link>http://www.blogjava.net/liudawei/articles/362867.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Sat, 05 Nov 2011 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/362867.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/362867.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/362867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/362867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/362867.html</trackback:ping><description><![CDATA[
对于 Oracle 的 rownum <br />问题，很多资料都说不支持&gt;,&gt;=,=,between...and，只能用以上符号(&lt;、&lt;=、!=)，并非说用&gt;,&gt;=,=,between..and <br />时会提示SQL语法错误，而是经常是查不出一条记录来，还会出现似乎是莫名其妙的结果来，其实您只要理解好了这个 rownum <br />伪列的意义就不应该感到惊奇，同样是伪列，rownum 与 rowid 可有些不一样，下面以例子说明<br /><p>假设某个表 t1(c1) 有 20 条记录</p><br /><p>如果用 select rownum,c1 from t1 where rownum &lt; 10, <br />只要是用小于号，查出来的结果很容易地与一般理解在概念上能达成一致，应该不会有任何疑问的。</p><br /><p>可如果用 select rownum,c1 from t1 where rownum &gt; 10 <br />(如果写下这样的查询语句，这时候在您的头脑中应该是想得到表中后面10条记录)，你就会发现，显示出来的结果要让您失望了，也许您还会怀疑是不谁删了一些记录，然后查看记录数，仍然是 <br />20 条啊？那问题是出在哪呢？</p><br /><p>先好好理解 rownum 的意义吧。因为ROWNUM是对结果集加的一个伪列，即先查到结果集之后再加上去的一个列 (强调：先要有结果集)。简单的说 <br />rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1，而有其他大于1的值。所以您没办法期望得到下面的结果集：</p><br /><p>11 aaaaaaaa<br />12 bbbbbbb<br />13 ccccccc<br />.................</p><br /><p>rownum &gt;10 没有记录，因为第一条不满足去掉的话，第二条的ROWNUM又成了1，所以永远没有满足条件的记录。或者可以这样理解：</p><br /><p>ROWNUM是一个序列，是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1，第二条为2，依次类推。如果你用&gt;,&gt;=,=,between...and这些条件，因为从缓冲区或数据文件中得到的第一条记录的rownum为1，则被删除，接着取下条，可是它的rownum还是1，又被删除，依次类推，便没有了数据。</p><br /><p>有了以上从不同方面建立起来的对 rownum 的概念，那我们可以来认识使用 rownum 的几种现像</p><br /><p>1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢？它与 select <br />rownum,c1 from tablename where rownum &lt; 10 返回的结果集是一样的呢？<br />因为是在查询到结果集后，显示完第 9 <br />条记录后，之后的记录也都是 != 10,或者 &gt;=10,所以只显示前面9条记录。也可以这样理解，rownum 为9后的记录的 rownum为10，因条件为 <br />!=10，所以去掉，其后记录补上，rownum又是10，也去掉，如果下去也就只会显示前面9条记录了</p><br /><p>2. 为什么 rownum &gt;1 时查不到一条记录，而 rownum &gt;0 或 rownum &gt;=1 却总显示所以的记录<br />因为 <br />rownum 是在查询到的结果集后加上去的，它总是从1开始</p><br /><p>3. 为什么 between 1 and 10 或者 between 0 and 10 能查到结果，而用 between 2 and 10 <br />却得不到结果<br />原因同上一样，因为 rownum 总是从 1 开始</p><br /><p>从上可以看出，任何时候想把 rownum = 1 这条记录抛弃是不对的，它在结果集中是不可或缺的，少了rownum=1 就像空中楼阁一般不能存在，所以你的 <br />rownum 条件要包含到 1 </p><br /><p>但如果就是想要用 rownum &gt; 10 这种条件的话话就要用嵌套语句,把 rownum 先生成，然后对他进行查询。<br />select * <br /><br />from (selet rownum as rn，t1.* from a where ...)<br />where rn &gt;10</p><br /><p>一般代码中对结果集进行分页就是这么干的。</p><br /><p>另外：rowid 与 rownum 虽都被称为伪列，但它们的存在方式是不一样的，rowid <br />可以说是物理存在的，表示记录在表空间中的唯一位置ID，在DB中唯一。只要记录没被搬动过，rowid是不变的。rowid 相对于表来说又像表中的一般列，所以以 <br />rowid 为条件就不会有 rownum那些情况发生。<br />另外还要注意：rownum不能以任何基表的名称作为前缀。</p><br /><script type="text/javascript">
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
var isLogined = false;
var cb_blogId = 19791;
var cb_entryId = 911685;
var cb_blogApp = "chinhr";
var cb_blogUserGuid = "9359360b-63cf-dd11-9e4d-001cf0cd104b";
var cb_entryCreatedDate = '2007/9/30 11:17:00';
</script><br /> 
<img src ="http://www.blogjava.net/liudawei/aggbug/362867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-11-05 23:56 <a href="http://www.blogjava.net/liudawei/articles/362867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>left join如何去除重复数据</title><link>http://www.blogjava.net/liudawei/articles/362593.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Thu, 03 Nov 2011 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/362593.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/362593.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/362593.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/362593.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/362593.html</trackback:ping><description><![CDATA[<div><div><span style="color: #3366ff; ">--大概思路：如果是从主表一直left join 子表 ,distinct业务层次最底层的子表ID</span></div><div><span style="color: #3366ff; ">--wz_xqjhd 物资需求计划单</span></div><div><span style="color: #3366ff; ">--wz_zbbd 物资招标标段</span></div><div><span style="color: #3366ff; ">--WZ_ZBBDQB 招标标段签报</span></div><div><span style="color: #3366ff; ">--wz_yzbfa 物资预中标方案</span></div><div><span style="color: #3366ff; ">--wz_qbzb 物资签报主表</span></div><div><span style="color: #3366ff; ">--wz_zbjg 物资中标结果</span></div><div><span style="color: #3366ff; ">--jhtm 计划条目</span></div><div><span style="color: #3366ff; ">--jhtmfp 计划条目分配</span></div><div></div><div><span style="color: #3366ff; ">--以上表关系 ：wz_xqjhd(1:n)wz_zbbd &nbsp;wz_xqjhd(1:n) wz_zbjg</span></div><div><span style="color: #3366ff; ">-- wz_yzbfa(1:n)wz_zbbd &nbsp;wz_qbzb(1:n)WZ_ZBBDQB &nbsp;wz_zbbd(1:n)WZ_ZBBDQB &nbsp;WZ_ZBBDQB相当于中间表</span></div><div><span style="color: #3366ff; ">-- wz_xqjhd(1:n) wz_zbjg</span></div><div><span style="color: #3366ff; ">-- jhtmfp 为wz_jhtm与wz_zbbd的中间表</span></div><div><span style="color: #3366ff; ">-- wz_jhtm 条目一层 相当于是业务的最低层 这个时候可以distinct去过滤最底层数据</span></div><div></div><div>select distinct(jhtm.jhtm_id) ,xqjhd.*,zbbd.*,jhtm.* from wz_xqjhd xqjhd</div><div>&nbsp; &nbsp; left join wz_zbbd zbbd on zbbd.xqjhd_id = xqjhd.xqjhd_id</div><div>&nbsp; &nbsp; left join WZ_ZBBDQB zbbdqb on zbbdqb.zbbd_id=zbbd.zbbd_id</div><div>&nbsp; &nbsp; left join wz_yzbfa yzbfa on yzbfa.yzbfa_id=zbbd.yzbfa_id</div><div>&nbsp; &nbsp; left join wz_qbzb qbzb on qbzb.qb_id=zbbdqb.dbqb_id</div><div>&nbsp; &nbsp; left join wz_zbjg zbjg on zbjg.Xqjhd_Id=xqjhd.xqjhd_id</div><div>&nbsp; &nbsp; left join wz_jhtm jhtm on jhtm.xqjhd_id=xqjhd.xqjhd_id</div><div>&nbsp; &nbsp; left join wz_jhtmfp jhtmfp on jhtmfp.jhtm_id=jhtm.jhtm_id and jhtmfp.zbbd_id=zbbd.zbbd_id;<br /><br />以上是从主表关联子表 一层一层来的，下面是从子表开始：<br /><div><div>&nbsp; &nbsp;select distinct(jhtm.jhtm_id) ,xqjhd.*,zbbd.*,jhtm.* from wz_jhtm jhtm</div><div>&nbsp; &nbsp; left join wz_jhtmfp jhtmfp on jhtmfp.jhtm_id=jhtm.jhtm_id&nbsp;</div><div>&nbsp; &nbsp; left join wz_zbbd zbbd on jhtmfp.zbbd_id = zbbd.zbbd_id</div><div>&nbsp; &nbsp; left join WZ_ZBBDQB zbbdqb on zbbdqb.zbbd_id=zbbd.zbbd_id</div><div>&nbsp; &nbsp; left join wz_yzbfa yzbfa on yzbfa.yzbfa_id=zbbd.yzbfa_id</div><div>&nbsp; &nbsp; left join wz_qbzb qbzb on qbzb.qb_id=zbbdqb.dbqb_id</div><div>&nbsp; &nbsp; left join wz_xqjhd xqjhd on xqjhd.xqjhd_id=jhtm.xqjhd_id</div><div>&nbsp; &nbsp; left join wz_zbjg zbjg on zbjg.Xqjhd_Id=xqjhd.xqjhd_id</div></div><br />从主表开始left join还是子表开始，具体得看业务逻辑，参考的具体层次</div></div><img src ="http://www.blogjava.net/liudawei/aggbug/362593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-11-03 10:52 <a href="http://www.blogjava.net/liudawei/articles/362593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE导出导入</title><link>http://www.blogjava.net/liudawei/articles/362562.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Wed, 02 Nov 2011 11:42:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/362562.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/362562.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/362562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/362562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/362562.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #5e5e5e; font-family: Verdana, Helvetica, Arial; font-size: 13px; line-height: 18px; background-color: #ffffff; "><p><span style="font-size: 10pt; ">一. 创建表并插入数据</span></p><p><span style="font-size: 10pt; ">SQL&gt; create table t1 as select * from scott.dept;</span></p><p><span style="font-size: 10pt; ">Table created.</span></p><p><span style="font-size: 10pt; ">SQL&gt; select * from t1;</span></p><p><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp; DEPTNO DNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />---------- -------------- -------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 ACCOUNTING&nbsp;&nbsp;&nbsp;&nbsp; NEW YORK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 RESEARCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DALLAS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 SALES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHICAGO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40 OPERATIONS&nbsp;&nbsp;&nbsp;&nbsp; BOSTON&nbsp;&nbsp;&nbsp;<br /><br />二. 导出</span></p><p><span style="font-size: 10pt; ">SQL&gt; exp&nbsp; -- 找不到该命令<br />SP2-0042: unknown command "exp" - rest of line ignored.<br />SQL&gt; host exp&nbsp; -- 在exp命令前加上host&nbsp;<br /><br />提示输入<br />username:&nbsp;&nbsp;</span><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#99;&#111;&#116;&#116;&#47;&#116;&#105;&#103;&#101;&#114;&#64;&#111;&#114;&#99;&#108;" style="color: #8d8c8c; text-decoration: none; "><span style="font-size: 10pt; ">scott/tiger@orcl</span></a><span style="font-size: 10pt; ">&nbsp;&nbsp; --如果是管理员则加上 as sysdba<br /><br />Enter array fetch buffer size: 4096 &gt; 回车<br /><br />Export file: Expdat.dmp &gt; e:\testexp.dmp&nbsp; --&nbsp;导出文件存放位置<br /><br />(2)U(sers), or (3)(ables): (2)U &gt;&nbsp;回车 -- 导出方式, 这里只列出用户方式和表方式, 如果是以管理员身份, 则有三种方式, 即整个数据库.<br /><br />Export grants (yes/no): yes &gt;&nbsp;回车 --是否导出权限<br /><br />Export table data (yes/no): yes &gt;回车 -- 是否导出表中数据<br /><br />compress extents (yes/no): yes &gt;回车 -- 是否用压缩区<br /><br />...&nbsp; 这样就把scott的所有对象导出了.<br /><br /><br /><br />三. 导入<br /><br />SQL&gt; imp&nbsp; -- 找不到该命令<br />SP2-0042: unknown command "imp" - rest of line ignored.<br />SQL&gt; host imp -- 在imp命令前加上host&nbsp;<br /><br />提示输入<br />username:&nbsp;&nbsp;</span><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#99;&#111;&#116;&#116;&#47;&#116;&#105;&#103;&#101;&#114;&#64;&#111;&#114;&#99;&#108;" style="color: #8d8c8c; text-decoration: none; "><span style="font-size: 10pt; ">scott/tiger@orcl</span></a><span style="font-size: 10pt; ">&nbsp;&nbsp; --如果是管理员则加上 as sysdba<br /><br />Import file: EXPDAT.DMP &gt; e:\testexp.dmp&nbsp; --&nbsp;导入文件存放位置<br /><br />Enter insert buffer size (minimum is 8192) 30720) &gt;回车<br /><br />List contents of import file only(yes/no): no &gt;回车<br /><br />ignore create error due to object existence (yes/no): no &gt; yes -- 如果对象已经存在, 则忽略<br /><br />import grants (yes/no): yes &gt;回车 -- 是否导入权限<br /><br />import table data (yes/no): yes &gt;回车 -- 是否导入表中数据<br /><br />import entire export file (yes/no): no &gt;no<br /><br />username: scott -- 从哪个用户导入.<br /><br />Enter table(T) or partition(T:P) names. Null list means all tales for user<br /><br />Enter table(T) or partition(T:P) name or . if done:&nbsp;t1 -- T 表示普通表, T:P 表示表空间.</span></p></span><img src ="http://www.blogjava.net/liudawei/aggbug/362562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-11-02 19:42 <a href="http://www.blogjava.net/liudawei/articles/362562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle drop database</title><link>http://www.blogjava.net/liudawei/articles/362536.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Wed, 02 Nov 2011 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/362536.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/362536.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/362536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/362536.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/362536.html</trackback:ping><description><![CDATA[<div><span class="Apple-style-span" style="font-family: Arial; font-size: 12px; line-height: 18px; background-color: #ffffff; ">在10g以前，要彻底删除数据库，只有两个方法，一个是利用DBCA图形化工具删除数据库，另外一个就是关闭数据库后，手工删除数据文件、控制文件以及日志文件的方法。&nbsp;<br /><br />从10g开始，Oracle提供了DROP DATABASE的语法，使得数据库的删除变得非常的简单。&nbsp;<br /><br /><br /><br /><br /><br />不过DROP DATABASE还是有一定的限制条件的：&nbsp;<br /><br />SQL&gt; conn / as sysdba&nbsp;<br />Connected.&nbsp;<br />SQL&gt; drop database;&nbsp;<br />drop database&nbsp;<br />*&nbsp;<br />ERROR at line 1:&nbsp;<br />ORA-01586: database must be mounted EXCLUSIVE and not open for this operation&nbsp;<br /><br /><br />SQL&gt; alter database close;&nbsp;<br /><br />Database altered.&nbsp;<br /><br />SQL&gt; drop database;&nbsp;<br />drop database&nbsp;<br />*&nbsp;<br />ERROR at line 1:&nbsp;<br />ORA-12719: operation requires database is in RESTRICTED mode&nbsp;<br /><br /><br />SQL&gt; alter system enable restricted session;&nbsp;<br /><br />System altered.&nbsp;<br /><br />SQL&gt; drop database;&nbsp;<br /><br />Database dropped.&nbsp;<br /><br />Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production&nbsp;<br />With the Partitioning, OLAP and Data Mining options&nbsp;<br />SQL&gt; exit&nbsp;<br />[oracle@bjtest ~]$ ps -ef|grep test102&nbsp;<br />oracle 15805 14913 0 06:13 pts/1 00:00:00 grep test102&nbsp;<br /><br />数据库必须处于MOUNT状态，且设置了RESTRICTED SESSION。执行了DROP DATABASE命令后，Oracle自动删除控制文件，已经控制文件中记录的数据文件和在线重做日志文件，如果数据库使用了SPFILE，那么SPFILE文件也会删除。这个命令不会删除归档文件和备份文件。&nbsp;<br /><br />在alert文件中，可以看到drop database对应的操作：&nbsp;<br /><br />drop database&nbsp;<br />Mon May 18 06:13:01 2009&nbsp;<br />Deleted file /data/oradata/test102/system01.dbf&nbsp;<br />Deleted file /data/oradata/test102/undotbs1.dbf&nbsp;<br />Deleted file /data/oradata/test102/sysaux01.dbf&nbsp;<br />Deleted file /data/oradata/test102/redo01.log&nbsp;<br />Deleted file /data/oradata/test102/redo02.log&nbsp;<br />Deleted file /data/oradata/test102/redo03.log&nbsp;<br />Deleted file /data/oradata/test102/redo04.log&nbsp;<br />Deleted file /data/oradata/test102/redo05.log&nbsp;<br />Deleted file /data/oradata/test102/redo06.log&nbsp;<br />Deleted file /data/oradata/test102/redo07.log&nbsp;<br />Deleted file /data/oradata/test102/temp01.dbf&nbsp;<br />Instance terminated by USER, pid = 15795&nbsp;<br />Deleted file /data/oradata/test102/control01.ctl&nbsp;<br />Completed: drop database&nbsp;<br />Mon May 18 06:13:08 2009&nbsp;<br />Shutting down instance (abort)&nbsp;<br />License high water mark = 1</span></div><img src ="http://www.blogjava.net/liudawei/aggbug/362536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-11-02 15:24 <a href="http://www.blogjava.net/liudawei/articles/362536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle转义字符</title><link>http://www.blogjava.net/liudawei/articles/362131.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Wed, 26 Oct 2011 14:18:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/362131.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/362131.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/362131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/362131.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/362131.html</trackback:ping><description><![CDATA[<div><span>1、oracle 特殊字符 转义</span><br />关键词： oracle&nbsp;&nbsp;&nbsp; 转义&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div>环境：oracle 9i&nbsp; plsql</div>
<div>在plsql里边执行:<br />update userinfo set pageurl='myjsp?page=1&amp;pagesize=10' where id='test'<br />这条sql语句往数据库的pageurl字段放进去了一个url地址，但是执行的时候却并非那么理想，因为这其中有一个oracle的特殊字符，需要进行转义，那就是字符'&amp;'.</div>
<div>怎么处理上例中的特殊字符？<br />两个办法：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1) update userinfo set pageurl='myjsp?page=1'||'&amp;'||'pagesize=10' where id='test' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) update userinfo set pageurl='myjsp?page=1'||chr(38)||'pagesize=10' where id='test'</div>
<div>其中||是连字符, chr(38)跟ASCII的字符转码是一致的。<br />plsql中还可以set define off来关闭特殊字符，还可以用show define来查看有些特殊定义的字符。</div>
<div><br /><span>2、oracle 中如何转义 特殊字符 </span><br />问 : 如何转义 下划线 _</div>
<div>select * from ng_values where name like 'lady_%' </div>
<div>jieguo 结果显示 lady_test,lady_test,lady1</div>
<div>正确结果应该是:lady_test,lady_test </div>
<div>不包括 lady1 </div>
<div>请各位给出转义方法,3ks</div>
<div>answer:</div>
<div>select ... from ... where ... like '/_%' escape '/';</div>
<div><br />3、<br />insert into t(col) values(chr(ascii('&amp;'))) ；</div>
<div>(方法一)<br />例:插入特殊字元'&amp;'<br />SQL&gt; SHOW DEFINE <br />define "&amp;" (hex 26) ? &lt;--- DEFINE的default值是 &#8216;&amp;&#8217;<br />SQL&gt; SET DEFINE OFF<br />SQL&gt; SHOW DEFINE<br />define OFF <br />SQL&gt; INSERT INTO &lt;table_name&gt; VALUES ('AT&amp;T'); <br />/ <br />1 row created </div>
<div>&nbsp;</div>
<div>(方法二)<br />SQL&gt; SHOW ESCAPE <br />escape OFF &lt;--- ESCAPE的default值是 OFF<br />SQL&gt; SET ESCAPE ON<br />SQL&gt; SHOW ESCAPE<br />escape "\" (hex 5c)<br />SQL&gt; INSERT INTO temp_table VALUES ('select * from emp where ename = \&amp;1'); </div>
<div>1 row created.</div>
<div>；<br />几个测试方法：<br />SELECT 'myjsp?page=1&amp;pagesize=10' FROM dual;<br />SELECT 'myjsp?page=1&amp;pagesize=10' FROM dual;<br /></div>
<div>&nbsp;</div>
<div>SQL&gt; &nbsp; create &nbsp; table &nbsp; a &nbsp; (b &nbsp; varchar2(10)); &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; Table &nbsp; created &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; SQL&gt; &nbsp; insert &nbsp; into &nbsp; a &nbsp; values('_a'); &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; 1 &nbsp; row &nbsp; inserted &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; SQL&gt; &nbsp; select &nbsp; B &nbsp; from &nbsp; A &nbsp; where &nbsp; instr(b,'_a')&gt;0; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; B &nbsp; <br />&nbsp; ---------- &nbsp; <br />&nbsp; _a&nbsp;&nbsp;&nbsp;<br />&nbsp; select &nbsp; B &nbsp; from &nbsp; A &nbsp; where &nbsp; b &nbsp; like &nbsp; '%\_a%' &nbsp; escape &nbsp; '\'</div>
<div>先启动转义符 &nbsp; <br />&nbsp; set &nbsp; escape &nbsp; on &nbsp; <br />&nbsp; select &nbsp; B &nbsp; from &nbsp; A &nbsp; where &nbsp; b &nbsp; like &nbsp; '%\_a%' &nbsp; escape &nbsp; '\';</div>
<div>select &nbsp; B &nbsp; from &nbsp; A &nbsp; where &nbsp; b &nbsp; like &nbsp; '%\_a%' &nbsp; escape &nbsp; '\'</div> <img src ="http://www.blogjava.net/liudawei/aggbug/362131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-10-26 22:18 <a href="http://www.blogjava.net/liudawei/articles/362131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于navicat连接oracle 报 ORA-12737 set CHS16GBK错误的解决 </title><link>http://www.blogjava.net/liudawei/articles/353486.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Fri, 01 Jul 2011 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/353486.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/353486.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/353486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/353486.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/353486.html</trackback:ping><description><![CDATA[1、原因：<br /><font face="黑体">ORA-12737: Instant Client Light: unsupported server character set CHS16GBK</font> <font color="#000000" size="3" face="黑体"><br />Google，解释如下：<br />ORA-12737:<br />Instant Client Light: unsupported server character set string<br />Cause: &nbsp;&nbsp;&nbsp; The character set specified is not allowed for this operation or is invalid. Instant Client Light has only minimal character sets.<br />Action: &nbsp;&nbsp;&nbsp; Do not use Instant Client Light for this character set<br /><br /></font><br />2、首先，我们打开&#8220;tools&#8221;--&gt;"options"菜单，见到如下界面，依据OCI library(oci.dll) 路径，导航到 navicat oci 目录下，备份里面的文件（通过在该目录新建bak文件夹，将&#8220;%dir%/Navicat Lite\instantclient_10_2&#8221;路径下的所有dll文件剪切到bak文件夹）。<br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/coundy/未命名.jpg" styborder="0" /><br /><br /><br />3、在oracle 客户端安装目录bin/目录下，找到如下几个.dll文件<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/coundy/dll.JPG" /><br />4、将上面所列文件放置到&#8220;%dir%/Navicat Lite\instantclient_10_2&#8221; 目录下，重新启动navcat即可。<br /><br />5、oracle10的客户端dll文件替换地址(请复制下面地址)：<br /><a href="http://www.blogjava.net/Files/liudawei/">http://www.blogjava.net/Files/liudawei/</a>关于navicat连接oracle%20报%20ORA-12737%20set%20CHS16GBK错误的解决.zip <img src ="http://www.blogjava.net/liudawei/aggbug/353486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-07-01 10:54 <a href="http://www.blogjava.net/liudawei/articles/353486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle创建外键(删除外键)</title><link>http://www.blogjava.net/liudawei/articles/353462.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Thu, 30 Jun 2011 11:42:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/353462.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/353462.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/353462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/353462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/353462.html</trackback:ping><description><![CDATA[<p><span style="color: #ff0000">--删除外键</span><br />ALTER TABLE WZ_JHTM DROP CONSTRAINT F_WZ_JHTM_XQJHD;</p>
<p><br /><span style="color: #ff0000">--创建外键</span><br />ALTER TABLE WZ_JHTM add CONSTRAINT "F_WZ_JHTM_XQJHD" FOREIGN KEY ("XQJHD_ID")<br />&nbsp; REFERENCES "BID_ADMIN"."WZ_XQJHD" ("XQJHD_ID") ENABLE <br /></p> <img src ="http://www.blogjava.net/liudawei/aggbug/353462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-06-30 19:42 <a href="http://www.blogjava.net/liudawei/articles/353462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>存储过程分批批量删除大数据量表</title><link>http://www.blogjava.net/liudawei/articles/353459.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Thu, 30 Jun 2011 11:17:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/353459.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/353459.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/353459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/353459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/353459.html</trackback:ping><description><![CDATA[<font face="Verdana">CREATE OR REPLACE PROCEDURE p_del_table<br />--功能：循环删除表数据，避免使用大量回滚段<br />--设计：<br />--编码：<br />--日期：2006年06月07日<br />(<br />iTabName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --输入要删除的表名<br />)<br />AS<br />vSql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(2000); --动态SQL<br />vTabName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(100);<br />BEGIN<br />--vTabName:=TRIM(iTabName);<br />vTabName:='vtestjhtm';<br />LOOP<br />--循环删除数据，每次删除1000条然后commit<br />vSql:='DELETE FROM '||vTabName||' WHERE ROWNUM&lt;1000';<br />--执行动态SQL<br />EXECUTE IMMEDIATE vSql;<br />COMMIT;<br />--删除的表数据为空时，退出<br />EXIT WHEN SQL%ROWCOUNT=0;<br />END LOOP;<br />--提示删除成功<br />dbms_output.put_line('DELETE TABLE '||vTabName||' Successfully!');<br />EXCEPTION<br />WHEN OTHERS THEN<br />ROLLBACK;<br />--提示删除失败，并提示错误信息<br />dbms_output.put_line('DELETE TABLE '||vTabName||' Fail!');<br />dbms_output.put_line('Error Message is: '||substr(SQLERRM,1,200));<br />END;<br /></font>  <img src ="http://www.blogjava.net/liudawei/aggbug/353459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-06-30 19:17 <a href="http://www.blogjava.net/liudawei/articles/353459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何查询一个表被其他表所引用？</title><link>http://www.blogjava.net/liudawei/articles/353072.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Mon, 27 Jun 2011 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/353072.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/353072.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/353072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/353072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/353072.html</trackback:ping><description><![CDATA[Select r.table_name table_name, p.table_name ref_table_name<br />From User_Constraints r, User_Cons_Columns p<br />Where r.constraint_type = 'R'<br />&nbsp;&nbsp; And r.r_constraint_name = p.constraint_name<br />&nbsp;&nbsp; And p.table_name = upper('&amp;ref_talbe')  <img src ="http://www.blogjava.net/liudawei/aggbug/353072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-06-27 15:29 <a href="http://www.blogjava.net/liudawei/articles/353072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据SQL整理</title><link>http://www.blogjava.net/liudawei/articles/351515.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Wed, 01 Jun 2011 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/351515.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/351515.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/351515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/351515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/351515.html</trackback:ping><description><![CDATA[一.查看表结构<br />USER_TAB_COLUMNS视图中，如scott模式下查看dept表结构：<br />20:52:08 SQL&gt; SELECT column_name, data_type FROM user_tab_columns WHERE table_name='DEPT';<br /><br />二.Oracle查询是否解锁与锁定<br />1.查询<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT /*+ rule */<br />&nbsp;s.username,<br />&nbsp;decode(l.type, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', l.type) LOCK_LEVEL,<br />&nbsp;o.owner,<br />&nbsp;o.object_name,<br />&nbsp;o.object_type,<br />&nbsp;s.sid,<br />&nbsp;s.serial#,<br />&nbsp;s.terminal,<br />&nbsp;s.machine,<br />&nbsp;s.program,<br />&nbsp;s.osuser<br />&nbsp; FROM v$session s, v$lock l, dba_objects o<br />&nbsp;WHERE l.sid = s.sid<br />&nbsp;&nbsp; AND l.id1 = o.object_id(+)<br />&nbsp;&nbsp; AND s.username is NOT NULL<br /><br />2.解锁(<span style="color: red">根据需要kill&nbsp; 550为的sid 3761为对应的serial#</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;alter system kill session '550,3761';<br />&nbsp;&nbsp;&nbsp;&nbsp;commit; <br /><br />三.增加修改字段 字段注释 表注释<br />alter table&nbsp;表名 add&nbsp;&nbsp;&nbsp;字段 char(1);<br />alter table 表名 modify 字段 char(1);<br />comment on column 表名.字段名 is '状态';<br />commnet on table 表名 is '表名' <img src ="http://www.blogjava.net/liudawei/aggbug/351515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-06-01 14:28 <a href="http://www.blogjava.net/liudawei/articles/351515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>left join 和 left outer join 的区别 </title><link>http://www.blogjava.net/liudawei/articles/351305.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Mon, 30 May 2011 01:05:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/351305.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/351305.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/351305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/351305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/351305.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: left join 和 left outer join 的区别 通俗的讲：&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;&nbsp;&nbsp;left&nbsp;&nbsp;&nbsp;join&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;的连接的记录数与A表的记录数同&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/liudawei/articles/351305.html'>阅读全文</a><img src ="http://www.blogjava.net/liudawei/aggbug/351305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-05-30 09:05 <a href="http://www.blogjava.net/liudawei/articles/351305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库递归查询</title><link>http://www.blogjava.net/liudawei/articles/349847.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Mon, 09 May 2011 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/349847.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/349847.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/349847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/349847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/349847.html</trackback:ping><description><![CDATA[<div class="postTitle">
<h1><a id="ctl02_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/yg_zhang/archive/2006/12/09/db2.html">DB2的递归查询</a></h1>
</div>
<div id="cnblogs_post_body">在db2可以使用sql语句来进行递归查询,就是使用<strong style="color: red">with</strong>语句<br />
<br />
1.先建一个树形表:<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table tst</span><span style="color: #000000">&nbsp;(<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" />id&nbsp;&nbsp;</span><span style="color: #000000; font-weight: bold">integer</span><span style="color: #000000">,<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" />parentId&nbsp;</span><span style="color: #000000; font-weight: bold">int</span><span style="color: #000000">,<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" />name&nbsp;</span><span style="color: #000000; font-weight: bold">varchar</span><span style="color: #000000">(</span><span style="color: #800000; font-weight: bold">20</span><span style="color: #000000">))</span></div>
<br />
2.插入数据<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /><span style="color: #0000ff">insert</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">into</span><span style="color: #000000">&nbsp;tst&nbsp;</span><span style="color: #0000ff">values</span><span style="color: #000000">&nbsp;<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" />(</span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">,</span><span style="color: #800000; font-weight: bold">0</span><span style="color: #000000">,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">a</span><span style="color: #ff0000">'</span><span style="color: #000000">),<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" />(</span><span style="color: #800000; font-weight: bold">2</span><span style="color: #000000">,</span><span style="color: #800000; font-weight: bold">0</span><span style="color: #000000">,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">b</span><span style="color: #ff0000">'</span><span style="color: #000000">),<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" />(</span><span style="color: #800000; font-weight: bold">3</span><span style="color: #000000">,</span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">c</span><span style="color: #ff0000">'</span><span style="color: #000000">),<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" />(</span><span style="color: #800000; font-weight: bold">4</span><span style="color: #000000">,</span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">d</span><span style="color: #ff0000">'</span><span style="color: #000000">),<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" />(</span><span style="color: #800000; font-weight: bold">5</span><span style="color: #000000">,</span><span style="color: #800000; font-weight: bold">4</span><span style="color: #000000">,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">d</span><span style="color: #ff0000">'</span><span style="color: #000000">),<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" />(</span><span style="color: #800000; font-weight: bold">6</span><span style="color: #000000">,</span><span style="color: #800000; font-weight: bold">5</span><span style="color: #000000">,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">d</span><span style="color: #ff0000">'</span><span style="color: #000000">)</span></div>
3.使用递归查询<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /><span style="color: #0000ff">with</span><span style="color: #000000">&nbsp;rpl&nbsp;(id,parentId,name)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" />(<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;id,parentId,name&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;tst&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;parentId</span><span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">&nbsp;<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">union</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">all</span><span style="color: #000000">&nbsp;<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;&nbsp;child.id,child.parentId,child.name&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;rpl&nbsp;parent,&nbsp;tst&nbsp;child&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;parent.id</span><span style="color: #808080">=</span><span style="color: #000000">child.parentId<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" />)<br />
<img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;rpl</span></div>
<br />
</div>
<h1><a id="ctl02_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/yg_zhang/archive/2006/12/09/db2.html">Oracle的递归查询</a></h1>
<br />
<div id="blog_text" class="cnt">收集的几条在oracle中通过connect by prior来实现递归查询
<p><br />
<font color="#000000">Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。<br />
创建示例表：<br />
CREATE TABLE TBL_TEST<br />
(<br />
ID&nbsp;&nbsp;&nbsp; NUMBER,<br />
NAME VARCHAR2(100 BYTE),<br />
PID&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT 0<br />
);</font></p>
<p><font color="#000000">插入测试数据：<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');<br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');</font></p>
<p><font color="#000000"><strong>从Root往树末梢递归<br />
</strong>select * from TBL_TEST<br />
start with id=1<br />
connect by prior id = pid</font></p>
<p><font color="#000000"><strong>从末梢往树ROOT递归<br />
</strong>select * from TBL_TEST<br />
start with id=5<br />
connect by prior pid = id</font></p>
<p><br />
<font color="#000000">===============================================================================================================</font></p>
<p><font color="#000000">有一张表&nbsp;&nbsp; t&nbsp;&nbsp; <br />
字段：&nbsp;&nbsp; <br />
parent&nbsp;&nbsp; <br />
child&nbsp;&nbsp; <br />
两个字段的关系是父子关系&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
写一个sql语句，查询出指定父下面的所有的子&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
比如&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
a&nbsp;&nbsp; b&nbsp;&nbsp; <br />
a&nbsp;&nbsp; c&nbsp;&nbsp;&nbsp;&nbsp; <br />
a&nbsp;&nbsp; e&nbsp;&nbsp; <br />
b&nbsp;&nbsp; b1&nbsp;&nbsp; <br />
b&nbsp;&nbsp; b2&nbsp;&nbsp; <br />
c&nbsp;&nbsp; c1&nbsp;&nbsp; <br />
e&nbsp;&nbsp; e1&nbsp;&nbsp; <br />
e&nbsp;&nbsp; e3&nbsp;&nbsp; <br />
d&nbsp;&nbsp; d1&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
指定parent=a，选出&nbsp;&nbsp; <br />
a&nbsp;&nbsp; b&nbsp;&nbsp; <br />
a&nbsp;&nbsp; c&nbsp;&nbsp;&nbsp;&nbsp; <br />
a&nbsp;&nbsp; e&nbsp;&nbsp; <br />
b&nbsp;&nbsp; b1&nbsp;&nbsp; <br />
b&nbsp;&nbsp; b2&nbsp;&nbsp; <br />
c&nbsp;&nbsp; c1&nbsp;&nbsp; <br />
e&nbsp;&nbsp; e1&nbsp;&nbsp; <br />
e&nbsp;&nbsp; e3&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
SQL语句：&nbsp;&nbsp; <br />
select&nbsp;&nbsp; parent,child&nbsp;&nbsp; from&nbsp;&nbsp; test&nbsp;&nbsp; start&nbsp;&nbsp; with&nbsp;&nbsp; parent='a'&nbsp;&nbsp; <br />
connect&nbsp;&nbsp; by&nbsp;&nbsp; prior&nbsp;&nbsp; child=parent </font></p>
<p><br />
<font color="#000000">================================================================================================</font></p>
<p><font color="#000000">connect by 是结构化查询中用到的，其基本语法是： <br />
select ... from tablename start by cond1 <br />
connect by cond2 <br />
where cond3; <br />
简单说来是将一个树状结构存储在一张表里，比如一个表中存在两个字段: <br />
id,parentid那么通过表示每一条记录的parent是谁，就可以形成一个树状结构。 <br />
用上述语法的查询可以取得这棵树的所有记录。 <br />
其中COND1是根结点的限定语句，当然可以放宽限定条件，以取得多个根结点，实际就是多棵树。 <br />
COND2是连接条件，其中用PRIOR表示上一条记录，比如 CONNECT BY PRIOR ID=PRAENTID就是说上一条记录的ID是本条记录的PRAENTID，即本记录的父亲是上一条记录。 <br />
COND3是过滤条件，用于对返回的所有记录进行过滤。</font></p>
<p><font color="#000000">PRIOR和START WITH关键字是可选项<br />
<strong>PRIORY</strong>运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系，PRIOR<br />
运算符在一侧表示父节点，在另一侧表示子节点，从而确定查找树结构是的顺序是自顶向下还是<br />
自底向上。在连接关系中，除了可以使用列名外，还允许使用列表达式。<strong>START WITH</strong> 子句为<br />
可选项，用来标识哪个节点作为查找树型结构的根节点。若该子句被省略，则表示所有满足查询<br />
条件的行作为根节点。<br />
完整的例子如SELECT PID,ID,NAME FROM T_WF_ENG_WFKIND START WITH PID =0 CONNECT BY PRIOR ID = PID</font></p>
<p><br />
<font color="#000000">以上主要是针对上层对下层的顺向递归查询而使用start with ... connect by prior ...这种方式,但有时在需求需要的时候,可能会需要由下层向上层的逆向递归查询,此是语句就有所变化:例如要实现 select * from table where id in ('0','01','0101','0203','0304') ;现在想把0304的上一级03给递归出来,0203的上一级02给递归出来,而01现在已经是存在的,最高层为0.而这张table不仅仅这些数据,但我现在只需要('0','01','0101','0203','0304','02','03')这些数据,此时语句可以这样写SELECT PID,ID,NAME FROM V_WF_WFKIND_TREE WHERE ID IN (SELECT DISTINCT(ID) ID FROM V_WF_WFKIND_TREE CONNECT BY PRIOR PID = ID START WITH ID IN ('0','01','0101','0203','0304') );</font></p>
<p><font color="#000000">其中START WITH ID IN里面的值也可以替换SELECT 子查询语句.</font></p>
<p><br />
<font color="#000000">注意由上层向下层递归与下层向上层递归的区别在于START WITH...CONNECT BY PRIOR...的先后顺序以及 ID = PID 和 PID = ID 的微小变化!<br />
<br />
=============================================================<br />
connect by prior start with 经常会被用到一个表中存在递归关系的时候。比如我们经常会将一个比较复杂的目录树存储到一个表中。或者将一些部门存储到一个表中，而这些部门互相有隶属关系。这个时候你就会用到connect by prior start with。</font></p>
<p><font color="#000000">典型的使用方法就是：<br />
select * from table connect by prior cur_id=parent_id start with cur_id=???<br />
例如：<br />
a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br />
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</font></p>
<p><font color="#000000">如果想查找a=2及其下面的所有数据，则：<br />
select * from table connect by prior a=b start with a=2<br />
a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2</font></p>
<p><font color="#000000">这些只是基础，皮毛。其实只要你灵活的构造查询语句。可以得出意想不到的结果。比如生成树每一个路径。<br />
但是这些记录组成的树必须正常才可以。如果有互为父子的情况，就会出现循环错误！</font></p>
<p>&nbsp;</p>
<p><font color="#000000">select * from tb_cus_area_cde</font></p>
<p><font color="#000000"><strong>--子取父</strong><br />
select * from tb_cus_area_cde a&nbsp;&nbsp;&nbsp; <br />
CONNECT BY PRIOR&nbsp;&nbsp;&nbsp;&nbsp; a.c_snr_area=a.c_area_cde START WITH a.c_area_cde='1040101'</font></p>
<p><font color="#000000"><strong>--父取子<br />
</strong>select * from tb_cus_area_cde a&nbsp;&nbsp;&nbsp; <br />
CONNECT BY PRIOR&nbsp;&nbsp;&nbsp;&nbsp; a.c_area_cde=a.c_snr_area START WITH a.c_snr_area is null</font></p>
<p>&nbsp;</p>
<p><font color="#000000">注意：在用这个函数的时候，statement的参数要用 ResultSet.TYPE_SCROLL_INSENSITIVE&nbsp;&nbsp; 而不能用 ResultSet.TYPE_SCROLL_SENSITIVE,在这里再把这两个之间的区别讲讲：</font></p>
<p><font color="#000000">1.TYPE_FORWORD_ONLY,只可向前滚动；&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
2.TYPE_SCROLL_INSENSITIVE,双向滚动，但不及时更新，就是如果数据库里的数据修改过，并不在ResultSet中反应出来。&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
3.TYPE_SCROLL_SENSITIVE，双向滚动，并及时跟踪数据库的更新,以便更改ResultSet中的数据</font></p>
<p>&nbsp;</p>
<p><br />
<font color="#000000">======================================<br />
<strong><font size="3">10g树形查询特性CONNECT_BY_ISCYCLE</font></strong></font></p>
<p><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp; 在10g中Oracle提供了新的伪列：CONNECT_BY_ISCYCLE，通过这个伪列，可以判断是否在树形查询的过程中构成了循环，这个伪列只是在CONNECT BY NOCYCLE方式下有效。</font></p>
<p><font color="#000000">　　这一篇描述一下解决问题的思路。</font></p>
<p><font color="#000000">　　CONNECT_BY_ISCYCLE的实现和前面两篇文章中CONNECT_BY_ROOT和CONNECT_BY_ISLEAF的实现完全不同。</font></p>
<p><font color="#000000">　　因为要实现CONNECT_BY_ISCYCLE，就必须先实现CONNECT BY NOCYCLE，而在9i中是没有方法实现这个功能的。</font></p>
<p><font color="#000000">　　也就是说，首先要实现自己的树形查询的功能，而仅这第一点，就是一个异常困难的问题，何况后面还要实现NOCYCLE，最后再加上一个ISCYCLE的判断。</font></p>
<p><font color="#000000">　　所以总的来说，这个功能的实现比前面两个功能要复杂得多。由于树形查询的LEVEL是不固定的，所以采用链接的方式实现，基本上是不现实的。换句话说，用纯SQL的方式来实现树形查询的功能基本上不可行。而为了解决这个功能，只能通过PL/SQL配合SQL来实现。</font></p>
<p><font color="#000000">　　仍然是首先构造一个例子：</font></p>
<p><font color="#000000">SQL&gt; CREATE TABLE T_TREE (ID NUMBER, FATHER_ID NUMBER, NAME VARCHAR2(30)); <br />
　　表已创建。 <br />
　　SQL&gt; INSERT INTO T_TREE VALUES (1, 0, 'A'); <br />
　　已创建 1 行。 <br />
　　SQL&gt; INSERT INTO T_TREE VALUES (2, 1, 'BC'); <br />
　　已创建 1 行。 <br />
　　SQL&gt; INSERT INTO T_TREE VALUES (3, 1, 'DE'); <br />
　　已创建 1 行。 <br />
　　SQL&gt; INSERT INTO T_TREE VALUES (4, 1, 'FG'); <br />
　　已创建 1 行。 <br />
　　SQL&gt; INSERT INTO T_TREE VALUES (5, 2, 'HIJ'); <br />
　　已创建 1 行。 <br />
　　SQL&gt; INSERT INTO T_TREE VALUES (6, 4, 'KLM'); <br />
　　已创建 1 行。 <br />
　　SQL&gt; INSERT INTO T_TREE VALUES (7, 6, 'NOPQ'); <br />
　　已创建 1 行。 <br />
　　SQL&gt; INSERT INTO T_TREE VALUES (0, 0, 'ROOT'); <br />
　　已创建 1 行。 <br />
　　SQL&gt; INSERT INTO T_TREE VALUES (4, 7, 'FG'); <br />
　　已创建 1 行。 <br />
　　SQL&gt; COMMIT; <br />
　　提交完成。 <br />
　　SQL&gt; SELECT * FROM T_TREE; <br />
　　ID FATHER_ID NAME <br />
　　---------- ---------- ------------------------------ <br />
　　1 0 A <br />
　　2 1 BC <br />
　　3 1 DE <br />
　　4 1 FG <br />
　　5 2 HIJ <br />
　　6 4 KLM <br />
　　7 6 NOPQ <br />
　　0 0 ROOT <br />
　　4 7 FG <br />
　　已选择9行。 </font></p>
<p><font color="#000000">　　上面构造了两种树形查询循环的情况，一种是当前记录的自循环，另一种是树形查询的某个子节点是当前节点的祖先节点，从而构成了循环。在这个例子中，记录ID为0和ID为4且FATHER_ID等于7的两条记录分别构成了上述的两种循环的情况。</font></p>
<p><font color="#000000">　　下面就来看看CONNECT_BY_ISCYCLE和CONNECT BY NOCYCLE的功能：</font></p>
<p><font color="#000000">SQL&gt; SELECT * <br />
　　2 FROM T_TREE <br />
　　3 START WITH ID = 0 <br />
　　4 CONNECT BY PRIOR ID = FATHER_ID; <br />
　　ERROR: <br />
　　ORA-01436: 用户数据中的 CONNECT BY 循环 <br />
　　未选定行 <br />
　　SQL&gt; SELECT * <br />
　　2 FROM T_TREE <br />
　　3 START WITH ID = 1 <br />
　　4 CONNECT BY PRIOR ID = FATHER_ID; <br />
　　ERROR: <br />
　　ORA-01436: 用户数据中的 CONNECT BY 循环 <br />
　　未选定行 </font></p>
<p><br />
<font color="#000000">　　这就是不使用CONNECT BY NOCYCLE的情况，查询会报错，指出树形查询中出现循环，在10g中可以使用CONNECT BY NOCYCLE的方式来避免错误的产生：</font></p>
<p><font color="#000000">SQL&gt; SELECT * <br />
　　2 FROM T_TREE <br />
　　3 START WITH ID = 0 <br />
　　4 CONNECT BY NOCYCLE PRIOR ID = FATHER_ID; <br />
　　ID FATHER_ID NAME <br />
　　---------- ---------- ------------------------------ <br />
　　0 0 ROOT <br />
　　1 0 A <br />
　　2 1 BC <br />
　　5 2 HIJ <br />
　　3 1 DE <br />
　　4 1 FG <br />
　　6 4 KLM <br />
　　7 6 NOPQ <br />
　　已选择8行。 </font></p>
<p><br />
<font color="#000000">　　使用CONNECT BY NOCYCLE，Oracle自动避免循环的产生，将不产生循环的数据查询出来，下面看看CONNECT_BY_ISCYCLE的功能：</font></p>
<p><font color="#000000">SQL&gt; SELECT ID, <br />
　　2 FATHER_ID, <br />
　　3 NAME, <br />
　　4 CONNECT_BY_ISCYCLE CYCLED <br />
　　5 FROM T_TREE <br />
　　6 START WITH ID = 0 <br />
　　7 CONNECT BY NOCYCLE PRIOR ID = FATHER_ID; <br />
　　ID FATHER_ID NAME CYCLED <br />
　　---------- ---------- ------------------------------ ---------- <br />
　　0 0 ROOT 1 <br />
　　1 0 A 0 <br />
　　2 1 BC 0 <br />
　　5 2 HIJ 0 <br />
　　3 1 DE 0 <br />
　　4 1 FG 0 <br />
　　6 4 KLM 0 <br />
　　7 6 NOPQ 1 <br />
　　已选择8行。 </font></p>
<p><br />
<font color="#000000">　　可以看到，CONNECT_BY_ISCYCLE伪列指出循环在树形查询中发生的位置。</font></p>
<p><font color="#000000">　　为了实现CONNECT_BY_ISCYCLE就必须先实现CONNECT BY NOCYCLE方式，而这在9i中是没有现成的办法的，所以这里尝试使用PL/SQL来自己实现树形查询的功能。</font></p>
<p><font color="#000000">SQL&gt; CREATE OR REPLACE FUNCTION F_FIND_CHILD(P_VALUE VARCHAR2) RETURN VARCHAR2 AS <br />
　　2 V_STR VARCHAR2(32767) := '/' || P_VALUE; <br />
　　3 <br />
　　4 PROCEDURE P_GET_CHILD_STR (P_FATHER IN VARCHAR2, P_STR IN OUT VARCHAR2) AS <br />
　　5 BEGIN <br />
　　6 FOR I IN (SELECT ID FROM T_TREE WHERE FATHER_ID = P_FATHER AND FATHER_ID != ID) LOOP <br />
　　7 IF INSTR(P_STR || '/', '/' || I.ID || '/') = 0 THEN <br />
　　8 P_STR := P_STR || '/' || I.ID; <br />
　　9 P_GET_CHILD_STR(I.ID, P_STR); <br />
　　10 END IF; <br />
　　11 END LOOP; <br />
　　12 END; <br />
　　13 BEGIN <br />
　　14 P_GET_CHILD_STR(P_VALUE, V_STR); <br />
　　15 RETURN V_STR; <br />
　　16 END; <br />
　　17 / </font></p>
<p><br />
<font color="#000000">　　函数已创建。</font></p>
<p><font color="#000000">　　构造一个函数，在函数中递归调用过程来实现树形查询的功能。</font></p>
<p><font color="#000000">　　下面看看调用这个函数的结果：　</font></p>
<p><font color="#000000">SQL&gt; SELECT F_FIND_CHILD(0) FROM DUAL; <br />
　　F_FIND_CHILD(0) <br />
　　------------------------------------------------ <br />
　　/0/1/2/5/3/4/6/7 <br />
　　SQL&gt; SELECT F_FIND_CHILD(2) FROM DUAL; <br />
　　F_FIND_CHILD(2) <br />
　　------------------------------------------------ <br />
　　/2/5 <br />
　　SQL&gt; SELECT F_FIND_CHILD(4) FROM DUAL; <br />
　　F_FIND_CHILD(4) <br />
　　------------------------------------------------ <br />
　　/4/6/7 </font></p>
<p><br />
<font color="#000000">　　虽然目前存在的问题还有很多，但是已经基本上实现了一个最简单的NOCYCLE的SYS_CONNECT_BY_PATH的功能。</font></p>
<p><font color="#000000">　　有了这个函数作为基础，就可以逐步的实现最终的目标了。<br />
</font></p>
</div>
<br />
 <img src ="http://www.blogjava.net/liudawei/aggbug/349847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2011-05-09 16:28 <a href="http://www.blogjava.net/liudawei/articles/349847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>唯一索引&amp;普通索引的一个有趣的区别</title><link>http://www.blogjava.net/liudawei/articles/340994.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Fri, 17 Dec 2010 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/340994.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/340994.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/340994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/340994.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/340994.html</trackback:ping><description><![CDATA[<font face='\"宋体\"'>今天CNOUG上，一个网友问了一个随机取记录的问题，连接如下： <br />
</font><br />
<font face="宋体"><font size="3">http://www.oracle.com.cn/viewthread.php?tid=130433 <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>在测试过程，却引起我对Oracle的索引的机制有了一次生动的回顾。 <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>测试的本意是参数一个随机数，然后根据随机数取一条记录。 <br />
</font></font><br />
<font size="3"><strong><font face='\"宋体\"'>SELECT</font></strong><font face='\"宋体\"'> * <strong>FROM</strong> phs.t1 <strong>WHERE</strong> rn = trunc(dbms_random.<strong>value</strong>(</font><font face='\"宋体\"'>1</font><font face='\"宋体\"'>,</font><font face='\"宋体\"'>100000</font><font face='\"宋体\"'>)) <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>Rn</font><font face='\"宋体\"'>是索引字段 normal betree，根据rownum来建立。 <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>但是初次测试的结果，却出乎我意料，居然查询结果是，无记录或者随机长度记录集。多次测试： <br />
</font></font><br />
<font face="宋体"><font size="3">SELECT COUNT(*) FROM phs.t1 WHERE rn = trunc(dbms_random.value(1,100000)); <br />
</font></font><br />
<font face="宋体"><font size="3">结果竟然是：0,28909，0,0,9870，23012，0,56789，45189，1240&#8230; <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>我花了5分钟就解决了这个问题，但花了三个小时的思考，我终于想了一套说法来描述这里面的关系。 <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>解决1：把sql改为 <br />
</font></font><br />
<font face="courier">WITH tab AS(SELECT trunc(dbms_random.value(1,100000)) a FROM dual) <br />
&nbsp; SELECT * FROM t1 WHERE rn =( SELECT a FROM tab)</font><font face="宋体"> <br />
</font><br />
<font size="3"><font face='\"宋体\"'>解决2：把rn的索引改为，unique <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>实际看到第二种解决办法，就大概有种明白的感觉了，但是想解释一下又无法说清。说白了，这里面牵扯了Oracle Intenal的东西，这些东西又不是公开的。我只能凭着仅有的资料去猜测。 <br />
</font></font><br />
<font size="3"><font face='\"times\"'>在</font><font face='\"times\"'>normal</font><font face='\"宋体\"'>索引下，</font><font face='\"times\"'>SQL</font><font face='\"宋体\"'>的执行计划是</font><font face='\"times\"'>RANGE SCAN</font><font face='\"宋体\"'>，而</font><font face='\"times\"'>unique</font><font face='\"宋体\"'>索引，则是</font><font face='\"times\"'>unique SCAN</font><font face='\"宋体\"'>。</font></font> <br />
<font size="3"><font face='\"times\"'>发生这种现象实际和</font><font face='\"times\"'>SQL</font><font face='\"宋体\"'>的执行机制以及索引的机制有着密切的联系。</font></font> <br />
<font size="3"><font face='\"times\"'>通过查询，可以看出该索引有</font><font face='\"times\"'>2747</font><font face='\"宋体\"'>个叶子块，</font><font face='\"times\"'>67</font><font face='\"宋体\"'>个</font><font face='\"times\"'>branch </font><font face='\"宋体\"'>块，</font><font face='\"times\"'>height 3</font></font> <br />
<font face="times"><font size="3">SQL&gt; SELECT s.leaf_blocks,s.blevel FROM dba_indexes s WHERE s.index_name = 'INDEX_T1_RN';</font></font> <br />
<font face="times"><font size="3"></font><br />
<br />
<font face='\"times\"'>LEAF_BLOCKS &nbsp; BLEVEL</font></font> <br />
<font face="times"><font size="3">----------- ----------</font></font> <br />
<font size="3"><font face='\"times\"'>2747 &nbsp; 2</font></font> <br />
<font face="times"><font size="3"></font><br />
<br />
<font face='\"times\"'>SQL&gt; SELECT SUM(blocks) FROM dba_extents WHERE segment_name='INDEX_T1_RN';</font></font> <br />
<font face="times"><font size="3"></font><br />
<br />
<font face='\"times\"'>SUM(BLOCKS)</font></font> <br />
<font face="times"><font size="3">-----------</font></font> <br />
<font size="3"><font face='\"times\"'>2816</font></font> <br />
<font face="宋体"><font size="3">那么它的结构如图：</font></font> <br />
<font face="宋体"><strong></strong><br />
<img border="0" src="http://valen.blog.ccidnet.com/attachment/51502_9a78f652f9db3bf.jpg" width="800" onload="if(this.width  alt="" />'800')this.width='800';if(this.height>'600')this.height='600';"><br />
</font><br />
<br />
<br />
<font size="3"><font face='\"times\"'>SQL</font><font face='\"宋体\"'>的执行步骤如下：</font></font> <br />
<font size="3"><font face='\"times\"'>1</font><font face='\"宋体\"'>．</font><font face='\"times\"'>SQL</font><font face='\"宋体\"'>匹配，语法语义检查</font><font face='\"times\"'>,</font><font face='\"宋体\"'>通过对</font><font face='\"times\"'>LIBRARY CACHE</font><font face='\"宋体\"'>中对象的比对，进行匹配。</font></font> <br />
<font size="3"><font face='\"times\"'>2</font><font face='\"宋体\"'>．对子查询，视图等进行重新组合和</font><font face='\"times\"'>SQL</font><font face='\"宋体\"'>改写，判断对象访问的开销以及结果集的大小</font><font face='\"times\"'>,</font><font face='\"宋体\"'>每个对象都独立计算成本以及返回的结果集的大小，判断不同的连接顺序的不同开销</font></font> <br />
<font size="3"><font face='\"宋体\"'>，连接方式和连接顺序被通盘考虑，并且找到开销最小的连接方式这个步骤里面包含了</font><font face='\"times\"'>SQL</font><font face='\"宋体\"'>执行计划的优化。产生执行树，执行树被生成后放在</font><font face='\"times\"'>LIBRARY CACHE</font><font face='\"宋体\"'>里，当</font><font face='\"times\"'>SQL</font><font face='\"宋体\"'>执行的时候，被用来驱动查询</font><font face='\"times\"'>.</font></font> <br />
<font size="3"><font face='\"times\"'>4</font><font face='\"宋体\"'>．分配绑定变量需要的内存空间，绑定变量的值实现绑定。使用上一步产生的执行计划执行</font><font face='\"times\"'>SQL. </font></font><br />
<font size="3"><font face='\"times\"'>5</font><font face='\"宋体\"'>．对于</font><font face='\"times\"'>SELECT</font><font face='\"宋体\"'>操作，比普通的</font><font face='\"times\"'>SQL</font><font face='\"宋体\"'>多了一个</font><font face='\"times\"'>FETCH</font><font face='\"宋体\"'>步骤，在这个步骤中，实际上的</font><font face='\"times\"'>DB BLOCK</font><font face='\"宋体\"'>的访问才会产生。在这个阶段，将剔除不需要的数据，把结果放入结果集，传输给客户端。</font></font> <br />
<font size="3"><font face='\"times\"'>有了上面的知识，我现在来解释这个现象。</font></font> <br />
<font size="3"><font face='\"times\"'><font color="#0000f0">Q:</font></font><font color="#0000f0"><font face='\"宋体\"'>为什么在</font><font face='\"times\"'>normal</font><font face='\"宋体\"'>的索引下，</font><font face='\"times\"'>sql</font><font face='\"宋体\"'>返回结构集的大小是随机的？在</font><font face='\"times\"'>unique</font><font face='\"宋体\"'>下面却能确定唯一记录？</font></font></font> <br />
<font size="3"><font face='\"times\"'>A:</font><font face='\"宋体\"'>首先在</font><font face='\"times\"'>normal</font><font face='\"宋体\"'>索引下，优化器会把执行计划解释为</font><font face='\"times\"'>RANGE SCAN</font><font face='\"宋体\"'>，因为它认为可能返回多条记录。优化器在进行执行计划编写的时候，首先就会计算</font><font face='\"times\"'> </font><font face='\"宋体\"'>trunc(dbms_random.value(1,100000))</font><font face='\"宋体\"'>，由此来确定选择什么执行计划，假设本次产生的随机数是87905。 <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>进入执行阶段，系统找到87905&#8220;开始&#8220;所在的索引数据块，注意这个&#8220;开始&#8221;（也就是说它只关注数据是从那里开始的），随后进行遍历该块的水平链表寻找，执行过滤,找到适合rowid，再去获取数据块。 <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>在normal模式下，由于是范围SCAN，优化器实际把 <br />
</font></font><br />
<font face="宋体"><font size="3">Rn= trunc(dbms_random.value(1,100000)) <br />
</font></font><br />
<font face="宋体"><font size="3">拆成了 <br />
</font></font><br />
<font face="宋体"><font size="3">Rn &gt;= trunc(dbms_random.value(1,100000)) and <br />
</font></font><br />
<font face="宋体"><font size="3">Rn &lt;= trunc(dbms_random.value(1,100000)) <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>在unique模式下，仍然是 <br />
</font></font><br />
<font face="宋体"><font size="3">Rn= trunc(dbms_random.value(1,100000)) <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>所以，在normal模式下，遍历过程发现了87905的记录，但它这个时候它还会判断是否已经达到区间扫描的终点，又会执行Rn &lt;= trunc(dbms_random.value(1,100000)) <br />
</font></font><br />
<font face="宋体"><font size="3"><font color="#00f000">这个时候，trunc(dbms_random.value(1,100000))被重新计算！！！ <br />
</font></font></font><br />
<font size="3"><font face='\"宋体\"'>那么就会出现下面的分支情况：</font></font> <br />
<font size="3"><font face='\"宋体\"'><strong></strong><br />
<img border="0" src="http://valen.blog.ccidnet.com/attachment/51502_6229e147d0b2ba7.jpg" onload="if(this.width  alt="" />'800')this.width='800';if(this.height>'600')this.height='600';"><br />
<br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>1.</font><font face='\"宋体\"'>结果&gt;87905,优化器认为已经达到区间终点（索引是有序的），谓词判断结果 true + false = false,所以返回空结果集。 <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>2.</font><font face='\"宋体\"'>结果小于等于87905,返回该记录，计算出新的谓词例如12346，再次寻找块，遍历水平列表（重复上面的动作），然后又进入分支判断&#8230;最终出现分支1的时候终止。 <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>这样就说明为什么会出现这种情况。 <br />
</font></font><br />
<font face="宋体"><br />
</font><br />
<font size="3"><font face='\"times\"'>在</font><font face='\"times\"'>unique</font><font face='\"宋体\"'>模式下，在遍历水平链表的时候，找到当前值就返回，而不用进行区间判断，或者是</font><font face='\"times\"'>SCAN</font><font face='\"宋体\"'>多条。所以结果集是正确的。</font></font> <br />
<font size="3"><font face='\"times\"'><font color="#0000f0">Q:</font></font><font color="#0000f0"><font face='\"宋体\"'>为什么采用了</font><font face='\"times\"'>with</font><font face='\"宋体\"'>语法可以避免这种情况呢？</font></font></font> <br />
<font size="3"><font face='\"times\"'>A:</font><font face='\"宋体\"'>因为</font><font face='\"times\"'>with</font><font face='\"宋体\"'>字句在</font><font face='\"times\"'>oracle</font><font face='\"宋体\"'>内部被解释为一个内联视图或者临时表，所以</font><font face='\"宋体\"'>trunc(dbms_random.value(1,100000))</font><font face='\"宋体\"'>只会计算一次，之后的计算是针对固定的内联视图的。 <br />
</font></font><br />
oracle 不允许这种写法，rn= sequences.nextval，估计也是出于这个考虑吧。 <br />
<font size="3"><font face='\"宋体\"'>想到这里，就结束了，其实可以自己写一个random函数，在里面加一个记录点，来证明谓词多次改变，也可以做更详细的sql trace，dump dump&#8230; <br />
</font></font><br />
<font size="3"><font face='\"宋体\"'>或者换一个Oracle的人来解释一下，就OK了，但我估计在Oracle china也没几个了解数据库机密的人。唉&#8230; <br />
</font></font><br />
引自：http://valen.blog.ccidnet.com/blog-htm-do-showone-uid-51502-type-blog-itemid-262825.html
 <img src ="http://www.blogjava.net/liudawei/aggbug/340994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2010-12-17 16:07 <a href="http://www.blogjava.net/liudawei/articles/340994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle随机抽取(转)</title><link>http://www.blogjava.net/liudawei/articles/340993.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Fri, 17 Dec 2010 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/340993.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/340993.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/340993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/340993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/340993.html</trackback:ping><description><![CDATA[<div id="postmessage_1012245" class="t_msgfont">从100万数据量的表中随机抽取一条数据 要达到0.02S以内<br />
<br />
刚好我有一个120w数据的测试表，在一个很老的PC上，northwood 2.4的p4，sis芯片组。
<div class="blockcode"><span class="headactions" onclick="copycode($('code0'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code0">SQL&gt; set timing on;<br />
SQL&gt; SELECT COUNT(1) FROM t1;<br />
<br />
&nbsp;&nbsp;COUNT(1)<br />
----------<br />
&nbsp; &nbsp;1219948<br />
<br />
Executed in 0.015 seconds<br />
<br />
SQL&gt; alter table T1 add rn number;<br />
<br />
Table altered<br />
<br />
Executed in 0.36 seconds<br />
<br />
SQL&gt; update t1<br />
&nbsp;&nbsp;2&nbsp;&nbsp;set rn =rownum;<br />
<br />
1219948 rows updated<br />
<br />
Executed in 129.75 seconds<br />
<br />
SQL&gt; create index index_t1_rn on T1 (rn);<br />
<br />
Index created<br />
<br />
Executed in 51.234 seconds<br />
<br />
SQL&gt; <br />
SQL&gt; WITH tab AS(SELECT trunc(dbms_random.value(1,100000)) a FROM dual)<br />
&nbsp;&nbsp;2&nbsp;&nbsp;SELECT * FROM t1 WHERE rn =( SELECT a FROM tab)<br />
&nbsp;&nbsp;3&nbsp;&nbsp;/<br />
<br />
&nbsp; &nbsp; NORMAL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;CLASS&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;RN<br />
---------- --------------------------------------- ----------<br />
&nbsp; &nbsp;&nbsp; &nbsp;3198&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;5&nbsp; &nbsp;&nbsp; &nbsp; 7384<br />
<br />
Executed in 0.031 seconds<br />
<br />
SQL&gt; <br />
SQL&gt; WITH tab AS(SELECT trunc(dbms_random.value(1,100000)) a FROM dual)<br />
&nbsp;&nbsp;2&nbsp;&nbsp;SELECT * FROM t1 WHERE rn =( SELECT a FROM tab)<br />
&nbsp;&nbsp;3&nbsp;&nbsp;/<br />
<br />
&nbsp; &nbsp; NORMAL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;CLASS&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;RN<br />
---------- --------------------------------------- ----------<br />
&nbsp; &nbsp;&nbsp; &nbsp;4760&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;12&nbsp; &nbsp;&nbsp; &nbsp;72082<br />
<br />
Executed in 0.047 seconds<br />
<br />
SQL&gt; /<br />
<br />
&nbsp; &nbsp; NORMAL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;CLASS&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;RN<br />
---------- --------------------------------------- ----------<br />
&nbsp; &nbsp;&nbsp; &nbsp;6922&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;7&nbsp; &nbsp;&nbsp; &nbsp;30862<br />
<br />
Executed in 0.033 seconds<br />
<br />
SQL&gt; /<br />
<br />
&nbsp; &nbsp; NORMAL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;CLASS&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;RN<br />
---------- --------------------------------------- ----------<br />
&nbsp; &nbsp;&nbsp; &nbsp;1727&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;5&nbsp; &nbsp;&nbsp; &nbsp;81038<br />
<br />
Executed in 0.019 seconds<br />
<br />
SQL&gt; /<br />
<br />
&nbsp; &nbsp; NORMAL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;CLASS&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;RN<br />
---------- --------------------------------------- ----------<br />
&nbsp; &nbsp;&nbsp;&nbsp;11890&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;3&nbsp; &nbsp;&nbsp; &nbsp;65704<br />
<br />
Executed in 0.016 seconds</code></div>
100w不是一个恐怖的数据量，创建字段索引都比较快。这类问题关注的焦点，就是在如何减少IO上，诸如get random value的问题，实际只消耗一次CPU时间，而CPU都几百M HZ。<br />
最后，我用了一个with 语法来取数，其实是我在测试过程发现一个现象，暂时不表。<br />
<br />
引自：http://www.oracle.com.cn/viewthread.php?tid=130433&amp;extra=page%3D1<br />
<br />
<br />
</div>
 <img src ="http://www.blogjava.net/liudawei/aggbug/340993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2010-12-17 16:06 <a href="http://www.blogjava.net/liudawei/articles/340993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oralce随机数</title><link>http://www.blogjava.net/liudawei/articles/340986.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Fri, 17 Dec 2010 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/340986.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/340986.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/340986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/340986.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/340986.html</trackback:ping><description><![CDATA[<p>&nbsp;首先第一个是随机抽取6个 </p>
<p>&nbsp;&nbsp;&nbsp; select * from&nbsp; (select * from tablename order by order by dbms_random.value) where&nbsp; rownum＜7 </p>
<p>&nbsp;&nbsp;&nbsp; 这个方法的原理我认为应该是把表中的数据全部查询出来按照随机数进行排列后在从查询出来的数据中查询中6条记录，这个方法我在使用的过程中发现，如果记录一多的话查询的速度有一点点的慢<br />
<br />
第二个是利用oracle的sample()或sample block方法<br />
</p>
<p>选择10%的记录<br />
select * from t1 sample(10)<br />
选择0.1%的记录<br />
select * from t1 sample(0.1)</p>
<p>根据数据块选择1%的记录<br />
select * from t1 sample block(1) </p>
<p>使用数据块选择与使用记录行选择的区别：使用数据块选择表示样本的采集是基于数据块采集的，也就是说样本如果一个数据块被采集为样本，则数据块里的记录全部都是样本</p>
<p><br />
样本统计是基于统计学采集的，是有概率问题，不一定完全准确，如你要取50%的记录，但实际可能返回给你49%的记录集，也可能返回给你51%的记录集</p>
<p><br />
例如</p>
<p>如果表T1有数据块B1,B2<br />
B1有记录R1,R2,R3,R4,R5<br />
B2有记录R6,R7,R8,R9,R10</p>
<p>如果使用如下SQL选择50%的数据<br />
select * from t1 sample block(50)</p>
<p>则返回的结果可能是数据块B1的记录<br />
R1,R2,R3,R4,R5<br />
也可能是数据块B2的记录<br />
R6,R7,R8,R9,R10<br />
也可能不返回记录集</p>
<p><br />
如果使用如下SQL选择50%的数据<br />
select * from t1 sample (50)</p>
<p>则返回的结果可能是<br />
R2,R3,R5,R8,R9<br />
也可能是如下的样子<br />
R1,R3,R4,R8</p>
<p>&nbsp;</p>
<p><br />
应用示例：<br />
随机从表中取中1条记录，选取记录的概率是1%<br />
select * from t1 sample(1) where rownum=1</p>
<p>随机从表中取中10条记录，选取记录的概率是0.1%<br />
select * from t1 sample(0.1) where rownum&lt;=10</p>
<p>注：当选取的概率越低，访问表的记录数将越多</p>
<p><br />
ORACLE参考手册中的相关说明：</p>
<p>sample_clause<br />
The sample_clause lets you instruct Oracle to select from a random sample of rows from the table, rather than from the entire table.</p>
<p><br />
BLOCK<br />
BLOCK instructs Oracle to perform random block sampling instead of random row sampling.</p>
<p><br />
sample_percent<br />
sample_percent is a number specifying the percentage of the total row or block count to be included in the sample. The value must be in the range .000001 to (but not including) 100.</p>
<p>Restrictions on Sampling During Queries<br />
You can specify SAMPLE only in a query that selects from a single table. Joins are not supported. However, you can achieve the same results by using a CREATE TABLE ... AS SELECT query to materialize a sample of an underlying table and then rewrite the original query to refer to the newly created table sample. If you wish, you can write additional queries to materialize samples for other tables. </p>
<p>When you specify SAMPLE, Oracle automatically uses cost-based optimization. Rule-based optimization is not supported with this clause. </p>
<p>--------------------------------------------------------------------------------<br />
Caution: <br />
The use of statistically incorrect assumptions when using this feature can lead to incorrect or undesirable results.</p>
<p>--------------------------------------------------------------------------------<br />
&nbsp;<br />
译:<br />
Sample选项<br />
使用sample选项的意思是指定Oracle从表中随机选择记录样本，这样比从整个表中选择更高效.</p>
<p>block选项<br />
加上 BLOCK选项时表示随机取数据块，而不是随机取记录行.</p>
<p>sample_percent选项<br />
sample_percent是指定总记录行或数据块为数据样本的百分比数值，这个值只能在0.000001到100之间，且不能等于100</p>
<p>限制<br />
只能在单表查询的SQL中指定sample选项，不支持有连接的查询。但是，你可以使用CREATE TABLE ... AS SELECT查询的语法完成同样的效果，然后再采用新建的样本表重新编写查询SQL。</p>
<p>当你指定用sample时，不支持基于规则(rule)的优化法则，ORACLE自动使用基本成本(cost)的优化法则<br />
</p>
 <img src ="http://www.blogjava.net/liudawei/aggbug/340986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2010-12-17 15:30 <a href="http://www.blogjava.net/liudawei/articles/340986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle查询是否锁定与解锁</title><link>http://www.blogjava.net/liudawei/articles/340883.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Thu, 16 Dec 2010 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/340883.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/340883.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/340883.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/340883.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/340883.html</trackback:ping><description><![CDATA[<p>1.查询<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</p>
&nbsp; SELECT /*+ rule */<br />
&nbsp;s.username,<br />
&nbsp;decode(l.type, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', l.type) LOCK_LEVEL,<br />
&nbsp;o.owner,<br />
&nbsp;o.object_name,<br />
&nbsp;o.object_type,<br />
&nbsp;s.sid,<br />
&nbsp;s.serial#,<br />
&nbsp;s.terminal,<br />
&nbsp;s.machine,<br />
&nbsp;s.program,<br />
&nbsp;s.osuser<br />
&nbsp; FROM v$session s, v$lock l, dba_objects o<br />
&nbsp;WHERE l.sid = s.sid<br />
&nbsp;&nbsp; AND l.id1 = o.object_id(+)<br />
&nbsp;&nbsp; AND s.username is NOT NULL<br />
<br />
2.解锁(<span style="color: red">根据需要kill&nbsp; 550为的sid 3761为对应的serial#</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;alter system kill session '550,3761';<br />
&nbsp;&nbsp;&nbsp;&nbsp;commit; 
 <img src ="http://www.blogjava.net/liudawei/aggbug/340883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2010-12-16 14:02 <a href="http://www.blogjava.net/liudawei/articles/340883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle下实现主键自增长(触发器)</title><link>http://www.blogjava.net/liudawei/articles/339288.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Mon, 29 Nov 2010 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/339288.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/339288.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/339288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/339288.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/339288.html</trackback:ping><description><![CDATA[<li><span><span class="keyword">drop</span><span>&nbsp;</span><span class="keyword">table</span><span>&nbsp;book; &nbsp;&nbsp;</span></span></li>
<li><span class="comment">--创建表&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="keyword">create</span><span>&nbsp;</span><span class="keyword">table</span><span>&nbsp;book(&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;bookId&nbsp;varchar2(4)&nbsp;</span><span class="keyword">primary</span><span>&nbsp;</span><span class="keyword">key</span><span>, &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">name</span><span>&nbsp;varchar2(20)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>); &nbsp;&nbsp;</span></li>
<li><span class="comment">--创建序列&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="keyword">create</span><span>&nbsp;</span><span class="keyword">sequence</span><span>&nbsp;book_seq&nbsp;start&nbsp;</span><span class="keyword">with</span><span>&nbsp;1&nbsp;increment&nbsp;</span><span class="keyword">by</span><span>&nbsp;1;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">--创建触发器&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="keyword">create</span><span>&nbsp;</span><span class="op">or</span><span>&nbsp;</span><span class="func">replace</span><span>&nbsp;</span><span class="keyword">trigger</span><span>&nbsp;book_trigger&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>before&nbsp;</span><span class="keyword">insert</span><span>&nbsp;</span><span class="keyword">on</span><span>&nbsp;book&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span class="keyword">for</span><span>&nbsp;each&nbsp;row&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span class="keyword">begin</span><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span class="keyword">select</span><span>&nbsp;book_seq.nextval&nbsp;</span><span class="keyword">into</span><span>&nbsp;:new.bookId&nbsp;</span><span class="keyword">from</span><span>&nbsp;dual;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span class="keyword">end</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
<li><span class="comment">--添加数据&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="keyword">insert</span><span>&nbsp;</span><span class="keyword">into</span><span>&nbsp;book(</span><span class="keyword">name</span><span>)&nbsp;&nbsp;</span><span class="keyword">values</span><span>&nbsp;(</span><span class="string">'cc'</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span class="keyword">insert</span><span>&nbsp;</span><span class="keyword">into</span><span>&nbsp;book(</span><span class="keyword">name</span><span>)&nbsp;&nbsp;</span><span class="keyword">values</span><span>&nbsp;(</span><span class="string">'dd'</span><span>); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="keyword">commit</span><span>;&nbsp;</span></li>
 <img src ="http://www.blogjava.net/liudawei/aggbug/339288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2010-11-29 09:46 <a href="http://www.blogjava.net/liudawei/articles/339288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle创建表空间 用户</title><link>http://www.blogjava.net/liudawei/articles/336762.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Tue, 02 Nov 2010 01:42:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/336762.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/336762.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/336762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/336762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/336762.html</trackback:ping><description><![CDATA[01_create_tablespace<br />
<br />
<p>----------------------------------------------------<br />
-- Export file for user JSYD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --<br />
-- Created by Administrator on 2008-9-4, 10:34:43 --<br />
----------------------------------------------------set echo on<br />
--set feedback off<br />
--set verify off</p>
<p>--define tb_path=C:\oracle\product\10.1.0\oradata\steel_trade\</p>
<p><br />
--prompt '建立表空间开始...'</p>
<p>create tablespace STEEL_TRADE_DAT datafile '&amp;tb_path\STEEL_TRADE_DAT.DBF' size 10M AUTOEXTEND ON NEXT&nbsp; 10240K MAXSIZE UNLIMITED extent management local uniform size 128k online;<br />
create tablespace STEEL_TRADE_IDX datafile '&amp;tb_path\STEEL_TRADE_IDX.DBF' size 10M AUTOEXTEND ON NEXT&nbsp; 10240K MAXSIZE UNLIMITED extent management local uniform size 128k online;<br />
create temporary tablespace STEEL_TRADE_TMP tempfile '&amp;tb_path\STEEL_TRADE_TMP.DBF' size 10m AUTOEXTEND ON NEXT&nbsp; 10240K MAXSIZE UNLIMITED extent management local uniform size 128k;</p>
<p><br />
--prompt '建立表空间完毕！'<br />
</p>
<br />
02_create_user<br />
<br />
<p>----------------------------------------------------<br />
-- Export file for user JSYD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --<br />
-- Created by Administrator on 2008-9-4, 10:34:43 --<br />
----------------------------------------------------<br />
--prompt '创建数据库用户...'</p>
<p>--set feedback off<br />
--set define off<br />
--set echo off<br />
--PROMPT 正在创建login ---jsyd<br />
create user bid_admin identified by a123456<br />
&nbsp;&nbsp;&nbsp; default tablespace STEEL_TRADE_DAT<br />
&nbsp;&nbsp;&nbsp; temporary tablespace STEEL_TRADE_TMP<br />
&nbsp;&nbsp;&nbsp; account unlock;</p>
<p><br />
--PROMPT 正在创建角色权限 ---jsyd</p>
<p><br />
--PROMPT 正在创建系统权限 ---jsyd<br />
grant AUDIT ANY to bid_admin with admin option;<br />
grant DROP USER to bid_admin with admin option;<br />
grant ALTER USER to bid_admin with admin option;<br />
grant ANALYZE ANY to bid_admin with admin option;<br />
grant BECOME USER to bid_admin with admin option;<br />
grant CREATE ROLE to bid_admin with admin option;<br />
grant CREATE TYPE to bid_admin with admin option;<br />
grant CREATE USER to bid_admin with admin option;<br />
grant CREATE VIEW to bid_admin with admin option;<br />
grant ALTER SYSTEM to bid_admin with admin option;<br />
grant AUDIT SYSTEM to bid_admin with admin option;<br />
grant CREATE TABLE to bid_admin with admin option;<br />
grant DROP PROFILE to bid_admin with admin option;<br />
grant ALTER PROFILE to bid_admin with admin option;<br />
grant ALTER SESSION to bid_admin with admin option;<br />
grant DROP ANY ROLE to bid_admin with admin option;<br />
grant DROP ANY TYPE to bid_admin with admin option;<br />
grant DROP ANY VIEW to bid_admin with admin option;<br />
grant QUERY REWRITE to bid_admin with admin option;<br />
grant ALTER ANY ROLE to bid_admin with admin option;<br />
grant ALTER ANY TYPE to bid_admin with admin option;<br />
grant ALTER DATABASE to bid_admin with admin option;<br />
grant CREATE CLUSTER to bid_admin with admin option;<br />
grant CREATE LIBRARY to bid_admin with admin option;<br />
grant CREATE PROFILE to bid_admin with admin option;<br />
grant CREATE SESSION to bid_admin with admin option;<br />
grant CREATE SYNONYM to bid_admin with admin option;<br />
grant CREATE TRIGGER to bid_admin with admin option;<br />
grant DROP ANY INDEX to bid_admin with admin option;<br />
grant DROP ANY TABLE to bid_admin with admin option;<br />
grant GRANT ANY ROLE to bid_admin with admin option;<br />
grant LOCK ANY TABLE to bid_admin with admin option;<br />
grant ALTER ANY INDEX to bid_admin with admin option;<br />
grant ALTER ANY TABLE to bid_admin with admin option;<br />
grant CREATE ANY TYPE to bid_admin with admin option;<br />
grant CREATE ANY VIEW to bid_admin with admin option;<br />
grant CREATE SEQUENCE to bid_admin with admin option;<br />
grant CREATE SNAPSHOT to bid_admin with admin option;<br />
grant DROP TABLESPACE to bid_admin with admin option;<br />
grant ALTER TABLESPACE to bid_admin with admin option;<br />
grant BACKUP ANY TABLE to bid_admin with admin option;<br />
grant CREATE ANY INDEX to bid_admin with admin option;<br />
grant CREATE ANY TABLE to bid_admin with admin option;<br />
grant CREATE PROCEDURE to bid_admin with admin option;<br />
grant DELETE ANY TABLE to bid_admin with admin option;<br />
grant DROP ANY CLUSTER to bid_admin with admin option;<br />
grant DROP ANY LIBRARY to bid_admin with admin option;<br />
grant DROP ANY SYNONYM to bid_admin with admin option;<br />
grant DROP ANY TRIGGER to bid_admin with admin option;<br />
grant EXECUTE ANY TYPE to bid_admin with admin option;<br />
grant INSERT ANY TABLE to bid_admin with admin option;<br />
grant SELECT ANY TABLE to bid_admin with admin option;<br />
grant UPDATE ANY TABLE to bid_admin with admin option;<br />
grant ALTER ANY CLUSTER to bid_admin with admin option;<br />
grant ALTER ANY LIBRARY to bid_admin with admin option;<br />
grant ALTER ANY TRIGGER to bid_admin with admin option;<br />
grant COMMENT ANY TABLE to bid_admin with admin option;<br />
grant CREATE TABLESPACE to bid_admin with admin option;<br />
grant DROP ANY SEQUENCE to bid_admin with admin option;<br />
grant DROP ANY SNAPSHOT to bid_admin with admin option;<br />
grant FORCE TRANSACTION to bid_admin with admin option;<br />
grant MANAGE TABLESPACE to bid_admin with admin option;<br />
grant ALTER ANY SEQUENCE to bid_admin with admin option;<br />
grant ALTER ANY SNAPSHOT to bid_admin with admin option;<br />
grant CREATE ANY CLUSTER to bid_admin with admin option;<br />
grant CREATE ANY LIBRARY to bid_admin with admin option;<br />
grant CREATE ANY SYNONYM to bid_admin with admin option;<br />
grant CREATE ANY TRIGGER to bid_admin with admin option;<br />
grant DROP ANY DIRECTORY to bid_admin with admin option;<br />
grant DROP ANY PROCEDURE to bid_admin with admin option;<br />
grant RESTRICTED SESSION to bid_admin with admin option;<br />
grant ALTER ANY PROCEDURE to bid_admin with admin option;<br />
grant ALTER RESOURCE COST to bid_admin with admin option;<br />
grant CREATE ANY SEQUENCE to bid_admin with admin option;<br />
grant CREATE ANY SNAPSHOT to bid_admin with admin option;<br />
grant DROP PUBLIC SYNONYM to bid_admin with admin option;<br />
grant EXECUTE ANY LIBRARY to bid_admin with admin option;<br />
grant GRANT ANY PRIVILEGE to bid_admin with admin option;<br />
grant SELECT ANY SEQUENCE to bid_admin with admin option;<br />
grant CREATE ANY DIRECTORY to bid_admin with admin option;<br />
grant CREATE ANY PROCEDURE to bid_admin with admin option;<br />
grant CREATE DATABASE LINK to bid_admin with admin option;<br />
grant GLOBAL QUERY REWRITE to bid_admin with admin option;<br />
grant UNLIMITED TABLESPACE to bid_admin with admin option;<br />
grant CREATE PUBLIC SYNONYM to bid_admin with admin option;<br />
grant DROP ROLLBACK SEGMENT to bid_admin with admin option;<br />
grant EXECUTE ANY PROCEDURE to bid_admin with admin option;<br />
grant FORCE ANY TRANSACTION to bid_admin with admin option;<br />
grant SELECT ANY DICTIONARY to bid_admin with admin option;<br />
grant ALTER ROLLBACK SEGMENT to bid_admin with admin option;<br />
grant CREATE ROLLBACK SEGMENT to bid_admin with admin option;<br />
grant DROP PUBLIC DATABASE LINK to bid_admin with admin option;<br />
grant CREATE PUBLIC DATABASE LINK to bid_admin with admin option;<br />
--exit;<br />
</p>
 <img src ="http://www.blogjava.net/liudawei/aggbug/336762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2010-11-02 09:42 <a href="http://www.blogjava.net/liudawei/articles/336762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle9i 字符集与NLS_LANG搭配测试兼乱码问题分析 </title><link>http://www.blogjava.net/liudawei/articles/332310.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Fri, 17 Sep 2010 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/332310.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/332310.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/332310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/332310.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/332310.html</trackback:ping><description><![CDATA[<font color="#ff0000"><span style="font-size: 10pt; color: #000000; font-family: Verdana"><font style="font-family: " color="#ff0000">【背景介绍】</font><br style="font-family: " />
=================================================================== <br style="font-family: " />
<span style="color: #000000">最近在使用Oracle9i数据库进行数据插入、查询、导入/出，有时会出现乱码的情况，具体的情形有以下两种：<br style="font-family: " />
<br style="font-family: " />
1.首次插入/显示乱码<br style="font-family: " />
<br style="font-family: " />
2.首次插入/显示正常、但把数据用工具导出为本地文件(例如TXT)文件，再在另一个客户端中打开该文件并执行时再次插入的数据显示为乱码。 <br style="font-family: " />
<br style="font-family: " />
遂在本地创建两个数据库，一个为AL32UTF8字符集，一个为ZHS16GBK字符集，配合客户端NLS_LANG的不同设置，测试乱码的情况及进行原因分析。&nbsp;&nbsp;&nbsp;&nbsp; <br style="font-family: " />
</span>===================================================================<br style="font-family: " />
<br style="font-family: " />
<font style="font-family: " size="2"><font style="font-family: " color="#ff0000">【测试目的】<br style="font-family: " />
</font>===================================================================<br />
测试不同的数据库字符集和客户端NLS_LANG搭配下，中文字符/中文日期的插入、显示<br style="font-family: " />
===================================================================<br style="font-family: " />
<br style="font-family: " />
</font><font style="font-family: " size="2"><font style="font-family: " color="#ff0000">【测试环境】<br style="font-family: " />
</font>===================================================================<br />
Windows 2000 Professional (英文版) + Oracle 9.2.0.1.0 + SQL*Plus: Release 9.2.0.1.0<br style="font-family: " />
<br style="font-family: " />
注：此次测试的客户端应用工具为SQL*PLUS，如果是使用TOAD、PL/SQL Develop之类工具，得到的结果会和以下有些不同。推荐使用SQL*PLUS作为一切客户端应用的测试工具<br style="font-family: " />
=================================================================== <br style="font-family: " />
<br style="font-family: " />
</font><font style="font-family: " size="2"><font style="font-family: " color="#ff0000">【测试数据库】<br style="font-family: " />
</font>=================================================================== <br style="font-family: " />
本机数据库1: SID: PAULLIN 登陆参数: qprod/qprod@paullin <br style="font-family: " />
本机数据库2：SID: PAUL&nbsp;&nbsp;&nbsp;&nbsp;登陆参数：qlinpen/pengpenglin@paul<br style="font-family: " />
=================================================================== <br style="font-family: " />
<br style="font-family: " />
</font><font style="font-family: " size="2"><font style="font-family: " color="#ff0000">【测试字符集】<br style="font-family: " />
</font>=================================================================== <br style="font-family: " />
客户端应用/操作系统字符集：GB2312<br style="font-family: " />
<br style="font-family: " />
客户端NLS_LANG设置：<br style="font-family: " />
&nbsp; AMERICAN_AMERICA.US7ASCII<br style="font-family: " />
&nbsp;&nbsp;AMERICAN_AMERICA.WE8MSWIN1252<br style="font-family: " />
&nbsp;&nbsp;AMERICAN_AMERICA.ZHS16GBK<br style="font-family: " />
&nbsp;&nbsp;AMERICAN_AMERICA.AL32UTF8<br style="font-family: " />
&nbsp;&nbsp;SIMPLIFIED CHINESE_CHINA.ZHS16GBK<br style="font-family: " />
<br style="font-family: " />
数据库端字符集：<br style="font-family: " />
&nbsp; PAULLIN: AL32UF8<br style="font-family: " />
&nbsp;&nbsp;PAUL: ZHS16GBK<br style="font-family: " />
=================================================================== <br style="font-family: " />
<br style="font-family: " />
</font><font style="font-family: " size="2"><font style="font-family: " color="#ff0000">【测试脚本】<br style="font-family: " />
</font>=================================================================== <br style="font-family: " />
--登陆数据库&nbsp;&nbsp;&nbsp;&nbsp; <br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; sqlplus </font><a style="font-family: " href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#113;&#112;&#114;&#111;&#100;&#47;&#113;&#112;&#114;&#111;&#100;&#64;&#112;&#97;&#117;&#108;&#108;&#105;&#110;"><font style="font-family: " size="2">qprod/qprod@paullin</font></a><font style="font-family: " size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; sqlplus </font><a style="font-family: " href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#113;&#108;&#105;&#110;&#112;&#101;&#110;&#47;&#112;&#101;&#110;&#103;&#112;&#101;&#110;&#103;&#108;&#105;&#110;&#64;&#112;&#97;&#117;&#108;"><font style="font-family: " size="2">qlinpen/pengpenglin@paul</font></a><br style="font-family: " />
<br style="font-family: " />
<font style="font-family: " size="2">--执行测试脚本<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; drop table test;<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; drop table testdate;&nbsp;&nbsp;&nbsp;&nbsp; <br style="font-family: " />
<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; create table test (id number(1), name varchar2(20));<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; create table testdate (birthday date);&nbsp;&nbsp; <br style="font-family: " />
<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; insert into test values(1,'Tom'); <br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; insert into test values(2,'张三'); <br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; insert into test values(3,'易建聯');<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; commit;<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; <br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; insert into testdate values(TO_Date( '01/08/2008 04:14:00 下午', <br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'MM/DD/YYYY HH:MI:SS AM'));<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; commit;<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; <br style="font-family: " />
--查看测试结果&nbsp;&nbsp;&nbsp;&nbsp; <br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; select * from test;<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; select * from testdate;&nbsp;&nbsp;&nbsp;&nbsp;<br style="font-family: " />
=================================================================== <br style="font-family: " />
<br style="font-family: " />
</font><font style="font-family: " size="2"><font style="font-family: " color="#ff0000">【测试一：数据库端字符集为AL32UTF8的情况】<br style="font-family: " />
</font>=================================================================== <br style="font-family: " />
1.登陆数据库：<br style="font-family: " />
&nbsp;&nbsp;C:\Documents and Settings\qlinpen.E0015609D6309&gt;sqlplus qprod/qprod@paullin<br style="font-family: " />
<br style="font-family: " />
2.查看数据库字符集：<br style="font-family: " />
&nbsp;&nbsp;SQL&gt; select * from nls_database_parameters where parameter = 'NLS_CHARACTERSET';&nbsp;&nbsp;&nbsp;&nbsp;<br style="font-family: " />
<br style="font-family: " />
3.测试内容及测试结果：<br style="font-family: " />
&nbsp;&nbsp;1).客户端NLS_LANG设置为AMERICAN_AMERICA.US7ASCII：<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文字符测试：插入/显示中文字符均为乱码<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;中文日期测试：ORA-01855: AM/A.M. or PM/P.M. required<br style="font-family: " />
<br style="font-family: " />
&nbsp;&nbsp;2).客户端NLS_LANG设置为AMERICAN_AMERICA.WE8MSWIN1252：<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文字符测试：插入/显示中文字符均为正常<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;中文日期测试：ORA-01855: AM/A.M. or PM/P.M. required<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; <br style="font-family: " />
&nbsp;&nbsp;3).客户端NLS_LANG设置为AMERICAN_AMERICA.ZHS16GBK：<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文字符测试：插入/显示中文字符均为正常<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文日期测试：ORA-01855: AM/A.M. or PM/P.M. required<br style="font-family: " />
&nbsp;&nbsp;<br style="font-family: " />
&nbsp;&nbsp;4).客户端NLS_LANG设置为AMERICAN_AMERICA.AL32UTF8：<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文字符测试：插入/显示中文字符均为正常<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文日期测试：ORA-01855: AM/A.M. or PM/P.M. required<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; <br style="font-family: " />
&nbsp;&nbsp;5).客户端NLS_LANG设置为SIMPLIFIED CHINESE_CHINA.ZHS16GBK：<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文字符测试：插入/显示中文均为正常<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文日期测试：插入/显示中文日期均为正常，格式为DD-MM-YY(例如：08-1月 -08)&nbsp;&nbsp; <br style="font-family: " />
<br style="font-family: " />
4.测试结论：<br style="font-family: " />
&nbsp;&nbsp;从测试结果来看，当数据库端字符集为AL32UTF8时，能够使到中文字符被正确插入/显示的NLS_LANG的字符集为：&nbsp;&nbsp;WE8MSWIN1252、ZHS16GBK、AL32UTF8。<br style="font-family: " />
&nbsp;&nbsp;<br style="font-family: " />
&nbsp;&nbsp;但是要使到中文格式的时间能够被正确插入，则NLS_LANG的LANGUAGE和TERRITORY设置必须为：SIMPLIFIED_CHINESE_CHINA<br style="font-family: " />
=================================================================== <br style="font-family: " />
<br style="font-family: " />
</font><font style="font-family: " size="2"><font style="font-family: " color="#ff0000">【测试二：数据库端字符集为ZHS16GBK的情况】<br style="font-family: " />
</font>=================================================================== <br style="font-family: " />
1.登陆数据库：<br style="font-family: " />
&nbsp;&nbsp;C:\Documents and Settings\qlinpen.E0015609D6309&gt;sqlplus qlinpen/pengpenglin@paul<br style="font-family: " />
<br style="font-family: " />
2.查看数据库字符集：<br style="font-family: " />
&nbsp;&nbsp;SQL&gt; select * from nls_database_parameters where parameter = 'NLS_CHARACTERSET';&nbsp;&nbsp;&nbsp;&nbsp;<br style="font-family: " />
<br style="font-family: " />
3.测试内容及测试结果：<br style="font-family: " />
&nbsp;&nbsp;1).客户端NLS_LANG设置为AMERICAN_AMERICA.US7ASCII：<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文字符测试：插入/显示中文字符均为乱码<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文日期测试：ORA-01855: AM/A.M. or PM/P.M. required<br style="font-family: " />
<br style="font-family: " />
&nbsp;&nbsp;2).客户端NLS_LANG设置为AMERICAN_AMERICA.WE8MSWIN1252：<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文字符测试：插入/显示中文字符均为乱码<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文日期测试：ORA-01855: AM/A.M. or PM/P.M. required<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; <br style="font-family: " />
&nbsp;&nbsp;3).客户端NLS_LANG设置为AMERICAN_AMERICA.ZHS16GBK：<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文字符测试：插入/显示中文字符均为正常<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文日期测试：ORA-01855: AM/A.M. or PM/P.M. required<br style="font-family: " />
&nbsp;&nbsp;<br style="font-family: " />
&nbsp;&nbsp;4).客户端NLS_LANG设置为AMERICAN_AMERICA.AL32UTF8：<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文字符测试：插入/显示中文字符均为乱码<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文日期测试：ORA-01855: AM/A.M. or PM/P.M. required<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp; <br style="font-family: " />
&nbsp;&nbsp;5).客户端NLS_LANG设置为SIMPLIFIED CHINESE_CHINA.ZHS16GBK：<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文字符测试：插入/显示中文均为正常<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文日期测试：插入/显示中文日期均为正常，格式为DD-MM-YY(例如：08-1月 -08)&nbsp;&nbsp; <br style="font-family: " />
<br style="font-family: " />
4.测试结论：<br style="font-family: " />
&nbsp;&nbsp;从测试结果来看，当数据库端字符集为ZHS16GBK时，能够使到中文字符被正常插入/显示的NLS_LANG的字符集为：ZHS16GBK。<br style="font-family: " />
&nbsp;&nbsp;<br style="font-family: " />
&nbsp;&nbsp;而且要使到中文格式的时间能够被正确插入，则NLS_LANG的LANGUAGE和TERRITORY设置必须为：SIMPLIFIED CHINESE_CHINA<br style="font-family: " />
=================================================================== <br style="font-family: " />
<br style="font-family: " />
</font><font style="font-family: " size="2"><font style="font-family: " color="#ff0000">【测试总结】<br style="font-family: " />
</font>=================================================================== <br style="font-family: " />
从上面两个测试的结果就可以明显看出，把数据库端的字符集设置为AL32UTF8比起ZHS16GBK更加有优势。<br style="font-family: " />
<br style="font-family: " />
UTF8支持从客户端应用字符集为WE8MSWIN1252、ZHS16GBK、AL32UTF8的环境下进行中文字符的插入，而ZHS16GBK只支持客户端应用字符集为ZHS16GBK环境下的的中文字符插入。<br style="font-family: " />
<br style="font-family: " />
其次我们来看看日期格式为：01/08/2008 04:14:00 下午的记录为什么只能在NLS_LANG的LANGUAGE和TERRITORY为SIMPLIFIED CHINESE_CHINA的情况下才能正确插入？<br style="font-family: " />
<br style="font-family: " />
我们知道客户端NLS_LANG的值由3部分构成，即&lt;LANUAGE&gt;_&lt;TERRITORY&gt;.&lt;CHARACTERSET&gt;，而掌管日期中月份和日显示的恰恰就是&lt;LANGUAGE&gt;部分，所以很明显&lt;LANGUAGE&gt;为AMERICAN的情况下，是不可能正确插入的(西方用AM、PM来表示上、下午)。<br style="font-family: " />
<br style="font-family: " />
依次类推，如果以后出现货币和数字格式、地区和计算星期及日期的习惯插入、转换失败，那么我们就要检查第二个元素&lt;TERRITORY&gt;。<br style="font-family: " />
=================================================================== </font></span></font>
</table>
<img src ="http://www.blogjava.net/liudawei/aggbug/332310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2010-09-17 16:04 <a href="http://www.blogjava.net/liudawei/articles/332310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装客户端 监听器报错（Oracle 10g ORA-12154: TNS: could not resolve the connect identifier specified 问题解决! ）</title><link>http://www.blogjava.net/liudawei/articles/332305.html</link><dc:creator>孤飞燕</dc:creator><author>孤飞燕</author><pubDate>Fri, 17 Sep 2010 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/liudawei/articles/332305.html</guid><wfw:comment>http://www.blogjava.net/liudawei/comments/332305.html</wfw:comment><comments>http://www.blogjava.net/liudawei/articles/332305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liudawei/comments/commentRss/332305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liudawei/services/trackbacks/332305.html</trackback:ping><description><![CDATA[今天安装Oracle客户端 监听器已经配置好 并且在Net Configuration Assistant中测试都正常，用PLSQL测试连接总不成功，总是报ora12541-TNS 异常信息<br />
<br />
查了下相关东西<br />
<br />
本身的环境变量：<br />
<br />
d:\oracle\product\10.2.0\client_2\bin;<span style="color: red">d:\oracle\product\10.2.0\client_1;</span>C:\Program Files\PC Connectivity Solution\;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Common Files\Thunder Network\KanKan\Codecs;D:\Program Files\TortoiseSVN\bin<br />
<br />
把红色去掉后 尽然成功了 希望大家以后碰到此问题 检查下相关环境变量 可能根据每个人安装不同 环境变量不同 只保留bin目录 其他可以去掉了
  <img src ="http://www.blogjava.net/liudawei/aggbug/332305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liudawei/" target="_blank">孤飞燕</a> 2010-09-17 15:48 <a href="http://www.blogjava.net/liudawei/articles/332305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>