﻿<?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-CONAN ZONE-文章分类-Oracle</title><link>http://www.blogjava.net/conans/category/32437.html</link><description>你越挣扎我就越兴奋</description><language>zh-cn</language><lastBuildDate>Mon, 13 Dec 2010 00:11:06 GMT</lastBuildDate><pubDate>Mon, 13 Dec 2010 00:11:06 GMT</pubDate><ttl>60</ttl><item><title>Oracle 常用SQL技巧收藏</title><link>http://www.blogjava.net/conans/articles/338235.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 17 Nov 2010 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/338235.html</guid><description><![CDATA[<strong>转自：</strong>http://www.javaeye.com/topic/805815<br />
<strong><br />
1. SELECT子句中避免使用 &#8220;*&#8221;</strong>
<br />
&nbsp;&nbsp;&nbsp; 当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 &#8216;*&#8217;
是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将&#8220;*&#8221; 依次转换成所有的列名,
这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.
<br />
<br />
<strong>2.使用DECODE函数来减少处理时间</strong>
<br />
&nbsp;&nbsp;&nbsp; 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. 例如:
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>SELECT&nbsp;COUNT(*)，SUM(SAL)&nbsp;FROM&nbsp;EMP&nbsp;WHERE&nbsp;DEPT_NO&nbsp;=&nbsp;0020&nbsp;AND&nbsp;&nbsp;ENAME&nbsp;LIKE&nbsp;&#8216;SMITH%&#8217;;&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;COUNT(*)，SUM(SAL)&nbsp;FROM&nbsp;EMP&nbsp;WHERE&nbsp;DEPT_NO&nbsp;=&nbsp;0030&nbsp;AND&nbsp;ENAME&nbsp;LIKE&nbsp;&#8216;SMITH%&#8217;;&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">SELECT COUNT(*)，SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND  ENAME LIKE &#8216;SMITH%&#8217;;
SELECT COUNT(*)，SUM(SAL) FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE &#8216;SMITH%&#8217;;
</pre>
&nbsp;&nbsp;&nbsp; 你可以用DECODE函数高效地得到相同结果:
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>SELECT&nbsp;COUNT(DECODE(DEPT_NO,0020,&#8217;X&#8217;,NULL))&nbsp;D0020_COUNT,&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNT(DECODE(DEPT_NO,0030,&#8217;X&#8217;,NULL))&nbsp;D0030_COUNT,&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(DECODE(DEPT_NO,0020,SAL,NULL))&nbsp;D0020_SAL,&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(DECODE(DEPT_NO,0030,SAL,NULL))&nbsp;D0030_SAL&nbsp;&nbsp;</li>
    <li>FROM&nbsp;EMP&nbsp;WHERE&nbsp;ENAME&nbsp;LIKE&nbsp;&#8216;SMITH%&#8217;;&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">SELECT COUNT(DECODE(DEPT_NO,0020,&#8217;X&#8217;,NULL)) D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,&#8217;X&#8217;,NULL)) D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
FROM EMP WHERE ENAME LIKE &#8216;SMITH%&#8217;;
</pre>
&nbsp;&nbsp;&nbsp; 类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中.
<br />
<br />
<strong>3.删除重复记录</strong>
<br />
&nbsp;&nbsp; 最高效的删除重复记录方法 ( 因为使用了ROWID)
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>DELETE&nbsp;FROM&nbsp;EMP&nbsp;E&nbsp;WHERE&nbsp;E.ROWID&nbsp;&gt;&nbsp;(SELECT&nbsp;MIN(X.ROWID)&nbsp;FROM&nbsp;EMP&nbsp;X&nbsp;WHERE&nbsp;X.EMP_NO&nbsp;=&nbsp;E.EMP_NO);&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">DELETE FROM EMP E WHERE E.ROWID &gt; (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
</pre>
<br />
<br />
<strong>4. 用TRUNCATE替代DELETE</strong>
<br />
&nbsp;&nbsp;&nbsp; 当删除表中的记录时，在通常情况下，回滚段(rollback segments )
用来存放可以被恢复的信息，如果你没有COMMIT事务，ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)，而当运
用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.
<br />
<br />
<strong>5.计算记录条数</strong>
<br />
&nbsp;&nbsp;&nbsp; 和一般的观点相反, count(*) 比count(1)稍快 ，当然如果可以通过索引检索，对索引列的计数仍旧是最快的. 例如 COUNT(EMPNO)
<br />
<br />
<strong>6.用Where子句替换HAVING子句</strong>
<br />
&nbsp;&nbsp;&nbsp; 避免使用HAVING子句，HAVING 只会在检索出所有记录之后才对结果集进行过滤，这个处理需要排序、总计等操作，如果能通过WHERE子句限制记录的数目，那就能减少这方面的开销, 例如:
<br />
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--低效&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;REGION，AVG(LOG_SIZE)&nbsp;FROM&nbsp;LOCATION&nbsp;GROUP&nbsp;BY&nbsp;REGION&nbsp;HAVING&nbsp;REGION&nbsp;REGION&nbsp;!=&nbsp;&#8216;SYDNEY&#8217;&nbsp;AND&nbsp;REGION&nbsp;!=&nbsp;&#8216;PERTH&#8217;&nbsp;&nbsp;</li>
    <li>--高效&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;REGION，AVG(LOG_SIZE)&nbsp;&nbsp;FROM&nbsp;&nbsp;LOCATION&nbsp;WHERE&nbsp;REGION&nbsp;REGION&nbsp;!=&nbsp;&#8216;SYDNEY&#8217;&nbsp;ND&nbsp;REGION&nbsp;!=&nbsp;&#8216;PERTH&#8217;&nbsp;GROUP&nbsp;BY&nbsp;REGION&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--低效
SELECT REGION，AVG(LOG_SIZE) FROM LOCATION GROUP BY REGION HAVING REGION REGION != &#8216;SYDNEY&#8217; AND REGION != &#8216;PERTH&#8217;
--高效
SELECT REGION，AVG(LOG_SIZE)  FROM  LOCATION WHERE REGION REGION != &#8216;SYDNEY&#8217; ND REGION != &#8216;PERTH&#8217; GROUP BY REGION
</pre>
<br />
<br />
<strong>7. 用EXISTS替代IN</strong>
<br />
&nbsp;&nbsp; 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--低效&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;*&nbsp;FROM&nbsp;EMP&nbsp;WHERE&nbsp;EMPNO&nbsp;&gt;&nbsp;0&nbsp;AND&nbsp;DEPTNO&nbsp;IN&nbsp;(SELECT&nbsp;DEPTNO&nbsp;FROM&nbsp;DEPT&nbsp;WHERE&nbsp;LOC&nbsp;=&nbsp;&#8216;MELB&#8217;)&nbsp;&nbsp;</li>
    <li>--高效:&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;*&nbsp;FROM&nbsp;EMP&nbsp;WHERE&nbsp;EMPNO&nbsp;&gt;&nbsp;0&nbsp;AND&nbsp;EXISTS&nbsp;(SELECT&nbsp;&#8216;X&#8217;&nbsp;&nbsp;FROM&nbsp;DEPT&nbsp;WHERE&nbsp;DEPT.DEPTNO&nbsp;=&nbsp;EMP.DEPTNO&nbsp;AND&nbsp;LOC&nbsp;=&nbsp;&#8216;MELB&#8217;)&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--低效
SELECT * FROM EMP WHERE EMPNO &gt; 0 AND DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC = &#8216;MELB&#8217;)
--高效:
SELECT * FROM EMP WHERE EMPNO &gt; 0 AND EXISTS (SELECT &#8216;X&#8217;  FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = &#8216;MELB&#8217;)
</pre>
<br />
<br />
<strong>8.用NOT EXISTS替代NOT IN</strong>
<br />
&nbsp;&nbsp; 在子查询中，NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下，NOT IN都是最低效的
(因为它对子查询中的表执行了一个全表遍历).&nbsp; 为了避免使用NOT IN，我们可以把它改写成外连接(Outer Joins)或NOT
EXISTS. 例如:
<br />
SELECT &#8230;FROM EMP&nbsp; WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT=&#8217;A&#8217;);
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--为了提高效率改写为:&nbsp;(方法一:&nbsp;高效)&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;&#8230;.FROM&nbsp;EMP&nbsp;A,DEPT&nbsp;B&nbsp;WHERE&nbsp;A.DEPT_NO&nbsp;=&nbsp;B.DEPT(+)&nbsp;AND&nbsp;B.DEPT_NO&nbsp;IS&nbsp;NULL&nbsp;AND&nbsp;B.DEPT_CAT(+)&nbsp;=&nbsp;&#8216;A&#8217;&nbsp;&nbsp;</li>
    <li>--&nbsp;(方法二:&nbsp;最高效)&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;&#8230;.FROM&nbsp;EMP&nbsp;E&nbsp;WHERE&nbsp;NOT&nbsp;EXISTS&nbsp;(SELECT&nbsp;&#8216;X&#8217;&nbsp;&nbsp;FROM&nbsp;DEPT&nbsp;D&nbsp;WHERE&nbsp;D.DEPT_NO&nbsp;=&nbsp;E.DEPT_NO&nbsp;AND&nbsp;DEPT_CAT&nbsp;=&nbsp;&#8216;A&#8217;);&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--为了提高效率改写为: (方法一: 高效)
SELECT &#8230;.FROM EMP A,DEPT B WHERE A.DEPT_NO = B.DEPT(+) AND B.DEPT_NO IS NULL AND B.DEPT_CAT(+) = &#8216;A&#8217;
-- (方法二: 最高效)
SELECT &#8230;.FROM EMP E WHERE NOT EXISTS (SELECT &#8216;X&#8217;  FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = &#8216;A&#8217;);
</pre>
<br />
<br />
<strong>9.用EXISTS替换DISTINCT</strong>
<br />
&nbsp;&nbsp;&nbsp; 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换
<br />
例如:
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--低效:&nbsp;&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;DISTINCT&nbsp;DEPT_NO,DEPT_NAME&nbsp;&nbsp;FROM&nbsp;DEPT&nbsp;D,EMP&nbsp;E&nbsp;WHERE&nbsp;D.DEPT_NO&nbsp;=&nbsp;E.DEPT_NO&nbsp;&nbsp;</li>
    <li>--高效:&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;DEPT_NO,DEPT_NAME&nbsp;&nbsp;FROM&nbsp;DEPT&nbsp;D&nbsp;WHERE&nbsp;EXISTS&nbsp;(&nbsp;SELECT&nbsp;&#8216;X&#8217;&nbsp;FROM&nbsp;EMP&nbsp;E&nbsp;WHERE&nbsp;E.DEPT_NO&nbsp;=&nbsp;D.DEPT_NO);&nbsp;&nbsp;</li>
    <li>--EXISTS&nbsp;使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--低效:
SELECT DISTINCT DEPT_NO,DEPT_NAME  FROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO
--高效:
SELECT DEPT_NO,DEPT_NAME  FROM DEPT D WHERE EXISTS ( SELECT &#8216;X&#8217; FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
--EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.
</pre>
<br />
<br />
<strong>10. 用索引提高效率</strong>
<br />
&nbsp;&nbsp;
索引是表的一个概念部分，用来提高检索数据的效率，实际上ORACLE使用了一个复杂的自平衡B-tree结构，通常通过索引查询数据比全表扫描要快，当
ORACLE找出执行查询和Update语句的最佳路径时， ORACLE优化器将使用索引，
同样在联结多个表时使用索引也可以提高效率，另一个使用索引的好处是，它提供了主键(primary key)的唯一性验证，除了那些LONG或LONG
RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现,
在扫描小表时,使用索引同样能提高效率，虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价.
索引需要空间来存储，也需要定期维护，每当有记录在表中增减或索引列被修改时，索引本身也会被修改，这意味着每条记录的INSERT , DELETE ,
UPDATE将为此多付出4 , 5 次的磁盘I/O， 因为索引需要额外的存储空间和处理，那些不必要的索引反而会使查询反应时间变慢
<br />
<em>注：定期的重构索引是有必要的. </em>
<br />
<br />
<strong>11. 避免在索引列上使用计算</strong>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE子句中，如果索引列是函数的一部分，优化器将不使用索引而使用全表扫描. 举例：
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--低效：&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;&#8230;FROM&nbsp;DEPT&nbsp;WHERE&nbsp;SAL&nbsp;*&nbsp;12&nbsp;&gt;&nbsp;25000;&nbsp;&nbsp;</li>
    <li>--高效:&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;&#8230;&nbsp;FROM&nbsp;DEPT&nbsp;WHERE&nbsp;SAL&nbsp;&nbsp;&gt;&nbsp;25000/12;&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--低效：
SELECT &#8230;FROM DEPT WHERE SAL * 12 &gt; 25000;
--高效:
SELECT &#8230; FROM DEPT WHERE SAL  &gt; 25000/12;
</pre>
<br />
<br />
<strong>12. 用&gt;=替代&gt;</strong>
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--如果DEPTNO上有一个索引&nbsp;&nbsp;</li>
    <li>--高效：&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;SELECT&nbsp;*&nbsp;&nbsp;FROM&nbsp;EMP&nbsp;&nbsp;WHERE&nbsp;DEPTNO&nbsp;&gt;=4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>--低效：&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;SELECT&nbsp;*&nbsp;&nbsp;FROM&nbsp;EMP&nbsp;&nbsp;&nbsp;WHERE&nbsp;DEPTNO&nbsp;&gt;3&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--如果DEPTNO上有一个索引
--高效：
SELECT *  FROM EMP  WHERE DEPTNO &gt;=4
--低效：
SELECT *  FROM EMP   WHERE DEPTNO &gt;3
</pre>
&nbsp;&nbsp; 两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
<strong>1. SELECT子句中避免使用 &#8220;*&#8221;</strong>
<br />
&nbsp;&nbsp;&nbsp; 当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 &#8216;*&#8217;
是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将&#8220;*&#8221; 依次转换成所有的列名,
这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.
<br />
<br />
<strong>2.使用DECODE函数来减少处理时间</strong>
<br />
&nbsp;&nbsp;&nbsp; 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. 例如:
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>SELECT&nbsp;COUNT(*)，SUM(SAL)&nbsp;FROM&nbsp;EMP&nbsp;WHERE&nbsp;DEPT_NO&nbsp;=&nbsp;0020&nbsp;AND&nbsp;&nbsp;ENAME&nbsp;LIKE&nbsp;&#8216;SMITH%&#8217;;&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;COUNT(*)，SUM(SAL)&nbsp;FROM&nbsp;EMP&nbsp;WHERE&nbsp;DEPT_NO&nbsp;=&nbsp;0030&nbsp;AND&nbsp;ENAME&nbsp;LIKE&nbsp;&#8216;SMITH%&#8217;;&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">SELECT COUNT(*)，SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND  ENAME LIKE &#8216;SMITH%&#8217;;
SELECT COUNT(*)，SUM(SAL) FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE &#8216;SMITH%&#8217;;
</pre>
&nbsp;&nbsp;&nbsp; 你可以用DECODE函数高效地得到相同结果:
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>SELECT&nbsp;COUNT(DECODE(DEPT_NO,0020,&#8217;X&#8217;,NULL))&nbsp;D0020_COUNT,&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNT(DECODE(DEPT_NO,0030,&#8217;X&#8217;,NULL))&nbsp;D0030_COUNT,&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(DECODE(DEPT_NO,0020,SAL,NULL))&nbsp;D0020_SAL,&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(DECODE(DEPT_NO,0030,SAL,NULL))&nbsp;D0030_SAL&nbsp;&nbsp;</li>
    <li>FROM&nbsp;EMP&nbsp;WHERE&nbsp;ENAME&nbsp;LIKE&nbsp;&#8216;SMITH%&#8217;;&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">SELECT COUNT(DECODE(DEPT_NO,0020,&#8217;X&#8217;,NULL)) D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,&#8217;X&#8217;,NULL)) D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
FROM EMP WHERE ENAME LIKE &#8216;SMITH%&#8217;;
</pre>
&nbsp;&nbsp;&nbsp; 类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中.
<br />
<br />
<strong>3.删除重复记录</strong>
<br />
&nbsp;&nbsp; 最高效的删除重复记录方法 ( 因为使用了ROWID)
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>DELETE&nbsp;FROM&nbsp;EMP&nbsp;E&nbsp;WHERE&nbsp;E.ROWID&nbsp;&gt;&nbsp;(SELECT&nbsp;MIN(X.ROWID)&nbsp;FROM&nbsp;EMP&nbsp;X&nbsp;WHERE&nbsp;X.EMP_NO&nbsp;=&nbsp;E.EMP_NO);&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">DELETE FROM EMP E WHERE E.ROWID &gt; (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
</pre>
<br />
<br />
<strong>4. 用TRUNCATE替代DELETE</strong>
<br />
&nbsp;&nbsp;&nbsp; 当删除表中的记录时，在通常情况下，回滚段(rollback segments )
用来存放可以被恢复的信息，如果你没有COMMIT事务，ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)，而当运
用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.
<br />
<br />
<strong>5.计算记录条数</strong>
<br />
&nbsp;&nbsp;&nbsp; 和一般的观点相反, count(*) 比count(1)稍快 ，当然如果可以通过索引检索，对索引列的计数仍旧是最快的. 例如 COUNT(EMPNO)
<br />
<br />
<strong>6.用Where子句替换HAVING子句</strong>
<br />
&nbsp;&nbsp;&nbsp; 避免使用HAVING子句，HAVING 只会在检索出所有记录之后才对结果集进行过滤，这个处理需要排序、总计等操作，如果能通过WHERE子句限制记录的数目，那就能减少这方面的开销, 例如:
<br />
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--低效&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;REGION，AVG(LOG_SIZE)&nbsp;FROM&nbsp;LOCATION&nbsp;GROUP&nbsp;BY&nbsp;REGION&nbsp;HAVING&nbsp;REGION&nbsp;REGION&nbsp;!=&nbsp;&#8216;SYDNEY&#8217;&nbsp;AND&nbsp;REGION&nbsp;!=&nbsp;&#8216;PERTH&#8217;&nbsp;&nbsp;</li>
    <li>--高效&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;REGION，AVG(LOG_SIZE)&nbsp;&nbsp;FROM&nbsp;&nbsp;LOCATION&nbsp;WHERE&nbsp;REGION&nbsp;REGION&nbsp;!=&nbsp;&#8216;SYDNEY&#8217;&nbsp;ND&nbsp;REGION&nbsp;!=&nbsp;&#8216;PERTH&#8217;&nbsp;GROUP&nbsp;BY&nbsp;REGION&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--低效
SELECT REGION，AVG(LOG_SIZE) FROM LOCATION GROUP BY REGION HAVING REGION REGION != &#8216;SYDNEY&#8217; AND REGION != &#8216;PERTH&#8217;
--高效
SELECT REGION，AVG(LOG_SIZE)  FROM  LOCATION WHERE REGION REGION != &#8216;SYDNEY&#8217; ND REGION != &#8216;PERTH&#8217; GROUP BY REGION
</pre>
<br />
<br />
<strong>7. 用EXISTS替代IN</strong>
<br />
&nbsp;&nbsp; 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--低效&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;*&nbsp;FROM&nbsp;EMP&nbsp;WHERE&nbsp;EMPNO&nbsp;&gt;&nbsp;0&nbsp;AND&nbsp;DEPTNO&nbsp;IN&nbsp;(SELECT&nbsp;DEPTNO&nbsp;FROM&nbsp;DEPT&nbsp;WHERE&nbsp;LOC&nbsp;=&nbsp;&#8216;MELB&#8217;)&nbsp;&nbsp;</li>
    <li>--高效:&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;*&nbsp;FROM&nbsp;EMP&nbsp;WHERE&nbsp;EMPNO&nbsp;&gt;&nbsp;0&nbsp;AND&nbsp;EXISTS&nbsp;(SELECT&nbsp;&#8216;X&#8217;&nbsp;&nbsp;FROM&nbsp;DEPT&nbsp;WHERE&nbsp;DEPT.DEPTNO&nbsp;=&nbsp;EMP.DEPTNO&nbsp;AND&nbsp;LOC&nbsp;=&nbsp;&#8216;MELB&#8217;)&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--低效
SELECT * FROM EMP WHERE EMPNO &gt; 0 AND DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC = &#8216;MELB&#8217;)
--高效:
SELECT * FROM EMP WHERE EMPNO &gt; 0 AND EXISTS (SELECT &#8216;X&#8217;  FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = &#8216;MELB&#8217;)
</pre>
<br />
<br />
<strong>8.用NOT EXISTS替代NOT IN</strong>
<br />
&nbsp;&nbsp; 在子查询中，NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下，NOT IN都是最低效的
(因为它对子查询中的表执行了一个全表遍历).&nbsp; 为了避免使用NOT IN，我们可以把它改写成外连接(Outer Joins)或NOT
EXISTS. 例如:
<br />
SELECT &#8230;FROM EMP&nbsp; WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT=&#8217;A&#8217;);
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--为了提高效率改写为:&nbsp;(方法一:&nbsp;高效)&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;&#8230;.FROM&nbsp;EMP&nbsp;A,DEPT&nbsp;B&nbsp;WHERE&nbsp;A.DEPT_NO&nbsp;=&nbsp;B.DEPT(+)&nbsp;AND&nbsp;B.DEPT_NO&nbsp;IS&nbsp;NULL&nbsp;AND&nbsp;B.DEPT_CAT(+)&nbsp;=&nbsp;&#8216;A&#8217;&nbsp;&nbsp;</li>
    <li>--&nbsp;(方法二:&nbsp;最高效)&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;&#8230;.FROM&nbsp;EMP&nbsp;E&nbsp;WHERE&nbsp;NOT&nbsp;EXISTS&nbsp;(SELECT&nbsp;&#8216;X&#8217;&nbsp;&nbsp;FROM&nbsp;DEPT&nbsp;D&nbsp;WHERE&nbsp;D.DEPT_NO&nbsp;=&nbsp;E.DEPT_NO&nbsp;AND&nbsp;DEPT_CAT&nbsp;=&nbsp;&#8216;A&#8217;);&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--为了提高效率改写为: (方法一: 高效)
SELECT &#8230;.FROM EMP A,DEPT B WHERE A.DEPT_NO = B.DEPT(+) AND B.DEPT_NO IS NULL AND B.DEPT_CAT(+) = &#8216;A&#8217;
-- (方法二: 最高效)
SELECT &#8230;.FROM EMP E WHERE NOT EXISTS (SELECT &#8216;X&#8217;  FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = &#8216;A&#8217;);
</pre>
<br />
<br />
<strong>9.用EXISTS替换DISTINCT</strong>
<br />
&nbsp;&nbsp;&nbsp; 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换
<br />
例如:
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--低效:&nbsp;&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;DISTINCT&nbsp;DEPT_NO,DEPT_NAME&nbsp;&nbsp;FROM&nbsp;DEPT&nbsp;D,EMP&nbsp;E&nbsp;WHERE&nbsp;D.DEPT_NO&nbsp;=&nbsp;E.DEPT_NO&nbsp;&nbsp;</li>
    <li>--高效:&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;DEPT_NO,DEPT_NAME&nbsp;&nbsp;FROM&nbsp;DEPT&nbsp;D&nbsp;WHERE&nbsp;EXISTS&nbsp;(&nbsp;SELECT&nbsp;&#8216;X&#8217;&nbsp;FROM&nbsp;EMP&nbsp;E&nbsp;WHERE&nbsp;E.DEPT_NO&nbsp;=&nbsp;D.DEPT_NO);&nbsp;&nbsp;</li>
    <li>--EXISTS&nbsp;使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--低效:
SELECT DISTINCT DEPT_NO,DEPT_NAME  FROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO
--高效:
SELECT DEPT_NO,DEPT_NAME  FROM DEPT D WHERE EXISTS ( SELECT &#8216;X&#8217; FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
--EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.
</pre>
<br />
<br />
<strong>10. 用索引提高效率</strong>
<br />
&nbsp;&nbsp;
索引是表的一个概念部分，用来提高检索数据的效率，实际上ORACLE使用了一个复杂的自平衡B-tree结构，通常通过索引查询数据比全表扫描要快，当
ORACLE找出执行查询和Update语句的最佳路径时， ORACLE优化器将使用索引，
同样在联结多个表时使用索引也可以提高效率，另一个使用索引的好处是，它提供了主键(primary key)的唯一性验证，除了那些LONG或LONG
RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现,
在扫描小表时,使用索引同样能提高效率，虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价.
索引需要空间来存储，也需要定期维护，每当有记录在表中增减或索引列被修改时，索引本身也会被修改，这意味着每条记录的INSERT , DELETE ,
UPDATE将为此多付出4 , 5 次的磁盘I/O， 因为索引需要额外的存储空间和处理，那些不必要的索引反而会使查询反应时间变慢
<br />
<em>注：定期的重构索引是有必要的. </em>
<br />
<br />
<strong>11. 避免在索引列上使用计算</strong>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE子句中，如果索引列是函数的一部分，优化器将不使用索引而使用全表扫描. 举例：
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--低效：&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;&#8230;FROM&nbsp;DEPT&nbsp;WHERE&nbsp;SAL&nbsp;*&nbsp;12&nbsp;&gt;&nbsp;25000;&nbsp;&nbsp;</li>
    <li>--高效:&nbsp;&nbsp;</li>
    <li>SELECT&nbsp;&#8230;&nbsp;FROM&nbsp;DEPT&nbsp;WHERE&nbsp;SAL&nbsp;&nbsp;&gt;&nbsp;25000/12;&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--低效：
SELECT &#8230;FROM DEPT WHERE SAL * 12 &gt; 25000;
--高效:
SELECT &#8230; FROM DEPT WHERE SAL  &gt; 25000/12;
</pre>
<br />
<br />
<strong>12. 用&gt;=替代&gt;</strong>
<br />
<div>
<div>
<div>Sql代码 </div>
</div>
<ol start="1">
    <li>--如果DEPTNO上有一个索引&nbsp;&nbsp;</li>
    <li>--高效：&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;SELECT&nbsp;*&nbsp;&nbsp;FROM&nbsp;EMP&nbsp;&nbsp;WHERE&nbsp;DEPTNO&nbsp;&gt;=4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
    <li>--低效：&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;SELECT&nbsp;*&nbsp;&nbsp;FROM&nbsp;EMP&nbsp;&nbsp;&nbsp;WHERE&nbsp;DEPTNO&nbsp;&gt;3&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">--如果DEPTNO上有一个索引
--高效：
SELECT *  FROM EMP  WHERE DEPTNO &gt;=4
--低效：
SELECT *  FROM EMP   WHERE DEPTNO &gt;3
</pre>
&nbsp;&nbsp; 两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
<img src ="http://www.blogjava.net/conans/aggbug/338235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2010-11-17 11:12 <a href="http://www.blogjava.net/conans/articles/338235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle的decode、sign、 trunc函数</title><link>http://www.blogjava.net/conans/articles/319966.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 03 May 2010 12:16:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/319966.html</guid><description><![CDATA[<span style="font-family: comic sans ms,sans-serif;">
<p><span style="font-size: small;"><strong>一、<span class="hilite2">decode</span></strong></span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">在<span class="hilite1">Oracle</span>/PLSQL
中,&nbsp; <strong><span class="hilite2">decode</span></strong> 具有和
IF-THEN-ELSE 一样的功能。</span></p>
<p><span><span style="font-size: small;"><strong><span class="hilite2">decode</span></strong>
函数语法如下：</span></span></p>
<blockquote class="definition">
<p><span style="font-size: small;"><span class="hilite2">decode</span>(
expression , search , result [, search , result]... [, default] )</span></p>
</blockquote>
<p><span><span style="font-size: small;"><em>expression</em> 要比较的表达式.</span></span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span><span style="font-size: small;"><em>search</em> 要与<em>expression</em>
<em>比较的字段。</em>.</span></span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span><span style="font-size: small;"><em>result</em> 如果<em>expression</em>
与<em>search</em> 一样的话，返回该结果。.</span></span></p>
<p><span><span style="font-size: small;"><em>default</em> 此参数可选，如果没有与<em>expression</em>
匹配上的<em>search</em> .
就返回此结果，如果此参数没有设置，当没有与expression匹配上的search时，返回null。</span></span></p>
<p><span style="font-size: small;"><span>search&nbsp;和
result可成对出现多次，代表各种要匹配的情况。&nbsp;<br />
</span>&nbsp;</span></p>
<p class="example_heading"><span style="font-size: small;">应用于</span></p>
<ul>
    <li><span style="font-size: small;"><span class="hilite1">Oracle</span>
    9i, <span class="hilite1">Oracle</span> 10g, <span class="hilite1">Oracle</span>
    11g </span></li>
</ul>
<p><span style="font-size: small;">例如：</span></p>
<p><span style="font-size: small;">You could use the <span class="hilite2">decode</span> function in an SQL statement as follows:</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small; color: #ff00ff;">select
supplier_name,<span class="hilite2">decode</span>(supplier_id,1000,'IBM',10001,'Microsoft','1002','Hewlett
Packard','Gateway') result from suppliers;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">上面的sql语句相当于下面的IF-THEN-ELSE :</span></p>
<blockquote class="sql_command">
<p><span style="font-size: small;">IF supplier_id = 10000 THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;
result := 'IBM';</span></p>
<p><span style="font-size: small;">ELSIF supplier_id = 10001 THEN<br />
&nbsp;&nbsp;&nbsp;
result := 'Microsoft';</span></p>
<p><span style="font-size: small;">ELSIF supplier_id = 10002 THEN<br />
&nbsp;&nbsp;&nbsp;
result := 'Hewlett Packard';</span></p>
<p><span style="font-size: small;">ELSE<br />
&nbsp;&nbsp;&nbsp; result := 'Gateway';</span></p>
<p><span style="font-size: small;">END IF;</span></p>
</blockquote>
<p><span><br />
</span><span style="font-size: small;">&nbsp;<span><span class="hilite2">decode</span> 函数会挨个匹配supplier_id 的值.</span></span></p>
<p><span><br />
</span><span style="font-size: small;">&nbsp;</span></p>
<h2><span style="font-size: small;">常见问题：</span></h2>
<p><span style="font-size: small;">
<hr />
</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span><span style="font-size: small;"><strong>问题1</strong>:&nbsp;
现在一个阅读者想问，怎么使用<span class="hilite2">decode</span>函数来比较两个日期呢？（例如：date1 和
date2）, 如果date1 &gt; date2, <span class="hilite2">decode</span>
函数返回date2.&nbsp;否则<span class="hilite2">decode</span>函数返回 date1.</span></span></p>
<p><span><span style="font-size: small;"><strong>回答</strong>:&nbsp;
要实现上述要求，可使用<span class="hilite2">decode</span>函数如下：</span></span></p>
<blockquote class="sql_command">
<p><span style="font-size: small;"><span class="hilite2">decode</span>((date1
- date2) - abs(date1 - date2), 0, date2, date1)</span></p>
</blockquote>
<p><span style="font-size: small;">如果date1大于date2，下面表达是会等于0：</span></p>
<blockquote>
<p><span style="font-size: small;">(date1 - date2) - abs(date1 - date2)</span></p>
</blockquote>
<p><span><span style="font-size: small;"><strong>帮助性提示</strong>: 可用<span class="hilite2">decode</span>函数绑定</span></span><a href="http://knowyouknowme.javaeye.com/admin/blogs/sign.php"><span style="font-size: small;">SIGN&nbsp;函数</span></a><span style="font-size: small;">&nbsp;像下面这样:</span></p>
<p><span style="font-size: small;">上面比较日期的语句可修改如下:</span></p>
<blockquote class="sql_command">
<p><span style="font-size: small; color: #ff00ff;"><span class="hilite2">DECODE</span>(SIGN(date1-date2), 1, date2, date1)</span></p>
</blockquote>
<p><span style="font-size: small;">SIGN/<span class="hilite2">DECODE</span>
联合对于有关销售红利等数字方面的比较是非常有用的。</span></p>
<blockquote class="sql_command">
<p><span style="font-size: small;"><span class="hilite2">DECODE</span>(SIGN(actual-target),
-1, 'NO Bonus for you', 0,'Just made it', 1, 'Congrats, you are a
winner')</span></p>
</blockquote>
<p><span style="font-size: small;">
<hr />
</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span><span style="font-size: small;"><strong>问题2</strong>:&nbsp;
我想知道是否可以用<span class="hilite2">decode</span>函数来确定数字范围，例如 1-10 =
'category 1', 11-20 = 'category 2', 比一个一个比较应该会好一点吧.</span></span></p>
<p><span><span style="font-size: small;"><strong>回答</strong>:
不幸的告诉你，不可以用<span class="hilite2">decode</span>函数来确定数字的范围.
可是你可以试着创建一个表达式，这个表达式可以得一个数字指定的范围, 下一个数字对应下一个指定的范围, 以此类推.</span></span></p>
<p><span style="font-size: small;"><strong>例如：</strong></span></p>
<p><span style="font-size: small; color: #ff00ff;">select
supplier_id,<span class="hilite2">decode</span>(trunc((supplier_id-1)/10),0,'category
1',1,'category 2',2,'category 3','unknown') result from suppliers;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><span>这个例子基于这个公式：</span><span>trunc
((supplier_id - 1) / 10</span></span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">如果supplier_id在1和10之间，表达式计算值=0.</span></p>
<p><span style="font-size: small;">如果supplier_id在11和20之间，表达式计算值=1.</span></p>
<p><span>
<p><span style="font-size: small;">如果supplier_id在21和30之间，表达式计算值=3.</span></p>
</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">等等；
<hr />
</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span><span style="font-size: small;"><strong>问题3</strong>:&nbsp; 我想写一个<span class="hilite2">decode</span>函数，要求如下:</span></span></p>
<blockquote>
<p><span style="font-size: small;">如果&nbsp;yrs_of_service &lt; 1 返回 0.04<br />
如
果&nbsp;yrs_of_service &gt;= 1 and &lt; 5 返回0.04<br />
如果&nbsp;yrs_of_service &gt; 5
返回 0.06</span></p>
</blockquote>
<p><span style="font-size: small;">这种情况我该怎么做呢?</span></p>
<p><span><span style="font-size: small;"><strong>回答</strong>:&nbsp; You will
need to create a formula that will evaluate to a single number for each
one of your ranges.</span></span></p>
<p><span style="font-size: small;">For example:</span></p>
<p><span style="font-size: small; color: #ff00ff;">select
emp_name,<span class="hilite2">decode</span>(trunc((yrs_of_service+3)/4),0,0.04,1,0.04,0.06)
as perc_value from employees;</span></p>
<p><span style="font-size: small;">
<hr />
</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span><span style="font-size: small;"><strong>问题4</strong>:&nbsp; <span class="hilite2">decode</span>函数的参数个数有限制吗？我得到一个错误 "ORA-00939: too many
arguments for function".</span></span></p>
<p><span><span style="font-size: small;"><strong>回答</strong>:&nbsp; 是的，<span class="hilite2">decode</span>函数的最大参数个数为255个,包括<em>expression</em>, <em>search</em>,
and <em>result</em> arguments.&lt;!-- InstanceEndEditable --&gt; </span></span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">-------------------------------------------------------------------------------------------------------------</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><strong>二、sign</strong></span></p>
<p><span style="font-size: small;">在<span class="hilite1">Oracle</span>/PLSQL
中, <strong>sign</strong> 函数返回一个数字的正负标志.</span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><span>语法如下：</span><span>sign( number )</span></span></p>
<p><span><em></em></span><span style="font-size: small;">&nbsp;</span></p>
<p><span><span style="font-size: small;"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number</em>
要测试标志的数字.</span></span></p>
<blockquote>
<p><span style="font-size: small;">If <em>number</em> &lt; 0, then sign
returns -1.<br />
If <em>number</em> = 0, then sign returns 0.<br />
If <em>number</em>
&gt; 0, then sign returns 1.</span><span><br />
</span></p>
</blockquote>
<p class="example_heading"><span style="font-size: small;">应用于:</span></p>
<ul>
    <li>
    <span style="font-size: small;"><span class="hilite1">Oracle</span> 8i, <span class="hilite1">Oracle</span> 9i, <span class="hilite1">Oracle</span>
    10g, <span class="hilite1">Oracle</span> 11g </span><span><br />
    </span>
    </li>
</ul>
<p class="example_heading"><span style="font-size: small;">例如:</span></p>
<p class="example_heading"><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<blockquote>
<table border="0" cellpadding="3" cellspacing="0" width="257">
    <tbody>
        <tr>
            <td class="function_example" width="102"><span style="font-size: small;">sign(-23)</span></td>
            <td class="function_desc" width="151"><span style="font-size: small;">would
            return -1</span></td>
        </tr>
        <tr>
            <td class="function_example" width="102"><span style="font-size: small;">sign(0.001)</span></td>
            <td class="function_desc" width="151"><span style="font-size: small;">would
            return -1</span></td>
        </tr>
        <tr>
            <td class="function_example" width="102"><span style="font-size: small;">sign(0)</span></td>
            <td class="function_desc" width="151"><span style="font-size: small;">would
            return 0</span></td>
        </tr>
        <tr>
            <td class="function_example" width="102"><span style="font-size: small;">sign(0.001)</span></td>
            <td class="function_desc" width="151"><span style="font-size: small;">would
            return 1</span></td>
        </tr>
        <tr>
            <td class="function_example" width="102"><span style="font-size: small;">sign(23)</span></td>
            <td class="function_desc" width="151"><span style="font-size: small;">would
            return 1</span></td>
        </tr>
        <tr>
            <td class="function_example" width="102"><span style="font-size: small;">sig(23.601)</span></td>
            <td class="function_desc" width="151">
            <p><span style="font-size: small;">would return 1</span></p>
            <p><span style="font-size: small;">&nbsp;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<span style="font-family: comic sans ms,sans-serif;"><strong></strong></span>
</blockquote>
</span>
<p><span style="font-size: small;">&nbsp;</span></p>
<p style="text-align: left;"><span style="font-size: small;">&nbsp;</span></p>
<p style="text-align: left;"><span style="font-size: small; font-family: comic sans ms,sans-serif;">----------------------------------------------------------------------------------------------------</span></p>
<p style="text-align: left;"><span style="font-size: small; font-family: comic sans ms,sans-serif;"><strong>三、trunc(number)</strong></span></p>
<p><span style="font-size: small; font-family: comic sans ms,sans-serif;">在<span class="hilite1">Oracle</span>/PLSQL中,&nbsp;<strong>trunc</strong>
function returns a number truncated to a certain number of decimal
places.</span></p>
<p><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: small;"><strong>trunc</strong> function 语法如下:</span></span></p>
<blockquote class="definition">
<p><span style="font-size: small; font-family: comic sans ms,sans-serif;">trunc( number, [ decimal_places ] )</span></p>
</blockquote>
<p><span style="font-family: comic sans ms,sans-serif;"><span><span style="font-size: small;"><em>number</em> 要截取的数字.</span></span></span></p>
<p><span style="font-family: comic sans ms,sans-serif;"><span><span style="font-size: small;"><em>decimal_places</em> 要保留的小数位.
这个参数必须是个整数.&nbsp;如果此参数缺省，默认保留0位小数</span></span></span><span style="font-family: comic sans ms,sans-serif;"><br />
</span><span style="font-size: small;">&nbsp;</span></p>
<p class="example_heading"><span style="font-size: small; font-family: comic sans ms,sans-serif;">应用于:</span></p>
<ul>
    <li><span style="font-size: small; font-family: comic sans ms,sans-serif;"><span class="hilite1">Oracle</span> 8i, <span class="hilite1">Oracle</span> 9i, <span class="hilite1">Oracle</span>
    10g, <span class="hilite1">Oracle</span> 11g </span></li>
</ul>
<p style="text-align: left;"><span style="font-family: comic sans ms,sans-serif;"><br />
</span><span style="font-size: small;">&nbsp;</span></p>
<p class="example_heading"><span style="font-size: small; font-family: comic sans ms,sans-serif;">例如For example:</span></p>
<blockquote>
<table border="0" cellpadding="3" cellspacing="0" width="323">
    <tbody>
        <tr>
            <td class="function_example" width="133"><span style="font-size: small; font-family: comic sans ms,sans-serif;">trunc(125.815)</span></td>
            <td class="function_desc"><span style="font-size: small; font-family: comic sans ms,sans-serif;">would return 125</span></td>
        </tr>
        <tr>
            <td class="function_example"><span style="font-size: small; font-family: comic sans ms,sans-serif;">trunc(125.815, 0)</span></td>
            <td class="function_desc"><span style="font-size: small; font-family: comic sans ms,sans-serif;">would return 125</span></td>
        </tr>
        <tr>
            <td class="function_example"><span style="font-size: small; font-family: comic sans ms,sans-serif;">trunc(125.815, 1)</span></td>
            <td class="function_desc"><span style="font-size: small; font-family: comic sans ms,sans-serif;">would return 125.8</span></td>
        </tr>
        <tr>
            <td class="function_example"><span style="font-size: small; font-family: comic sans ms,sans-serif;">trunc(125.815, 2)</span></td>
            <td class="function_desc"><span style="font-size: small; font-family: comic sans ms,sans-serif;">would return 125.81</span></td>
        </tr>
        <tr>
            <td class="function_example"><span style="font-size: small; color: #ff00ff; font-family: comic sans ms,sans-serif;">trunc(125.81,
            3)</span></td>
            <td class="function_desc"><span style="font-size: small; color: #ff00ff; font-family: comic sans ms,sans-serif;">would return 125.81</span></td>
        </tr>
        <tr>
            <td class="function_example"><span style="font-size: small; font-family: comic sans ms,sans-serif;">trunc(-125.815, 2)</span></td>
            <td class="function_desc"><span style="font-size: small; font-family: comic sans ms,sans-serif;">would return -125.81</span></td>
        </tr>
        <tr>
            <td class="function_example"><span style="font-size: small; font-family: comic sans ms,sans-serif;">trunc(125.815, -1)</span></td>
            <td class="function_desc"><span style="font-size: small; font-family: comic sans ms,sans-serif;">would return 120</span></td>
        </tr>
        <tr>
            <td class="function_example"><span style="font-size: small; font-family: comic sans ms,sans-serif;">trunc(125.815, -2)</span></td>
            <td class="function_desc"><span style="font-size: small; font-family: comic sans ms,sans-serif;">would return 100</span></td>
        </tr>
        <tr>
            <td class="function_example"><span style="font-size: small; color: #ff00ff; font-family: comic sans ms,sans-serif;">trunc(125.81,
            -3)</span></td>
            <td class="function_desc"><span style="font-size: small; color: #ff00ff; font-family: comic sans ms,sans-serif;">would return 0</span></td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small; font-family: comic sans ms,sans-serif;">&nbsp;如果<em>decimal_places</em> 大于<em>number</em>
本身的小数位数，返回原数字不会加0.</span></p>
<p><span style="font-size: small; font-family: Comic Sans MS;">如：trunc(125.81,3)
would return 125.81;</span></p>
<p><span style="font-size: small; font-family: Comic Sans MS;">如果<em>decimal_places</em>
为负数，那么将指定的位数</span></p>
</blockquote>
<p><span style="font-size: small;">&nbsp;</span></p>
<img src ="http://www.blogjava.net/conans/aggbug/319966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2010-05-03 20:16 <a href="http://www.blogjava.net/conans/articles/319966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle rownum 专题</title><link>http://www.blogjava.net/conans/articles/319963.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 03 May 2010 11:46:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/319963.html</guid><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><strong><span style="font-size: 14pt;" lang="EN-US"><span style="font-family: Times New Roman;">Rownum</span></span></strong><strong><span style="font-size: 14pt; font-family: 宋体;">专题</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体;">对于</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">来说它是</span><span lang="EN-US"><span style="font-family: Times New Roman;">oracle</span></span><span style="font-family: 宋体;">系统顺序分配为从查询返回的行的编号，返回的第一行分配的是</span><span lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-family: 宋体;">，第二行是</span><span lang="EN-US"><span style="font-family: Times New Roman;">2</span></span><span style="font-family: 宋体;">，依此类推，这个伪字段可以用于限制查询返回的总行数，而且</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">不能以任何表的名称作为前缀。</span></span><span lang="EN-US"><br />
</span><span style="font-family: 宋体;"><span style="font-size: small;">举例说明：</span></span><span lang="EN-US"><br />
</span><span style="font-size: small;"><span style="font-family: 宋体;">例如表：</span><span lang="EN-US"><span style="font-family: Times New Roman;">student(</span></span><span style="font-family: 宋体;">学生</span><span lang="EN-US"><span style="font-family: Times New Roman;">)</span></span><span style="font-family: 宋体;">表，表结构为：</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">ID</span></span><span style="font-size: small;"><span style="font-family: 宋体;">　　　</span><span lang="EN-US"><span style="font-family: Times New Roman;"> char(6)</span></span><span style="font-family: 宋体;">　　　　　</span><span lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --</span></span><span style="font-family: 宋体;">学号</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">name</span></span><span style="font-size: small;"><span style="font-family: 宋体;">　　</span><span lang="EN-US"><span style="font-family: Times New Roman;">VARCHAR2(10)</span></span><span style="font-family: 宋体;">　　　</span><span lang="EN-US"><span style="font-family: Times New Roman;">--</span></span><span style="font-family: 宋体;">姓名</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"> <br />
<br />
/*
Formatted on 2008/09/24 09:15 (Formatter Plus v4.8.7) */<br />
CREATE TABLE
student (ID CHAR(6), NAME VARCHAR2(100));<br />
<br />
INSERT INTO student<br />
&nbsp;&nbsp;&nbsp;&nbsp;
VALUES ('200001', '</span></span><span style="font-family: 宋体;">张一</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">');<br />
INSERT INTO student<br />
&nbsp;&nbsp;&nbsp;&nbsp; VALUES ('200002', '</span></span><span style="font-family: 宋体;">王二</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">');<br />
INSERT
INTO student<br />
&nbsp;&nbsp;&nbsp;&nbsp; VALUES ('200003', '</span></span><span style="font-family: 宋体;">李三</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">');<br />
INSERT
INTO student<br />
&nbsp;&nbsp;&nbsp;&nbsp; VALUES ('200004', '</span></span><span style="font-family: 宋体;">赵四</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">');<br />
COMMIT ;<br />
<br />
<br />
(1)
rownum </span></span><span style="font-family: 宋体;">对于等于某值的查询条件</span></span><span lang="EN-US"><br />
</span><span style="font-size: small;"><span style="font-family: 宋体;">如果希望找到学生表中第一条学生的信息，可以使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum=1</span></span><span style="font-family: 宋体;">作为条件。但是想找到学生表中第二条学生的信息，使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum=2</span></span><span style="font-family: 宋体;">结果查不到数据。因为</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">都是从</span><span lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-family: 宋体;">开始，但是</span><span lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-family: 宋体;">以上的自然数在</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">做等于判断是时认为都是</span><span lang="EN-US"><span style="font-family: Times New Roman;">false</span></span><span style="font-family: 宋体;">条件，所以无法查到</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum = n</span></span><span style="font-family: 宋体;">（</span><span lang="EN-US"><span style="font-family: Times New Roman;">n&gt;1</span></span><span style="font-family: 宋体;">的自然数）。</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">SQL&gt; select
rownum,id,name from student where rownum=1;</span></span><span style="font-family: 宋体;"><span style="font-size: small;">（可以用在限制返回记录条数的地
方，保证不出错，如：隐式游标）</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">SQL&gt; select
rownum,id,name from student where rownum=1;<br />
&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
----------
------ ---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1
200001 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">张一</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">SQL&gt; select
rownum,id,name from student where rownum =2; <br />
&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
----------
------ ---------------------------------------------------<br />
<br />
</span></span><span style="font-size: small;"><span style="font-family: 宋体;">（</span><span lang="EN-US"><span style="font-family: Times New Roman;">2</span></span><span style="font-family: 宋体;">）</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">对于大于某值的查询条件</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp; </span></span><span style="font-size: small;"><span style="font-family: 宋体;">如果想找到从第二行记录以后的
记录，当使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum&gt;2</span></span><span style="font-family: 宋体;">是查不出记录的，
原因是由于</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">是一个总是从</span><span lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-family: 宋体;">开始的伪列，</span><span lang="EN-US"><span style="font-family: Times New Roman;">Oracle </span></span><span style="font-family: 宋体;">认为</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum&gt; n(n&gt;1</span></span><span style="font-family: 宋体;">的自然数</span><span lang="EN-US"><span style="font-family: Times New Roman;">)</span></span><span style="font-family: 宋体;">这种条件依旧不成立，所以查不到记录</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">SQL&gt; select rownum,id,name from student where rownum &gt;2;<br />
ROWNUM
ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------
---------------------------------------------------<br />
</span></span><span style="font-size: small;"><span style="font-family: 宋体;">那如何才能找到第二行以后的记
录呀。可以使用以下的子查询方法来解决。注意子查询中的</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">必须要有别名，否则还是不会查出记录来，这是因为</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">不是某个表的列，如果不起别名的话，无法知道</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">是子查询的列还是主查询的列。</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">SQL&gt;select *
from(select rownum no ,id,name from student) where no&gt;2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
NO ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------
---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003
</span></span><span style="font-family: 宋体;"><span style="font-size: small;">李三</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">赵四</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">SQL&gt; select * from(select rownum,id,name from student)where
rownum&gt;2;<br />
&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------
---------------------------------------------------<br />
<br />
</span></span><span style="font-size: small;"><span style="font-family: 宋体;">（</span><span lang="EN-US"><span style="font-family: Times New Roman;">3</span></span><span style="font-family: 宋体;">）</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">对于小于某值的查询条件</span></span><span lang="EN-US"><br />
</span><span style="font-size: small;"><span style="font-family: 宋体;">如果想找到第三条记录以前的记
录，当使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum&lt;3</span></span><span style="font-family: 宋体;">是能得到两条记录
的。显然</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">对于</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum&lt;n</span></span><span style="font-family: 宋体;">（</span><span lang="EN-US"><span style="font-family: Times New Roman;">(n&gt;1</span></span><span style="font-family: 宋体;">的自然数）的条件认为是成立的，所以可以找到记录。</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">SQL&gt; select rownum,id,name from student where rownum &lt;3;<br />
&nbsp;&nbsp;&nbsp;
ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------
---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">张一</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">王二</span></span><span lang="EN-US"><br />
<br />
</span><span style="font-size: small;"><span style="font-family: 宋体;">综上几种情况，可能有时候需要
查询</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">在某区间的数据，那怎么办呀从上可以看出</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">对小于某值的查询条件是人为</span><span lang="EN-US"><span style="font-family: Times New Roman;">true</span></span><span style="font-family: 宋体;">的，</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">对于大于某值的查询条件直接认为是</span><span lang="EN-US"><span style="font-family: Times New Roman;">false</span></span><span style="font-family: 宋体;">的，但是可以间接的让它转为认为是</span><span lang="EN-US"><span style="font-family: Times New Roman;">true</span></span><span style="font-family: 宋体;">的。那就必须使用子查询。例如要查询</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">在第二行到第三行之间的数据，包括第二行和第三行数据，那么我们只能写以下语句，先让它返回小于等于
三的记录行，然后在主查询中判断新的</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">的别名
列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">SQL&gt; select *
from (select rownum no,id,name from student where rownum&lt;=3 ) where
no &gt;=2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------
---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002
</span></span><span style="font-family: 宋体;"><span style="font-size: small;">王二</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">李三</span></span><span lang="EN-US"><br />
<br />
</span><span style="font-size: small;"><span style="font-family: 宋体;">（</span><span lang="EN-US"><span style="font-family: Times New Roman;">4</span></span><span style="font-family: 宋体;">）</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">和排序</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">Oracle</span></span><span style="font-size: small;"><span style="font-family: 宋体;">中的</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">的是在取数据的时候产生的序号，所以想对指定排序的数据去指定的</span><span lang="EN-US"><span style="font-family: Times New Roman;">rowmun</span></span><span style="font-family: 宋体;">行数据就必须注意了。</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">SQL&gt; select
rownum ,id,name from student order by name;<br />
&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
----------
------ ---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3
200003 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">李三</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2
200002 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">王二</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1
200001 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">张一</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4
200004 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">赵四</span></span><span lang="EN-US"><br />
</span><span style="font-size: small;"><span style="font-family: 宋体;">可以看出，</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">并不是按照</span><span lang="EN-US"><span style="font-family: Times New Roman;">name</span></span><span style="font-family: 宋体;">列来生成的序号。系统是按照记录插入时的顺序给记录排的号，</span><span lang="EN-US"><span style="font-family: Times New Roman;">rowid</span></span><span style="font-family: 宋体;">也是顺序分配的。为了解决这个问题，必须使用子查询</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">SQL&gt; select rownum ,id,name from (select * from student order
by name);<br />
&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
---------- ------
---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200003
</span></span><span style="font-family: 宋体;"><span style="font-size: small;">李三</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">王二</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200001 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">张一</span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4
200004 </span></span><span style="font-family: 宋体;"><span style="font-size: small;">赵四</span></span><span lang="EN-US"><br />
</span><span style="font-size: small;"><span style="font-family: 宋体;">这样就成了按</span><span lang="EN-US"><span style="font-family: Times New Roman;">name</span></span><span style="font-family: 宋体;">排序，并且用</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">标出正确序号（有小到大）。</span></span><span lang="EN-US"><br />
<br />
</span><span style="font-size: small;"><span style="color: #ff6600; font-family: 宋体;">笔者在工作中有一上百万条记录的表，在</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">jsp</span></span><span style="color: #ff6600; font-family: 宋体;">页面中需对该表进行分页显示，</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;"> </span></span><span style="color: #ff6600; font-family: 宋体;">便考虑用</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="color: #ff6600; font-family: 宋体;">来作，下面是具体方法</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">(</span></span><span style="color: #ff6600; font-family: 宋体;">每页</span></span><span style="color: #ff6600;" lang="EN-US"><br />
</span><span style="font-size: small;"><span style="color: #ff6600; font-family: 宋体;">显示</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">20</span></span><span style="color: #ff6600; font-family: 宋体;">条</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">)</span></span><span style="color: #ff6600; font-family: 宋体;">：</span></span><span style="font-size: small;"><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;"> <br />
&#8220;select *
from tabname where rownum&lt;20 order by name" </span></span><span style="color: #ff6600; font-family: 宋体;">但却发现</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">oracle</span></span><span style="color: #ff6600; font-family: 宋体;">却不能按自己的意愿来执行，而是先随便</span></span><span style="color: #ff6600;" lang="EN-US"><br />
</span><span style="font-size: small;"><span style="color: #ff6600; font-family: 宋体;">取</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">20</span></span><span style="color: #ff6600; font-family: 宋体;">条记录，然后再</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;"> order by</span></span><span style="color: #ff6600; font-family: 宋体;">，后经咨询</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">oracle,</span></span><span style="color: #ff6600; font-family: 宋体;">说</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="color: #ff6600; font-family: 宋体;">确实就这样，想用的话，只能用子查询</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;"> </span></span><span style="color: #ff6600; font-family: 宋体;">来实现先排序，后</span></span><span style="color: #ff6600;" lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">rownum</span></span><span style="color: #ff6600; font-family: 宋体;"><span style="font-size: small;">，方法如下：</span></span><span style="font-size: small;"><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;"> <br />
"select * from (select * from
tabname order by name) where rownum&lt;20",</span></span><span style="color: #ff6600; font-family: 宋体;">但这样一来，效率会较低很多。</span></span><span style="font-size: small;"><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;"> <br />
</span></span><span style="color: #ff6600; font-family: 宋体;">后经笔者试验，只需在</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">order by </span></span><span style="color: #ff6600; font-family: 宋体;">的字段上加主键或索引即可让</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">oracle</span></span><span style="color: #ff6600; font-family: 宋体;">先按</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;"> </span></span><span style="color: #ff6600; font-family: 宋体;">该字段排序，然后再</span><span style="color: #ff6600;" lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="color: #ff6600; font-family: 宋体;">；方法不变：</span></span><span style="color: #ff6600;" lang="EN-US"><span style="font-size: small; font-family: Times New Roman;"> <br />
&nbsp;&nbsp; &#8220;select * from tabname where rownum&lt;20 order by name"</span></span><span lang="EN-US"><br />
<br />
</span><span style="font-size: small;"><span style="color: blue; font-family: 宋体;">补充：我们正常分页是如下（</span><span style="color: blue;" lang="EN-US"><span style="font-family: Times New Roman;">order by </span></span><span style="color: blue; font-family: 宋体;">主键，在最里面的那一层。非主键字段同样要</span><span style="color: blue;"><span style="font-family: Times New Roman;"> </span></span><span style="color: blue; font-family: 宋体;">加索引）：</span></span><span style="color: blue;" lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">/* Formatted on 2008/09/24 12:14 (Formatter Plus v4.8.7) */<br />
SELECT
*<br />
FROM (SELECT tmp.*, ROWNUM rn<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM (SELECT&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
FROM student<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE 1 = 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER
BY NAME DESC) tmp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE 1 = 1 AND ROWNUM &lt;= 3)<br />
WHERE 1
= 1 AND rn &gt;= 2</span></span><span lang="EN-US"><br />
<br />
<br />
<span style="font-size: small; font-family: Times New Roman;">(5) </span></span><span style="font-size: small;"><span style="font-family: 宋体;">取得某列中第</span><span lang="EN-US"><span style="font-family: Times New Roman;">N</span></span><span style="font-family: 宋体;">大的行</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"> <br />
<br />
select
column_name from <br />
(select table_name.*,dense_rank() over (order by
column desc) rank from table_name) <br />
where rank = &amp;N</span></span><span style="font-family: 宋体;">；</span></span><span lang="EN-US"><br />
<br />
<span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="color: #3366ff;">/* Formatted on 2008/09/24 12:30
(Formatter Plus v4.8.7) */<br />
SELECT *<br />
FROM (SELECT student.*,
DENSE_RANK () OVER (ORDER BY ID DESC) RANK<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM student)<br />
WHERE
RANK = 2</span><br />
<br />
(6)</span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">假如要返回前</span><span lang="EN-US"><span style="font-family: Times New Roman;">5</span></span><span style="font-family: 宋体;">条记录：</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"> <br />
<br />
select
* from tablename where rownum&lt;6;(</span></span><span style="font-family: 宋体;">或是</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum &lt;= 5 </span></span><span style="font-family: 宋体;">或是</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">rownum
!= 6) <br />
</span></span><span style="font-family: 宋体;">假如要返回第</span><span lang="EN-US"><span style="font-family: Times New Roman;">5-9</span></span><span style="font-family: 宋体;">条记录：</span></span><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;"> <br />
</span><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="color: blue;">/* Formatted on 2008/09/24 12:34 (Formatter Plus
v4.8.7) */<br />
SELECT&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp; FROM student<br />
&nbsp;&nbsp; WHERE ROWNUM &lt; 4<br />
MINUS<br />
SELECT&nbsp;&nbsp;
*<br />
&nbsp;&nbsp;&nbsp; FROM student<br />
&nbsp;&nbsp; WHERE ROWNUM &lt; 2</span><br />
<br />
order by
name <br />
</span></span></span><span style="font-size: small;"><span style="font-family: 宋体;">选出结果后用</span><span lang="EN-US"><span style="font-family: Times New Roman;">name</span></span><span style="font-family: 宋体;">排序显示结果。</span><span lang="EN-US"><span style="font-family: Times New Roman;">(</span></span><span style="font-family: 宋体;">先选再排序</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">)
<br />
<br />
</span></span><span style="font-family: 宋体;">注意：只能用以上符号</span><span lang="EN-US"><span style="font-family: Times New Roman;">(&lt;</span></span><span style="font-family: 宋体;">、</span><span lang="EN-US"><span style="font-family: Times New Roman;">&lt;=</span></span><span style="font-family: 宋体;">、</span><span lang="EN-US"><span style="font-family: Times New Roman;">!=)</span></span><span style="font-family: 宋体;">。</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"> <br />
<br />
(7)select
* from tablename where rownum != 10;</span></span><span style="font-family: 宋体;">返回的是前９条记录。</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">
<br />
</span></span><span style="font-family: 宋体;">不能用：</span><span lang="EN-US"><span style="font-family: Times New Roman;">&gt;,&gt;=,=,Between...and</span></span><span style="font-family: 宋体;">。由于</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum</span></span><span style="font-family: 宋体;">是一个总是从</span><span lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-family: 宋体;">开始的伪列，</span><span lang="EN-US"><span style="font-family: Times New Roman;">Oracle </span></span><span style="font-family: 宋体;">认为这种条件</span><span style="font-family: Times New Roman;"> </span><span style="font-family: 宋体;">不成立，查不到记录</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">. <br />
<br />
</span></span><span style="font-family: 宋体;">另
外，这个方法更快：</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"> <br />
<br />
select
* from ( <br />
select rownum r,a from yourtable <br />
where rownum &lt;= 20
<br />
order by name ) <br />
where r &gt; 10 <br />
</span></span><span style="font-family: 宋体;">这样取出第</span><span lang="EN-US"><span style="font-family: Times New Roman;">11-20</span></span><span style="font-family: 宋体;">条记录</span><span lang="EN-US"><span style="font-family: Times New Roman;">!(</span></span><span style="font-family: 宋体;">先选再排序再选</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">)
<br />
<br />
</span></span><span style="font-family: 宋体;">要先排序再选则须用</span><span lang="EN-US"><span style="font-family: Times New Roman;">select</span></span><span style="font-family: 宋体;">嵌套：内层排序外层选。</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"> <br />
<span style="color: blue;">rownum</span></span></span><span style="color: blue; font-family: 宋体;">是随着结果集生成的，一旦生成，就不会变化了；同时</span><span style="color: blue;" lang="EN-US"><span style="font-family: Times New Roman;">,</span></span><span style="color: blue; font-family: 宋体;">生成的结果
是依次递加的，没有</span><span style="color: blue;" lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="color: blue; font-family: 宋体;">就永远不会有</span><span style="color: blue;" lang="EN-US"><span style="font-family: Times New Roman;">2! </span></span></span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Times New Roman;">rownum </span></span><span style="font-size: small;"><span style="font-family: 宋体;">是在</span><span style="font-family: Times New Roman;"> </span><span style="font-family: 宋体;">查询集合产生的过程中产生的伪列，并且如果</span><span lang="EN-US"><span style="font-family: Times New Roman;">where</span></span><span style="font-family: 宋体;">条件中存在</span><span lang="EN-US"><span style="font-family: Times New Roman;"> rownum </span></span><span style="font-family: 宋体;">条件的话，则</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">:
<br />
<br />
1</span></span><span style="font-family: 宋体;">：</span><span style="font-family: Times New Roman;"> </span><span style="font-family: 宋体;">假如</span><span style="font-family: Times New Roman;"> </span><span style="font-family: 宋体;">判定条件是常量，则：</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">
<br />
</span></span><span style="font-family: 宋体;">只能</span><span lang="EN-US"><span style="font-family: Times New Roman;"> rownum = 1,
&lt;= </span></span><span style="font-family: 宋体;">大于</span><span lang="EN-US"><span style="font-family: Times New Roman;">1 </span></span><span style="font-family: 宋体;">的自然数，</span><span lang="EN-US"><span style="font-family: Times New Roman;"> = </span></span><span style="font-family: 宋体;">大于</span><span lang="EN-US"><span style="font-family: Times New Roman;">1 </span></span><span style="font-family: 宋体;">的数是没有结果的，</span><span style="font-family: Times New Roman;"> </span><span style="font-family: 宋体;">大于一个数也是没有结果的</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"> <br />
</span></span><span style="font-family: 宋体;">即</span><span style="font-family: Times New Roman;"> </span><span style="font-family: 宋体;">当出现一个</span><span lang="EN-US"><span style="font-family: Times New Roman;"> rownum </span></span><span style="font-family: 宋体;">不满足条件的时候则</span><span style="font-family: Times New Roman;"> </span><span style="font-family: 宋体;">查询结束</span><span style="font-family: Times New Roman;"> </span><span style="font-family: 宋体;">　　</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">this
is stop key! <br />
<br />
2: </span></span><span style="font-family: 宋体;">当判
定值不是常量的时候</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"> <br />
</span></span><span style="font-family: 宋体;">若条件是</span><span lang="EN-US"><span style="font-family: Times New Roman;"> = var , </span></span><span style="font-family: 宋体;">则只有当</span><span lang="EN-US"><span style="font-family: Times New Roman;"> var </span></span><span style="font-family: 宋体;">为</span><span lang="EN-US"><span style="font-family: Times New Roman;">1 </span></span><span style="font-family: 宋体;">的时候才满足条件，这个时候不存在</span><span lang="EN-US"><span style="font-family: Times New Roman;"> stop key ,</span></span><span style="font-family: 宋体;">必须进行</span><span lang="EN-US"><span style="font-family: Times New Roman;"> full scan ,</span></span><span style="font-family: 宋体;">对每个满足其他</span><span lang="EN-US"><span style="font-family: Times New Roman;">where</span></span><span style="font-family: 宋体;">条件的数据进行判定</span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"> <br />
</span></span><span style="font-family: 宋体;">选出一行后才能去选</span><span lang="EN-US"><span style="font-family: Times New Roman;">rownum=2</span></span><span style="font-family: 宋体;">的行</span><span lang="EN-US"><span style="font-family: Times New Roman;">&#8230;&#8230;</span></span></span></p>
<img src ="http://www.blogjava.net/conans/aggbug/319963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2010-05-03 19:46 <a href="http://www.blogjava.net/conans/articles/319963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle递归查询</title><link>http://www.blogjava.net/conans/articles/318052.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 12 Apr 2010 05:35:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/318052.html</guid><description><![CDATA[转自：http://www.javaeye.com/topic/625574<br />
<br />
有的情况下，我们需要用递归的方法整理数据，这才程序中很容易做到，但是在数据库中，用SQL语句怎么实现？下面我以最典型的树形结构来说明下如何在Oracle使用递归查询。 <br />
&nbsp;&nbsp;&nbsp; 为了说明方便，创建一张数据库表，用于存储一个简单的树形结构
<div>
<div>
<div>Sql代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=create%20table%20TEST_TREE%0A(%0A%20%20ID%20%20%20NUMBER%2C%0A%20%20PID%20%20NUMBER%2C%0A%20%20IND%20%20NUMBER%2C%0A%20%20NAME%20VARCHAR2(32)%0A)%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>create&nbsp;table&nbsp;TEST_TREE&nbsp;&nbsp;</li>
    <li>(&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;ID&nbsp;&nbsp;&nbsp;NUMBER,&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;PID&nbsp;&nbsp;NUMBER,&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;IND&nbsp;&nbsp;NUMBER,&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;NAME&nbsp;VARCHAR2(32)&nbsp;&nbsp;</li>
    <li>)&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">create table TEST_TREE
(
ID   NUMBER,
PID  NUMBER,
IND  NUMBER,
NAME VARCHAR2(32)
)
</pre>
<p><br />
&nbsp;&nbsp;&nbsp; ID是主键，PID是父节点ID，IND是排序字段，NAME是节点名称。初始化几条测试数据。</p>
<table style="text-align: left;" border="1">
    <tbody>
        <tr>
            <th>ID</th>
            <th>PID</th>
            <th>IND</th>
            <th>NAME</th>
        </tr>
        <tr>
            <td>1</td>
            <td>0</td>
            <td>1</td>
            <td>根节点</td>
        </tr>
        <tr>
            <td>2</td>
            <td>1</td>
            <td>1</td>
            <td>一级菜单1</td>
        </tr>
        <tr>
            <td>3</td>
            <td>1</td>
            <td>2</td>
            <td>一级菜单2</td>
        </tr>
        <tr>
            <td>4</td>
            <td>1</td>
            <td>2</td>
            <td>一级菜单3</td>
        </tr>
        <tr>
            <td>5</td>
            <td>2</td>
            <td>1</td>
            <td>一级1子1</td>
        </tr>
        <tr>
            <td>6</td>
            <td>2</td>
            <td>2</td>
            <td>一级1子2</td>
        </tr>
        <tr>
            <td>7</td>
            <td>4</td>
            <td>1</td>
            <td>一级3子1</td>
        </tr>
        <tr>
            <td>8</td>
            <td>4</td>
            <td>2</td>
            <td>一级3子2</td>
        </tr>
        <tr>
            <td>9</td>
            <td>4</td>
            <td>3</td>
            <td>一级3子3</td>
        </tr>
        <tr>
            <td>10</td>
            <td>4</td>
            <td>0</td>
            <td>一级3子0</td>
        </tr>
    </tbody>
</table>
<p>一、基本使用：</p>
<p>&nbsp;&nbsp;&nbsp; 在Oracle中，递归查询要用到start&nbsp;&nbsp; with 。。。。connect&nbsp;&nbsp; by&nbsp;&nbsp; prior。。。</p>
<p>&nbsp;&nbsp;&nbsp; 具体格式是：</p>
<div>
<div>
<div>Sql代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=SELECT%20column%0AFROM%20table_name%0ASTART%20WITH%20column%3Dvalue%0ACONNECT%20BY%20PRIOR%20%E7%88%B6%E4%B8%BB%E9%94%AE%3D%E5%AD%90%E5%A4%96%E9%94%AE" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>SELECT&nbsp;column&nbsp;&nbsp;</li>
    <li>FROM&nbsp;table_name&nbsp;&nbsp;</li>
    <li>START&nbsp;WITH&nbsp;column=value&nbsp;&nbsp;</li>
    <li>CONNECT&nbsp;BY&nbsp;PRIOR&nbsp;父主键=子外键&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">SELECT column
FROM table_name
START WITH column=value
CONNECT BY PRIOR 父主键=子外键</pre>
<p>&nbsp;&nbsp;&nbsp; 对于本例来说，就是：</p>
<div>
<div>
<div>Sql代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=select%20%20%20d.*%20%20%20from%20%20test_tree%20d%20%0A%20%20start%20%20%20with%20%20%20d.pid%3D0%0A%20%20connect%20%20%20by%20%20%20prior%20%20%20d.id%3Dd.pid%20" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>select&nbsp;&nbsp;&nbsp;d.*&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;test_tree&nbsp;d&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;start&nbsp;&nbsp;&nbsp;with&nbsp;&nbsp;&nbsp;d.pid=0&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;connect&nbsp;&nbsp;&nbsp;by&nbsp;&nbsp;&nbsp;prior&nbsp;&nbsp;&nbsp;d.id=d.pid&nbsp;&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">select   d.*   from  test_tree d
start   with   d.pid=0
connect   by   prior   d.id=d.pid </pre>
<p>&nbsp;&nbsp; 查询结果如下：</p>
<table border="1">
    <tbody>
        <tr>
            <th>ID</th>
            <th>PID</th>
            <th>IND</th>
            <th>NAME</th>
        </tr>
        <tr>
            <td>1</td>
            <td>0</td>
            <td>1</td>
            <td>根节点</td>
        </tr>
        <tr>
            <td>2</td>
            <td>1</td>
            <td>1</td>
            <td>一级菜单1</td>
        </tr>
        <tr>
            <td>5</td>
            <td>2</td>
            <td>1</td>
            <td>一级1子1</td>
        </tr>
        <tr>
            <td>6</td>
            <td>2</td>
            <td>2</td>
            <td>一级1子2</td>
        </tr>
        <tr>
            <td>3</td>
            <td>1</td>
            <td>2</td>
            <td>一级菜单2</td>
        </tr>
        <tr>
            <td>4</td>
            <td>1</td>
            <td>2</td>
            <td>一级菜单3</td>
        </tr>
        <tr>
            <td>7</td>
            <td>4</td>
            <td>1</td>
            <td>一级3子1</td>
        </tr>
        <tr>
            <td>8</td>
            <td>4</td>
            <td>2</td>
            <td>一级3子2</td>
        </tr>
        <tr>
            <td>9</td>
            <td>4</td>
            <td>3</td>
            <td>一级3子3</td>
        </tr>
        <tr>
            <td>10</td>
            <td>4</td>
            <td>0</td>
            <td>一级3子0</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;我们从结果中可以看到，记录已经是按照树形结构进行排列了，但是现在有个新问题，如果我们有这样的需求，就是不但要求结果按照树形结构显示，还要根据ind字段在每一个分支内进行排序，这个问题怎么处理呢？我们可能很自然的想到如下语句：</p>
<div>
<div>
<div>Sql代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=select%20%20%20d.*%20%20%20from%20%20test_tree%20d%20%0A%20%20start%20%20%20with%20%20%20d.pid%3D0%0A%20%20connect%20%20%20by%20%20%20prior%20%20%20d.id%3Dd.pid%20%0A%20%20order%20by%20d.ind" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>select&nbsp;&nbsp;&nbsp;d.*&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;test_tree&nbsp;d&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;start&nbsp;&nbsp;&nbsp;with&nbsp;&nbsp;&nbsp;d.pid=0&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;connect&nbsp;&nbsp;&nbsp;by&nbsp;&nbsp;&nbsp;prior&nbsp;&nbsp;&nbsp;d.id=d.pid&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;order&nbsp;by&nbsp;d.ind&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">select   d.*   from  test_tree d
start   with   d.pid=0
connect   by   prior   d.id=d.pid
order by d.ind</pre>
<p>&nbsp;结果如下：</p>
<table border="1">
    <tbody>
        <tr>
            <th>ID</th>
            <th>PID</th>
            <th>IND</th>
            <th>NAME</th>
        </tr>
        <tr>
            <td>1</td>
            <td>0</td>
            <td>1</td>
            <td>根节点</td>
        </tr>
        <tr>
            <td>2</td>
            <td>1</td>
            <td>1</td>
            <td>一级菜单1</td>
        </tr>
        <tr>
            <td>5</td>
            <td>2</td>
            <td>1</td>
            <td>一级1子1</td>
        </tr>
        <tr>
            <td>6</td>
            <td>2</td>
            <td>2</td>
            <td>一级1子2</td>
        </tr>
        <tr>
            <td>4</td>
            <td>1</td>
            <td>2</td>
            <td>一级菜单3</td>
        </tr>
        <tr>
            <td>10</td>
            <td>4</td>
            <td>0</td>
            <td>一级3子0</td>
        </tr>
        <tr>
            <td>8</td>
            <td>4</td>
            <td>2</td>
            <td>一级3子2</td>
        </tr>
        <tr>
            <td>9</td>
            <td>4</td>
            <td>3</td>
            <td>一级3子3</td>
        </tr>
        <tr>
            <td>7</td>
            <td>4</td>
            <td>1</td>
            <td>一级3子1</td>
        </tr>
        <tr>
            <td>3</td>
            <td>1</td>
            <td>2</td>
            <td>一级菜单2</td>
        </tr>
    </tbody>
</table>
<p>这显然不是我们想要的结果，那下面的这个语句呢？</p>
<div>
<div>
<div>Sql代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=select%20%20%20d.*%20%20%20from%20%20(select%20dd.*%20from%20test_tree%20dd%20order%20by%20dd.ind)%20d%20%0A%20%20start%20%20%20with%20%20%20d.pid%3D0%0A%20%20connect%20%20%20by%20%20%20prior%20%20%20d.id%3Dd.pid%20" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>select&nbsp;&nbsp;&nbsp;d.*&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;(select&nbsp;dd.*&nbsp;from&nbsp;test_tree&nbsp;dd&nbsp;order&nbsp;by&nbsp;dd.ind)&nbsp;d&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;start&nbsp;&nbsp;&nbsp;with&nbsp;&nbsp;&nbsp;d.pid=0&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;connect&nbsp;&nbsp;&nbsp;by&nbsp;&nbsp;&nbsp;prior&nbsp;&nbsp;&nbsp;d.id=d.pid&nbsp;&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">select   d.*   from  (select dd.* from test_tree dd order by dd.ind) d
start   with   d.pid=0
connect   by   prior   d.id=d.pid </pre>
<p>结果如下：</p>
<table border="1">
    <tbody>
        <tr>
            <th>ID</th>
            <th>PID</th>
            <th>IND</th>
            <th>NAME</th>
        </tr>
        <tr>
            <td>1</td>
            <td>0</td>
            <td>1</td>
            <td>根节点</td>
        </tr>
        <tr>
            <td>2</td>
            <td>1</td>
            <td>1</td>
            <td>一级菜单1</td>
        </tr>
        <tr>
            <td>5</td>
            <td>2</td>
            <td>1</td>
            <td>一级1子1</td>
        </tr>
        <tr>
            <td>6</td>
            <td>2</td>
            <td>2</td>
            <td>一级1子2</td>
        </tr>
        <tr>
            <td>4</td>
            <td>1</td>
            <td>2</td>
            <td>一级菜单3</td>
        </tr>
        <tr>
            <td>10</td>
            <td>4</td>
            <td>0</td>
            <td>一级3子0</td>
        </tr>
        <tr>
            <td>8</td>
            <td>4</td>
            <td>2</td>
            <td>一级3子2</td>
        </tr>
        <tr>
            <td>9</td>
            <td>4</td>
            <td>3</td>
            <td>一级3子3</td>
        </tr>
        <tr>
            <td>7</td>
            <td>4</td>
            <td>1</td>
            <td>一级3子1</td>
        </tr>
        <tr>
            <td>3</td>
            <td>1</td>
            <td>2</td>
            <td>一级菜单2</td>
        </tr>
    </tbody>
</table>
<p>这个结果看似对了，但由于一级菜单3节点下有一个节点的ind=0，导致一级菜单2被拍到了3下面。如果想使用类似这样的语句做到各分支内排序，则需要找到一个能够准确描述菜单级别的字段，但是对于示例表来说，不存在这么一个字段。</p>
<p>那我们如何实现需求呢？其实Oracle9以后，提供了一种排序&#8220;order siblings by&#8221;就可以实现我们的需求，用法如下：</p>
<div>
<div>
<div>Sql代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=select%20%20%20d.*%20%20%20from%20%20test_tree%20d%20%0A%20%20start%20%20%20with%20%20%20d.pid%3D0%0A%20%20connect%20%20%20by%20%20%20prior%20%20%20d.id%3Dd.pid%20%0A%20%20order%20%20%20siblings%20%20%20by%20%20%20d.ind%20%20%20asc" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div>
</div>
<ol start="1">
    <li>select&nbsp;&nbsp;&nbsp;d.*&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;test_tree&nbsp;d&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;start&nbsp;&nbsp;&nbsp;with&nbsp;&nbsp;&nbsp;d.pid=0&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;connect&nbsp;&nbsp;&nbsp;by&nbsp;&nbsp;&nbsp;prior&nbsp;&nbsp;&nbsp;d.id=d.pid&nbsp;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;order&nbsp;&nbsp;&nbsp;siblings&nbsp;&nbsp;&nbsp;by&nbsp;&nbsp;&nbsp;d.ind&nbsp;&nbsp;&nbsp;asc&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code" class="sql">select   d.*   from  test_tree d
start   with   d.pid=0
connect   by   prior   d.id=d.pid
order   siblings   by   d.ind   asc</pre>
<p>结果如下：</p>
<table border="1">
    <tbody>
        <tr>
            <th>ID</th>
            <th>PID</th>
            <th>IND</th>
            <th>NAME</th>
        </tr>
        <tr>
            <td>1</td>
            <td>0</td>
            <td>1</td>
            <td>根节点</td>
        </tr>
        <tr>
            <td>2</td>
            <td>1</td>
            <td>1</td>
            <td>一级菜单1</td>
        </tr>
        <tr>
            <td>5</td>
            <td>2</td>
            <td>1</td>
            <td>一级1子1</td>
        </tr>
        <tr>
            <td>6</td>
            <td>2</td>
            <td>2</td>
            <td>一级1子2</td>
        </tr>
        <tr>
            <td>3</td>
            <td>1</td>
            <td>2</td>
            <td>一级菜单2</td>
        </tr>
        <tr>
            <td>4</td>
            <td>1</td>
            <td>2</td>
            <td>一级菜单3</td>
        </tr>
        <tr>
            <td>10</td>
            <td>4</td>
            <td>0</td>
            <td>一级3子0</td>
        </tr>
        <tr>
            <td>7</td>
            <td>4</td>
            <td>1</td>
            <td>一级3子1</td>
        </tr>
        <tr>
            <td>8</td>
            <td>4</td>
            <td>2</td>
            <td>一级3子2</td>
        </tr>
        <tr>
            <td>9</td>
            <td>4</td>
            <td>3</td>
            <td>一级3子3</td>
        </tr>
    </tbody>
</table>
<p>这样一来，查询结果就完全符合我们的要求了。</p>
<p>至于在Oracle8以前版本，或者其他数据库中如何实现类似的功能，希望大家来指教下，谢谢。</p>
<br />
<br />
<img src ="http://www.blogjava.net/conans/aggbug/318052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2010-04-12 13:35 <a href="http://www.blogjava.net/conans/articles/318052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE EXP/IMP的使用详解</title><link>http://www.blogjava.net/conans/articles/304736.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 04 Dec 2009 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/304736.html</guid><description><![CDATA[导入/导出是ORACLE幸存的最古老的两个命令行工具，其实我从来不认为Exp/Imp是一种好的备份方式，正确的说法是Exp/Imp只能是一个好的
转储工具，特别是在小型数据库的转储，表空间的迁移，表的抽取，检测逻辑和物理冲突等中有不小的功劳。当然，我们也可以把它作为小型数据库的物理备份后的
一个逻辑辅助备份，也是不错的建议。对于越来越大的数据库，特别是TB级数据库和越来越多数据仓库的出现，EXP/IMP越来越力不从心了，这个时候，数
据库的备份都转向了RMAN和第三方工具。下面说明一下EXP/IMP的使用。<br />
如何使exp的帮助以不同的字符集显
示：set&nbsp;nls_lang=simplified&nbsp;chinese_china.zhs16gbk，通过设置环境变量，可以让exp的帮助以中文显
示，如果set&nbsp;nls_lang=American_america.字符集，那么帮助就是英文的了<br />
<div class="UBBPanel">
<div class="UBBTitle"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' style="margin: 0px 2px -3px 0px;" alt="程序代码" src="http://www.bgcn.net/ck/images/code.gif" /> 程序代码</div>
<div class="UBBContent">EXP的所有参数（括号中为参数的默认值）：<br />
USERID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户名/口令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如：&nbsp;USERID=duanl/duanl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;导出整个数据库&nbsp;(N)<br />
BUFFER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据缓冲区的大小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
OWNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有者用户名列表,你希望导出哪个用户的对象，就用owner=username<br />
FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输出文件&nbsp;(EXPDAT.DMP)&nbsp;&nbsp;&nbsp;&nbsp;<br />
TABLES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表名列表&nbsp;,指定导出的table名称，如：TABLES=table1,table2<br />
COMPRESS&nbsp;&nbsp;&nbsp;&nbsp;导入一个extent&nbsp;(Y)&nbsp;&nbsp;&nbsp;<br />
RECORDLENGTH&nbsp;&nbsp;IO&nbsp;记录的长度<br />
GRANTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;导出权限&nbsp;(Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
INCTYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;增量导出类型<br />
INDEXES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;导出索引&nbsp;(Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
RECORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;跟踪增量导出&nbsp;(Y)<br />
ROWS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;导出数据行&nbsp;(Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
PARFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参数文件名,如果你exp的参数很多，可以存成参数文件.<br />
CONSTRAINTS&nbsp;&nbsp;导出约束&nbsp;(Y)&nbsp;&nbsp;&nbsp;&nbsp;<br />
CONSISTENT&nbsp;&nbsp;&nbsp;交叉表一致性<br />
LOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;屏幕输出的日志文件&nbsp;&nbsp;&nbsp;&nbsp;<br />
STATISTICS&nbsp;&nbsp;&nbsp;&nbsp;分析对象&nbsp;(ESTIMATE)<br />
DIRECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;直接路径&nbsp;(N)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
TRIGGERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;导出触发器&nbsp;(Y)<br />
FEEDBACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;显示每&nbsp;x&nbsp;行&nbsp;(0)&nbsp;的进度<br />
FILESIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;各转储文件的最大尺寸<br />
QUERY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选定导出表子集的子句<br />
下列关键字仅用于可传输的表空间<br />
TRANSPORT_TABLESPACE&nbsp;导出可传输的表空间元数据&nbsp;(N)<br />
TABLESPACES&nbsp;将传输的表空间列表<br />
</div>
</div>
<br />
<div class="UBBPanel">
<div class="UBBTitle"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' style="margin: 0px 2px -3px 0px;" alt="程序代码" src="http://www.bgcn.net/ck/images/code.gif" /> 程序代码</div>
<div class="UBBContent">IMP的所有参数（括号中为参数的默认值）：<br />
USERID&nbsp;&nbsp;&nbsp;用户名/口令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;导入整个文件&nbsp;(N)<br />
BUFFER&nbsp;&nbsp;&nbsp;数据缓冲区大小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
FROMUSER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有人用户名列表<br />
FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入文件&nbsp;(EXPDAT.DMP)&nbsp;&nbsp;&nbsp;&nbsp;<br />
TOUSER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户名列表<br />
SHOW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;只列出文件内容&nbsp;(N)<br />
TABLES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表名列表<br />
IGNORE&nbsp;&nbsp;&nbsp;忽略创建错误&nbsp;(N)&nbsp;&nbsp;&nbsp;&nbsp;<br />
RECORDLENGTH&nbsp;&nbsp;IO&nbsp;记录的长度<br />
GRANTS&nbsp;&nbsp;导入权限&nbsp;(Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
INCTYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;增量导入类型<br />
INDEXES&nbsp;导入索引&nbsp;(Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
COMMIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;提交数组插入&nbsp;(N)<br />
ROWS&nbsp;&nbsp;&nbsp;&nbsp;导入数据行&nbsp;(Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
PARFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参数文件名<br />
LOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;屏幕输出的日志文件&nbsp;&nbsp;&nbsp;<br />
CONSTRAINTS&nbsp;&nbsp;导入限制&nbsp;(Y)<br />
DESTROY&nbsp;&nbsp;覆盖表空间数据文件&nbsp;(N)<br />
INDEXFILE&nbsp;将表/索引信息写入指定的文件<br />
SKIP_UNUSABLE_INDEXES&nbsp;&nbsp;跳过不可用索引的维护&nbsp;(N)<br />
ANALYZE&nbsp;&nbsp;执行转储文件中的&nbsp;ANALYZE&nbsp;语句&nbsp;(Y)<br />
FEEDBACK&nbsp;显示每&nbsp;x&nbsp;行&nbsp;(0)&nbsp;的进度<br />
TOID_NOVALIDATE&nbsp;&nbsp;跳过指定类型&nbsp;id&nbsp;的校验<br />
FILESIZE&nbsp;各转储文件的最大尺寸<br />
RECALCULATE_STATISTICS&nbsp;重新计算统计值&nbsp;(N)<br />
下列关键字仅用于可传输的表空间<br />
TRANSPORT_TABLESPACE&nbsp;导入可传输的表空间元数据&nbsp;(N)<br />
TABLESPACES&nbsp;将要传输到数据库的表空间<br />
DATAFILES&nbsp;将要传输到数据库的数据文件<br />
TTS_OWNERS&nbsp;拥有可传输表空间集中数据的用户<br />
</div>
</div>
<br />
关于增量参数的说明：exp/imp的增量并不是真正意义上的增量，所以最好不要使用。<br />
&nbsp;<br />
<br />
使用方法：<br />
Exp&nbsp;parameter_name=value&nbsp;or&nbsp;Exp&nbsp;parameter_name=(value1,value2&#8230;&#8230;)<br />
只要输入参数help=y就可以看到所有帮助.<br />
<br />
<strong>EXP常用选项</strong><br />
1.FULL，这个用于导出整个数据库，在ROWS=N一起使用时，可以导出整个数据库的结构。例如：<br />
exp&nbsp;userid=test/test&nbsp;file=./db_str.dmp&nbsp;log=./db_str.log&nbsp;full=y&nbsp;rows=n&nbsp;compress=y&nbsp;direct=y<br />
2.&nbsp;OWNER和TABLE，这两个选项用于定义EXP的对象。OWNER定义导出指定用户的对象；TABLE指定EXP的table名称，例如：<br />
exp&nbsp;userid=test/test&nbsp;file=./db_str.dmp&nbsp;log=./db_str.log&nbsp;owner=duanl<br />
exp&nbsp;userid=test/test&nbsp;file=./db_str.dmp&nbsp;log=./db_str.log&nbsp;table=nc_data,fi_arap<br />
3.BUFFER和FEEDBACK，在导出比较多的数据时，我会考虑设置这两个参数。例如：<br />
exp&nbsp;userid=test/test&nbsp;file=yw97_2003.dmp&nbsp;log=yw97_2003_3.log&nbsp;feedback=10000&nbsp;buffer=100000000&nbsp;tables=WO4,OK_YT<br />
4.FILE和LOG，这两个参数分别指定备份的DMP名称和LOG名称，包括文件名和目录，例子见上面。<br />
5.COMPRESS参数不压缩导出数据的内容。用来控制导出对象的storage语句如何产生。默认值为Y，使用默认值，对象的存储语句的init&nbsp;extent等于当前导出对象的extent的总和。推荐使用COMPRESS＝N。<br />
6.&nbsp;FILESIZE该选项在8i中可用。如果导出的dmp文件过大时，最好使用FILESIZE参数，限制文件大小不要超过2G。如：<br />
exp&nbsp;userid=duanl/duanl&nbsp;file=f1,f2,f3,f4,f5&nbsp;filesize=2G&nbsp;owner=scott<br />
这样将创建f1.dmp,&nbsp;f2.dmp等一系列文件，每个大小都为2G，如果导出的总量小于10G<br />
EXP不必创建f5.bmp.<br />
<br />
I<strong>MP常用选项</strong><br />
1、FROMUSER和TOUSER，使用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中。例如：假设我们做exp时导出的为test的对象,现在我们想把对象导入用户：<br />
imp&nbsp;userid=test1/test1&nbsp;file=expdat.dmp&nbsp;fromuser=test1&nbsp;touser=test1<br />
2、
IGNORE、GRANTS和INDEXES，其中IGNORE参数将忽略表的存在，继续导入，这个对于需要调整表的存储参数时很有用，我们可以先根据实
际情况用合理的存储参数建好表，然后直接导入数据。而GRANTS和INDEXES则表示是否导入授权和索引，如果想使用新的存储参数重建索引，或者为了
加快到入速度，我们可以考虑将INDEXES设为N，而GRANTS一般都是Y。例
如：imp&nbsp;userid=test1/test1&nbsp;file=expdat.dmp&nbsp;fromuser=test1&nbsp;touser=test1&nbsp;indexes=N<br />
<br />
<strong>表空间传输</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;表空间传输是8i新增加的一种快速在数据库间移动数据的一种办法，是把一个数据库上的格式数据文件附加到另外一个数据库中，而不是把数据导出成Dmp文件，这在有些时候是非常管用的，因为传输表空间移动数据就象复制文件一样快。<br />
关于传输表空间有一些规则，即：<br />
&#183;源数据库和目标数据库必须运行在相同的硬件平台上。<br />
&#183;源数据库与目标数据库必须使用相同的字符集。<br />
&#183;源数据库与目标数据库一定要有相同大小的数据块<br />
&#183;目标数据库不能有与迁移表空间同名的表空间<br />
&#183;SYS的对象不能迁移<br />
&#183;必须传输自包含的对象集<br />
&#183;有一些对象，如物化视图，基于函数的索引等不能被传输<br />
可以用以下的方法来检测一个表空间或一套表空间是否符合传输标准：<br />
exec&nbsp;sys.dbms_tts.transport_set_check(&#8216;tablespace_name&#8217;,true);<br />
select&nbsp;*&nbsp;from&nbsp;sys.transport_set_violation;<br />
如果没有行选择，表示该表空间只包含表数据，并且是自包含的。对于有些非自包含的表空间，如数据表空间和索引表空间，可以一起传输。<br />
以下为简要使用步骤，如果想参考详细使用方法，也可以参考ORACLE联机帮助。<br />
1.设置表空间为只读（假定表空间名字为APP_Data&nbsp;和APP_Index）<br />
alter&nbsp;tablespace&nbsp;app_data&nbsp;read&nbsp;only;<br />
alter&nbsp;tablespace&nbsp;app_index&nbsp;read&nbsp;only;<br />
2.发出EXP命令<br />
SQL&gt;host&nbsp;exp&nbsp;userid=&#8221;&#8221;&#8221;sys/password&nbsp;as&nbsp;sysdba&#8221;&#8221;&#8221;&nbsp;<br />
transport_tablespace=y&nbsp;tablespace=(app_data,&nbsp;app_index)<br />
以上需要注意的是<br />
&#183;为了在SQL中执行EXP，USERID必须用三个引号，在UNIX中也必须注意避免&#8220;/&#8221;的使用<br />
&#183;在816和以后，必须使用sysdba才能操作<br />
&#183;这个命令在SQL中必须放置在一行（这里是因为显示问题放在了两行）<br />
3.拷贝数据文件到另一个地点，即目标数据库<br />
&nbsp;&nbsp;可以是cp(unix)或copy(windows)或通过ftp传输文件（一定要在bin方式）<br />
4.把本地的表空间设置为读写<br />
5.在目标数据库附加该数据文件<br />
imp&nbsp;file=expdat.dmp&nbsp;userid=&#8221;&#8221;&#8221;sys/password&nbsp;as&nbsp;sysdba&#8221;&#8221;&#8221;&nbsp;transport_tablespace=y&nbsp;&#8220;datafile=(c:\temp\app_data,c:\temp\app_index)&#8221;<br />
6.设置目标数据库表空间为读写<br />
alter&nbsp;tablespace&nbsp;app_data&nbsp;read&nbsp;write;<br />
alter&nbsp;tablespace&nbsp;app_index&nbsp;read&nbsp;write;<br />
<br />
<strong>优化EXP/IMP的方法：</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;当需要exp/imp的数据量比较大时，这个过程需要的时间是比较长的，我们可以用一些方法来优化exp/imp的操作。<br />
exp:使用直接路径&nbsp;direct=y<br />
oracle会避开sql语句处理引擎,直接从数据库文件中读取数据,然后写入导出文件.<br />
可以在导出日志中观察到:&nbsp;exp-00067:&nbsp;table&nbsp;xxx&nbsp;will&nbsp;be&nbsp;exported&nbsp;in&nbsp;conventional&nbsp;path<br />
&nbsp;&nbsp;&nbsp;&nbsp;如果没有使用直接路径,必须保证buffer参数的值足够大.<br />
&nbsp;&nbsp;&nbsp;&nbsp;有一些参数于direct=y不兼容,无法用直接路径导出可移动的tablespace,或者用query参数导出数据库子集.<br />
&nbsp;&nbsp;&nbsp;&nbsp;当导入导出的数据库运行在不同的os下时,必须保证recordlength参数的值一致.<br />
<br />
<strong>imp:通过以下几个途径优化</strong><br />
1.避免磁盘排序<br />
将sort_area_size设置为一个较大的值,比如100M<br />
2.避免日志切换等待<br />
增加重做日志组的数量,增大日志文件大小.<br />
3.优化日志缓冲区<br />
比如将log_buffer容量扩大10倍(最大不要超过5M)<br />
4.使用阵列插入与提交<br />
commit&nbsp;=&nbsp;y<br />
注意:阵列方式不能处理包含LOB和LONG类型的表,对于这样的table,如果使用commit&nbsp;=&nbsp;y,每插入一行,就会执行一次提交.<br />
5.使用NOLOGGING方式减小重做日志大小<br />
在导入时指定参数indexes=n,只导入数据而忽略index,在导完数据后在通过脚本创建index,指定&nbsp;NOLOGGING选项<br />
<br />
<strong>导出/导入与字符集</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;进行数据的导入导出时，我们要注意关于字符集的问题。在EXP/IMP过程中我们需要注意四个字符集的参数：导出端的客户端字符集，导出端数据库字符集，导入端的客户端字符集，导入端数据库字符集。<br />
我们首先需要查看这四个字符集参数。<br />
查看数据库的字符集的信息：<br />
SQL&gt;&nbsp;select&nbsp;*&nbsp;from&nbsp;nls_database_parameters;<br />
PARAMETER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VALUE<br />
------------------------------&nbsp;--------------------------------------------------------------------------------<br />
NLS_LANGUAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AMERICAN<br />
NLS_TERRITORY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AMERICA<br />
NLS_CURRENCY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$<br />
NLS_ISO_CURRENCY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AMERICA<br />
NLS_NUMERIC_CHARACTERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.,<br />
NLS_CHARACTERSET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZHS16GBK<br />
NLS_CALENDAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GREGORIAN<br />
NLS_DATE_FORMAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DD-MON-RR<br />
NLS_DATE_LANGUAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AMERICAN<br />
NLS_SORT&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;BINARY<br />
NLS_TIME_FORMAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HH.MI.SSXFF&nbsp;AM<br />
NLS_TIMESTAMP_FORMAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DD-MON-RR&nbsp;HH.MI.SSXFF&nbsp;AM<br />
NLS_TIME_TZ_FORMAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HH.MI.SSXFF&nbsp;AM&nbsp;TZH:TZM<br />
NLS_TIMESTAMP_TZ_FORMAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DD-MON-RR&nbsp;HH.MI.SSXFF&nbsp;AM&nbsp;TZH:TZM<br />
NLS_DUAL_CURRENCY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$<br />
NLS_COMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BINARY<br />
NLS_NCHAR_CHARACTERSET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZHS16GBK<br />
NLS_RDBMS_VERSION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.1.7.4.1<br />
NLS_CHARACTERSET：ZHS16GBK是当前数据库的字符集。<br />
<br />
我们再来查看客户端的字符集信息：<br />
客户端字符集的参数NLS_LANG=_&lt;&nbsp;territory&nbsp;&gt;.<br />
language：指定oracle消息使用的语言，日期中日和月的显示。<br />
Territory：指定货币和数字的格式，地区和计算星期及日期的习惯。<br />
Characterset：控制客户端应用程序使用的字符集。通常设置或等于客户端的代码页。或者对于unicode应用设为UTF8。<br />
在windows中，查询和修改NLS_LANG可在注册表中进行：<br />
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMExx\<br />
xx指存在多个Oracle_HOME时的系统编号。<br />
<br />
在unix中：<br />
$&nbsp;env|grep&nbsp;NLS_LANG<br />
NLS_LANG=simplified&nbsp;chinese_china.ZHS16GBK<br />
<br />
修改可用：<br />
$&nbsp;export&nbsp;NLS_LANG=AMERICAN_AMERICA.UTF8<br />
<br />
通常在导出时最好把客户端字符集设置得和数据库端相同。当进行数据导入时，主要有以下两种情况：<br />
(1)&nbsp;&nbsp;&nbsp;&nbsp;源数据库和目标数据库具有相同的字符集设置。<br />
这时，只需设置导出和导入端的客户端NLS_LANG等于数据库字符集即可。<br />
(2)&nbsp;&nbsp;&nbsp;&nbsp;源数据库和目标数据库字符集不同。<br />
&nbsp;&nbsp;&nbsp;&nbsp;先将导出端客户端的NLS_LANG设置成和导出端的数据库字符集一致，导出数据，然后将导入端客户端的NLS_LANG设置成和导出端一致，导入数据，这样转换只发生在数据库端，而且只发生一次。<br />
&nbsp;&nbsp;&nbsp;&nbsp;这种情况下，只有当导入端数据库字符集为导出端数据库字符集的严格超集时，数据才能完全导成功，否则，可能会有数据不一致或乱码出现。<br />
<br />
<strong>不同版本的EXP/IMP问题</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;一般来说，从低版本导入到高版本问题不大，麻烦的是将高版本的数据导入到低版本中，在Oracle9i之前，不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决：<br />
1、在高版本数据库上运行底版本的catexp.sql；<br />
2、使用低版本的EXP来导出高版本的数据；<br />
3、使用低版本的IMP将数据库导入到低版本数据库中；<br />
4、在高版本数据库上重新运行高版本的catexp.sql脚本。<br />
但在9i中，上面的方法并不能解决问题。如果直接使用低版本EXP/IMP会出现如下错误：<br />
EXP-00008:&nbsp;orACLE&nbsp;error&nbsp;%lu&nbsp;encountered<br />
orA-00904:&nbsp;invalid&nbsp;column&nbsp;name<br />
这已经是一个公布的BUG，需要等到Oracle10.0才能解决，BUG号为2261722，你可以到METALINK上去查看有关此BUG的详细信息。<br />
BUG归BUG，我们的工作还是要做，在没有Oracle的支持之前，我们就自己解决。在Oracle9i中执行下面的SQL重建exu81rls视图即可。<br />
Create&nbsp;or&nbsp;REPLACE&nbsp;view&nbsp;exu81rls&nbsp;<br />
(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)&nbsp;<br />
AS&nbsp;select&nbsp;u.name,&nbsp;o.name,&nbsp;r.pname,&nbsp;r.pfschma,&nbsp;r.ppname,&nbsp;r.pfname,&nbsp;<br />
decode(bitand(r.stmt_type,1),&nbsp;0,'',&nbsp;'Select,')&nbsp;<br />
||&nbsp;decode(bitand(r.stmt_type,2),&nbsp;0,'',&nbsp;'Insert,')&nbsp;<br />
||&nbsp;decode(bitand(r.stmt_type,4),&nbsp;0,'',&nbsp;'Update,')&nbsp;<br />
||&nbsp;decode(bitand(r.stmt_type,8),&nbsp;0,'',&nbsp;'Delete,'),&nbsp;<br />
r.check_opt,&nbsp;r.enable_flag,&nbsp;<br />
DECODE(BITAND(r.stmt_type,&nbsp;16),&nbsp;0,&nbsp;0,&nbsp;1)&nbsp;<br />
from&nbsp;user$&nbsp;u,&nbsp;obj$&nbsp;o,&nbsp;rls$&nbsp;r&nbsp;<br />
where&nbsp;u.user#&nbsp;=&nbsp;o.owner#&nbsp;<br />
and&nbsp;r.obj#&nbsp;=&nbsp;o.obj#&nbsp;<br />
and&nbsp;(uid&nbsp;=&nbsp;0&nbsp;or&nbsp;<br />
uid&nbsp;=&nbsp;o.owner#&nbsp;or&nbsp;<br />
exists&nbsp;(&nbsp;select&nbsp;*&nbsp;from&nbsp;session_roles&nbsp;where&nbsp;role='Select_CATALOG_ROLE')&nbsp;<br />
)&nbsp;<br />
/&nbsp;<br />
grant&nbsp;select&nbsp;on&nbsp;sys.exu81rls&nbsp;to&nbsp;public;&nbsp;<br />
/&nbsp;<br />
<br />
可以跨版本的使用EXP/IMP，但必须正确地使用EXP和IMP的版本：&nbsp;<br />
1、总是使用IMP的版本匹配数据库的版本，如：要导入到817中，使用817的IMP工具。<br />
2、总是使用EXP的版本匹配两个数据库中最低的版本，如：从9201往817中导入，则使用817版本的EXP工具。
<img src ="http://www.blogjava.net/conans/aggbug/304736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2009-12-04 10:11 <a href="http://www.blogjava.net/conans/articles/304736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Developer ODE界面语言</title><link>http://www.blogjava.net/conans/articles/295745.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sun, 20 Sep 2009 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/295745.html</guid><description><![CDATA[<p>在中文版的操作系统上，或者是英文版的操作系统但是设置了&#8221;Language for non-Unicode
program&#8221;为&#8221;Chinese(PRC)&#8221;
的情况下，ODI的界面始终是中文的，这给学习过程造成了很大的困惑，因为所有的文档都是英文的，在文档中提到的名词我需要去猜测在ODI的中文界面中是
哪个词。</p>
<p>如果说Model翻译成&#8220;模型&#8221;，DataStore翻译成&#8220;数据存储&#8221;还可以简单地对应上，那么Controls翻译成&#8220;控制&#8221;，Flow翻译成&#8220;流&#8221;，Scenario翻译成&#8220;方案&#8221;就不得不花费一些时间去对照了。</p>
<p>所以，为了加快学习进程，需要把ODI的界面设置成英文的。</p>
<p>编辑ODI安装目录中bin目录下的odiparams.bat文件，设置如下一行，然后重新启动ODI即可：</p>
<p>set ODI_ADDITIONAL_JAVA_OPTIONS=&#8221;-Duser.language=en&#8221; &#8220;-Duser.region=US&#8221;</p>
<p>&nbsp;</p>
<p>英文版界面清爽多了。:)</p>
<p>附加修改Oracle SQL Developer的界面语言方法：<br />
编辑sqldeveloper\sqldeveloper\bin\sqldeveloper.conf文件，加入</p>
<p>AddVMOption -Duser.language=EN<br />
AddVMOption -Duser.region=US</p>
<p>&nbsp;</p>
<p>--我的设置</p>
<p>&nbsp;</p>
<p>IncludeConfFile http://www.cnblogs.com/ide/bin/ide.conf</p>
<p>AddVMOption&nbsp; -Dapple.laf.useScreenMenuBar=true <br />
AddVMOption&nbsp; -Dcom.apple.mrj.application.apple.menu.about.name="SQL_Developer"<br />
AddVMOption&nbsp; -Dcom.apple.mrj.application.growbox.intrudes=false <br />
AddVMOption&nbsp; -Dcom.apple.macos.smallTabs=true <br />
AddVMOption&nbsp; -Doracle.ide.util.AddinPolicyUtils.OVERRIDE_FLAG=true</p>
<p>AddVMOption -Dsun.java2d.ddoffscreen=false</p>
<p>AddVMOption -Dwindows.shell.font.languages=</p>
<p>AddVMOption&nbsp; -XX:MaxPermSize=128M</p>
<p>AddVMOption -Duser.language=EN<br />
AddVMOption -Duser.region=US</p>
<p>IncludeConfFile&nbsp; sqldeveloper-nondebug.conf</p>
<img src ="http://www.blogjava.net/conans/aggbug/295745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2009-09-20 13:44 <a href="http://www.blogjava.net/conans/articles/295745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决Oracle EM 乱码问题</title><link>http://www.blogjava.net/conans/articles/287776.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Tue, 21 Jul 2009 13:36:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/287776.html</guid><description><![CDATA[<span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Oracle 10g</span><span style="color: black; line-height: 138%; font-family: 宋体;">提供了一个基于</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Web</span><span style="color: black; line-height: 138%; font-family: 宋体;">的管理工具</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">EM</span><span style="color: black; line-height: 138%; font-family: 宋体;">（</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Enterprise Manager</span><span style="color: black; line-height: 138%; font-family: 宋体;">），使用比较方便。不过，如果您使用的是中文</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Linux</span><span style="color: black; line-height: 138%; font-family: 宋体;">环境，而在安装</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Oracle</span><span style="color: black; line-height: 138%; font-family: 宋体;">的时候，没有加上简体中文语言的话，那登陆时，可能会发现中文按钮都是类似</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">"□□"</span><span style="color: black; line-height: 138%; font-family: 宋体;">字样的乱码。下面就是解决这问题的方法。</span></span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
<span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: 宋体;">该方法适合红旗</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Asianux 2.0</span><span style="color: black; line-height: 138%; font-family: 宋体;">、</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">3.0</span><span style="color: black; line-height: 138%; font-family: 宋体;">等操作系统环境。</span></span><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="entrymore"></a><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
<br />
</span><strong><span style="color: royalblue; font-family: 宋体;"><span style="font-size: small;">一、故障问题</span></span></strong><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: 宋体;">打开</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span><a linkindex="55" href="http://ip:1158/em" class="smarterwiki-linkify">http://ip:1158/em</a></span></span><span style="color: black; line-height: 138%; font-family: 宋体;">时，看到如下的显示，其中中文字符部分是乱码：</span></span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/yangsong158/EntryImages/20090602/1.png" alt="" height="627" width="1024" /><br />
<br />
</span><strong><span style="color: royalblue; font-family: 宋体;"><span style="font-size: small;">二、解决问题</span></span></strong><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">1</span></strong><strong><span style="color: black; font-family: 宋体;">、改变</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">$ORACLE_HOME/jdk</span></strong><strong><span style="color: black; font-family: 宋体;">目录下的</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">jre</span></strong><strong><span style="color: black; font-family: 宋体;">的默认字体</span></strong></span>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; background: #fbfeff none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span style="font-size: small;"># su - oracle<br />
$ cd $ORACLE_HOME/jdk/jre/lib/<br />
$ ls font*zh_CN*</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 12pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: 宋体;">其中，</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">font.properties</span><span style="color: black; line-height: 138%; font-family: 宋体;">是默认使用的字体。还可以看到</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">font.properties.zh_CN.Redhat</span><span style="color: black; line-height: 138%; font-family: 宋体;">和其它的字体。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; background: #fbfeff none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span style="font-size: small;">$ cp font.properties font.properties.bak<br />
$ cp font.properties.zh_CN.Redhat font.properties</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 12pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">2</span></strong><strong><span style="color: black; font-family: 宋体;">、改变</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">$ORACLE_HOME/jre</span></strong><strong><span style="color: black; font-family: 宋体;">下的默认字体</span></strong></span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: 宋体;">使用上面同样的方法来操作。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; background: #fbfeff none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span style="font-size: small;">$ cd $ORACLE_HOME/jre/1.4.2/lib/<br />
$ ls font*zh_CN*<br />
$ cp font.properties font.properties.bak<br />
$ cp font.properties.zh_CN.Redhat font.properties</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 12pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">3</span></strong><strong><span style="color: black; font-family: 宋体;">、删除</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">Cache</span></strong><strong><span style="color: black; font-family: 宋体;">下的</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">gif</span></strong><strong><span style="color: black; font-family: 宋体;">文件</span></strong></span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
<span style="font-size: small;">em</span></span><span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: 宋体;">里面会用到这些图片：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; background: #fbfeff none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span style="font-size: small;">$ cd $ORACLE_HOME/oc4j/j2ee/oc4j_applications/\<br />
applications/em/em/cabo/images/cache/zhs/<br />
$ ls *.gif<br />
$ rm *.gif</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 12pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><strong><span style="color: red; font-family: 宋体;">※</span></strong><strong><span style="color: red; font-family: Tahoma;"> </span></strong><strong><span style="color: red; font-family: 宋体;">注意不要搞错目录，修改的是中文环境的。</span></strong></span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
<br />
</span><span style="font-size: small;"><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">4</span></strong><strong><span style="color: black; font-family: 宋体;">、重新启动</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">EM</span></strong><strong><span style="color: black; font-family: 宋体;">服务</span></strong></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; background: #fbfeff none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span style="font-size: small;">$ emctl stop dbconsole<br />
$ emctl start dbconsole</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: black; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><span style="color: black; font-family: 宋体;">进入</span><span style="color: black; font-family: Tahoma;" lang="EN-US">EM</span><span style="color: black; font-family: 宋体;">看看中文问题是否已经解决。</span></span><span style="color: black; font-family: Tahoma;" lang="EN-US"><br />
<br />
</span><span style="color: black; font-family: 宋体;"><span style="font-size: small;">新打开的界面如下：</span></span><span style="color: black; font-family: Tahoma;" lang="EN-US"><br />
<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/yangsong158/EntryImages/20090602/2.png" alt="" height="627" width="1024" /></span></p>
<img src ="http://www.blogjava.net/conans/aggbug/287776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2009-07-21 21:36 <a href="http://www.blogjava.net/conans/articles/287776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下Oracle 10G DBCA等汉字乱码解决方法</title><link>http://www.blogjava.net/conans/articles/287532.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 20 Jul 2009 13:55:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/287532.html</guid><description><![CDATA[<p><font id="zoom" class="zw_txt">Linux下Oracle 10G DBCA等汉字乱码的解决方法其实很简单：</font></p>
<p><font id="zoom" class="zw_txt">1、在Linux下安装新的JDK（JRE），我装的是1.6；</font></p>
<p><font id="zoom" class="zw_txt">2、修改DBCA所对应的JRE路径（默认下/u01/app/oralce/product/10.2.0/db_1/bin/dbca）</font></p>
<font id="zoom" class="zw_txt">3、完成（em修改同理）。</font>
<img src ="http://www.blogjava.net/conans/aggbug/287532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2009-07-20 21:55 <a href="http://www.blogjava.net/conans/articles/287532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 9i修改字符集为UTF8</title><link>http://www.blogjava.net/conans/articles/254526.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 13 Feb 2009 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/254526.html</guid><description><![CDATA[所以应该这样换<br />
$ sqlplus &#8216;/ as sysdba&#8217; <br />
SQL&gt; SHUTDOWN IMMEDIATE; <br />
SQL&gt; STARTUP MOUNT EXCLUSIVE; <br />
SQL&gt; ALTER SYSTEM ENABLE RESTRICTED SESSION; <br />
SQL&gt; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; <br />
SQL&gt; ALTER SYSTEM SET AQ_TM_PROCESSES=0; <br />
SQL&gt; ALTER DATABASE OPEN; <br />
SQL&gt; ALTER DATABASE NATIONAL CHARACTER SET UTF8; <br />
SQL&gt; SHUTDOWN IMMEDIATE; <br />
SQL&gt; STARTUP; <br />
<br />
按上面的做法就可以,但是可能会出现&#8216;ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when <br />
NCLOB data exists&#8217; 这样的提示信息<br />
<br />
要解决这个问题有两种方法<br />
<br />
一个是,利用INTERNAL_USE 关键字修改区域设置,还有一个是利用re-create,但是re-create有点复杂,所以请用internal_use,<br />
$ sqlplus &#8216;/ as sysdba&#8217; <br />
SQL&gt; SHUTDOWN IMMEDIATE; <br />
SQL&gt; STARTUP MOUNT EXCLUSIVE; <br />
SQL&gt; ALTER SYSTEM ENABLE RESTRICTED SESSION; <br />
SQL&gt; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; <br />
SQL&gt; ALTER SYSTEM SET AQ_TM_PROCESSES=0; <br />
SQL&gt; ALTER DATABASE OPEN; <br />
SQL&gt; ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8; <br />
SQL&gt; SHUTDOWN IMMED<br />
<br />
如果按上面的做法做,National charset的区域设置就没有问题<br />
<img src ="http://www.blogjava.net/conans/aggbug/254526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2009-02-13 11:32 <a href="http://www.blogjava.net/conans/articles/254526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CentOS 5.2下Oracle 10G 2安装</title><link>http://www.blogjava.net/conans/articles/242379.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 24 Nov 2008 14:00:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/242379.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/conans/articles/242379.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/242379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-11-24 22:00 <a href="http://www.blogjava.net/conans/articles/242379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CentOS 5.2下安装Oracle 11g</title><link>http://www.blogjava.net/conans/articles/242378.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 24 Nov 2008 13:59:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/242378.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/conans/articles/242378.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/242378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-11-24 21:59 <a href="http://www.blogjava.net/conans/articles/242378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>centos 5 oracle 10g 安装指南</title><link>http://www.blogjava.net/conans/articles/242372.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 24 Nov 2008 13:44:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/242372.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/conans/articles/242372.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/242372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-11-24 21:44 <a href="http://www.blogjava.net/conans/articles/242372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)Oracle开发专题之：窗口函数 </title><link>http://www.blogjava.net/conans/articles/242303.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 24 Nov 2008 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/242303.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/conans/articles/242303.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/242303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-11-24 17:25 <a href="http://www.blogjava.net/conans/articles/242303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）Oracle开发专题之：分析函数2(Rank, Dense_rank, row_number) </title><link>http://www.blogjava.net/conans/articles/242192.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 24 Nov 2008 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/242192.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/conans/articles/242192.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/242192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-11-24 09:21 <a href="http://www.blogjava.net/conans/articles/242192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)Oracle开发专题之：分析函数(OVER) </title><link>http://www.blogjava.net/conans/articles/242191.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 24 Nov 2008 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/242191.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/conans/articles/242191.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/242191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-11-24 09:19 <a href="http://www.blogjava.net/conans/articles/242191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中ROWNUM的使用技巧。</title><link>http://www.blogjava.net/conans/articles/219693.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sun, 03 Aug 2008 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/219693.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ROWNUM是一种伪列，它会根据返回记录生成一个序列化的数字。利用ROWNUM，我们可以生产一些原先难以实现的结果输出，但因为它是伪列的这个特殊性，我们在使用时也需要注意一些事项，不要掉入&#8220;陷阱&#8221;。下面就介绍一下它的使用技巧及注意事项。1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特殊结果输出利用ROWNUM，我...&nbsp;&nbsp;<a href='http://www.blogjava.net/conans/articles/219693.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/219693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-08-03 13:53 <a href="http://www.blogjava.net/conans/articles/219693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle合并多行为多列</title><link>http://www.blogjava.net/conans/articles/214465.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sat, 12 Jul 2008 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/214465.html</guid><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="blogcontents2">
            <table width="100%">
                <tbody>
                    <tr>
                        <td align="center">
                        <div class="authorIntro2 padlr5">
                        <table cellspacing="0" cellpadding="0" width="100%" border="0">
                            <tbody>
                                <tr>
                                    <td valign="top" align="left">一个男人. 一个写程序的男人. 一个写程序并从程序中寻找快乐的男人. 一个写程序并从程序中寻找快乐又把快乐传递给大家的男人. 一个书生. 一个寂寞的书生. 一个寂寞的梅香竹影下敲声写韵的书生. 一个寂寞的梅香竹影下敲声写韵晨钟暮鼓中逸气扬剑的书生. 那个男人是位书生。没有人知道他的姓名，居无定所，行无定踪，亦耕亦读，或渔或樵。 </td>
                                </tr>
                            </tbody>
                        </table>
                        </div>
                        <br />
                        <br />
                        <!--bloger基本信息--></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td class="blogcontents">
            <div id="div_content">
            <p>oracle 如何聚合多行函数</p>
            <p>在BEA论坛上看一位专家写的大作,一条SQL语句是</p>
            <pre class="ql" name="code">select	r.xm,
            substr(r.csrq,1,4)||'年'||substr(r.csrq,5,2)||'月'||substr(r.csrq,7,2)||'日' csrq,
            (select dictvalue from zh_dictvalue where dictcode=xb and dictname='rk_xb') xb,
            (select dictvalue from zh_dictvalue where dictcode=mz and dictname='rk_mz') mz,
            (select dictvalue from zh_dictvalue where dictcode=ssxq and dictname='rk_xzqh') ssxq,
            xz,
            xp,
            xz,
            fwcs
            from czrk_jbxx r,rk_zpxx p
            where r.gmsfhm=p.gmsfhm  and rownum&lt;2</pre>
            <p>&nbsp;(select dictvalue from zh_dictvalue where dictcode=xb and dictname='rk_xb') xb, &nbsp;(select dictvalue from zh_dictvalue where dictcode=mz and dictname='rk_mz') mz, &nbsp;(select dictvalue from zh_dictvalue where dictcode=ssxq and dictname='rk_xzqh') ssxq, 这里如何优化?</p>
            <p>也就是符合条件的多条记录要合并成一条记录的多个字段.</p>
            <p>其实之前有好多这样的问题,但没有一个好的方案,都是嵌套太多,性能损失很大,把三条记录的结果合并.如果最后的sql语句中的select超过三次,那真的还不如直接这样查询.</p>
            <p>不过首先这个方法是错误的,因为这三次都在原表中查询,性能损失很大,其实如果是5条,10条,20条,100条.这样的语句写起来就累死人了.</p>
            <p>之前有人提供了几个方案,但都是连成字符串还不是形成多列.真正形成多列应该是用分析函数:</p>
            <p>这样实际上只对原表做一次查询,然后得到的结果集在显示的时候被提前到一行上形成多列.</p>
            <pre class="ql" name="code">select * from (
            select name,
            lead(name,1) over (order by name) as name1,
            lead(name,2) over (order by name) as name2,
            lead(name,3) over (order by name) as name3,
            lead(name,4) over (order by name) as name4
            from tb_customer where 条件
            ) t
            where t.name4 is not null</pre>
            <p>这样原来的行数越多节省的性能越高,因为实际原表查询只有一次,后来只是对内存中的结果做合并.上面的那个例子就是</p>
            <pre class="ql" name="code">select * from (
            select	dictvalue as mz,
            lead(dictvalue,1) over (order by dictcode) as ssxq,
            lead(dictvalue,2) over (order by dictcode) as xb,
            from zh_dictvalue
            where (dictcode=xb and dictname='rk_xb')
            or (dictcode=mz and dictname='rk_mz')
            or (dictcode=ssxq and dictname='rk_xzqh')
            ) t
            where t.ssxq not null</pre>
            <pre class="ql" name="code">&nbsp;</pre>
            <pre class="ql" name="code">不知道有没有发现</pre>
            <pre class="ql" name="code">select	dictvalue as mz,
            lead(dictvalue,1) over (order by dictcode) as ssxq,
            lead(dictvalue,2) over (order by dictcode) as xb,
            后面as的顺序?</pre>
            <pre class="ql" name="code">因为dictvalue值未知,如果按它排序,出来的值并不和mz,ssxq,xm有顺序对应的关系,所以以dictcode排序,那么出来的值就是上面的对应关系.</pre>
            </div>
            <br />
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/conans/aggbug/214465.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-07-12 19:16 <a href="http://www.blogjava.net/conans/articles/214465.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle开发专题之：时间运算2(日期截取及四舍五入) </title><link>http://www.blogjava.net/conans/articles/212195.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 02 Jul 2008 12:33:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/212195.html</guid><description><![CDATA[<span style="font-size: 10pt; font-family: Verdana"><strong>一、Oracle中的Round和Trunc：<br />
</strong><br />
如同对数字进行四舍五入和按位截取一样，Oracle对时间日期也提供了这两种功能。但比起对数字进行四舍五入和截取比较复杂：这是因为时间日期是有格式的。下面看看这两个函数的定义和用途：<br />
<br />
ROUND(date [, format])<br />
<br />
TRUNC(date [, format])<br />
<br />
Round函数对日期进行&#8220;四舍五入&#8221;，Trunc函数对日期进行截取。如果我们不指定格式的话，Round会返回一个最接近date参数的日期，而Trunc函数只会简单的截取时分秒部分，返回年月日部分。<br />
<br />
<strong>二、Round和Trunc函数示例：</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;to_char(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm-dd&nbsp;hh24:mi:ss</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;now_date,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_char(</span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate),</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm-dd&nbsp;hh24:mi:ss</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;round_date,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_char(Trunc(sysdate),</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm-dd&nbsp;hh24:mi:ss</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;trunc_date<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">4</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />NOW_DATE&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;ROUND_DATE&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;TRUNC_DATE<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">------------------------------------&nbsp;--------------------------------------&nbsp;----------------------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">2008</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000"><span style="background-color: #00ff00"><span style="font-weight: bold; color: #800000">06</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">30</span></span></span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">14</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">52</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">13</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2008</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000"><span style="background-color: #00ff00"><span style="font-weight: bold; color: #800000">07</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">01</span></span></span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2008</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000"><span style="background-color: #00ff00"><span style="font-weight: bold; color: #800000">06</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">30</span></span></span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
这是一个典型的例子，由于我们没有指定round和trunc函数的格式，所以Oracle默认采用了按日期时间的格式，该例子中当前的时间是下午14:52分，已经超过了12:00 AM这个中界线，所以Round返回07-01日而非06-30日。而Trunc不管三七二十一直接截取前面日期部分返回。<br />
<br />
另外一个值得注意的地方是这两个函数返回的时分秒都是00:00:00，即一天的开始时间(对于12小时制的返回的是12:00:00 AM)。<br />
<br />
<strong>三、指定格式的Round和Trunc函数示例：<br />
</strong><br />
如果我们对Round函数和Trunc函数指定了格式，事情就变得有点复杂了，不过核心思想还是不变：Round是四舍五入，Trunc是截取。举个例子来说，假如我们以年为格式，则现在Oracle的判断是基于年来判断，超过一年的一半(即6月30日)，Round函数则返回下一年了，Trunc函数依然返回当前年。
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;sysdate&nbsp;"Now&nbsp;date",<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Round_year,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Trunc(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Trunc_year<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">4</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Now&nbsp;date&nbsp;&nbsp;&nbsp;ROUND_YEAR&nbsp;TRUNC_YEAR<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------&nbsp;----------&nbsp;----------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">30</span><span style="color: #808080">-</span><span style="color: #000000">6月&nbsp;</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">08</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">01</span><span style="color: #808080">-</span><span style="color: #000000">1月&nbsp;</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">08</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">01</span><span style="color: #808080">-</span><span style="color: #000000">1月&nbsp;</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">08</span></div>
<br />
关于这两个函数可用的格式非常多，但日常应用中用得比较多的基本上就这几个，以Round函数为例：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Q</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Rnd_Q,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Month</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Rnd_Month,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">WW</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Rnd_Week,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">W</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Rnd_Week_again,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">DDD</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Rnd_day,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">DD</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Rnd_day_again,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">DAY</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Rnd_day_of_week,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">D</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Rnd_day_of_week_again,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">HH12</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Rnd_hour_12,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">HH24</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Rnd_hour_24,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff00ff">Round</span><span style="color: #000000">(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">MI</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;Rnd_minute<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual</span></div>
</span>
<img src ="http://www.blogjava.net/conans/aggbug/212195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-07-02 20:33 <a href="http://www.blogjava.net/conans/articles/212195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle开发专题之：时间运算 </title><link>http://www.blogjava.net/conans/articles/212194.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 02 Jul 2008 12:33:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/212194.html</guid><description><![CDATA[<strong>入门知识：<br />
<br />
</strong><span style="background-color: #ffffff"><span style="color: red"><span style="background-color: #ffffff"><strong>①Oracle中的日期时间存储：<br />
</strong></span></span>oracle数据库中存放时间格式的数据，是以oracle特定的格式存贮的，占7个字节，与查询时显示的时间格式无关。不存贮秒以下的时间单位。<br />
</span><strong style="color: red">②Oracle中的日期时间显示：</strong><br />
<font style="background-color: #00ff00"><span style="background-color: #ffffff">通常，客户端与数据库建立起连接后，oracle就会给一个缺省的时间格式数据的显示形式，与所使用的字符集有关。一般显示年月日，而不显示时分秒。<br />
</span></font><span style="color: red"><strong>③Oracle中的日期时间插入：<br />
</strong></span><font style="background-color: #ffffff">向表中插入数据时，如果不使用转换函数，则时间字段的格式必须遵从会话环境的时间格式，否则不能插入。</font><br />
<strong style="color: red">④Oracle中的日期时间格式修改：<br />
</strong><font style="background-color: #ffffff">a.SQL&gt; alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';<br />
</font>b.册表<a href="file://home0/">\hkey_local_machine\software\oracle\home0</a>主键中增加一个字串(8i版本)，字串名为nls_date_format，字串的值为你希望定义的时间格式<br />
<span style="background-color: #00ff00">前者只对当前会话有效，也即是一旦你关闭了SQL*PLUS窗口或重新打开一个SQL*PLUS窗口，日期时间格式依然采用本地字符集对应的日期时间格式。后者对所有客户端应用有效。当两者同时应用时，以alter session的修改为准。<br />
</span><br />
<br />
<a id="part1" name="part1"></a><strong>一、Oracle的日期函数:<br />
</strong><br />
Oracle从8i开始就提供了大量的日期函数，这些日期函数包括对日期进行加减、转换、截取等功能。下面是Oracle提供的日期函数一览表&nbsp;
<table style="width: 100%" cellspacing="0" cellpadding="0" width="100%" border="1">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: center" align="center"><strong><span style="font-family: Verdana">Function</span></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: center" align="center"><strong><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Use</span></span></span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">ADD_MONTHS</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Adds months to a date</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">LAST_DAY</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Computes the last day of the month</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">MONTHS_BETWEEN</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Determines the number of months between two dates</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">NEW_TIME</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Translates a time to a new time zone</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">NEXT_DAY</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Returns the date of the next specified weekday </span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">ROUND</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Rounds a date/time value to a specified element</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">SYSDATE</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Returns the current date and time</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">TO_CHAR</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Converts dates to strings</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">TO_DATE</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Converts strings and numbers to dates</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">TRUNC</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Truncates a date/time value to a specific element</span></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<span style="font-size: 10pt; font-family: Verdana"><strong><a id="part2" name="part2"></a>二、日期加减：<br />
</strong><br />
在Oralce中，对日期进行加减操作的默认单位是天，也就是说如果我们向当前日期加1的话是加上一天，而不是一秒或一小时。那么对一天中的一段时间进行加减要怎么做呢？很简单！只需将它们转化为以天为单位即可。<br />
<br />
【1】为当前时间加上30分钟：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;to_char(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm-dd&nbsp;hh:mi:ss</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;now_date,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background-color: #00ff00"><span style="color: #000000">to_char(sysdate</span><span style="color: #808080">+</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">30</span><span style="color: #808080">/</span><span style="font-weight: bold; color: #800000">24</span><span style="color: #808080">/</span><span style="font-weight: bold; color: #800000">60</span><span style="color: #000000">),&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm-dd&nbsp;hh:mi:ss</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span></span></span><span style="color: #000000">new_date<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />NOW_DATE&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;NEW_DATE<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">------------------------------------&nbsp;--------------------------------------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">2008</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">06</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">30</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">47</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">31</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2008</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">06</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">30</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">11</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">17</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">31</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<br />
我们看到了在绿色高亮处使用30/24/60将分钟转换成天。<strong style="color: red">另外一个要注意的地方是：SQL*PLUS环境下默认的日期格式：NLS_DATE_FORMAT是DD-MM-YYYY，也即是不包含时、分、秒，所以我们这里必须采用to_char的方式指定输入的日期格式。</strong><br />
<br />
除此之外也可以通过在SQL*PLUS中执行下列语句修改默认的日期输出格式，这样的话就不需要通过to_char来转换了，直接输出就行。
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">alter</span><span style="color: #000000">&nbsp;session&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;nls_date_format</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm-dd&nbsp;hh24:mi:ss</span><span style="color: #ff0000">'</span><span style="color: #000000">;</span></div>
<br />
【2】为当前时间减去30分钟：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;to_char(sysdate</span><span style="color: #808080">+</span><span style="color: #000000">(</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">30</span><span style="color: #808080">/</span><span style="font-weight: bold; color: #800000">24</span><span style="color: #808080">/</span><span style="font-weight: bold; color: #800000">60</span><span style="color: #000000">),</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm-dd&nbsp;hh:mi:ss</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;new_date&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />NEW_DATE<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">------------------------------------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">2008</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">06</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">30</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">24</span><span style="color: #000000">:</span><span style="font-weight: bold; color: #800000">59</span></div>
<br />
只需要加上一个负数即可以了。<br />
<br />
<strong><a id="part3" name="part3"></a>三、月份加减：</strong><br />
<br />
</span><font face="Verdana" size="2">月份的加减和日期加减相比要难了很多，因为每个月份的天数并不是固定的，可能是31,30,29,28。如果采用上面的方法将月份转换成实际天数将不可避免地出现多个判断，幸亏Oracle为我们提供了一个add_months函数，这个函数会自动判断月份的天数。看看下面的例子：<br />
<br />
【1】为当前时间加上6个月：</font>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><font face="Verdana"><font size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;add_months(sysdate,&nbsp;</span><span style="font-weight: bold; color: #800000">6</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">from</span></font></font><font face="Verdana"><font size="2"><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />ADD_MONTHS<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------</span></font></font><span style="color: #008080"><br />
<font face="Verdana" size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></font></span><font face="Verdana"><font size="2"><span style="font-weight: bold; color: #800000">31</span><span style="color: #808080">-</span><span style="color: #000000">12月</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">08</span></font></font></div>
<br />
<font face="Verdana" size="2">【2】为当前时间减去6个月：</font>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><font face="Verdana"><font size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;add_months(sysdate,&nbsp;</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">6</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">from</span></font></font><font face="Verdana"><font size="2"><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />ADD_MONTHS<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------</span></font></font><span style="color: #008080"><br />
<font face="Verdana" size="2"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></font></span><font face="Verdana"><font size="2"><span style="font-weight: bold; color: #800000">31</span><span style="color: #808080">-</span><span style="color: #000000">12月</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">07</span></font></font></div>
<br />
<font face="Verdana" size="2">【3】求两个日期相差的月数：<br />
<br />
通常情况下两个时间相减将得到以天数为单位的结果，可是有时我们更希望得到以月为单位的结果，如果手动转换这太麻烦了，所以Oracle又提供了一个函数，这个函数就是months_between。
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;months_between(sysdate,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to_date(</span><span style="color: #ff0000">'</span><span style="color: #ff0000">2008-01-01&nbsp;01:00:00</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm-dd&nbsp;hh:mi:ss</span><span style="color: #ff0000">'</span><span style="color: #000000">))&nbsp;result<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;RESULT<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">5.94928203</span></div>
<br />
months_between函数有2个参数，第一个参数是结束日期，第二个参数是开始日期，Oracle用第一个参数减去第二个参数得到月份数。所以结果有可能会是负数的。<br />
<br />
<strong><a id="part4" name="part4"></a>四、年份加减：</strong><br />
<br />
Oracle并不直接提供对年份进行加减的函数，不过有了add_months和months_between函数，我们照样可以做到。<br />
<br />
【1】为当前日期加上2年：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;<span style="background-color: #00ff00"><span style="color: #000000">add_months(sysdate,&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #808080">*</span><span style="font-weight: bold; color: #800000">12</span><span style="color: #000000">)</span></span></span><span style="color: #000000">&nbsp;two_years_later<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />TWO_YEARS_<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">30</span><span style="color: #808080">-</span><span style="color: #000000">6月&nbsp;</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">10</span></div>
<br />
【2】求两个日期相差几年：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;months_between(sysdate,&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to_date(</span><span style="color: #ff0000">'</span><span style="color: #ff0000">2006-06-30</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm-dd</span><span style="color: #ff0000">'</span><span style="color: #000000">))&nbsp;</span><span style="color: #808080"><span style="background-color: #00ff00"><span style="color: #808080">/</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">12</span></span></span><span style="color: #000000">&nbsp;years_between<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />YEARS_BETWEEN<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">-----------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span></div>
<br />
<strong style="color: red">直接将两个日期相减，然后除以365天并不准确，但是不管一年有多少天它总是只有12个月，所以利用这一点我们可以先求出两个日期相差的月数，再除以12就得出相差的年数了</strong><br />
<br />
<strong><a id="part5" name="part5"></a>五、求每月的最后一天：</strong><br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;last_day(add_months(sysdate,</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">))&nbsp;last_day<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />LAST_DAY<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">31</span><span style="color: #808080">-</span><span style="color: #000000">8月&nbsp;</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">08</span></div>
<br />
<strong><a id="part6" name="part6"></a>六、求每月的第一天：<br />
</strong><br />
Oracle提供了last_day让我们能够求出所在月份的最后一天，但没有对应的first_day函数，如果有这方面的需求，只需要稍微动一下脑筋，利用last_day函数即可。例如下面的SQL语句就是求出下个月的第一天：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;<span style="background-color: #00ff00"><span style="color: #000000">last_day(sysdate)</span><span style="color: #808080">+</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;</span></span></span><span style="color: #000000">fisrt_day<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />FISRT_DAY<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">01</span><span style="color: #808080">-</span><span style="color: #000000">7月&nbsp;</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">08</span></div>
<br />
在这里我们将&#8220;每月的第一天&#8221;转换成&#8220;上个月最后一天的下一天&#8221;，问题就解决了！<br />
<br />
<strong><a id="part7" name="part7"></a>七、求下一个星期几：</strong><br />
<br />
有时候我们会碰上&#8220;下个星期五是几号啊？&#8221;这样常见的问题。Oracle为此提供了一个函数：next_day，它的语法是这样的：next_day(date, string)。其中第一个参数date告诉Oracle从什么时候开始算起，第二个参数string则告诉Oracle要取的工作日。<br />
<br />
下面我们看看如何得到下个星期五的日期：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;next_day(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Friday</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;"</span><span style="color: #0000ff">Next</span><span style="color: #000000">&nbsp;Friday"&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;next_day(sysdate,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Friday</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;"</span><span style="color: #0000ff">Next</span><span style="color: #000000">&nbsp;Friday"&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&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;</span><span style="color: #808080">*</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />ERROR&nbsp;at&nbsp;line&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">:<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />ORA</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">01846</span><span style="color: #000000">:&nbsp;周中的日无效</span></div>
<br />
很奇怪！是不？明明语法没有问题，但为什么会说&#8220;周中的日无效&#8221;呢？这里就不得不说到Oracle中的语言和时区的问题了。下面这张图是使用TOAD截取出来的客户端session的语言和时区信息：<br />
</font><br />
<img height="87" alt="" src="http://www.blogjava.net/images/blogjava_net/pengpenglin/数据库/oracle_timezone.jpg" width="369" border="0" /><br />
<span style="font-size: 10pt; font-family: Verdana">图一<br />
<br />
从图中我们知道了客户端的语言是简体中文，日期使用的语言也是简体中文，这就是为什么上面的SQL语句出错的原因了，因为在中文中只有&#8220;星期一，星期二&#8221;这样的工作日表示，而没有&#8220;Monday，Firday&#8221;这样的写法！<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;next_day(sysdate,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">星期五</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;"下周五"&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />下周五<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">04</span><span style="color: #808080">-</span><span style="color: #000000">7月&nbsp;</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">08</span></div>
<br />
<strong style="color: red">如果你不确定自己的时区或者你担心从一个时区移植到另一个时区时，SQL语句会出错，Oracle还允许你用数字的形式来表示工作日。但是要记得一点：1表示的是周日，2表示的是周一，3表示的是周二，依此类推。<br />
<br />
</strong>例如我要查下个周三是什么时候，则函数是这样写的：next_day(sysdate, 4)。
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;<span style="background-color: #00ff00"><span style="color: #000000">next_day(sysdate,</span><span style="font-weight: bold; color: #800000">4</span><span style="color: #000000">)</span></span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />NEXT_DAY(S<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="font-weight: bold; color: #800000">02</span><span style="color: #808080">-</span><span style="color: #000000">7月&nbsp;</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">08</span></div>
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/pengpenglin/数据库/oracle_nextday_function.jpg" border="0" /><br />
<br />
看一下日历是不是正确的，确实不错！呵呵</span> 
<img src ="http://www.blogjava.net/conans/aggbug/212194.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-07-02 20:33 <a href="http://www.blogjava.net/conans/articles/212194.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 日期类型字段的操作(转)</title><link>http://www.blogjava.net/conans/articles/210933.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Thu, 26 Jun 2008 11:55:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/210933.html</guid><description><![CDATA[<div class="blog_content">
<p><strong></strong>在java对oracle的操作中，日期字段是很头疼的事情，其实仔细研究一下也并不难掌握。 </p>
<p>　　举个例子来说明：</p>
<p>　　表 book&nbsp; 中有name varchar2(20)//书籍名称,buydate Date //购买日期 两个字段。</p>
<p>　　已经创建了数据库连接Connection conn;</p>
<p>　　<strong>方法一、使用java.sql.Date实现比较简单的yyyy-mm-dd格式日期。</strong> </p>
<p>　　java.sql.Date不支持时间格式。切记不要使用new java.sql.Date(int year,int month,int date),因为还要处理时间差问题。</p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://sunxboy.javaeye.com/blog/206010#"><img alt="复制代码" src="http://sunxboy.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>PreparedStatement&nbsp;pstmt&nbsp;=&nbsp;conn.prepareStatement(</span><span class="string">"insert&nbsp;into&nbsp;book&nbsp;(name,buydate)&nbsp;values&nbsp;(?,?)"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　java.sql.Date&nbsp;buydate=java.sql.Date.valueOf(</span><span class="string">"2005-06-08"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>　　pstmt.setString(</span><span class="number">1</span><span>,&nbsp;</span><span class="string">"Java编程思想"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>　　pstmt.setDate(</span><span class="number">2</span><span>,buydate&nbsp;); &nbsp;&nbsp;</span></span></li>
    <li><span>　　pstmt.execute();&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");
　　java.sql.Date buydate=java.sql.Date.valueOf("2005-06-08");
　　pstmt.setString(1, "Java编程思想");
　　pstmt.setDate(2,buydate );
　　pstmt.execute();
</pre>
&nbsp;
<p>&nbsp;</p>
<p>　　<strong>方法二、使用java.sql.Timestamp,同上不使用new Timestamp(....)</strong> </p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://sunxboy.javaeye.com/blog/206010#"><img alt="复制代码" src="http://sunxboy.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>PreparedStatement&nbsp;pstmt&nbsp;=&nbsp;conn.prepareStatement(</span><span class="string">"insert&nbsp;into&nbsp;book&nbsp;(name,buydate)&nbsp;values&nbsp;(?,?)"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　java.sql.Timestamp&nbsp;buydate=java.sql.Timestamp.valueOf(</span><span class="string">"2004-06-08&nbsp;05:33:99"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>　　pstmt.setString(</span><span class="number">1</span><span>,&nbsp;</span><span class="string">"Java编程思想"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>　　pstmt.setTimestamp(</span><span class="number">2</span><span>,buydate&nbsp;); &nbsp;&nbsp;</span></span></li>
    <li><span>　　pstmt.execute();&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");
　　java.sql.Timestamp buydate=java.sql.Timestamp.valueOf("2004-06-08 05:33:99");
　　pstmt.setString(1, "Java编程思想");
　　pstmt.setTimestamp(2,buydate );
　　pstmt.execute();
</pre>
&nbsp;
<p>&nbsp;</p>
<p>　　<strong>方法三、使用oracle 的to_date内置函数</strong> </p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://sunxboy.javaeye.com/blog/206010#"><img alt="复制代码" src="http://sunxboy.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>PreparedStatement&nbsp;pstmt&nbsp;=&nbsp;conn.prepareStatement(</span><span class="string">"insert&nbsp;into&nbsp;book&nbsp;(name,buydate)&nbsp;values&nbsp;(?,to_date(?,&nbsp;'yyyy-mm-dd&nbsp;hh24:mi:ss')"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　String&nbsp;buydate=</span><span class="string">"2004-06-08&nbsp;05:33:99"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>　　pstmt.setString(</span><span class="number">1</span><span>,&nbsp;</span><span class="string">"Java编程思想"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>　　pstmt.setString(</span><span class="number">2</span><span>,buydate&nbsp;); &nbsp;&nbsp;</span></span></li>
    <li><span>　　pstmt.execute();&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,to_date(?, 'yyyy-mm-dd hh24:mi:ss')");
　　String buydate="2004-06-08 05:33:99";
　　pstmt.setString(1, "Java编程思想");
　　pstmt.setString(2,buydate );
　　pstmt.execute();
</pre>
&nbsp;
<p>&nbsp;</p>
<p>　　<strong>附:oracle日期格式参数 含义说明&nbsp; <br />
</strong>　　d: 一周中的星期几&nbsp; <br />
　　day: 天的名字，使用空格填充到9个字符&nbsp; <br />
　　dd: 月中的第几天&nbsp; <br />
　　ddd: 年中的第几天&nbsp; <br />
　　dy: 天的简写名&nbsp; <br />
　　iw: ISO标准的年中的第几周&nbsp; <br />
　　iyyy: ISO标准的四位年份&nbsp; <br />
　　yyyy: 四位年份&nbsp; <br />
　　yyy,yy,y: 年份的最后三位，两位，一位&nbsp; <br />
　　hh: 小时，按12小时计&nbsp; <br />
　　hh24: 小时，按24小时计&nbsp; <br />
　　mi: 分&nbsp; <br />
　　ss: 秒&nbsp; <br />
　　mm: 月&nbsp; <br />
　　mon: 月份的简写&nbsp; <br />
　　month: 月份的全名&nbsp; <br />
　　w: 该月的第几个星期&nbsp; <br />
　　ww: 年中的第几个星期</p>
</div>
<img src ="http://www.blogjava.net/conans/aggbug/210933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-26 19:55 <a href="http://www.blogjava.net/conans/articles/210933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle时间的应用(转)</title><link>http://www.blogjava.net/conans/articles/210931.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Thu, 26 Jun 2008 11:53:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/210931.html</guid><description><![CDATA[<p>1、转换函数<br />
与date操作关系最大的就是两个转换函数：to_date(),to_char()<br />
to_date()&nbsp;作用将字符类型按一定格式转化为日期类型：<br />
具体用法:to_date('2004-11-27','yyyy-mm-dd'),前者为字符串，后者为转换日期格式，注意，前后两者要以一对应。<br />
如;to_date('2004-11-27&nbsp;13:34:43',&nbsp;'yyyy-mm-dd&nbsp;hh24:mi:ss')&nbsp;将得到具体的时间<br />
<br />
多种日期格式：<br />
<br />
YYYY：四位表示的年份&nbsp;<br />
YYY，YY，Y：年份的最后三位、两位或一位，缺省为当前世纪&nbsp;<br />
MM：01~12的月份编号&nbsp;<br />
MONTH：九个字符表示的月份，右边用空格填补&nbsp;<br />
MON：三位字符的月份缩写&nbsp;<br />
WW：一年中的星期&nbsp;<br />
D：星期中的第几天&nbsp;<br />
DD：月份中的第几天&nbsp;<br />
DDD：年所中的第几天&nbsp;<br />
DAY：九个字符表示的天的全称，右边用空格补齐&nbsp;<br />
HH，HH12：一天中的第几个小时，12进制表示法&nbsp;<br />
HH24：一天中的第几个小时，取值为00~23&nbsp;<br />
MI：一小时中的分钟&nbsp;<br />
SS：一分钟中的秒&nbsp;<br />
SSSS：从午夜开始过去的秒数&nbsp;<br />
<br />
to_char():将日期转按一定格式换成字符类型<br />
SQL&gt;&nbsp;select&nbsp;to_char(sysdate,'yyyy-mm-dd&nbsp;hh24:mi:ss')&nbsp;time&nbsp;from&nbsp;dual;<br />
<br />
TIME<br />
-------------------<br />
2004-10-08&nbsp;15:22:58<br />
<br />
即把当前时间按yyyy-mm-dd&nbsp;hh24:mi:ss格式转换成字符类型<br />
<br />
在oracle中处理日期大全&nbsp;<br />
<br />
&nbsp;&nbsp;TO_DATE格式&nbsp;&nbsp;<br />
Day:&nbsp;&nbsp;<br />
dd&nbsp;number&nbsp;12&nbsp;&nbsp;<br />
dy&nbsp;abbreviated&nbsp;fri&nbsp;&nbsp;<br />
day&nbsp;spelled&nbsp;out&nbsp;friday&nbsp;&nbsp;<br />
ddspth&nbsp;spelled&nbsp;out,&nbsp;ordinal&nbsp;twelfth&nbsp;&nbsp;<br />
Month:&nbsp;&nbsp;<br />
mm&nbsp;number&nbsp;03&nbsp;&nbsp;<br />
mon&nbsp;abbreviated&nbsp;mar&nbsp;&nbsp;<br />
month&nbsp;spelled&nbsp;out&nbsp;march&nbsp;&nbsp;<br />
Year:&nbsp;&nbsp;<br />
yy&nbsp;two&nbsp;digits&nbsp;98&nbsp;&nbsp;<br />
yyyy&nbsp;four&nbsp;digits&nbsp;1998&nbsp;&nbsp;<br />
<br />
24小时格式下时间范围为：&nbsp;0:00:00&nbsp;-&nbsp;23:59:59....&nbsp;&nbsp;<br />
12小时格式下时间范围为：&nbsp;1:00:00&nbsp;-&nbsp;12:59:59&nbsp;....&nbsp;&nbsp;<br />
<br />
[ZT]日期和??函???<br />
1.&nbsp;&nbsp;<br />
日期和字符转换函数用法（to_date,to_char）&nbsp;&nbsp;<br />
<br />
2.&nbsp;&nbsp;<br />
select&nbsp;to_char(&nbsp;to_date(222,'J'),'Jsp')&nbsp;from&nbsp;dual&nbsp;&nbsp;<br />
<br />
显示Two&nbsp;Hundred&nbsp;Twenty-Two&nbsp;&nbsp;<br />
<br />
3.&nbsp;&nbsp;<br />
求某天是星期几&nbsp;&nbsp;<br />
select&nbsp;to_char(to_date('2002-08-26','yyyy-mm-dd'),'day')&nbsp;from&nbsp;dual;&nbsp;&nbsp;<br />
星期一&nbsp;&nbsp;<br />
select&nbsp;to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE&nbsp;=&nbsp;American')&nbsp;from&nbsp;dual;&nbsp;&nbsp;<br />
monday&nbsp;&nbsp;<br />
设置日期语言&nbsp;&nbsp;<br />
ALTER&nbsp;SESSION&nbsp;SET&nbsp;NLS_DATE_LANGUAGE='AMERICAN';&nbsp;&nbsp;<br />
也可以这样&nbsp;&nbsp;<br />
TO_DATE&nbsp;('2002-08-26',&nbsp;'YYYY-mm-dd',&nbsp;'NLS_DATE_LANGUAGE&nbsp;=&nbsp;American')&nbsp;&nbsp;<br />
<br />
4.&nbsp;&nbsp;<br />
两个日期间的天数&nbsp;&nbsp;<br />
select&nbsp;floor(sysdate&nbsp;-&nbsp;to_date('20020405','yyyymmdd'))&nbsp;from&nbsp;dual;&nbsp;&nbsp;<br />
<br />
5.&nbsp;时间为null的用法&nbsp;&nbsp;<br />
select&nbsp;id,&nbsp;active_date&nbsp;from&nbsp;table1&nbsp;&nbsp;<br />
UNION&nbsp;&nbsp;<br />
select&nbsp;1,&nbsp;TO_DATE(null)&nbsp;from&nbsp;dual;&nbsp;&nbsp;<br />
<br />
注意要用TO_DATE(null)&nbsp;&nbsp;<br />
<br />
6.&nbsp;&nbsp;<br />
a_date&nbsp;between&nbsp;to_date('20011201','yyyymmdd')&nbsp;and&nbsp;to_date('20011231','yyyymmdd')&nbsp;&nbsp;<br />
那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。&nbsp;&nbsp;<br />
所以，当时间需要精确的时候，觉得to_char还是必要的&nbsp;&nbsp;<br />
7.&nbsp;日期格式冲突问题&nbsp;&nbsp;<br />
输入的格式要看你安装的ORACLE字符集的类型,&nbsp;比如:&nbsp;US7ASCII,&nbsp;date格式的类型就是:&nbsp;'01-Jan-01'&nbsp;&nbsp;<br />
alter&nbsp;system&nbsp;set&nbsp;NLS_DATE_LANGUAGE&nbsp;=&nbsp;American&nbsp;&nbsp;<br />
alter&nbsp;session&nbsp;set&nbsp;NLS_DATE_LANGUAGE&nbsp;=&nbsp;American&nbsp;&nbsp;<br />
或者在to_date中写&nbsp;&nbsp;<br />
select&nbsp;to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE&nbsp;=&nbsp;American')&nbsp;from&nbsp;dual;&nbsp;&nbsp;<br />
注意我这只是举了NLS_DATE_LANGUAGE，当然还有很多，&nbsp;&nbsp;<br />
可查看&nbsp;&nbsp;<br />
select&nbsp;*&nbsp;from&nbsp;nls_session_parameters&nbsp;&nbsp;<br />
select&nbsp;*&nbsp;from&nbsp;V$NLS_PARAMETERS&nbsp;&nbsp;<br />
<br />
8.&nbsp;&nbsp;<br />
select&nbsp;count(*)&nbsp;&nbsp;<br />
from&nbsp;(&nbsp;select&nbsp;rownum-1&nbsp;rnum&nbsp;&nbsp;<br />
from&nbsp;all_objects&nbsp;&nbsp;<br />
where&nbsp;rownum&nbsp;&lt;=&nbsp;to_date('2002-02-28','yyyy-mm-dd')&nbsp;-&nbsp;to_date('2002-&nbsp;&nbsp;<br />
02-01','yyyy-mm-dd')+1&nbsp;&nbsp;<br />
)&nbsp;&nbsp;<br />
where&nbsp;to_char(&nbsp;to_date('2002-02-01','yyyy-mm-dd')+rnum-1,&nbsp;'D'&nbsp;)&nbsp;&nbsp;<br />
not&nbsp;&nbsp;<br />
in&nbsp;(&nbsp;'1',&nbsp;'7'&nbsp;)&nbsp;&nbsp;<br />
<br />
查找2002-02-28至2002-02-01间除星期一和七的天数&nbsp;&nbsp;<br />
在前后分别调用DBMS_UTILITY.GET_TIME,&nbsp;让后将结果相减(得到的是1/100秒,&nbsp;而不是毫秒).&nbsp;&nbsp;<br />
<br />
9.&nbsp;&nbsp;<br />
select&nbsp;months_between(to_date('01-31-1999','MM-DD-YYYY'),&nbsp;&nbsp;<br />
to_date('12-31-1998','MM-DD-YYYY'))&nbsp;"MONTHS"&nbsp;FROM&nbsp;DUAL;&nbsp;&nbsp;<br />
1&nbsp;&nbsp;<br />
<br />
select&nbsp;months_between(to_date('02-01-1999','MM-DD-YYYY'),&nbsp;&nbsp;<br />
to_date('12-31-1998','MM-DD-YYYY'))&nbsp;"MONTHS"&nbsp;FROM&nbsp;DUAL;&nbsp;&nbsp;<br />
<br />
1.03225806451613&nbsp;&nbsp;<br />
10.&nbsp;Next_day的用法&nbsp;&nbsp;<br />
Next_day(date,&nbsp;day)&nbsp;&nbsp;<br />
<br />
Monday-Sunday,&nbsp;for&nbsp;format&nbsp;code&nbsp;DAY&nbsp;&nbsp;<br />
Mon-Sun,&nbsp;for&nbsp;format&nbsp;code&nbsp;DY&nbsp;&nbsp;<br />
1-7,&nbsp;for&nbsp;format&nbsp;code&nbsp;D&nbsp;&nbsp;<br />
<br />
11&nbsp;&nbsp;<br />
select&nbsp;to_char(sysdate,'hh:mi:ss')&nbsp;TIME&nbsp;from&nbsp;all_objects&nbsp;&nbsp;<br />
注意：第一条记录的TIME&nbsp;与最后一行是一样的&nbsp;&nbsp;<br />
可以建立一个函数来处理这个问题&nbsp;&nbsp;<br />
create&nbsp;or&nbsp;replace&nbsp;function&nbsp;sys_date&nbsp;return&nbsp;date&nbsp;is&nbsp;&nbsp;<br />
begin&nbsp;&nbsp;<br />
return&nbsp;sysdate;&nbsp;&nbsp;<br />
end;&nbsp;&nbsp;<br />
<br />
select&nbsp;to_char(sys_date,'hh:mi:ss')&nbsp;from&nbsp;all_objects;&nbsp;&nbsp;<br />
12.&nbsp;&nbsp;<br />
获得小时数&nbsp;&nbsp;<br />
<br />
SELECT&nbsp;EXTRACT(HOUR&nbsp;FROM&nbsp;TIMESTAMP&nbsp;'2001-02-16&nbsp;2:38:40')&nbsp;from&nbsp;offer&nbsp;&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;sysdate&nbsp;,to_char(sysdate,'hh')&nbsp;from&nbsp;dual;&nbsp;&nbsp;<br />
<br />
SYSDATE&nbsp;TO_CHAR(SYSDATE,'HH')&nbsp;&nbsp;<br />
--------------------&nbsp;---------------------&nbsp;&nbsp;<br />
2003-10-13&nbsp;19:35:21&nbsp;07&nbsp;&nbsp;<br />
<br />
SQL&gt;&nbsp;select&nbsp;sysdate&nbsp;,to_char(sysdate,'hh24')&nbsp;from&nbsp;dual;&nbsp;&nbsp;<br />
<br />
SYSDATE&nbsp;TO_CHAR(SYSDATE,'HH24')&nbsp;&nbsp;<br />
--------------------&nbsp;-----------------------&nbsp;&nbsp;<br />
2003-10-13&nbsp;19:35:21&nbsp;19&nbsp;&nbsp;<br />
<br />
获取年月日与此类似&nbsp;&nbsp;<br />
13.&nbsp;&nbsp;<br />
年月日的处理&nbsp;&nbsp;<br />
select&nbsp;older_date,&nbsp;&nbsp;<br />
newer_date,&nbsp;&nbsp;<br />
years,&nbsp;&nbsp;<br />
months,&nbsp;&nbsp;<br />
abs(&nbsp;&nbsp;<br />
trunc(&nbsp;&nbsp;<br />
newer_date-&nbsp;&nbsp;<br />
add_months(&nbsp;older_date,years*12+months&nbsp;)&nbsp;&nbsp;<br />
)&nbsp;&nbsp;<br />
)&nbsp;days&nbsp;&nbsp;<br />
from&nbsp;(&nbsp;select&nbsp;&nbsp;<br />
trunc(months_between(&nbsp;newer_date,&nbsp;older_date&nbsp;)/12)&nbsp;YEARS,&nbsp;&nbsp;<br />
mod(trunc(months_between(&nbsp;newer_date,&nbsp;older_date&nbsp;)),&nbsp;&nbsp;<br />
12&nbsp;)&nbsp;MONTHS,&nbsp;&nbsp;<br />
newer_date,&nbsp;&nbsp;<br />
older_date&nbsp;&nbsp;<br />
from&nbsp;(&nbsp;select&nbsp;hiredate&nbsp;older_date,&nbsp;&nbsp;<br />
add_months(hiredate,rownum)+rownum&nbsp;newer_date&nbsp;&nbsp;<br />
from&nbsp;emp&nbsp;)&nbsp;&nbsp;<br />
)&nbsp;&nbsp;<br />
<br />
14.&nbsp;&nbsp;<br />
处理月份天数不定的办法&nbsp;&nbsp;<br />
select&nbsp;to_char(add_months(last_day(sysdate)&nbsp;+1,&nbsp;-2),&nbsp;'yyyymmdd'),last_day(sysdate)&nbsp;from&nbsp;dual&nbsp;&nbsp;<br />
<br />
16.&nbsp;&nbsp;<br />
找出今年的天数&nbsp;&nbsp;<br />
select&nbsp;add_months(trunc(sysdate,'year'),&nbsp;12)&nbsp;-&nbsp;trunc(sysdate,'year')&nbsp;from&nbsp;dual&nbsp;&nbsp;<br />
<br />
闰年的处理方法&nbsp;&nbsp;<br />
to_char(&nbsp;last_day(&nbsp;to_date('02'&nbsp;||&nbsp;:year,'mmyyyy')&nbsp;),&nbsp;'dd'&nbsp;)&nbsp;&nbsp;<br />
如果是28就不是闰年&nbsp;&nbsp;<br />
<br />
17.&nbsp;&nbsp;<br />
yyyy与rrrr的区别&nbsp;&nbsp;<br />
'YYYY99&nbsp;TO_C&nbsp;&nbsp;<br />
-------&nbsp;----&nbsp;&nbsp;<br />
yyyy&nbsp;99&nbsp;0099&nbsp;&nbsp;<br />
rrrr&nbsp;99&nbsp;1999&nbsp;&nbsp;<br />
yyyy&nbsp;01&nbsp;0001&nbsp;&nbsp;<br />
rrrr&nbsp;01&nbsp;2001&nbsp;&nbsp;<br />
<br />
18.不同时区的处理&nbsp;&nbsp;<br />
select&nbsp;to_char(&nbsp;NEW_TIME(&nbsp;sysdate,&nbsp;'GMT','EST'),&nbsp;'dd/mm/yyyy&nbsp;hh:mi:ss')&nbsp;,sysdate&nbsp;&nbsp;<br />
from&nbsp;dual;&nbsp;&nbsp;<br />
<br />
19.&nbsp;&nbsp;<br />
5秒钟一个间隔&nbsp;&nbsp;<br />
Select&nbsp;TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300)&nbsp;*&nbsp;300,'SSSSS')&nbsp;,TO_CHAR(sysdate,'SSSSS')&nbsp;&nbsp;<br />
from&nbsp;dual&nbsp;&nbsp;<br />
<br />
2002-11-1&nbsp;9:55:00&nbsp;35786&nbsp;&nbsp;<br />
SSSSS表示5位秒数&nbsp;&nbsp;<br />
<br />
20.&nbsp;&nbsp;<br />
一年的第几天&nbsp;&nbsp;<br />
select&nbsp;TO_CHAR(SYSDATE,'DDD'),sysdate&nbsp;from&nbsp;dual&nbsp;&nbsp;<br />
310&nbsp;2002-11-6&nbsp;10:03:51&nbsp;&nbsp;<br />
<br />
21.计算小时,分,秒,毫秒&nbsp;&nbsp;<br />
select&nbsp;&nbsp;<br />
Days,&nbsp;&nbsp;<br />
A,&nbsp;&nbsp;<br />
TRUNC(A*24)&nbsp;Hours,&nbsp;&nbsp;<br />
TRUNC(A*24*60&nbsp;-&nbsp;60*TRUNC(A*24))&nbsp;Minutes,&nbsp;&nbsp;<br />
TRUNC(A*24*60*60&nbsp;-&nbsp;60*TRUNC(A*24*60))&nbsp;Seconds,&nbsp;&nbsp;<br />
TRUNC(A*24*60*60*100&nbsp;-&nbsp;100*TRUNC(A*24*60*60))&nbsp;mSeconds&nbsp;&nbsp;<br />
from&nbsp;&nbsp;<br />
(&nbsp;&nbsp;<br />
select&nbsp;&nbsp;<br />
trunc(sysdate)&nbsp;Days,&nbsp;&nbsp;<br />
sysdate&nbsp;-&nbsp;trunc(sysdate)&nbsp;A&nbsp;&nbsp;<br />
from&nbsp;dual&nbsp;&nbsp;<br />
)&nbsp;&nbsp;<br />
<br />
<br />
<br />
select&nbsp;*&nbsp;from&nbsp;tabname&nbsp;&nbsp;<br />
order&nbsp;by&nbsp;decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');&nbsp;&nbsp;<br />
<br />
//&nbsp;&nbsp;<br />
floor((date2-date1)&nbsp;/365)&nbsp;作为年&nbsp;&nbsp;<br />
floor((date2-date1,&nbsp;365)&nbsp;/30)&nbsp;作为月&nbsp;&nbsp;<br />
mod(mod(date2-date1,&nbsp;365),&nbsp;30)作为日.&nbsp;&nbsp;<br />
23.next_day函数&nbsp;&nbsp;<br />
next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。&nbsp;&nbsp;<br />
1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;6&nbsp;7&nbsp;&nbsp;<br />
日&nbsp;一&nbsp;二&nbsp;三&nbsp;四&nbsp;五&nbsp;六<br />
<br />
oracle中有很多关于日期的函数<br />
<br />
在oracle中有很多关于日期的函数，如：&nbsp;<br />
1、add_months()用于从一个日期值增加或减少一些月份&nbsp;<br />
date_value:=add_months(date_value,number_of_months)&nbsp;<br />
例：&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;add_months(sysdate,12)&nbsp;"Next&nbsp;Year"&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
Next&nbsp;Year&nbsp;<br />
----------&nbsp;<br />
13-11月-04&nbsp;<br />
<br />
SQL&gt;&nbsp;select&nbsp;add_months(sysdate,112)&nbsp;"Last&nbsp;Year"&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
Last&nbsp;Year&nbsp;<br />
----------&nbsp;<br />
13-3月&nbsp;-13&nbsp;<br />
<br />
SQL&gt;&nbsp;<br />
<br />
2、current_date()返回当前会放时区中的当前日期&nbsp;<br />
date_value:=current_date&nbsp;<br />
SQL&gt;&nbsp;column&nbsp;sessiontimezone&nbsp;for&nbsp;a15&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;sessiontimezone,current_date&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
SESSIONTIMEZONE&nbsp;CURRENT_DA&nbsp;<br />
---------------&nbsp;----------&nbsp;<br />
+08:00&nbsp;13-11月-03&nbsp;<br />
<br />
SQL&gt;&nbsp;alter&nbsp;session&nbsp;set&nbsp;time_zone='-11:00'&nbsp;<br />
&nbsp;&nbsp;2&nbsp;/&nbsp;<br />
<br />
会话已更改。&nbsp;<br />
<br />
SQL&gt;&nbsp;select&nbsp;sessiontimezone,current_timestamp&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
SESSIONTIMEZONE&nbsp;CURRENT_TIMESTAMP&nbsp;<br />
---------------&nbsp;------------------------------------&nbsp;<br />
-11:00&nbsp;12-11月-03&nbsp;04.59.13.668000&nbsp;下午&nbsp;-11:&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;<br />
<br />
SQL&gt;&nbsp;<br />
<br />
3、current_timestamp()以timestamp&nbsp;with&nbsp;time&nbsp;zone数据类型返回当前会放时区中的当前日期&nbsp;<br />
timestamp_with_time_zone_value:=current_timestamp([timestamp_precision])&nbsp;<br />
SQL&gt;&nbsp;column&nbsp;sessiontimezone&nbsp;for&nbsp;a15&nbsp;<br />
SQL&gt;&nbsp;column&nbsp;current_timestamp&nbsp;format&nbsp;a36&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;sessiontimezone,current_timestamp&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
SESSIONTIMEZONE&nbsp;CURRENT_TIMESTAMP&nbsp;<br />
---------------&nbsp;------------------------------------&nbsp;<br />
+08:00&nbsp;13-11月-03&nbsp;11.56.28.160000&nbsp;上午&nbsp;+08:&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;<br />
<br />
SQL&gt;&nbsp;alter&nbsp;session&nbsp;set&nbsp;time_zone='-11:00'&nbsp;<br />
&nbsp;&nbsp;2&nbsp;/&nbsp;<br />
<br />
会话已更改。&nbsp;<br />
<br />
SQL&gt;&nbsp;select&nbsp;sessiontimezone,current_timestamp&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
SESSIONTIMEZONE&nbsp;CURRENT_TIMESTAMP&nbsp;<br />
---------------&nbsp;------------------------------------&nbsp;<br />
-11:00&nbsp;12-11月-03&nbsp;04.58.00.243000&nbsp;下午&nbsp;-11:&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;<br />
<br />
SQL&gt;&nbsp;<br />
<br />
4、dbtimezone()返回时区&nbsp;<br />
varchar_value:=dbtimezone&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;dbtimezone&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
DBTIME&nbsp;<br />
------&nbsp;<br />
-07:00&nbsp;<br />
<br />
SQL&gt;&nbsp;<br />
<br />
5、extract()找出日期或间隔值的字段值&nbsp;<br />
date_value:=extract(date_field&nbsp;from&nbsp;[datetime_value|interval_value])&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;extract(month&nbsp;from&nbsp;sysdate)&nbsp;"This&nbsp;Month"&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
This&nbsp;Month&nbsp;<br />
----------&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11&nbsp;<br />
<br />
SQL&gt;&nbsp;select&nbsp;extract(year&nbsp;from&nbsp;add_months(sysdate,36))&nbsp;"3&nbsp;Years&nbsp;Out"&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
3&nbsp;Years&nbsp;Out&nbsp;<br />
-----------&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006&nbsp;<br />
<br />
SQL&gt;&nbsp;<br />
<br />
6、last_day()返回包含了日期参数的月份的最后一天的日期&nbsp;<br />
date_value:=last_day(date_value)&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;last_day(date'2000-02-01')&nbsp;"Leap&nbsp;Yr?"&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
Leap&nbsp;Yr?&nbsp;<br />
----------&nbsp;<br />
29-2月&nbsp;-00&nbsp;<br />
<br />
SQL&gt;&nbsp;select&nbsp;last_day(sysdate)&nbsp;"Last&nbsp;day&nbsp;of&nbsp;this&nbsp;month"&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
Last&nbsp;day&nbsp;o&nbsp;<br />
----------&nbsp;<br />
30-11月-03&nbsp;<br />
<br />
SQL&gt;&nbsp;<br />
<br />
7、localtimestamp()返回会话中的日期和时间&nbsp;<br />
timestamp_value:=localtimestamp&nbsp;<br />
SQL&gt;&nbsp;column&nbsp;localtimestamp&nbsp;format&nbsp;a28&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;localtimestamp&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
LOCALTIMESTAMP&nbsp;<br />
----------------------------&nbsp;<br />
13-11月-03&nbsp;12.09.15.433000&nbsp;<br />
下午&nbsp;<br />
<br />
SQL&gt;&nbsp;select&nbsp;localtimestamp,current_timestamp&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
LOCALTIMESTAMP&nbsp;CURRENT_TIMESTAMP&nbsp;<br />
----------------------------&nbsp;------------------------------------&nbsp;<br />
13-11月-03&nbsp;12.09.31.006000&nbsp;13-11月-03&nbsp;12.09.31.006000&nbsp;下午&nbsp;+08:&nbsp;<br />
下午&nbsp;00&nbsp;<br />
<br />
SQL&gt;&nbsp;alter&nbsp;session&nbsp;set&nbsp;time_zone='-11:00';&nbsp;<br />
<br />
会话已更改。&nbsp;<br />
<br />
SQL&gt;&nbsp;select&nbsp;localtimestamp,to_char(sysdate,'DD-MM-YYYY&nbsp;HH:MI:SS&nbsp;AM')&nbsp;"SYSDATE"&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
LOCALTIMESTAMP&nbsp;SYSDATE&nbsp;<br />
----------------------------&nbsp;------------------------&nbsp;<br />
12-11月-03&nbsp;05.11.31.259000&nbsp;13-11-2003&nbsp;12:11:31&nbsp;下午&nbsp;<br />
下午&nbsp;<br />
<br />
SQL&gt;&nbsp;<br />
<br />
8、months_between()判断两个日期之间的月份数量&nbsp;<br />
number_value:=months_between(date_value,date_value)&nbsp;<br />
SQL&gt;&nbsp;select&nbsp;months_between(sysdate,date'1971-05-18')&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
MONTHS_BETWEEN(SYSDATE,DATE'1971-05-18')&nbsp;<br />
----------------------------------------&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;389.855143&nbsp;<br />
<br />
SQL&gt;&nbsp;select&nbsp;months_between(sysdate,date'2001-01-01')&nbsp;from&nbsp;dual;&nbsp;<br />
<br />
MONTHS_BETWEEN(SYSDATE,DATE'2001-01-01')&nbsp;<br />
----------------------------------------&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;34.4035409&nbsp;<br />
<br />
SQL&gt;&nbsp;<br />
<br />
9、next_day()给定一个日期值，返回由第二个参数指出的日子第一次出现在的日期值（应返回相应日子的名称字符串）<br />
<br />
?周相?日期函?<br />
<br />
1.查询某周的第一天<br />
select&nbsp;trunc(decode(ww,&nbsp;53,&nbsp;to_date(yy&nbsp;||&nbsp;'3112',&nbsp;'yyyyddmm'),&nbsp;to_date(yy&nbsp;||&nbsp;'-'&nbsp;||&nbsp;to_char(ww&nbsp;*&nbsp;7),&nbsp;'yyyy-ddd')),&nbsp;'d')&nbsp;last_day<br />
from&nbsp;(select&nbsp;substr('2004-32',&nbsp;1,&nbsp;4)&nbsp;yy,&nbsp;to_number(substr('2004-32',&nbsp;6))&nbsp;ww<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;dual)<br />
<br />
select&nbsp;trunc(to_date(substr('2003-01',1,5)||to_char((to_number(substr('2003-01',6)))*7),'yyyy-ddd'),'d')-6&nbsp;first_day&nbsp;from&nbsp;dual<br />
<br />
select&nbsp;min(v_date)&nbsp;from<br />
&nbsp;&nbsp;(select&nbsp;(to_date('200201','yyyymm')&nbsp;+&nbsp;rownum)&nbsp;v_date<br />
&nbsp;&nbsp;from&nbsp;all_tables<br />
&nbsp;&nbsp;where&nbsp;rownum&nbsp;&lt;&nbsp;370)<br />
where&nbsp;to_char(v_date,'yyyy-iw')&nbsp;=&nbsp;'2002-49'<br />
<br />
2.查询某周的最后一天<br />
select&nbsp;trunc(decode(ww,&nbsp;53,&nbsp;to_date(yy&nbsp;||&nbsp;'3112',&nbsp;'yyyyddmm'),&nbsp;to_date(yy&nbsp;||&nbsp;'-'&nbsp;||&nbsp;to_char(ww&nbsp;*&nbsp;7),&nbsp;'yyyy-ddd')),&nbsp;'d')&nbsp;-&nbsp;6&nbsp;first_day<br />
&nbsp;&nbsp;from&nbsp;(select&nbsp;substr('2004-33',&nbsp;1,&nbsp;4)&nbsp;yy,&nbsp;to_number(substr('2004-33',&nbsp;6))&nbsp;ww<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;dual)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
select&nbsp;trunc(to_date(substr('2003-01',1,5)||to_char((to_number(substr('2003-01',6)))*7),'yyyy-ddd'),'d')&nbsp;last_day&nbsp;from&nbsp;dual<br />
<br />
select&nbsp;max(v_date)&nbsp;from<br />
&nbsp;&nbsp;(select&nbsp;(to_date('200408','yyyymm')&nbsp;+&nbsp;rownum)&nbsp;v_date<br />
&nbsp;&nbsp;from&nbsp;all_tables<br />
&nbsp;&nbsp;where&nbsp;rownum&nbsp;&lt;&nbsp;370)<br />
where&nbsp;to_char(v_date,'yyyy-iw')&nbsp;=&nbsp;'2004-33'<br />
<br />
3.查询某周的日期<br />
select&nbsp;min_date,&nbsp;to_char(min_date,'day')&nbsp;day&nbsp;from<br />
(select&nbsp;to_date(substr('2004-33',1,4)||'001'+rownum-1,'yyyyddd')&nbsp;min_date&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;all_tables<br />
&nbsp;&nbsp;where&nbsp;rownum&nbsp;&lt;=&nbsp;decode(mod(to_number(substr('2004-33',1,4)),4),0,366,365)&nbsp;&nbsp;<br />
&nbsp;&nbsp;union<br />
<br />
&nbsp;&nbsp;select&nbsp;to_date(substr('2004-33',1,4)-1||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decode(mod(to_number(substr('2004-33',1,4))-1,4),0,359,358)+rownum,'yyyyddd')&nbsp;min_date&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;all_tables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;rownum&nbsp;&lt;=&nbsp;7<br />
&nbsp;&nbsp;union<br />
<br />
&nbsp;&nbsp;select&nbsp;to_date(substr('2004-33',1,4)+1||'001'+rownum-1,'yyyyddd')&nbsp;min_date&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;all_tables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;rownum&nbsp;&lt;=&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
)<br />
where&nbsp;to_char(min_date,'yyyy-iw')&nbsp;='2004-33' </p>
<img src ="http://www.blogjava.net/conans/aggbug/210931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-26 19:53 <a href="http://www.blogjava.net/conans/articles/210931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle开发专题之：行列转换 </title><link>http://www.blogjava.net/conans/articles/209880.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sun, 22 Jun 2008 10:53:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/209880.html</guid><description><![CDATA[<span style="font-size: 10pt; font-family: Verdana"><strong>一、使用decode函数进行&#8220;行转列&#8221;：<br style="font-family: " />
<br />
</strong>首先我们来看看最典型的需求：学生成绩单报表制作<br />
<br />
【1】表结构定义：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;SCORE<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />(<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">NUMBER</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">),<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;STUDENT_NAME&nbsp;</span><span style="font-weight: bold; color: #000000">VARCHAR2</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">),<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;SUBJECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">VARCHAR2</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">),<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;SCORE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">NUMBER</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">6</span><span style="color: #000000">,</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />)</span></div>
<br />
【2】测试数据如下：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</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;score;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;STUDENT_NAME&nbsp;&nbsp;&nbsp;&nbsp;SUBJECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCORE<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------&nbsp;---------------&nbsp;----------&nbsp;----------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chinese&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-weight: bold; color: #800000">80</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Math&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">75.05</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;English&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-weight: bold; color: #800000">90</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chinese&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-weight: bold; color: #800000">85.05</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;English&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-weight: bold; color: #800000">73.05</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Math&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-weight: bold; color: #800000">99</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />已选择6行。</span></div>
<br />
【3】最终转换的结果如下：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;STUDENT_NAME&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 />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />----------&nbsp;---------------&nbsp;----------&nbsp;----------&nbsp;----------<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;paul&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; 80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;75.05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;90<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;bob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 85.05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;73.05</span></div>
<br />
【4】实现方式：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;id,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;student_name,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(decode(subject,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Chinese</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;score))&nbsp;语法,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">4</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(decode(subject,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Math</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;score))&nbsp;数学,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">5</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(decode(subject,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">English</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;score))&nbsp;英语<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">6</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;score<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">7</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;id,&nbsp;student_name;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;STUDENT_NAME&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 />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------&nbsp;---------------&nbsp;----------&nbsp;----------&nbsp;----------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&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;</span><span style="font-weight: bold; color: #800000">80</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">75.05</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">90</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-weight: bold; color: #800000">85.05</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">99</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">73.05</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<br />
这里的原理就是利用decode函数对列subject进行判断，如果等于'Chinese'，则将对应的score列的值累加。同理可知其它两个字段。<br />
<br />
【5】备注：<br />
<br />
这种方式有几个特点：<br />
①用于判断的字段其所有可能的值必须是已知的，假如是未知数则这里的SQL将不成立。<br />
②用于转换的字段通常为数值型的，因为像行列转换的情况通常都会用到累积求和<br />
③用于group by的字段都是主键字段，而非用于判断的字段<br />
<br />
【6】延伸需求：<br />
<br />
假设现在我们不是要生成成绩单报表了，我们要统计一下每个科目参考的人数有那几个人，其最终的结果形式如下：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SUBJECT&nbsp;STUDENT<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />-------&nbsp;---------<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Chinese&nbsp;&nbsp; paul,&nbsp;bob<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />English&nbsp;&nbsp;&nbsp; paul,&nbsp;bob<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Math&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paul,&nbsp;bob</span></div>
<br />
像这种情况，我们就需要重新定义一下Oracle的'sum'函数了，这里就涉及到另外一个专题(以后会再介绍)<br />
<br />
<strong>二、使用insert...select进行&#8220;列转行&#8221;：<br />
</strong><br />
【1】表结构定义：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;score_2<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />(<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="font-weight: bold; color: #000000">number</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">,<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;student_name&nbsp;</span><span style="font-weight: bold; color: #000000">varchar2</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">),<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;chinese&nbsp;</span><span style="font-weight: bold; color: #000000">number</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">6</span><span style="color: #000000">,</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">),<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;math&nbsp;</span><span style="font-weight: bold; color: #000000">number</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">6</span><span style="color: #000000">,</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">),<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;english&nbsp;</span><span style="font-weight: bold; color: #000000">number</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">6</span><span style="color: #000000">,</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />)</span></div>
<br />
【2】测试数据如下：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</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;score_2;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;STUDENT_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHINESE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MATH&nbsp;&nbsp;&nbsp;&nbsp;ENGLISH<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------&nbsp;---------------&nbsp;----------&nbsp;----------&nbsp;----------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&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; </span><span style="font-weight: bold; color: #800000">70</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">80</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">90</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&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; </span><span style="font-weight: bold; color: #800000">80</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">90</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">100</span></div>
<br />
【3】最终转换的结果如下：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</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;score;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;STUDENT_NAME&nbsp;&nbsp;&nbsp;&nbsp;SUBJECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCORE<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------&nbsp;---------------&nbsp;----------&nbsp;----------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chinese&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-weight: bold; color: #800000">80</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Math&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-weight: bold; color: #800000">75.05</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;English&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-weight: bold; color: #800000">90</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chinese&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-weight: bold; color: #800000">85.05</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;English&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-weight: bold; color: #800000">73.05</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Math&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-weight: bold; color: #800000">99</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />已选择6行。</span></div>
<br />
也就是说和第一种情况刚好是相反的。<br />
<br />
【4】实现方式：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;timing&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;id,&nbsp;student_name,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">语文</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;subject,&nbsp;chinese&nbsp;score&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;score_2&nbsp;</span><span style="color: #0000ff">union</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;id,&nbsp;student_name,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">数学</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;subject,&nbsp;math&nbsp;score&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;score_2&nbsp;</span><span style="color: #0000ff">union</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;id,&nbsp;student_name,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">英语</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;subject,&nbsp;english&nbsp;score&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;score_2<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">4</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;id;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;STUDENT_NAME&nbsp;&nbsp;&nbsp;&nbsp;SUBJECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCORE<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------&nbsp;---------------&nbsp;----------&nbsp;----------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&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;</span><span style="font-weight: bold; color: #800000">80</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&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;</span><span style="font-weight: bold; color: #800000">90</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&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;</span><span style="font-weight: bold; color: #800000">70</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&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;</span><span style="font-weight: bold; color: #800000">90</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&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;</span><span style="font-weight: bold; color: #800000">100</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&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;</span><span style="font-weight: bold; color: #800000">80</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />已选择6行。<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />已用时间:&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:&nbsp;</span><span style="font-weight: bold; color: #800000">00.00</span></div>
<br />
可以看到我们利用了SQL里面的union，先提取出所有语文科目的记录，再连接上所有的数学、英语科目的记录，最后按ID排序就可以了。下面我们来看另外一种实现方式，我们使用前面第一节创建的score表作为这次的插入目标表：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;timing&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">truncate</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;score;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />表已截掉。<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />已用时间:&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:&nbsp;</span><span style="font-weight: bold; color: #800000">00.01</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff"><span style="background-color: #00ff00"><span style="color: #0000ff">insert</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">all</span><span style="color: #000000"><br />
</span></span></span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">into</span><span style="color: #000000">&nbsp;score&nbsp;</span><span style="color: #0000ff">values</span><span style="color: #000000">(id,&nbsp;student_name,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">语文</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;chinese)<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">into</span><span style="color: #000000">&nbsp;score&nbsp;</span><span style="color: #0000ff">values</span><span style="color: #000000">(id,&nbsp;student_name,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">数学</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;math)<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">4</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">into</span><span style="color: #000000">&nbsp;score&nbsp;</span><span style="color: #0000ff">values</span><span style="color: #000000">(id,&nbsp;student_name,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">英语</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;english)<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">5</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff"><span style="background-color: #00ff00"><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;id,&nbsp;student_name,&nbsp;chinese,&nbsp;math,&nbsp;english&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;score_2;<br />
</span></span></span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />已创建6行。<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />已用时间:&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:&nbsp;</span><span style="font-weight: bold; color: #800000">00.00</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">commit</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />提交完成。<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />已用时间:&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:&nbsp;</span><span style="font-weight: bold; color: #800000">00.00</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SQL</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</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;score;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;STUDENT_NAME&nbsp;&nbsp;&nbsp;&nbsp;SUBJECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCORE<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008080">--</span><span style="color: #008080">--------&nbsp;---------------&nbsp;----------&nbsp;----------</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&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;</span><span style="font-weight: bold; color: #800000">70</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&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;</span><span style="font-weight: bold; color: #800000">80</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&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;</span><span style="font-weight: bold; color: #800000">80</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&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;</span><span style="font-weight: bold; color: #800000">90</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;paul&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;</span><span style="font-weight: bold; color: #800000">90</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;bob&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;</span><span style="font-weight: bold; color: #800000">100</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />已选择6行。<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />已用时间:&nbsp;&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:&nbsp;</span><span style="font-weight: bold; color: #800000">00</span><span style="color: #000000">:&nbsp;</span><span style="font-weight: bold; color: #800000">00.00</span></div>
<br />
insert all into ... select是oracle9i里面提供的一个新功能，用于一次性批量执行多个插入语句，以提高效率。绿色高亮的第二处select语句首先查询出各个科目的成绩，然后在insert all into语句中引用到了这些查询到的字段的值。<br />
<br />
该SQL语句每次从score_2表中取出一条记录，然后分别取出其chinese, math, english字段创建一条记录。依此类推。<br />
<br />
<strong>三、利用rownum关键字进行行列转换：<br />
</strong><br />
关于如何使用rownum进行行列转换，请参考本人之前在CSDN的Blog中所写的一篇文章：<a title="利用Oracle rownum完成行列转换一例" href="http://blog.csdn.net/pengpenglin/archive/2007/01/07/1476118.aspx">利用Oracle rownum完成行列转换一例</a></span> 
<img src ="http://www.blogjava.net/conans/aggbug/209880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-22 18:53 <a href="http://www.blogjava.net/conans/articles/209880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle开发专题之：级联查询(Hierarchical Queries) 进阶应用：伪列Level</title><link>http://www.blogjava.net/conans/articles/209876.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sun, 22 Jun 2008 10:49:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/209876.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 目录：1.使用伪列Level显示表中节点的层次关系2.统计表中节点的层数3.统计表中各个层次的节点数量4.查找表中各个层次的节点信息5.在Start with中使用子查询6.判断节点和节点之间是否具有层次关系7.删除级联表中的子树一、使用伪列Level显示表中节点的层次关系：Oracle9i对级联查询的支持不仅在于提供了像Start with.....&nbsp;&nbsp;<a href='http://www.blogjava.net/conans/articles/209876.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/209876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-22 18:49 <a href="http://www.blogjava.net/conans/articles/209876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle整合BEA，WEBLogic的License可以免费下载了 </title><link>http://www.blogjava.net/conans/articles/209875.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sun, 22 Jun 2008 10:41:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/209875.html</guid><description><![CDATA[<span style="font-size: 10pt">众所周知，Oracle的数据库、中间件都可以在网上自由下载，没有任何license注册码的限制。<br />
现在，Oracle以85亿美元收购了BEA，带来的最直接的好处是，以前严格保密的License文件现在都可以直接下载了。请看下面页面：<br />
</span><a href="http://commerce.bea.com/products/all_products.jsp#WL"><span style="font-size: 10pt">http://commerce.bea.com/products/all_products.jsp#WL</span></a><br />
<br />
<a href="http://download2.bea.com/pub/license/All%20Products/BEA_WebLogic.zip"><span style="font-size: 10pt">WebLogic Family License Keys</span></a><br />
<a href="http://download2.bea.com/pub/license/All%20Products/BEA_WebLogic.zip"><span style="font-size: 10pt">http://download2.bea.com/pub/license/All%20Products/BEA_WebLogic.zip</span></a><br />
<br />
<a href="http://download2.bea.com/pub/license/All%20Products/BEA_AquaLogic.zip"><span style="font-size: 10pt">AquaLogic Family License Keys</span></a><br />
<a href="http://download2.bea.com/pub/license/All%20Products/BEA_AquaLogic.zip"><span style="font-size: 10pt">http://download2.bea.com/pub/license/All%20Products/BEA_AquaLogic.zip</span></a><br />
<br />
<span style="font-size: 10pt">摘录部分内容如下：<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-size: 10pt"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><span style="font-size: 10pt">========================================<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Read&nbsp;Me&nbsp;--&nbsp;BEA&nbsp;WebLogic&nbsp;License&nbsp;Keys&nbsp;=<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;========================================<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Some&nbsp;BEA&nbsp;products&nbsp;require&nbsp;multiple&nbsp;license&nbsp;keys&nbsp;for&nbsp;full&nbsp;functionality,&nbsp;or&nbsp;use&nbsp;a&nbsp;license&nbsp;key&nbsp;which&nbsp;is&nbsp;not&nbsp;intuitively&nbsp;identified&nbsp;as&nbsp;being&nbsp;for&nbsp;that&nbsp;product.<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Please&nbsp;refer&nbsp;to&nbsp;the&nbsp;legend&nbsp;below&nbsp;to&nbsp;determine&nbsp;which&nbsp;license&nbsp;keys&nbsp;are&nbsp;required&nbsp;for&nbsp;the&nbsp;BEA&nbsp;products&nbsp;you&nbsp;own.<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />BEA&nbsp;WebLogic&nbsp;Server&nbsp;Products&nbsp;(Product,&nbsp;Version,&nbsp;License&nbsp;ID/file)<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />================================================================<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />BEA&nbsp;WebLogic&nbsp;Server&nbsp;Advantage&nbsp;Edition&nbsp;&nbsp;&nbsp;&nbsp;10.0&nbsp;-&nbsp;10.0mp1&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLSA10.txt<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.2&nbsp;-&nbsp;9.2mp3&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLSA92.txt<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLSA90.txt<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />BEA&nbsp;WebLogic&nbsp;Server&nbsp;Premium&nbsp;Edition&nbsp;&nbsp;&nbsp;&nbsp;10.0&nbsp;-&nbsp;10.0mp1&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLSP10.txt<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.2&nbsp;-&nbsp;9.2mp3&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLSP92.txt<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLSP90.txt<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />BEA&nbsp;WebLogic&nbsp;Server&nbsp;SDK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLSP10-DEV<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLSP92-DEV<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLSP91-DEV<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLSP90-DEV<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />BEA&nbsp;WebLogic&nbsp;Server&nbsp;Premium&nbsp;for&nbsp;Linux&nbsp;s/390&nbsp;and&nbsp;z/Series<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.0sp1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLS70-CLS-56<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />BEA&nbsp;WebLogic&nbsp;Server&nbsp;Mid-Market&nbsp;Edition&nbsp;&nbsp;&nbsp;&nbsp;10.0&nbsp;-&nbsp;10.0mp1&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLS10-MME.txt<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.2&nbsp;-&nbsp;9.2mp3&nbsp;&nbsp;&nbsp;&nbsp;LIC-WLS92-MME.txt<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />BEA&nbsp;WebLogic&nbsp;Platform&nbsp;Products&nbsp;(Product,&nbsp;Version,&nbsp;License&nbsp;ID/file)<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />==================================================================<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />BEA&nbsp;WebLogic&nbsp;Platform&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.2&nbsp;ISV&nbsp;&nbsp;&nbsp;&nbsp;LIC-PLAT102-ISVED<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIC-AUTONOMY<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&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;LIC-PORT102<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />LIC-WLI102<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.2mp3&nbsp;ISV&nbsp;&nbsp;&nbsp;&nbsp;LIC-PLAT92-ISVED<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.2&nbsp;-&nbsp;9.2mp3&nbsp;&nbsp;&nbsp;&nbsp;LIC-PFRM92.txt<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.1&nbsp;-&nbsp;8.1sp6&nbsp;&nbsp;&nbsp;&nbsp;LIC-PFRM81-128.txt<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.0&nbsp;-&nbsp;7.0sp7&nbsp;&nbsp;&nbsp;&nbsp;LIC-PFRM70-128.txt</span></span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">license<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">component</span><span style="color: #0000ff">="WebLogic"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpus</span><span style="color: #0000ff">="unvalued"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expiration</span><span style="color: #0000ff">="never"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip</span><span style="color: #0000ff">="any"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;licensee</span><span style="color: #0000ff">="Customer"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serial</span><span style="color: #0000ff">="454493271161-2642447506228"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff">="RTK"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;units</span><span style="color: #0000ff">="unlimited"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signature</span><span style="color: #0000ff">="MCwCFHRYQyBkRqhyayiKQBDxfTq/bWfYAhQj+RMMeDMVxjiYhBaXuHobbHe/JA=="</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">/&gt;</span></div>
<br />
<span style="font-size: 10pt">呵呵，都什么年代了，您还在Google、baidu中搜索&#8220;weblogic 破解&#8221;这样的关键字吗，用不着了。但是这并不意味着您可以免费使用这些产品，熟悉Oracle的人都知道，如果您想在企业级应用中部署这些产品，您还是得付money！<br />
</span>
<img src ="http://www.blogjava.net/conans/aggbug/209875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-22 18:41 <a href="http://www.blogjava.net/conans/articles/209875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 7.04安装Oracle 10g</title><link>http://www.blogjava.net/conans/articles/209607.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 20 Jun 2008 15:16:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/209607.html</guid><description><![CDATA[<a href="http://wiki.ubuntu.org.cn/index.php?title=Index/database/InstallOracle10gInBreezy&amp;variant=zh-cn" target="_blank"><font color="#f81c92">http://wiki.ubuntu.org.cn/index.php?title=Index/database/InstallOracle10gInBreezy&amp;variant=zh-cn</font></a><br />
<a href="http://www.phpchina.com/batch.viewlink.php?itemid=14789" target="_blank"><font color="#f81c92">http://www.phpchina.com/batch.viewlink.php?itemid=14789</font></a><br />
<a href="http://www.dizwell.com/prod/node/52?page=0%2C1" target="_blank"><font color="#f81c92">http://www.dizwell.com/prod/node/52?page=0%2C1</font></a><br />
&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; 本文是在 <font size="-1">ubuntu 7.04下安装<font color="#cc0033">Oracle 10g</font></font> 的安装笔记。我假设您已经成功的安装并配置了 ununtu<br />
Linux。并且安装好了 sudo apt-get install gcc&nbsp; lesstif2&nbsp; libc6&nbsp; rpm libaio1 mawk gawk original-awk binutils&nbsp; libdb3 libdb1-compat cpp-3.3 gcc-3.3 libstdc++5-3.3-dev libstdc++2.10-glibc2.2&nbsp; base-files netbase libc6 libc6-dev make 可通过 apt-get install 完成安装(ununtu 和 debian 的这种安装方式蛮方便的)j2re 的运行环境,不一定要安装(<span style="color: rgb(255,0,0)">注：，如果会出现&#8220;</span><span> <span style="color: rgb(0,0,255)">Exception String: Error in invoking target 'client_sharedlib' of makefile '/opt/ora10/network/lib/ins_net_client.mk'.</span></span><span style="color: rgb(255,0,0)">&#8221;错误</span><span style="color: rgb(255,0,0)">，就一定要使用apt-get install sun-java6-jre 或是apt-get install sun-java6-jdk来安装java环境</span>)。<br />
1. 创建用户和组<br />
&nbsp;&nbsp; oracle 安装需要两个 unix 用户组和一个运行时的 oracle 用户。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #addgroup oinstall<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #addgroup dba<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #addgroup nobody<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #useradd -g oinstall -G dba -p passwd -d /home/oracle -s /bin/bash oracle<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #usermod -g nobody nobody<br />
2. 创建目录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有很多文档,建议您将 oracle 安装到一个独立的分区上面。比如:/opt。请您根据您的需要选择合适<br />
自己的安装目录。在本文档中,我们假设 oracle 的安装目录为/opt/ora10。确保有至少 3.0G 的可用空间。<br />
(晕死,我全部的剩余空间呀:()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #mkdir -p /opt/ora10<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #mkdir -p /opt/oradata<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #chown -R oracle:oinstall /opt/ora*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #chmod -R 775 /opt/ora*<br />
您生成了 oracle 的运行时路径,并且授写权限给 oracle 用户,执行权限给 dba 组。<br />
3 设置内核参数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.1 修改 sysctl.conf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加如下的行到/etc/sysctl.conf 中:<br />
kernel.shmall = 2097152<br />
kernel.shmmax = 2147483648<br />
kernel.shmmni = 4096<br />
kernel.sem = 250 32000 100 128<br />
fs.file-max = 65536<br />
net.ipv4.ip_local_port_range = 1024 65000<br />
net.core.rmem_default = 1048576<br />
net.core.rmem_max = 1048576<br />
net.core.wmem_default = 262144<br />
net.core.wmem_max = 262144<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注:shmmax(最大共享内存)是一个很重要参数,根据您的机器的内存来设定。如果您设置不合适的<br />
话,在创建数据库到约 86%的时候就会挂掉。祝您好运。^_^<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.2 修改 limits.conf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加下面的行到/etc/security/limits.conf 以修改你的资源限制:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oracle soft nofile 65536<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oracle hard nofile 65536<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oracle soft nproc 16384<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oracle hard nproc 16384<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.3 让修改生效<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改了以上文件后,您必须让其生效,您重启系统,或者切换到 root 用户下用以下的方式改变内核运<br />
行参数:<br />
&nbsp;&nbsp;&nbsp;&nbsp; #sysctl -p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4 创建程序链接<br />
&nbsp;&nbsp;&nbsp;&nbsp; #ln -s /usr/bin/awk /bin/awk<br />
&nbsp;&nbsp;&nbsp;&nbsp; #ln -s /usr/bin/rpm /bin/rpm<br />
&nbsp;&nbsp;&nbsp;&nbsp; #ln -s /usr/bin/basename /bin/basename<br />
4 .设置 Oracle 用户环境<br />
&nbsp;&nbsp;&nbsp; 以 oracle 用户登录:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~$su oracle<br />
&nbsp;&nbsp; 修改~/.bash_profile 文件,去掉下列三行的注释符,使.bashrc 文件生效:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #if [ -f ~/.bashrc ]; then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; . ~/.bashrc<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #fi<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ununtu 默认是没有注释的,debian 用户需要取消掉这个。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加下列行到~/.bashrc:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # oracle 10g<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export ORACLE_BASE=/opt/ora10<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export ORACLE_HOME=/opt/ora10<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)"> export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin:$PATH <span style="color: rgb(0,0,255)">//这项可不要</span></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export ORACLE_OWNER=oracle<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export ORACLE_SID=compiere<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export ORACLE_TERM=xterm<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Edit paths<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(32,112,21); font-style: italic">export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export PATH=/opt/ora10/bin:$PATH<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我是将上面的内容保存到另一个文件中,.bash_oracle,然后在.bashrc 中使用 source<br />
.bash_oracle 进行调用 的。您可以根据您的好恶进行设置。您需要注意的是,ORACLE_BASE 和<br />
ORACLE_HOME 的设置一定得和您在前面创建的目录相符。 ORACLE_SID 是默认数据库的名称,在本文档<br />
中,我们假设默认的数据库名叫 compiere,如果您想用其他的名字,请您作相应的修改。<br />
5 执行安装<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.1 交换分区的调整<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以 oracle 用户启动 X,进行安装。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 差点忘了,为了安装 Oracle 10g,oracle 推荐至少 512M 内存和至少 400M 交换空间。内存,好象不<br />
够关系也不大,但是交换分区 呢,您还是大方一点吧。如果您的交换分区不够 400M,那么您还是先看看这<br />
一步吧。<br />
&nbsp;重设交换分区可以使用如下操作:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shell# dd if=/dev/zero of=tmp_swap bs=1k count=900000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shell# chmod 600 tmp_swap<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shell# mkswap tmp_swap<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shell# swapon tmp_swap<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 完成安装以后,可以释放这个空间:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shell# swapoff tmp_swap<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shell# rm tmp_swap<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count 值是根据您需要调整的交换分区大小而定。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.2 安装前的准备<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 终于可以安装了。我们假设下载的安装文件位于/home/sungaoyong/oracle 下,名称为<br />
10201_database_linux32.zip 解压后。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建一个文件 /etc/redhat-release:添加如下内容。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Red Hat Linux release 3.1 (drupal)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oracle 将会把系统认为是 redhat 3 了:)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.3 java 中文的显示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 进入 java 的安装路径<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cd /usr/lib/j2se/1.4/lib<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ sudo cp font.properties.zh_CN_UTF8.Sun font.properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将最下面的一行改为如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filename.-misc-fzsongti-medium-r-normal--*-%d-*-*-p-*-iso10646-<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1=/usr/share/fonts/VeraSansYuanTi/VeraSansYuanTi-Regular.ttf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; appendedfontpath=/usr/share/fonts/VeraSansYuanTi<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java 就支持中文显示了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.4 运行 Installer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 进入 oracle 数据库解压的目录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./runInstaller -jreLoc /usr/lib/j2se/1.4/jre<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定 jre 的目的就是始安装界面可以显示中文,否则安装界面的中文都是小框框,不信试试,嘿嘿!<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下的一般选择默认设置就可以了。<br />
6.启动数据库<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.启动<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ sqlplus " scott/tiger as sysdba"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将出现如下连接数据库信息:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL*Plus: Release 10.1.0.2.0 - Production on 星期三 3 月 24 16:23:27 2004<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Copyright (c) 1982, 2004, Oracle. All rights reserved.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 连接到:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; With the Partitioning, OLAP and Data Mining options<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表明登录数据库系统成功,运行 startup 命令启动数据库。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; startup<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORACLE instance started.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Total System Global Area 336356520 bytes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fixed Size 279720 bytes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Variable Size 268435456 bytes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Database Buffers 67108864 bytes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Redo Buffers 532480 bytes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Database mounted.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Database opened.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示数据库正常启动。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.&nbsp;&nbsp; 关闭 Oracle10g 数据库<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ sqlplus "scott/tiger as sysdba" //以 sysdba 用户登录数据库<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成功登录数据库系统后,运行 shudown 命令关闭数据库。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; shutdown<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.&nbsp;&nbsp; 启动 Oracle10g 监听程序<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle 的监听程序主要是为客户端的连接提供接口,在控制台窗口键入如下命令:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ lsnrctl<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将出现如下监听程序信息:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 24-3 月 -2004 16<br />
:59:51<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Copyright (c) 1991, 2004, Oracle. All rights reserved.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 欢迎来到 LSNRCTL, 请键入"help"以获得信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LSNRCTL&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表明登录监听程序控制台成功,运行 start 命令启动监听程序。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LSNRCTL&gt; start<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将出现监听程序的一系列启动和配置情况信息列表。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信息行的最后一行是&#8220;The command completed successfully&#8221;字样时,监听程序启动成<br />
功。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.&nbsp;&nbsp; 关闭 Oracle10g 监听程序<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行 stop 命令关闭监听程序。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LSNRCTL&gt; stop<br />
7.创建自启动脚本<br />
创建 oracledb 脚本到/etc/init.d/oracledb,内容如下<br />
#!/bin/bash<br />
#<br />
# /etc/init.d/oracledb<br />
#<br />
# Run-level Startup script for the Oracle Instance, Listener, and<br />
# Web Interface<br />
export ORACLE_HOME=/opt/ora10<br />
export ORACLE_SID
<img src ="http://www.blogjava.net/conans/aggbug/209607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-20 23:16 <a href="http://www.blogjava.net/conans/articles/209607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle9i Installation on RHEL5 (转)</title><link>http://www.blogjava.net/conans/articles/209603.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 20 Jun 2008 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/209603.html</guid><description><![CDATA[从网上看到很多朋友提出如何在rhel5上安装oracle&nbsp;9i，更有人提出是否可以在rhel5上安装oracle&nbsp;9i. <br />
&nbsp;&nbsp;&nbsp;&nbsp;故把我的安装步骤、经验与大家分享. <br />
环境:&nbsp;Red&nbsp;Hat&nbsp;Enterprise&nbsp;Linux&nbsp;5&nbsp;(RHEL5),&nbsp;Oracle9i&nbsp;(9.2.0.4.0) <br />
&nbsp;&nbsp;RHEL5&nbsp;安装可参考&nbsp;[url=http://ox0spy.googlepages.com/rhel5install.txt]Red&nbsp;Hat&nbsp;Enterprise&nbsp;Linux&nbsp;5&nbsp;(RHEL5)&nbsp;安装说明 <br />
下面以&nbsp;$&nbsp;开头的命令都是由oracle执行的 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;开头的命令都是由root执行的 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;更多内容可阅读我blog&nbsp;:&nbsp;[url=http://ox0spy.blogspot.com/2008/03 /oracle9i-92040-installation-on-red-hat.html]http://ox0spy.blogspot.com/2008/03/oracle9i-92040-installation-on-red-hat.html <br />
<br />
1.&nbsp;创建用户和组 <br />
-------------------------添加安装过程中需要用到的用户和组 <br />
$&nbsp;su&nbsp;- <br />
#&nbsp;groupadd&nbsp;oinstall <br />
#&nbsp;groupadd&nbsp;dba <br />
#&nbsp;useradd&nbsp;-g&nbsp;oinstall&nbsp;-G&nbsp;dba&nbsp;oracle <br />
#&nbsp;passwd&nbsp;oracle <br />
<br />
2.&nbsp;创建目录 <br />
-------------------------- <br />
我们将把所有东西都安装到在&nbsp;/opt/oracle&nbsp;目录下： <br />
#&nbsp;mkdir&nbsp;-p&nbsp;/opt/app/oracle/9.2.0 <br />
#&nbsp;chown&nbsp;-R&nbsp;oracle.oinstall&nbsp;/opt/app/oracle <br />
<br />
3.&nbsp;系统配置 <br />
-------------------------- <br />
a)&nbsp;设置内核参数 <br />
编辑/etc/sysctl.conf <br />
kernel.shmmax&nbsp;=&nbsp;536870912&nbsp;这里设置为物理内存的一半&nbsp;1G内存的话为：512&#215;1024&#215;1024 <br />
kernel.shmmni&nbsp;=&nbsp;4096&nbsp;2G&nbsp;内存的话为：1024&#215;1024&#215;1024 <br />
kernel.shmall&nbsp;=&nbsp;2097152 <br />
kernel.sem&nbsp;=&nbsp;250&nbsp;32000&nbsp;100&nbsp;128&nbsp;其他的值都不用动 <br />
fs.file-max&nbsp;=&nbsp;65536 <br />
net.ipv4.ip_local_port_range&nbsp;=&nbsp;1024&nbsp;65000 <br />
<br />
sem&nbsp;4个参数依次为&nbsp;SEMMSL(每个用户拥有信号量最大数)； <br />
SEMMNS(系统信号量最大数)； <br />
SEMOPM(每次semopm系统调用操作数)； <br />
SEMMNI(系统辛苦量集数最大数). <br />
Shmmax&nbsp;最大共享内存2GB&nbsp;物理内存如果小的话可以设置成&nbsp;536870912. <br />
Shmmni&nbsp;最小共享内存&nbsp;4096KB. <br />
Shmall&nbsp;所有内存大小. <br />
<br />
执行sysctl以反映修改&nbsp;使内核参数立刻生效，重启也可以 <br />
#&nbsp;sysctl&nbsp;&#8211;p <br />
<br />
也可以在运行时通过执行下列命令更改内核参数： <br />
#echo&nbsp;250&nbsp;32000&nbsp;100&nbsp;128&nbsp;&gt;&nbsp;/proc/sys/kernel/sem <br />
#echo&nbsp;268435456&nbsp;&gt;&nbsp;/proc/sys/kernel/shmmax&nbsp;&nbsp;#&nbsp;1/2&nbsp;*&nbsp;mem_size(M)&nbsp;*&nbsp;1024&nbsp;*1024 <br />
#echo&nbsp;4096&nbsp;&gt;&nbsp;/proc/sys/kernel/shmmni <br />
#echo&nbsp;524288&nbsp;&gt;&nbsp;/proc/sys/kernel/shmall&nbsp;#&nbsp;mem_size(M)&nbsp;*&nbsp;1024 <br />
#echo&nbsp;65536&nbsp;&nbsp;&gt;&nbsp;/proc/sys/fs/file-max <br />
#echo&nbsp;1024&nbsp;65000&nbsp;&gt;&nbsp;/proc/sys/net/ipv4/ip_local_port_range <br />
<br />
b)&nbsp;设置oracle对文件的要求 <br />
修改文件：/etc/security/limits.conf&nbsp; <br />
#echo&nbsp;oracle soft nofile 65536&nbsp;&gt;&gt;&nbsp;/etc/security/limits.conf <br />
#echo&nbsp;oracle hard nofile 65536&nbsp;&gt;&gt;&nbsp;/etc/security/limits.conf <br />
#echo&nbsp;oracle soft nproc 16384&nbsp;&gt;&gt;&nbsp;/etc/security/limits.conf <br />
#echo&nbsp;oracle hard nproc 16384&nbsp;&gt;&gt;&nbsp;/etc/security/limits.conf <br />
<br />
c)&nbsp;设置环境变量 <br />
在/home/oracle/.bash_profile&nbsp;中添加如下行: <br />
export&nbsp;ORACLE_SID=zhang <br />
export&nbsp;ORACLE_BASE=/opt/app/oracle <br />
export&nbsp;ORACLE_HOME=/opt/app/oracle/9.2.0 <br />
export&nbsp;LD_LIBRARY_PATH=/opt/app/oracle/9.2.0/lib:/lib:/usr/lib:/usr/local/lib:/usr/X11R6/lib <br />
export&nbsp;TNS_ADMIN=/opt/app/oracle/9.2.0/network/admin <br />
export&nbsp;ORA_NLS33=/opt/app/oracle/9.2.0/ocommon/nls/admin/data <br />
export&nbsp;ORACLE_OWNER=oracle <br />
export&nbsp;ORACLE_TERM=xterm <br />
export&nbsp;PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/opt/app/oracle/9.2.0/bin <br />
<br />
4.&nbsp;打补丁、安装需要的包,&nbsp;至于为什么要做这些工作，后面有个Tips，给出了安装中出现的错误及其Solution <br />
-------------------------------------------------------------------------------------------------- <br />
a)&nbsp;补丁说明: <br />
p3006854_9204_LINUX.zip&nbsp;安装前就要打好的补丁 <br />
p2617419_210_GENERIC.zip&nbsp;安装后要打的（这只是一个伴随补丁，只要设置它的 <br />
环境变量） <br />
p3238244_9204_LINUX.zip&nbsp;安装后要打的9204的补丁,修复agent错误的补丁. <br />
http://www.opennet.ru/soft/ora_inst/ <br />
<br />
compat-libcwait-2.0-2.i386.rpm&nbsp;LINUX&nbsp;AS&nbsp;4&nbsp;的补丁在安装前就要打 <br />
compat-oracle-rhel4-1.0-5.i386.rpm&nbsp;LINUX&nbsp;AS&nbsp;4&nbsp;的补丁在安装前就要打,但我没安装它 <br />
http://oss.oracle.com/projects/compat-oracle/files/RedHat/ <br />
<br />
b)&nbsp;打p3006854_9204_LINUX.zip <br />
#&nbsp;unzip&nbsp;p3006854_9204_LINUX.zip <br />
#&nbsp;chmod&nbsp;+x&nbsp;3006854/rhel3_pre_install.sh <br />
#&nbsp;3006854/rhel3_pre_install.sh <br />
<br />
c)&nbsp;安装&nbsp;compat-libcwait-2.1-1.i386.rpm <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;compat-libcwait-2.1-1.i386.rpm <br />
<br />
d)&nbsp;一些需要的包，这些包可以从系统盘中找到 <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;compat-db-4.2.52-5.1.i386.rpm&nbsp; <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;libXp-1.0.0-8.i386.rpm&nbsp; <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;libXp-devel-1.0.0-8.i386.rpm <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;openmotif-2.3.0-0.3.el5.i386.rpm <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;openmotif-devel-2.3.0-0.3.el5.i386.rpm <br />
<br />
d)&nbsp;gnome-libs-1.4.2-7.rhel5.i386.rpm&nbsp;和&nbsp;一些依赖包 <br />
&nbsp;&nbsp;&nbsp;这些包网上都可以找到 <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;giflib-4.1.3-8.i386.rpm&nbsp; <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;glib-1.2.10-26.fc7.i386.rpm&nbsp; <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;libpng10-1.0.18-2.i386.rpm&nbsp; <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;ORBit-0.5.17-22.rhel5.i386.rpm&nbsp; <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;gtk+-1.2.10-57.fc7.i386.rpm&nbsp; <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;imlib-1.9.15-2.fc7.i386.rpm&nbsp; <br />
#&nbsp;rpm&nbsp;-ivh&nbsp;gnome-libs-1.4.2-7.rhel5.i386.rpm&nbsp; <br />
<br />
<br />
e)&nbsp;创建链接 <br />
#&nbsp;ln&nbsp;-s&nbsp;/usr/lib/libstdc++-libc6.2-2.so.3&nbsp;/usr/lib/libstdc++-libc6.1-1.so.2 <br />
<br />
到这你可以能会说前面的两个补丁还没打，请别着急，后面会用到它们的 <br />
好，我们继续... <br />
<br />
5.&nbsp;开始安装oracle <br />
---------------------------------------------------------------------------------- <br />
1)&nbsp;准备工作 <br />
&nbsp;&nbsp;&nbsp;download&nbsp;oracle&nbsp;9i <br />
&nbsp;&nbsp;&nbsp;http://www.oracle.com/technology/software/products/oracle9i/htdocs/linuxsoft.html <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;解压 <br />
&nbsp;&nbsp;&nbsp;$&nbsp;zcat&nbsp;ship_9204_linux_disk1.cpio.gz&nbsp;|&nbsp;cpio&nbsp;-idmv <br />
&nbsp;&nbsp;&nbsp;$&nbsp;zcat&nbsp;ship_9204_linux_disk2.cpio.gz&nbsp;|&nbsp;cpio&nbsp;-idmv <br />
&nbsp;&nbsp;&nbsp;$&nbsp;zcat&nbsp;ship_9204_linux_disk3.cpio.gz&nbsp;|&nbsp;cpio&nbsp;-idmv <br />
&nbsp;&nbsp;&nbsp; <br />
2)&nbsp;请重启X然后用oracle登陆系统,&nbsp;否则会出现一些列的错误,如：xhost&nbsp;+、环境变量、etc <br />
$&nbsp;Disk1/runInstaller <br />
没有特别说明的均按默认设置，根据界面提示，然后点&nbsp;Next&nbsp;或&nbsp;OK即可. <br />
Oracle&nbsp;install&nbsp;group&nbsp;:&nbsp;oinstall <br />
Global&nbsp;Database&nbsp;Name&nbsp;:&nbsp;ox0spy.org&nbsp;(可根据你的情况填写) <br />
这个过程中还会出现两次提示，让你运行指定目录下的脚本，根据提示做就可以了 <br />
<br />
3)&nbsp;现在应该安装到Configuration&nbsp;Tools了，如果在这出现错误，提示Configuration&nbsp;Tools安装失败， <br />
&nbsp;&nbsp;&nbsp;不要着急，我们还有两个补丁没打呢.&nbsp;其实准确的说是一个补丁,&nbsp;p2617419_210_GENERIC.zip只是 <br />
&nbsp;&nbsp;&nbsp;一个伴随补丁,&nbsp;我这不需要，手动完成就好 <br />
&nbsp;&nbsp;&nbsp;解决Agent&nbsp;Configuration&nbsp;Assistant安装失败 <br />
$&nbsp;unzip&nbsp;p3238244_9204_LINUX.zip <br />
$&nbsp;cp&nbsp;3238244/files/lib/stubs/*&nbsp;$ORACLE_HOME/lib/stubs/ <br />
$&nbsp;cd&nbsp;$ORACLE_HOME/network/lib/ <br />
$&nbsp;make&nbsp;-f&nbsp;ins_oemagent.mk&nbsp;install <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;解决&nbsp;Oracle&nbsp;Net&nbsp;Configuration&nbsp;Assistant,&nbsp;Oracle&nbsp;Database&nbsp;Configuration&nbsp;Assistant&nbsp;安装失败 <br />
$&nbsp;rm&nbsp;$ORACLE_HOME/JRE <br />
$&nbsp;ln&nbsp;-s&nbsp;$ORACLE_BASE/jre/1.3.1/&nbsp;&nbsp;$ORACLE_HOME/JRE <br />
$&nbsp;ln&nbsp;-s&nbsp;$ORACLE_HOME/JRE/bin/java&nbsp;$ORACLE_HOME/JRE/bin/jre <br />
$&nbsp;ln&nbsp;-s&nbsp;$ORACLE_HOME/JRE/bin/i386/native_threads/java&nbsp;$ORACLE_HOME/JRE/bin/i386/native_threads/jre <br />
<br />
OK，现在Retry，你就可以成功安装Configuration&nbsp;Tools了，安装也就结束了... <br />
<br />
================================================== <br />
*Tips:&nbsp;（这是我安装过程中出现的问题及其解决方法） <br />
================================================== <br />
<br />
1.&nbsp;error&nbsp;while&nbsp;loading&nbsp;shared&nbsp;libraries:&nbsp;libstdc++-libc6.1-1.so.2: <br />
cannot&nbsp;open&nbsp;shared&nbsp;object&nbsp;file:&nbsp;No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory&nbsp;-&nbsp;after <br />
./runInstaller&nbsp;execution. <br />
================================================================== <br />
Solution: <br />
su&nbsp;- <br />
#&nbsp;cd&nbsp;/usr/lib <br />
#&nbsp;ln&nbsp;-s&nbsp;libstdc++-3-libc6.2-2-2.10.0.so&nbsp;libstdc++-libc6.1-1.so.2 <br />
<br />
2.&nbsp;Oracle&nbsp;9i&nbsp;Patch <br />
========================== <br />
p2617419_220_GENERIC.zip <br />
p3006854_9204_LINUX.zip <br />
p3238244_9204_LINUX.zip <br />
http://www.opennet.ru/soft/ora_inst/ <br />
<br />
compat-libcwait-2.0-2.i386.rpm <br />
compat-oracle-rhel4-1.0-5.i386.rpm <br />
http://oss.oracle.com/projects/compat-oracle/files/RedHat/ <br />
<br />
3.&nbsp;几个需要的包所在的路径 <br />
=========================== <br />
compat-db&nbsp;--&nbsp;AS5&nbsp;disk&nbsp;3 <br />
compat-gcc-34&nbsp;--&nbsp;2 <br />
compat-gcc-34-c++&nbsp;--&nbsp;2 <br />
compat-libgcc&nbsp;--&nbsp;3 <br />
openmotif&nbsp;--&nbsp;3 <br />
<br />
4.&nbsp;Exception&nbsp;in&nbsp;thread&nbsp;"main"&nbsp;java.lang.UnsatisfiedLinkError: <br />
/tmp/OraInstall2007-12-06_07-00-08PM/jre/lib/i386/libawt.so:&nbsp;libXp.so.6: <br />
cannot&nbsp;open&nbsp;shared&nbsp;object&nbsp;file:&nbsp;No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory <br />
======================================================================== <br />
Solution:&nbsp;install&nbsp;the&nbsp;follow&nbsp;RPMs <br />
libXpm&nbsp;--&nbsp;1 <br />
libXpm-devel&nbsp;--&nbsp;2 <br />
libXp&nbsp;--&nbsp;2 <br />
libXp-devel&nbsp;--&nbsp;2 <br />
<br />
5.&nbsp;Exception&nbsp;in&nbsp;thread&nbsp;"main"&nbsp;java.lang.InternalError:&nbsp;Can't&nbsp;connect&nbsp;to <br />
X11&nbsp;window&nbsp;server&nbsp;using&nbsp;':0.0'&nbsp;as&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;DISPLAY&nbsp;variable. <br />
at&nbsp;sun.awt.X11GraphicsEnvironment.initDisplay(Native&nbsp;Method) <br />
at <br />
sun.awt.X11GraphicsEnvironment.&amp;lt;clinit&gt;(X11GraphicsEnvironment.java:59) <br />
at&nbsp;java.lang.Class.forName0(Native&nbsp;Method) <br />
at&nbsp;java.lang.Class.forName(Class.java:120) <br />
at <br />
java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:58) <br />
at&nbsp;java.awt.Window.&amp;lt;init&gt;(Window.java:188) <br />
at&nbsp;java.awt.Frame.&amp;lt;init&gt;(Frame.java:315) <br />
at&nbsp;java.awt.Frame.&amp;lt;init&gt;(Frame.java:262) <br />
at&nbsp;oracle.sysman.oii.oiic.OiicInstaller.main(OiicInstaller.java:593) <br />
====================================================================================== <br />
Solution:&nbsp;(xhost&nbsp;+的问题&nbsp;) <br />
1.&nbsp;用oracle用户登录x-window <br />
或者 <br />
2.用root用户运行 <br />
#&nbsp;xhost&nbsp;+ <br />
<br />
6.&nbsp;Fatal:&nbsp;Stack&nbsp;size&nbsp;too&nbsp;small.&nbsp;Use&nbsp;'ulimit&nbsp;-s'&nbsp;to&nbsp;increase&nbsp;default <br />
stack&nbsp;size. <br />
========================== <br />
第二次运行就正常了 <br />
<br />
7.&nbsp;$&nbsp;dbca&nbsp;&nbsp;&nbsp;//&nbsp;无法启动dbca，提示错误如下: <br />
/opt/oracle/jre/1.1.8/bin/../lib/i686/green_threads/libzip.so:&nbsp;symbol <br />
errno,&nbsp;version&nbsp;GLIBC_2.0&nbsp;not&nbsp;defined&nbsp;in&nbsp;file&nbsp;libc.so.6&nbsp;with&nbsp;link&nbsp;time <br />
reference&nbsp;(libzip.so) <br />
Unable&nbsp;to&nbsp;initialize&nbsp;threads:&nbsp;cannot&nbsp;find&nbsp;class&nbsp;java/lang/Thread <br />
Could&nbsp;not&nbsp;create&nbsp;Java&nbsp;VM <br />
========================== <br />
Solution:&nbsp;(参考&nbsp;冷风的Fedora&nbsp;7最新安装Oracle9204手记) <br />
$&nbsp;cd&nbsp;/opt/app/oracle/product/9.2.0 <br />
$&nbsp;ls&nbsp;-l&nbsp;JRE <br />
lrwxrwxrwx&nbsp;1&nbsp;oracle&nbsp;oinstall&nbsp;25&nbsp;Dec&nbsp;7&nbsp;10:11&nbsp;JRE&nbsp;-&gt;&nbsp;/opt/app/oracle/jre/1.1.8 <br />
$&nbsp;rm&nbsp;JRE <br />
$&nbsp;ln&nbsp;-s&nbsp;/opt/app/oracle/jre/1.3.1&nbsp;JRE <br />
$&nbsp;su&nbsp;- <br />
#&nbsp;cd&nbsp;/opt/app/oracle/product/9.2.0/JRE/bin/ <br />
#&nbsp;ln&nbsp;-s&nbsp;java&nbsp;jre <br />
#&nbsp;cd&nbsp;i386/native_threads/ <br />
#&nbsp;ln&nbsp;-s&nbsp;java&nbsp;jre <br />
<br />
8.&nbsp;快装完的时候有： <br />
parameter&nbsp;"orahome"=/home/oracle/product/9.2.0 <br />
parameter&nbsp;"nodeinfo"=NO_value <br />
提示失败。 <br />
======================================================= <br />
Solution: <br />
打上安装补丁p3238244_9204_LINUX.zip <br />
unzip&nbsp;p3238244_9204_LINUX.zip <br />
cd&nbsp;3238244 <br />
手工将3238244/files/lib/stubs目录下的所有文件复制到 <br />
/oracle/product/9.2.0/lib/stubs/目录下也可以,如下: <br />
cp&nbsp;files/lib/stubs/*&nbsp;$ORACLE_HOME/lib/stubs/ <br />
重新连接编译"Agent"相关程序 <br />
cd&nbsp;$ORACLE_HOME/network/lib/ <br />
make&nbsp;-f&nbsp;ins_oemagent.mk&nbsp;install <br />
耐心等待成功编译。 <br />
再点击前面oracle安装程序中的"Agent&nbsp;Configuration&nbsp;Assistant"，并点击 <br />
"Retry"重新运行配置工具程序，过一会应该会成功,退出安装 <br />
<br />
9.&nbsp;/opt/app/oracle/9.2.0/Apache/Apache/bin/apachectl&nbsp;startssl:&nbsp;httpd <br />
could&nbsp;not&nbsp;be&nbsp;started <br />
/opt/app/oracle/9.2.0/Apache/Apache/bin/httpd:&nbsp;error&nbsp;while&nbsp;loading <br />
shared&nbsp;libraries:&nbsp;libdb.so.2:&nbsp;cannot&nbsp;open&nbsp;shared&nbsp;object&nbsp;file:&nbsp;No&nbsp;such <br />
file&nbsp;or&nbsp;directory <br />
======================================================= <br />
Solution: <br />
安装&nbsp;gnome-libs-1.4.2-7.rhel5.i386.rpm&nbsp;及其依赖的包 <br />
giflib-4.1.3-8.i386.rpm <br />
libpng10-1.0.18-2.i386.rpm <br />
glib-1.2.10-26.fc7.i386.rpm <br />
ORBit-0.5.17-22.rhel5.i386.rpm <br />
gnome-libs-1.4.2-7.rhel5.i386.rpm <br />
rpmdb-redhat-4-0.20071031.src.rpm <br />
imlib-1.9.15-2.fc7.i386.rpm <br />
gtk+-1.2.10-57.fc7.i386.rpm <br />
<br />
<br />
写在最后，为了更加容易安装，我写了三个简单的脚本 <br />
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ <br />
+&nbsp;为了使安装更加容易，我写了3个简单的脚本： <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;&nbsp;&nbsp;[url=http://ox0spy.googlepages.com/beforeInstallOracle.sh]beforeInstallOracle.sh, <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;&nbsp;&nbsp;[url=http://ox0spy.googlepages.com/patch_before_install.sh]patch_before_install.sh, <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;&nbsp;&nbsp;[url=http://ox0spy.googlepages.com/patch_configuration_tools.sh]patch_configuration_tools.sh&nbsp; <br />
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ <br />
<br />
++++++++++++++++++++ <br />
+&nbsp;patch目录结构如下： <br />
++++++++++++++++++++ <br />
C:\&gt;tree&nbsp;/f&nbsp;D:\patch <br />
卷&nbsp;PROGRAM&nbsp;的文件夹&nbsp;PATH&nbsp;列表 <br />
卷序列号码为&nbsp;0006EE50&nbsp;D662:9A5F <br />
D:\PATCH <br />
│&nbsp;&nbsp;beforeInstallOracle.sh <br />
│&nbsp;&nbsp;p3006854_9204_LINUX.zip <br />
│&nbsp;&nbsp;p3238244_9204_LINUX.zip <br />
│&nbsp;&nbsp;patch_configuration_tools.sh <br />
│&nbsp;&nbsp;compat-libcwait-2.1-1.i386.rpm <br />
│&nbsp;&nbsp;patch_before_install.sh <br />
│ <br />
└─rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;libXp-1.0.0-8.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;openmotif-2.3.0-0.3.el5.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;compat-db-4.2.52-5.1.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;libXp-devel-1.0.0-8.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;compat-gcc-34-c++-3.4.6-4.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;openmotif-devel-2.3.0-0.3.el5.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;compat-gcc-34-3.4.6-4.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;libXpm-3.5.5-3.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;compat-libgcc-296-2.96-138.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;libXpm-devel-3.5.5-3.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;│ <br />
&nbsp;&nbsp;&nbsp;&nbsp;└─download <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gnome-libs-1.4.2-7.rhel5.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORBit-0.5.17-22.rhel5.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libpng10-1.0.18-2.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gtk+-1.2.10-57.fc7.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gnome-libs-devel-1.4.2-7.rhel5.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glib-1.2.10-26.fc7.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imlib-1.9.15-2.fc7.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;giflib-4.1.3-8.i386.rpm <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rpmdb-redhat-4-0.20071031.src.rpm&nbsp;<br />
<img src ="http://www.blogjava.net/conans/aggbug/209603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-20 23:14 <a href="http://www.blogjava.net/conans/articles/209603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL 优化</title><link>http://www.blogjava.net/conans/articles/209590.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 20 Jun 2008 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/209590.html</guid><description><![CDATA[<p>一、&nbsp;先介绍一下<span class="hilite1">oracle</span>的SGA：数据库的系统全局区，SGA主要由三部分构成：共享池、数据缓冲区、日志缓冲区。</p>
<p>1、&nbsp;共享池又由两部分构成：共享SQL区和数据字典缓冲区。共享SQL区专门存放用户SQL命令，<span class="hilite1">oracle</span>使用最近最少使用等优先级算法来更新覆盖；数据字典缓冲区（library cache）存放数据库运行的动态信息。数据库运行一段时间后，DBA需要查看这些内存区域的命中率以从数据库角度对数据库性能调优。通过执行下述语句查看：<br />
select (sum(pins - reloads)) / sum(pins) "Lib Cache"&nbsp; from&nbsp; v$librarycache;<br />
--查看共享SQL区的重用率，最好在90％以上，否则需要增加共享池的大小。<br />
select (sum(gets - getmisses - usage - fix<span id="S__699_ADDIV_8" onmouseover="S__699.SHOWFLOW('ED','8',event);this.style.textDecoration='none';" style="cursor: pointer; color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline" onclick="S__699.SHOWFLOW('ED','8',event);" onmouseout="S__699.hidden('8');;this.style.textDecoration='underline';" oncontentextmenu="return false">ED</span>)) / sum(gets) "Row Cache"&nbsp; from v$rowcache;<br />
--查看数据字典缓冲区的命中率，最好在90％以上，否则需要增加共享池的大小。<br />
2、&nbsp; 数据缓冲区：存放sql运行结果抓取到的data block；<br />
&nbsp;SELECT name, value&nbsp;&nbsp; FROM v$sysstat&nbsp;&nbsp; WHERE name IN ('db block gets', 'consistent gets','physical reads');<br />
-- 查看数据库数据缓冲区的使用情况。查询出来的结果可以计算出来数据缓冲区的使用命中率＝1 - ( physical reads / (db block gets + consistent gets) )。命中率应该在90％以上，否则需要增加数据缓冲区的大小。<br />
3、&nbsp;日志缓冲区：存放数据库运行生成的日志。<br />
select name,value from v$sysstat where name in ('redo entries','redo log space requests');<br />
--查看日志缓冲区的使用情况。查询出的结果可以计算出日志缓冲区的申请失败率：申请失败率＝requests/entries，申请失败率应该接近于0，否则说明日志缓冲区开设太小，需要增加<span class="hilite1">ORACLE</span>数据库的日志缓冲区。<br />
二．Sql语句的执行步骤：<br />
　 了解sql的执行步骤有利于更好的优化它们，每条sql语句执行时都要经历以下几步：<br />
1.&nbsp; Create&nbsp; cursor ； <br />
2.&nbsp; Parse, if it is not already in the shared pool.；<br />
3.&nbsp; Any query in the statement is processed. <br />
4.&nbsp; Bind Variables&nbsp; <br />
5.&nbsp; Execute. <br />
6.&nbsp; If possible, the statement is parallelized. <br />
7.&nbsp; Rows to be returned are fetched. </p>
<p>其中，Parse—是最有优化潜力的阶段。<br />
Cursor创建后，<span class="hilite1">oracle</span>将在share pool中寻找是否该sql语句已经存在，若已经存在且已经被parsed，则不需要再执行parse，直接到下一步。若未在share pool中找到，则parse步一般需要执行下面步骤：<br />
1.&nbsp; The statement is validated. <br />
2.&nbsp; The data is validated. <br />
3.&nbsp; Locks are allocated.<br />
4.&nbsp; Privileges are verified. <br />
5.&nbsp; The execution plan is determined. <br />
6.&nbsp; The statement is loaded into the shared SQL area. <br />
--parse有这么多步骤，所以能利用sharepool中现成的parse结果很重要。</p>
<p>三. 如何提高share pool中Sql共享率？<br />
要实现sql共享，跳过parse步骤，有如下基本要求条件：<br />
1. sql文本完全相同：<br />
--uppercase&nbsp; and&nbsp; lowercase<br />
--white space (spaces, tabs, carriage returns)<br />
--comments<br />
2.参考对象相同:<br />
&nbsp; --Referenced schema&#8217;s objects must be the same objects<br />
3. 绑定变量相同<br />
--Bind variables must match the same name and data type.（所以对于格式相同、<span id="S__699_ADDIV_1" onmouseover="S__699.SHOWFLOW('具体','1',event);this.style.textDecoration='none';" style="cursor: pointer; color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline" onclick="S__699.SHOWFLOW('具体','1',event);" onmouseout="S__699.hidden('1');;this.style.textDecoration='underline';" oncontentextmenu="return false">具体</span>条件不同的sql，建议经常使用变量来代替常量，以尽量使用重复sql代码，避开parse阶段，提高执行速度）<br />
--tip：<br />
--尽量使用存储过程；尽量使用变量代替常量，可以提高share pool共享率，跳过parse阶段，提高效率。<br />
四．什么是好的sql语句？<br />
总结出以下特征：<br />
&#8226; 尽量使用 PL/SQL提高性能： PL/SQL可以将sql语句块一次送给数据库服务器处理，不用PL/SQL只能一句一句送。 <br />
&#8226;&nbsp; 尽量使用stored procedure：降低<span class="hilite1">oracle</span>通过<span id="S__699_ADDIV_6" onmouseover="S__699.SHOWFLOW('网络','6',event);this.style.textDecoration='none';" style="cursor: pointer; color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline" onclick="S__699.SHOWFLOW('网络','6',event);" onmouseout="S__699.hidden('6');;this.style.textDecoration='underline';" oncontentextmenu="return false">网络</span>传输的数据量，并能提高共享sql区域的重用率。<br />
&#8226; 尽量使用packages： Packages在第一次调用时能将整个包 load进内存，对提高性能有帮助。 <br />
&#8226;&nbsp; 尽量使用cached sequences 来生成primary key ：提高主键生成速度和使用性能。 <br />
&#8226;&nbsp; 很好地利用空间：如用VARCHAR2 数据类型代替 CHAR等<br />
&#8226;&nbsp; 只在非常必要时才使用hint：仅在对sql的执行计划非常肯定地要使用hint时才使用。 </p>
<p>五．<span class="hilite2">Sql优化工具</span>的介绍：<br />
sqlexpert；toad；explain-table；PL/SQL；OEM等<br />
掌握一种，熟练使用即可。<br />
我的习惯：看执行计划用sqlplus 的autotrace，优化用sql expert。</p>
<p>--Autotrace使用方法：<br />
1.&nbsp;DBA在db中创建plustrace 角色：运行@?/sqlplus/admin/plustrce.sql<br />
2.&nbsp;DBA给用户赋予角色：grant plustrace to username;<br />
3.&nbsp; 用户创建自己的plan_table：运行@?/rdbms/admin/utlxplan.sql。--以上是第一次使用时需要进行的必要操作。<br />
4.&nbsp; 用户sqlplus连接数据库，对会话进行如下设置：<br />
Set&nbsp; autotrace&nbsp; -----off/on/trace[only]------explain/statistics，<br />
然后录入sql语句回车即可查看执行计划—推荐；<br />
或者用如下命令行：<br />
Explain plan set statement_id=&#8217;myplan1&#8217;&nbsp;&nbsp; for&nbsp;&nbsp; Your sql-statement;<br />
然后查看用户自己的plan_table</p>
<p>--演示Sql-expert的使用，连接到指定数据库，输入sql，显示执行计划或者sql优化结果，图形界面如下：<br />
&nbsp;</p>
<p>--ps：但我在使用中发现sql-expert的执行计划有时候显示得并不准确，所以建议以sqlplus中的为准。其sql优化倒很值得参考，有多种结果，用户可以自己测试和选择。</p>
<p>六．SQL优化技巧<br />
在这方面，长期搞数据库应用开发的人应该更有经验，我这里大概总结一下自己遇到过的和搜集到的一些sql优化经验，跟大家共同学习。<br />
SQL语言是一种灵活的语言，相同的功能可以使用不同的语句来实现，但是语句的执行效率可能会很不相同的，生产系统里经常跑的sql语句更要注意执行效率，否则会占用大量系统<span id="S__699_ADDIV_5" onmouseover="S__699.SHOWFLOW('资源','5',event);this.style.textDecoration='none';" style="cursor: pointer; color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline" onclick="S__699.SHOWFLOW('资源','5',event);" onmouseout="S__699.hidden('5');;this.style.textDecoration='underline';" oncontentextmenu="return false">资源</span>，带慢整个系统。SQL优化的实质就是在结果正确的前提下，用优化器可以识别的语句，充份利用索引，执行过程中访问尽量少的数据块，减少表扫描的I/O次数，尽量<span id="S__699_ADDIV_3" onmouseover="S__699.SHOWFLOW('避免','3',event);this.style.textDecoration='none';" style="cursor: pointer; color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline" onclick="S__699.SHOWFLOW('避免','3',event);" onmouseout="S__699.hidden('3');;this.style.textDecoration='underline';" oncontentextmenu="return false">避免</span>全表扫描和其他额外开销。<br />
Sql优化：<br />
1、&nbsp;先介绍一下<span class="hilite1">oracle</span>数据库常用的两种优化器：RBO（rule-based-optimizer）和CBO(cost-based-optimizer)。目前更多地采用CBO(cost-based-optimizer)基于开销的优化器。在CBO方式下，<span class="hilite1">Oracle</span>会根据表及索引的状态信息来选择计划；在RBO方式下，<span class="hilite1">Oracle</span>会根据自己内部设置的一些规则来决定选择计划，例如<span class="hilite1">oracle</span>会根据以下优先级来选择执行计划（越靠前，rank越低，越快）：</p>
<p><br />
&nbsp;RANK&nbsp;Access path<br />
1&nbsp;ROWID等于常量<br />
2&nbsp;唯一键值或主键的聚簇连接*<br />
3&nbsp;唯一键值或主键的哈希聚簇连接*&nbsp; <br />
4&nbsp;整个复合索引等于常量<br />
5&nbsp;唯一索引列等于常量<br />
6&nbsp;完全聚簇键等于同一个聚簇上的另一个表对应的聚簇键*<br />
7&nbsp;哈希聚簇键等于常数*<br />
8&nbsp;完全聚簇键等于常数*<br />
9&nbsp;整个非唯一组合索引等于常量<br />
10&nbsp;非唯一索引连结<br />
11&nbsp;整个组合索引等于小范围的值<br />
12&nbsp;组合索引的大部分前面的列等于常量<br />
13&nbsp;索引列取值存在上限和下限或者索引列LIKE "ABC%"（范围限制）<br />
14&nbsp;非唯一索引列取值存在上限和下限或者索引列LIKE "ABC%"（范围限制）<br />
15&nbsp;唯一索引列或是常量（范围无限制）<br />
16&nbsp;非唯一索引列或是常（范围无限制）<br />
17&nbsp;非索引列的等值连接(sort/merge join)<br />
18&nbsp;单一索引列的最大或最小值<br />
19&nbsp;ORDER BY整个索引<br />
20&nbsp;全表扫描</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>2、&nbsp;创建索引：创建索引一般有以下两个目的：维护被索引列的唯一性和提供快速访问表中数据的策略。<br />
索引创建原则：<br />
--在select操作占大部分的表上创建索引；<br />
--在where子句中出现最频繁的列上创建索引；<br />
--在选择性高的列上创建索引（补充索引选择性，最高是1，eg：primary key）<br />
--复合索引的主列应该是最有选择性的和where限定条件最常用的列，并以此类推第二列&#8230;&#8230;。<br />
--小于5M的表，最好不要使用索引来查询，表越小，越适合用全表扫描。</p>
<p>索引使用原则：<br />
--查询结果是所有数据行的5%以下时，使用index查询<span id="S__699_ADDIV_4" onmouseover="S__699.SHOWFLOW('效果','4',event);this.style.textDecoration='none';" style="cursor: pointer; color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline" onclick="S__699.SHOWFLOW('效果','4',event);" onmouseout="S__699.hidden('4');;this.style.textDecoration='underline';" oncontentextmenu="return false">效果</span>最好；<br />
--where条件中经常用到表的多列时，使用复合索引效果会好于几个单列索引。因为当sql 语句所查询的列，全部都出现在复合索引中时，此时由于 <span class="hilite1">Oracle</span> 只需要查询索引块即可获得所有数据，当然比使用多个单列索引要快得多；<br />
--索引利于select，但对经常insert，delte尤其update的表，会降低效率。</p>
<p>eg：试比较下面两条SQL语句(emp 表的deptno列上建有ununique index)：<br />
语句A：SELECT dname, deptno FROM dept WHERE deptno NOT IN&nbsp; <br />
(SELECT deptno FROM emp);<br />
语句B：SELECT dname, deptno FROM dept WHERE NOT EXISTS<br />
(SELECT deptno&nbsp; FROM emp WHERE dept.deptno = emp.deptno);<br />
这两条查询语句实现的结果是相同的，但是执行语句A的时候，<span class="hilite1">ORACLE</span>会对整个emp表进行扫描，没有使用建立在emp表上的deptno索引，执行语句B的时候，由于在子查询中使用了联合查询，<span class="hilite1">ORACLE</span>只是对emp表进行的部分数据扫描，并利用了deptno列的索引，所以语句B的效率要比语句A的效率高。我的测试结果：(当emp表有37M时的测试)：<br />
SQL&gt; SELECT dname, deptno FROM dept WHERE deptno NOT IN<br />
(SELECT deptno FROM emp);<br />
DNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEPTNO<br />
-------------- ----------<br />
OPERATIONS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40</p>
<p>Elapsed: 00:00:01.08<br />
Execution Plan<br />
----------------------------------------------------------<br />
&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT STATEMENT Optimizer=CHOOSE<br />
&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; FILTER<br />
&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF 'DEPT'<br />
&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF 'EMP'<br />
Statistics<br />
----------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; recursive calls<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31&nbsp; db block gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4635&nbsp; consistent gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; physical reads<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; redo size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 541&nbsp; bytes sent via SQL*Net to client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 550&nbsp; bytes received via SQL*Net from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp; SQL*Net roundtrips to/from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; sorts (memory)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; sorts (disk)<br />
1&nbsp;rows processed<br />
SQL&gt; SELECT dname, deptno FROM dept WHERE NOT EXISTS<br />
(SELECT deptno&nbsp; FROM emp WHERE dept.deptno = emp.deptno);<br />
DNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEPTNO<br />
-------------- ----------<br />
OPERATIONS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40</p>
<p>Elapsed: 00:00:00.30</p>
<p>Execution Plan<br />
----------------------------------------------------------<br />
&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT STATEMENT Optimizer=CHOOSE<br />
&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; FILTER<br />
&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF 'DEPT'<br />
&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF 'IND_EMP_DEPTNO' (NON-UNIQUE)</p>
<p>Statistics<br />
----------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; recursive calls<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12&nbsp; db block gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19&nbsp; consistent gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; physical reads<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 144&nbsp; redo size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 541&nbsp; bytes sent via SQL*Net to client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 550&nbsp; bytes received via SQL*Net from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp; SQL*Net roundtrips to/from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; sorts (memory)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; sorts (disk)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; rows processed</p>
<p>3．&nbsp;索引常用类型，按存储方式分为：B-tree ，bitmap，reverse key index<br />
&nbsp;B-ree：最常用的一种，又可以分为primary, unique,nonunique，composite,cluster等<br />
&nbsp;bitmap适用情况：<br />
--该列重复值很高（eg：性别列、分数列ABC级等），最好该列有not null的限制；<br />
--bitmap对大表效果好，且很节省索引空间；<br />
--适合并发度低的表，因为其数据更新时会锁住整个bitmap block；<br />
--使用bitmap索引时，需要加hint强制使用（应该是<span class="hilite1">oracle</span>一个bug）<br />
&nbsp;Reverse索引：适用于序列生成的数字列，会将index key列值倒序存放，尤其表的更改并发度又比较高时，更适合用reverse索引，这样可以将相似值的行分散到索引的多个叶子节点，降低冲突，提高性能。<br />
根据应用需求在适当列建合适的索引。</p>
<p>4、　<span class="hilite1">Oracle</span> 要使用一个索引，有一些基本要求条件：<br />
----where 子句中的这个字段，必须是复合索引的第一个字段；<br />
eg：一个索引是按 f1, f2, f3的次序建立的，若where 子句是 f2 = : var2, 则因为 f2 不是索引的第1个字段，无法使用该索引。<br />
---- where 子句中的这个字段，不应该参与任何形式的计算：任何对列的操作都将导致表扫描，它包括数据库函数、计算表达式等等，查询时要尽可能将操作移至等号右边。<br />
----应尽量熟悉各种操作符对 <span class="hilite1">Oracle</span> 是否使用索引的影响：以下这些操作会显式（explicitly）地阻止 <span class="hilite1">Oracle</span> 使用索引： is null ;&nbsp; is not null ;&nbsp; not in;&nbsp; !=;&nbsp; like ; numeric_col+0;date_col+0; char_col||&#8217; &#8217;;&nbsp; to_char;&nbsp; to_number，to_date 等。<br />
Eg：<br />
Select jobid from mytabs where isReq='0' and to_date (updatedate) &gt;= to_Date ( '2001-7-18', 'YYYY-MM-DD')；--updatedate列的索引也不会生效。 </p>
<p>5、索引不是越多越好。特别是大量从来或者几乎不用的索引，对系统只有损害。OLTP系统每表超过5个索引即会降低性能，&nbsp; 而且在一个sql 中， <span class="hilite1">Oracle</span> 从不能使用超过 5个索引。 <br />
索引对select有正面效果，但对insert，delete尤其是update有负面效果，会影响速度，索引越多，影响越大。所以<span class="hilite1">oracle</span>工具sqlldr倒入数据时，好的做法是先建好表结构，再倒入数据，最后才建索引，以提高数据倒入的速度，<span class="hilite1">oracle</span>工具import默认就是先倒入数据，然后才建索引。所以建索引时要充分考虑该表的主要应用。<br />
Tips： 经常做insert，delete尤其是update的表最好定期exp/imp表数据，整理数据，降低碎片（缺点：要停应用，以保持数据一致性，不实 用）；有索引的最好定期rebuild索引（rebuild期间只允许表的select操作，可在数据库较空闲时间提交），以降低索引碎片，提高效率；</p>
<p>6、何时适合使用全表扫描？<br />
&nbsp; --小表，仅有几个data block的表（5M以下）；<br />
--对数据行的选择率高于20%时可考虑用全表扫描（如有1000行记录，一次选出200行以上）<br />
&nbsp; <br />
7．选择联合查询的联合次序。联合查询分为3种：merge join,nested loop,hash join，这里讲的是nested&nbsp; loop的联合情况（后面实际案例1的优化就属于此类）；<br />
考虑下面的例子：<br />
SELECT stuff&nbsp; FROM taba a, tabb b, tabc c <br />
WHERE a.acol between :alow and :ahigh <br />
AND b.bcol between :blow and :bhigh <br />
AND c.ccol between :clow and :chigh <br />
AND a.key1 = b.key1 <br />
AMD a.key2 = c.key2;<br />
这 个SQL例子中，程序员首先需要选择要查询的主表，因为主表要进行整个表数据的扫描，所以主表应该数据量最小，所以例子中表A的acol列的范围应该比表 B和表C相应列的范围小。内外表的选择可由公式：外层表中的匹配行数*内层表中每一次查找的次数确定，乘积最小为最佳方案。</p>
<p>8、用UNION ALL代替UNION：<br />
UNION是最常用的集操作，使多个记录集联结成为单个集，对返回的数据行有唯一性要求，所以<span class="hilite1">oracle</span>就需要进行SORT UNIQUE操作（与使用distinct时操作类似），如果结果集又比较大，则操作会比较慢；<br />
UNION ALL操作不排除重复记录行，所以会快很多，如果数据本身重复行存在可能性较小时，用union all会比用union效率高很多！</p>
<p>9．&nbsp;避免在SQL里使用PL/SQL功能调用：<br />
PL/SQL块有利于提高重复使用代码，但是如果混合在SQL语句中，反而会降低效率。Eg：<br />
US$()为一货币转换的PL/SQL<br />
Sql:&nbsp; select name,US$(amount,currency) from salary where US$(amount,currency)&gt;1000;<br />
该sql效率低下，因为混合PL/SQL和sql时，<span class="hilite1">oracle</span>使用的机制不同，执行时，<span class="hilite1">oracle</span>将调用分成两个组件：用带有赋值变量的SQL语句代替功能调用，和对功能调用的PL/SQL块：<br />
即：<br />
select name,:a1 from salary where :a2&gt;1000;<br />
和<br />
begin<br />
:a1:=US$(:amount,:currency);<br />
end;<br />
对salary表里的每一行执行PL/SQL两次，效率大大降低。</p>
<p>10 子查询中慎重使用IN或者NOT IN语句，使用where (NOT) exists的效果要好的多。IN、OR子句常会使索引失效，可以考虑把子句拆开，拆开的子句中尽量包含索引。<br />
&nbsp;<br />
11慎重使用视图的联合查询，尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。</p>
<p>12&nbsp; <span class="hilite1">ORACLE</span>提 供的DBMS_SHARED_POOL程序可以帮助程序员将某些经常使用的存储过程&#8220;钉&#8221;在SQL区中而不被换出内存，程序员对于经常使用并且占用内存较 多的存储过程&#8220;钉&#8221;到内存中有利于提高最终用户的响应时间。一定要确认非常有必要时才采用这个方法，否则对系统只有坏的影响，会降低内存利用率。<br />
(execute DBMS_SHARED_POOL.KEEP('APPOWNER.ADD_CLIENT','P'); <br />
（P代表PROCEDURES，C代表CURSORS）)</p>
<p>13. 从物理存储方面降低竞争，提高索引效率：将索引和数据分开不同的表空间存放，以减少I/O竞争（尽量将索引、数据表空间从物理底蹭分开是数据库建设前期物 理设计工作的重要部分）。举例：九七数据库里的TB表（长驻cache；仅几十行数据，并发度高，更新频繁，分多个block存放，降低block I/O竞争）</p>
<p>14．加hint强制使用索引<br />
有时候<span class="hilite1">oracle</span>自动判断的CBO信息不能令人满意时，就需要我们手工加hint来强制sql语句得到我们想要的执行计划。<br />
Hint的基本使用方法：<br />
----紧跟DML（select，insert，delete，update）之后：/*+hint_content*/，/*和+之间不能有空格；或者用--+，此行后面均为hint<span id="S__699_ADDIV_9" onmouseover="S__699.SHOWFLOW('内容','9',event);this.style.textDecoration='none';" style="cursor: pointer; color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline" onclick="S__699.SHOWFLOW('内容','9',event);" onmouseout="S__699.hidden('9');;this.style.textDecoration='underline';" oncontentextmenu="return false">内容</span>；<br />
----一句sql只能有一个hint，但里面可以有多层，eg：/*+hint1,hint2&#8230;*/；<br />
----sql语句中若使用了别名(aliase)，则hint里面也必须使用别名。<br />
--不要对view查询加hint，无效。<br />
Tip：尽量少用hint，因为随着数据变化，可能加hint的执行计划逐渐变的不再是最优；加hint的维护成本较高；</p>
<p>15．使用session/transaction级别的临时表会大大提高中间处理的速度：<br />
---临时表只对本session或者transaction可见，关闭session或者退出transaction时，临时表自动被清理drop；<br />
---其他session/transaction可以建同名的temporary table，用户只对自己的temp table操作；<br />
---临时表使用temp表空间，此类表的DML操作不产生redo log，只产生undo log<br />
---可以在其上建index，index也一样是temporary的，生命阶段同temp table。<br />
create global temporary table tab_name(&#8230;.)；</p>
<p>结语：<br />
<span class="hilite1">Oracle</span> 是否真正使用索引，使用索引是否真正有效，还是必须进行实地的测验。合理的做法是，对所写的复杂的 sql, 在将它写入应用程序之前，先在产品数据库上做一次explain，获得对该 sql 的解析，明确看到 <span class="hilite1">Oracle</span> 是如何执行该sql 的，并进行适当优化调整；<br />
另外，即使是相同的sql语句，也会因为表的大小等<span id="S__699_ADDIV_2" onmouseover="S__699.SHOWFLOW('原因','2',event);this.style.textDecoration='none';" style="cursor: pointer; color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline" onclick="S__699.SHOWFLOW('原因','2',event);" onmouseout="S__699.hidden('2');;this.style.textDecoration='underline';" oncontentextmenu="return false">原因</span>造成执行计划的不同，所以一定要具体情况具体分析！ 如果经常做 explain, 就会发现，喜爱写复杂的 sql 并不是个好习惯，因为过分复杂的sql 其解析计划往往不尽如人意。事实上，将复杂的 sql 拆开，有时候会极大地提高效率，因为能获得很好的优化。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 赵春英&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;2004.5.26 定稿 <br />
实际案例:<br />
1、 select 'x' from dh where dhso in (select ogso from og where ogid = 21097023 and ogzt='VALID') and dhcz = 18 and dhzt&lt;&gt;'OVER'；<br />
执行情况：no rows selected&nbsp;&nbsp; Elapsed: 00:07:05.98<br />
Execution Plan<br />
----------------------------------------------------------<br />
&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT STATEMENT Optimizer=CHOOSE<br />
&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; VIEW<br />
&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; SORT (UNIQUE)<br />
&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS<br />
&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'DH'<br />
&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF 'IND_DHCZ_DHZT' (NON-UNIQUE)<br />
&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'OG'<br />
&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (UNIQUE SCAN) OF 'PK_OGID_OGSO' (UNIQUE)<br />
Statistics<br />
----------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; recursive calls<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; db block gets<br />
&nbsp;&nbsp;&nbsp;&nbsp; 421027&nbsp; consistent gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15181&nbsp; physical reads<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000&nbsp; redo size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 181&nbsp; bytes sent via SQL*Net to client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 278&nbsp; bytes received via SQL*Net from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; SQL*Net roundtrips to/from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; sorts (memory)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; sorts (disk)<br />
0&nbsp;rows processed<br />
原语句用7分6秒完成，使用sqlexpert优化后选取的一个新语句如下，出结果仅用8秒！<br />
select /*+ ALL_ROWS */ 'x' from dh <br />
&nbsp;where EXISTS (SELECT 'X' from og WHERE ogid = 21097023 and ogzt = 'VALID' AND ogso = dhso)&nbsp;&nbsp;&nbsp; and dhcz = 18 and dhzt &lt;&gt; 'OVER'；<br />
执行情况：&nbsp; no rows selected&nbsp;&nbsp; Elapsed: 00:00:08.23<br />
Execution Plan<br />
----------------------------------------------------------<br />
&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT STATEMENT Optimizer=HINT: ALL_ROWS (Cost=119 Card=55<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bytes=3410)<br />
&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'DH' (Cost=2 Card=1 Bytes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =31)<br />
&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS (Cost=119 Card=55 Bytes=3410)<br />
&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SORT (UNIQUE)<br />
&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'OG' (Cost=6 Card=5<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 Bytes=1705)<br />
&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF 'PK_OGID_OGSO' (UNIQUE) (Cos<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t=2 Card=2191)</p>
<p>&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF 'IND_DHSO' (NON-UNIQUE) (Cost=1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Card=2018)<br />
Statistics<br />
----------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp; recursive calls<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; db block gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp; consistent gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; physical reads<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; redo size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 181&nbsp; bytes sent via SQL*Net to client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 278&nbsp; bytes received via SQL*Net from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; SQL*Net roundtrips to/from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; sorts (memory)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; sorts (disk)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; rows processed</p>
<p><br />
2、select&nbsp; GGZT,GGXX,GGSJ,GGRQ,GGLR,GGGH,GGDH,GGBZ,GGID&nbsp; <br />
from GG&nbsp; where GGRQ&gt;='20040325' <br />
and GGRQ&lt;='20040325' and GGID&gt;8673 and GGZT='VALID' and GGID in&nbsp; <br />
(select&nbsp; GFGG from GF,GB where GFGG=GBGG <br />
and ((GFGW=1 and GFQX&gt;='003' and GBLX='001' and GBDW=104)&nbsp; <br />
or (GFGW=118 and GFQX&gt;='000' and GBLX='002' and GBDW=102))) <br />
order by GGID DESC;<br />
--联合查询三个小表（GG 1M，&nbsp; GB 2M，&nbsp; GF 2M）, 用了索引反而慢，又费cpu，优化后改成全表扫描:</p>
<p>执行情况：<br />
no rows selected<br />
Elapsed: 00:00:18.57<br />
Execution Plan<br />
----------------------------------------------------------<br />
&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT STATEMENT Optimizer=CHOOSE<br />
&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; SORT (ORDER BY)<br />
&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; VIEW<br />
&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SORT (UNIQUE)<br />
&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONCATENATION<br />
&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS<br />
&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS<br />
&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'GB'<br />
&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF 'IND_GBLX_GBDW' (NON-U<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NIQUE)<br />
&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'GF'<br />
&nbsp; 10&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF 'IND_GFGW' (NON-UNIQUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />
11&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'GG'<br />
&nbsp; 12&nbsp;&nbsp; 11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (UNIQUE SCAN) OF 'PK_GGID' (UNIQUE)<br />
&nbsp; 13&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS<br />
&nbsp; 14&nbsp;&nbsp; 13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS<br />
&nbsp; 15&nbsp;&nbsp; 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'GB'<br />
&nbsp; 16&nbsp;&nbsp; 15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF 'IND_GBLX_GBDW' (NON-U<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NIQUE)<br />
&nbsp; 17&nbsp;&nbsp; 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'GF'<br />
&nbsp; 18&nbsp;&nbsp; 17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF 'IND_GFGW' (NON-UNIQUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />
&nbsp; 19&nbsp;&nbsp; 13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'GG'<br />
&nbsp; 20&nbsp;&nbsp; 19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (UNIQUE SCAN) OF 'PK_GGID' (UNIQUE)<br />
Statistics<br />
----------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 243&nbsp; recursive calls<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; db block gets<br />
&nbsp;&nbsp;&nbsp;&nbsp; 346554&nbsp; consistent gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20&nbsp; physical reads<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; redo size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 534&nbsp; bytes sent via SQL*Net to client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 278&nbsp; bytes received via SQL*Net from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; SQL*Net roundtrips to/from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp; sorts (memory)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; sorts (disk)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; rows processed</p>
<p><br />
select /*+ full(gg) */ GGZT,GGXX,GGSJ,GGRQ,GGLR,GGGH,GGDH,GGBZ,GGID&nbsp; <br />
from GG&nbsp; where GGRQ&gt;='20040325' <br />
and GGRQ&lt;='20040325' and GGID&gt;8673 and GGZT='VALID' and GGID in&nbsp; <br />
(select /*+ full(gf) */ GFGG from GF,GB where GFGG=GBGG <br />
and ((GFGW=1 and GFQX&gt;='003' and GBLX='001' and GBDW=104)&nbsp; <br />
or (GFGW=118 and GFQX&gt;='000' and GBLX='002' and GBDW=102))) <br />
order by GGID DESC;<br />
执行情况：<br />
no rows selected</p>
<p>Elapsed: 00:00:07.96</p>
<p>Execution Plan<br />
----------------------------------------------------------<br />
&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT STATEMENT Optimizer=CHOOSE (Cost=25 Card=1 Bytes=715)<br />
&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; SORT (ORDER BY) (Cost=25 Card=1 Bytes=715)<br />
&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; HASH JOIN (SEMI) (Cost=22 Card=1 Bytes=715)<br />
&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF 'GG' (Cost=3 Card=1 Bytes=702)<br />
&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VIEW OF 'VW_NSO_1' (Cost=18 Card=1 Bytes=13)<br />
&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HASH JOIN (Cost=18 Card=1 Bytes=62)<br />
&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'GB' (Cost=4 Card<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =1041 Bytes=32271)<br />
&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)<br />
&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP OR<br />
&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (FROM ROWIDS)<br />
&nbsp; 10&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF 'IND_GBLX_GBDW' (NON<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -UNIQUE) (Cost=1)<br />
&nbsp; 11&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (FROM ROWIDS)<br />
&nbsp; 12&nbsp;&nbsp; 11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF 'IND_GBLX_GBDW' (NON<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -UNIQUE) (Cost=1)<br />
&nbsp; 13&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF 'GF' (Cost=13 Card=1213 Byt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; es=37603)<br />
Statistics<br />
----------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 390&nbsp; recursive calls<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; db block gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 82&nbsp; consistent gets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp; physical reads<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; redo size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 534&nbsp; bytes sent via SQL*Net to client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 278&nbsp; bytes received via SQL*Net from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; SQL*Net roundtrips to/from client<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; sorts (memory)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; sorts (disk)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; rows processed</p>
&nbsp;
<img src ="http://www.blogjava.net/conans/aggbug/209590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-20 23:05 <a href="http://www.blogjava.net/conans/articles/209590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>