﻿<?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-XZC.Log-随笔分类-Oracle</title><link>http://www.blogjava.net/xzclog/category/17323.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 09 Feb 2015 15:29:03 GMT</lastBuildDate><pubDate>Mon, 09 Feb 2015 15:29:03 GMT</pubDate><ttl>60</ttl><item><title> MySQL数据导出与导入</title><link>http://www.blogjava.net/xzclog/archive/2015/02/09/422827.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 09 Feb 2015 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2015/02/09/422827.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/422827.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2015/02/09/422827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/422827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/422827.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://blog.chinaunix.net/uid-16844903-id-3411118.html工具mysqlmysqldump应用举例导出导出全库备份到本地的目录mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines --default-character-set=utf8 --lock-all-tables --ad...&nbsp;&nbsp;<a href='http://www.blogjava.net/xzclog/archive/2015/02/09/422827.html'>阅读全文</a><img src ="http://www.blogjava.net/xzclog/aggbug/422827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2015-02-09 10:52 <a href="http://www.blogjava.net/xzclog/archive/2015/02/09/422827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle to_char格式化函数</title><link>http://www.blogjava.net/xzclog/archive/2012/03/20/372238.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 20 Mar 2012 01:09:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2012/03/20/372238.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/372238.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2012/03/20/372238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/372238.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/372238.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Postgres&nbsp;格式化函数提供一套有效的工具用于把各种数据类型（日期/时间，int，float，numeric）转换成格式化的字符串以及反过来从格式化的字符串转换成原始的数据类型。注意：所有格式化函数的第二个参数是用于转换的模板。表 5-7. 格式化函数&nbsp;&nbsp;函数返回描述例子to_char(timestamp, text)text把 timestamp 转换成 str...&nbsp;&nbsp;<a href='http://www.blogjava.net/xzclog/archive/2012/03/20/372238.html'>阅读全文</a><img src ="http://www.blogjava.net/xzclog/aggbug/372238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2012-03-20 09:09 <a href="http://www.blogjava.net/xzclog/archive/2012/03/20/372238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ociuldr</title><link>http://www.blogjava.net/xzclog/archive/2012/03/03/371168.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 03 Mar 2012 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2012/03/03/371168.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/371168.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2012/03/03/371168.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/371168.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/371168.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #336666; font-family: Arial; font-size: 12px; line-height: normal; background-color: #f1f5f8; "><p style="line-height: normal; "><font size="3" style="line-height: normal; ">将ociuldr.exe复制到H:\oracle\product\10.2.0\db_1\BIN下, 或者path中的某个文件夹中</font></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">用法:<br style="line-height: normal; " />C:\Documents and Settings\tgm&gt;ociuldr</font></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">Usage: ociuldr user=... query=... field=... record=... file=...<br style="line-height: normal; " />(@) Copyright Lou Fangxin 2004/2005, all rights reserved.<br style="line-height: normal; " />Notes:<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -si&nbsp;&nbsp; = enable logon as SYSDBA<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user = username/password@tnsname<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql&nbsp;&nbsp; = SQL file name,one sql per file, do not include ";"<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query = select statement<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; field = seperator string between fields<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; record= seperator string between records<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file = output file name(default: uldrdata.txt)<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read = set DB_FILE_MULTIBLOCK_READ_COUNT at session level<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sort = set SORT_AREA_SIZE &amp; SORT_AREA_RETAINED_SIZE at session level (UNIT:MB)<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hash = set HASH_AREA_SIZE at session level (UNIT:MB)<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serial= set _serial_direct_read to TRUE at session level<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace = set event 10046 to given level at session level<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table = table name in the sqlldr control file<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode = sqlldr option, INSERT or APPEND or REPLACE or TRUNCATE<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log&nbsp;&nbsp; = log file name, prefix with + to append mode<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long = maximum long field size<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array = array fetch size<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; head = 第一行是否为字段名(head=on), 默认为off</font></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">for field and record, you can use '0x' to specify hex character code,<br style="line-height: normal; " />\r=0x0d \n=0x0a |=0x7c ,=0x2c \t=0x09</font></p><p style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">一、导出数据</font></strong></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">d:\&gt;ociuldr&nbsp;</font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#61;&#116;&#101;&#115;&#116;&#47;&#116;&#101;&#115;&#116;&#64;&#97;&#99;&#102;" style="line-height: 20px; color: #336666; font-size: 14px; text-decoration: none; "><font color="#108ac6" size="3" style="line-height: normal; ">user=test/test@acf</font></a><font size="3" style="line-height: normal; ">&nbsp;query="select * from test" file=test.txt table=test</font></p><p style="line-height: normal; "></p><p style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">二、查看导出内容</font></strong></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">1,a<br style="line-height: normal; " />2,b<br style="line-height: normal; " />3,c<br style="line-height: normal; " />4,d<br style="line-height: normal; " />5,e<br style="line-height: normal; " />6,f</font></p><p style="line-height: normal; "></p><p style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">三、查看自动生成的控制文件</font></strong></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">--<br style="line-height: normal; " />-- Generated by OCIULDR<br style="line-height: normal; " />--<br style="line-height: normal; " />OPTIONS(BINDSIZE=8388608,READSIZE=8388608,ERRORS=-1,ROWS=50000)<br style="line-height: normal; " />LOAD DATA<br style="line-height: normal; " />INFILE 'test.txt' "STR X'0a'"<br style="line-height: normal; " />INTO TABLE test<br style="line-height: normal; " />FIELDS TERMINATED BY X'2c' TRAILING NULLCOLS&nbsp;<br style="line-height: normal; " />(<br style="line-height: normal; " />ID CHAR(40),<br style="line-height: normal; " />NAME CHAR(10)<br style="line-height: normal; " />)</font></p><p style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">四、可以尝试使用这个控制文件将数据加载到数据库中</font></strong></p><p style="line-height: normal; "><font size="3" style="line-height: normal; ">d:\&gt;sqlldr&nbsp;</font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#47;&#116;&#101;&#115;&#116;&#64;&#97;&#99;&#102;" style="line-height: 20px; color: #336666; font-size: 14px; text-decoration: none; "><font color="#108ac6" size="3" style="line-height: normal; ">test/test@acf</font></a><font size="3" style="line-height: normal; ">&nbsp;control=test_sqlldr.ctl</font></p><p style="line-height: normal; "></p><p style="line-height: normal; "><span style="line-height: normal; color: #ff0000; "><font size="3" style="line-height: normal; ">这样数据就加载到数据库中。对于大数据库表的导出ociuldr工具还支持按照不同的批量导出数据，这通过一个参数batch来实现，默认一个batch是50万条记录，如果不指定batch为2就表示100万条记录换一个文件，默认这个选项值是0，就是指不生成多个文件。</font></span></p><p style="line-height: normal; "><span style="line-height: normal; color: #ff0000; "><font size="3" style="line-height: normal; ">在指定batch选项后，需要指定file选项来定义生成的文件名，文件名中间需要包含&#8220;%d&#8221;字样，在生成文件时，&#8220;%d&#8221;会打印成序号，请看以下一个测试：</font></span></p><p style="line-height: normal; "></p><p style="line-height: normal; "><span style="line-height: normal; color: #000000; "><font size="3" style="line-height: normal; ">D:\&gt;ociuldr&nbsp;</font></span><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#61;&#116;&#101;&#115;&#116;&#47;&#116;&#101;&#115;&#116;&#64;&#97;&#99;&#102;" style="line-height: 20px; color: #336666; font-size: 14px; text-decoration: none; "><span style="line-height: normal; color: #000000; "><font size="3" style="line-height: normal; ">user=test/test@acf</font></span></a><span style="line-height: normal; color: #000000; "><font size="3" style="line-height: normal; ">&nbsp;query="select * from test" batch=1 file=test_%d.txt table=test</font></span></p><p style="line-height: normal; "><span style="line-height: normal; color: #000000; "><font size="3" style="line-height: normal; ">刚才测试了一下,果然是强悍, 用spool按要求导出10万条记录要好几分钟, 用ociuldr导出来用了一秒,或许一秒都不到, NB!</font></span></p></span><img src ="http://www.blogjava.net/xzclog/aggbug/371168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2012-03-03 15:39 <a href="http://www.blogjava.net/xzclog/archive/2012/03/03/371168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE确定当前记录和下一条记录之间的差值 </title><link>http://www.blogjava.net/xzclog/archive/2011/12/09/365946.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 09 Dec 2011 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/12/09/365946.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/365946.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/12/09/365946.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/365946.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/365946.html</trackback:ping><description><![CDATA[<div class="article_content" id="article_content">
<p>转自：<a href="http://blog.csdn.net/wh62592855/article/details/4988336">http://blog.csdn.net/wh62592855/article/details/4988336</a><br />例如说吧，对DEPTNO 10中的每个员工，确定聘用他们的日期及聘用下一个员工（可能是其他部门的员工）的日期之间相差的天数。</p>
<p>SQL&gt; select ename,hiredate,deptno from emp order by hiredate;</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEPTNO<br />---------- --------------- ----------<br />SMITH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-DEC-80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />ALLEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20-FEB-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />WARD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22-FEB-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />JONES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 02-APR-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />BLAKE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01-MAY-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09-JUN-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />TURNER&nbsp;&nbsp;&nbsp;&nbsp; 08-SEP-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />MARTIN&nbsp;&nbsp;&nbsp;&nbsp; 28-SEP-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />JAMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 03-DEC-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />FORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 03-DEC-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEPTNO<br />---------- --------------- ----------<br />MILLER&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />SCOTT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19-APR-87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />ADAMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23-MAY-87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20</p>
<p>14 rows selected.</p>
<p>&nbsp;</p>
<p>SQL&gt; select ename,hiredate,next_hd,<br />&nbsp; 2&nbsp; next_hd-hiredate diff<br />&nbsp; 3&nbsp; from<br />&nbsp; 4&nbsp; (<br />&nbsp; 5&nbsp; select deptno,ename,hiredate,<br />&nbsp; 6&nbsp; lead(hiredate) over(order by hiredate) next_hd<br />&nbsp; 7&nbsp; from emp<br />&nbsp; 8&nbsp; )<br />&nbsp; 9&nbsp; where deptno=10;</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NEXT_HD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIFF<br />---------- --------------- --------------- ----------<br />CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09-JUN-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 08-SEP-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 91<br />KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 03-DEC-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16<br />MILLER&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19-APR-87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1912</p>
<p>这里的LEAD OVER非常有用，它能够访问&#8220;未来的&#8221;行（&#8220;未来的&#8221;行相对于当前行，由ORDER BY子句决定）。这种无需添加联接就能够访问当前行附近行的功能，提高了代码的可读性和有效性。<span style="color: #ff0000">在采用窗口函数时，一定要记住，它在WHERE子句之后求值</span>，因此在该解决方案中，需要使用内联视图。如果把对DEPTNO的筛选移到内联视图，则结果会发生改变（仅考虑了DETPNO 10中的HIREDATE）。</p>
<p>所以下面的结果是错误的：</p>
<p>SQL&gt; select ename,hiredate,next_hd,<br />&nbsp; 2&nbsp; next_hd-hiredate diff<br />&nbsp; 3&nbsp; from<br />&nbsp; 4&nbsp; (<br />&nbsp; 5&nbsp; select deptno,ename,hiredate,<br />&nbsp; 6&nbsp; lead(hiredate) over(order by hiredate) next_hd<br />&nbsp; 7&nbsp; from emp<br />&nbsp; 8&nbsp; where deptno=10<br />&nbsp; 9&nbsp; );</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NEXT_HD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIFF<br />---------- --------------- --------------- ----------<br />CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09-JUN-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 161<br />KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 67<br />MILLER&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82</p>
<p>&nbsp;</p>
<p>对于ORACLE的LEAD和LAG函数还需要特别注意，它们的结果中可能会有重复。在上面的例子中表EMP内不包含重复的HIREDATE，所以&#8220;看起来&#8221;似乎没有什么问题。下面我们向表中插入4个重复值来看看</p>
<p>SQL&gt; insert into emp(empno,ename,deptno,hiredate)<br />&nbsp; 2&nbsp; values(1,'a',10,to_date('17-NOV-1981'));</p>
<p>1 row created.</p>
<p>SQL&gt; insert into emp(empno,ename,deptno,hiredate)<br />&nbsp; 2&nbsp; values(2,'b',10,to_date('17-NOV-1981'));</p>
<p>1 row created.</p>
<p>SQL&gt; insert into emp(empno,ename,deptno,hiredate)<br />&nbsp; 2&nbsp; values(3,'c',10,to_date('17-NOV-1981'));</p>
<p>1 row created.</p>
<p>SQL&gt; insert into emp(empno,ename,deptno,hiredate)<br />&nbsp; 2&nbsp; values(4,'d',10,to_date('17-NOV-1981'));</p>
<p>1 row created.</p>
<p>SQL&gt; select ename,hiredate<br />&nbsp; 2&nbsp; from emp<br />&nbsp; 3&nbsp; where deptno=10<br />&nbsp; 4&nbsp; order by 2;</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE<br />---------- ---------------<br />CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09-JUN-81<br />b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81<br />c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81<br />a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81<br />d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81<br />KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81<br />MILLER&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82</p>
<p>7 rows selected.</p>
<p>现在还是用以前那个查询语句来试试</p>
<p>SQL&gt; select ename,hiredate,next_hd,<br />&nbsp; 2&nbsp; next_hd-hiredate diff<br />&nbsp; 3&nbsp; from<br />&nbsp; 4&nbsp; (<br />&nbsp; 5&nbsp; select deptno,ename,hiredate,<br />&nbsp; 6&nbsp; lead(hiredate) over(order by hiredate) next_hd<br />&nbsp; 7&nbsp; from emp<br />&nbsp; 8&nbsp; )<br />&nbsp; 9&nbsp; where deptno=10;</p>
<p>ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIREDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NEXT_HD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIFF<br />---------- --------------- --------------- ----------<br />CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09-JUN-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 08-SEP-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 91<br />d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 03-DEC-81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16<br />MILLER&nbsp;&nbsp;&nbsp;&nbsp; 23-JAN-82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19-APR-87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1912</p>
<p>7 rows selected.</p>
<p>可以看到其中有4个员工的DIFF列值都是0，这是错误的，同一天聘用的所有员工都应该跟下一个聘用其他员工的HIREDATE进行计算。</p>
<p>幸运的是ORACLE针对这类情况提供了一个非常简单的措施：当调用LEAD函数时，可以给LEAD传递一个参数，以便准确的指定&#8220;未来的&#8221;行（是下一行？10行之后？等等）。</p>
<p>select ename,hiredate,next_hd,<br />next_hd-hiredate diff<br />from<br />(<br />select deptno,ename,hiredate,<br />lead(hiredate,cnt-rn+1) over(order by hiredate) next_hd<br />from<br />(<br />select deptno,ename,hiredate,<br />count(*) over(partition by hiredate) cnt,<br />row_number() over(partition by hiredate order by empno) rn<br />from emp<br />where deptno=10<br />)<br />)</p>
<p>&nbsp;</p></div><img src ="http://www.blogjava.net/xzclog/aggbug/365946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-12-09 10:40 <a href="http://www.blogjava.net/xzclog/archive/2011/12/09/365946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SYS_CONNECT_BY_PATH函数用法 ORACLE </title><link>http://www.blogjava.net/xzclog/archive/2011/08/05/355850.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 05 Aug 2011 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/08/05/355850.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/355850.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/08/05/355850.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/355850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/355850.html</trackback:ping><description><![CDATA[<p>SELECT ename&nbsp;&nbsp; <br />FROM scott.emp&nbsp;&nbsp;&nbsp; <br />START WITH ename = 'KING'&nbsp;&nbsp;&nbsp; <br />CONNECT BY PRIOR empno = mgr;&nbsp;&nbsp;&nbsp; <br />&nbsp; <br />--得到结果为：&nbsp;&nbsp; <br />&nbsp; <br />KING&nbsp;&nbsp; <br />JONES&nbsp;&nbsp; <br />SCOTT&nbsp;&nbsp; <br />ADAMS&nbsp;&nbsp; <br />FORD&nbsp;&nbsp; <br />SMITH&nbsp;&nbsp; <br />BLAKE&nbsp;&nbsp; <br />ALLEN&nbsp;&nbsp; <br />WARD&nbsp;&nbsp; <br />MARTIN&nbsp;&nbsp; <br />TURNER&nbsp;&nbsp; <br />JAMES&nbsp;&nbsp; <br />&nbsp; <br />&nbsp; <br />&nbsp; <br />而：&nbsp;&nbsp; <br />&nbsp; <br />&nbsp; <br />&nbsp; <br />SELECT SYS_CONNECT_BY_PATH(ename, '&gt;') "Path"&nbsp;&nbsp;&nbsp; <br />FROM scott.emp&nbsp;&nbsp;&nbsp; <br />START WITH ename = 'KING'&nbsp;&nbsp;&nbsp; <br />CONNECT BY PRIOR empno = mgr;&nbsp;&nbsp; <br />&nbsp; <br />&nbsp; <br />&nbsp; <br />--得到结果为：&nbsp;&nbsp; <br />&nbsp; <br />&nbsp; <br />&nbsp; <br />&gt;KING&nbsp;&nbsp; <br />&gt;KING&gt;JONES&nbsp;&nbsp; <br />&gt;KING&gt;JONES&gt;SCOTT&nbsp;&nbsp; <br />&gt;KING&gt;JONES&gt;SCOTT&gt;ADAMS&nbsp;&nbsp; <br />&gt;KING&gt;JONES&gt;FORD&nbsp;&nbsp; <br />&gt;KING&gt;JONES&gt;FORD&gt;SMITH&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&gt;ALLEN&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&gt;WARD&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&gt;MARTIN&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&gt;TURNER&nbsp;&nbsp; <br />&gt;KING&gt;BLAKE&gt;JAMES&nbsp;&nbsp; <br />&gt;KING&gt;CLARK&nbsp;&nbsp; <br />&gt;KING&gt;CLARK&gt;MILLER&nbsp; <br />SELECT ename<br />FROM scott.emp <br />START WITH ename = 'KING' <br />CONNECT BY PRIOR empno = mgr; </p>
<p>--得到结果为：</p>
<p>KING<br />JONES<br />SCOTT<br />ADAMS<br />FORD<br />SMITH<br />BLAKE<br />ALLEN<br />WARD<br />MARTIN<br />TURNER<br />JAMES</p>
<p>&nbsp;</p>
<p>而：</p>
<p>&nbsp;</p>
<p>SELECT SYS_CONNECT_BY_PATH(ename, '&gt;') "Path" <br />FROM scott.emp <br />START WITH ename = 'KING' <br />CONNECT BY PRIOR empno = mgr;</p>
<p>&nbsp;</p>
<p>--得到结果为：</p>
<p>&nbsp;</p>
<p>&gt;KING<br />&gt;KING&gt;JONES<br />&gt;KING&gt;JONES&gt;SCOTT<br />&gt;KING&gt;JONES&gt;SCOTT&gt;ADAMS<br />&gt;KING&gt;JONES&gt;FORD<br />&gt;KING&gt;JONES&gt;FORD&gt;SMITH<br />&gt;KING&gt;BLAKE<br />&gt;KING&gt;BLAKE&gt;ALLEN<br />&gt;KING&gt;BLAKE&gt;WARD<br />&gt;KING&gt;BLAKE&gt;MARTIN<br />&gt;KING&gt;BLAKE&gt;TURNER<br />&gt;KING&gt;BLAKE&gt;JAMES<br />&gt;KING&gt;CLARK<br />&gt;KING&gt;CLARK&gt;MILLER<br />&nbsp;</p>
<p><br />其实SYS_CONNECT_BY_PATH这个函数是oracle9i才新提出来的！<br />它一定要和connect by子句合用！<br />第一个参数是形成树形式的字段，第二个参数是父级和其子级分隔显示用的分隔符！</p>
<p>START WITH 代表你要开始遍历的的节点！</p>
<p>CONNECT BY PRIOR 是标示父子关系的对应！</p>
<p>如下例子：</p>
<p>view plaincopy to clipboardprint?<br />select max(&nbsp;&nbsp; <br />substr(&nbsp;&nbsp; <br />sys_connect_by_path(column_name,',')&nbsp;&nbsp; <br />,2)&nbsp;&nbsp; <br />)&nbsp;&nbsp; <br />from (select column_name,rownum rn from user_tab_columns where table_name ='AA_TEST')&nbsp;&nbsp; <br />start with rn=1 connect by rn=rownum ;&nbsp; <br />select max(<br />substr(<br />sys_connect_by_path(column_name,',')<br />,2)<br />)<br />from (select column_name,rownum rn from user_tab_columns where table_name ='AA_TEST')<br />start with rn=1 connect by rn=rownum ;</p>
<p>&nbsp;</p>
<p>是将列用,进行分割成为一行，然后将首个，去掉，只取取最大的那个数据。</p>
<p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p>
<p>下面是别人的例子：</p>
<p>1、带层次关系</p>
<p>view plaincopy to clipboardprint?<br />SQL&gt; create table dept(deptno number,deptname varchar2(20),mgrno number);&nbsp;&nbsp; <br />&nbsp; <br />Table created.&nbsp;&nbsp; <br />&nbsp; <br />SQL&gt; insert into dept values(1,'总公司',null);&nbsp;&nbsp; <br />&nbsp; <br />1 row created.&nbsp;&nbsp; <br />&nbsp; <br />SQL&gt; insert into dept values(2,'浙江分公司',1);&nbsp;&nbsp; <br />&nbsp; <br />1 row created.&nbsp;&nbsp; <br />&nbsp; <br />SQL&gt; insert into dept values(3,'杭州分公司',2);&nbsp;&nbsp; <br />&nbsp; <br />1 row created.&nbsp;&nbsp; <br />&nbsp; <br />SQL&gt; commit;&nbsp;&nbsp; <br />&nbsp; <br />Commit complete.&nbsp;&nbsp; <br />&nbsp; <br />SQL&gt; select max(substr(sys_connect_by_path(deptname,','),2)) from dept connect by prior deptno=mgrno;&nbsp;&nbsp; <br />&nbsp; <br />MAX(SUBSTR(SYS_CONNECT_BY_PATH(DEPTNAME,','),2))&nbsp;&nbsp; <br />--------------------------------------------------------------------------------&nbsp;&nbsp; <br />总公司,浙江分公司,杭州分公司&nbsp; <br />SQL&gt; create table dept(deptno number,deptname varchar2(20),mgrno number);</p>
<p>Table created.</p>
<p>SQL&gt; insert into dept values(1,'总公司',null);</p>
<p>1 row created.</p>
<p>SQL&gt; insert into dept values(2,'浙江分公司',1);</p>
<p>1 row created.</p>
<p>SQL&gt; insert into dept values(3,'杭州分公司',2);</p>
<p>1 row created.</p>
<p>SQL&gt; commit;</p>
<p>Commit complete.</p>
<p>SQL&gt; select max(substr(sys_connect_by_path(deptname,','),2)) from dept connect by prior deptno=mgrno;</p>
<p>MAX(SUBSTR(SYS_CONNECT_BY_PATH(DEPTNAME,','),2))<br />--------------------------------------------------------------------------------<br />总公司,浙江分公司,杭州分公司 </p>
<p>2、行列转换</p>
<p><br />如把一个表的所有列连成一行，用逗号分隔:</p>
<p>view plaincopy to clipboardprint?<br />SQL&gt; select max(substr(sys_connect_by_path(column_name,','),2))&nbsp;&nbsp; <br />from (select column_name,rownum rn from user_tab_columns where table_name ='DEPT')&nbsp;&nbsp; <br />start with rn=1 connect by rn=rownum ;&nbsp;&nbsp; <br />&nbsp; <br />MAX(SUBSTR(SYS_CONNECT_BY_PATH(COLUMN_NAME,','),2))&nbsp;&nbsp; <br />--------------------------------------------------------------------------------&nbsp;&nbsp; <br />DEPTNO,DEPTNAME,MGRNO&nbsp; </p><img src ="http://www.blogjava.net/xzclog/aggbug/355850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-08-05 11:03 <a href="http://www.blogjava.net/xzclog/archive/2011/08/05/355850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows Oracle 10G手工创建数据库 </title><link>http://www.blogjava.net/xzclog/archive/2011/07/18/354554.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 18 Jul 2011 10:50:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/07/18/354554.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/354554.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/07/18/354554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/354554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/354554.html</trackback:ping><description><![CDATA[<div>转自：<a href="http://blog.csdn.net/tianlesoftware/article/details/4680230">http://blog.csdn.net/tianlesoftware/article/details/4680230</a><br />
<p><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">在Oracle中建库，通常有两种方法。一是使用Oracle的建库工</span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">且DBCA，这是一个图形界面工且，使用起来方便且很容易理解，因为它的界面友好、美观，而且提示也比较齐全。在Ｗindows系统中，这个工具可以在Oracle程序组中打开（&#8221;开始&#8221;&#8212;&#8220;程序&#8221;&#8212;&#8220; Oracle OraDb10g_home1&#8221;&#8212;&#8220; Configuration and Migration Tools&#8221;&#8212;&#8220; Database ConfigurationAssistant&#8221;），也可以在命令行（&#8221;开始&#8221;&#8212;&#8220;运行&#8221;&#8212;&#8220;cmd&#8221;）工具中直接输入dbca来打开。另一种方法就是手工建库，这也就是下面所要讲的内容。 手工建库比起使用DBCA建库来说，是比较麻烦的，但是如果我们学好了手工建库的话，就可以使我们更好地理解Oracle数据库的体系结构。手工建库须要经过几个步骤，每一个步骤都非常关键。它包括： </span><br /><span style="font-size: 18px; line-height: 1.3em">１、 <span style="line-height: 1.3em; font-family: '宋体'">创建必要的相关目录 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">２、 <span style="line-height: 1.3em; font-family: '宋体'">创建初始化参数文件 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">３、 <span style="line-height: 1.3em; font-family: '宋体'">设置环境变量Oracle_sid </span></span><br /><span style="font-size: 18px; line-height: 1.3em">４、 <span style="line-height: 1.3em; font-family: '宋体'">创建实例 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">５、 <span style="line-height: 1.3em; font-family: '宋体'">创建口令文件</span></span><br /><span style="font-size: 18px; line-height: 1.3em">６、 <span style="line-height: 1.3em; font-family: '宋体'">启动数据库到nomount(实例)状态 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">７、 <span style="line-height: 1.3em; font-family: '宋体'">执行建库脚本 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">８、 <span style="line-height: 1.3em; font-family: '宋体'">执行catalog脚步本创建数据字典 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">９、 <span style="line-height: 1.3em; font-family: '宋体'">执行catproc创建package包 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">１０、 <span style="line-height: 1.3em; font-family: '宋体'">执行pupbld </span></span><br /><span style="font-size: 18px; line-height: 1.3em">１１、 <span style="line-height: 1.3em; font-family: '宋体'">由初始化参数文件创建spfile文件 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">１２、 <span style="line-height: 1.3em; font-family: '宋体'">执行scott脚本创建scott模式 </span></span><br /><span style="font-size: 18px; line-height: 1.3em"><span style="line-height: 1.3em; font-family: '宋体'">做完了以上的步骤之后就可以使用&#8220;SQL&gt;alterdatabase open;&#8221;打开数据库正常的使用了。下面，我将具体地把以上的几个步骤用实验展开来讲。 实验系统平台：Windows Server 2000　数据库系统版本：Oracle Database 10Ｇ Oracle的安装路径：D盘　</span>.<span style="line-height: 1.3em; font-family: '宋体'">创建的数据库名称：book １、打开命令行工具，创建必要有相关目录 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book</span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book/bdump </span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book/udump </span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book/cdump</span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book/pfile </span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/admin/book/create </span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;mkdir D:/oracle/product/10.1.0/oradata/book</span><br /><span style="font-size: 18px; line-height: 1.3em"><span style="line-height: 1.3em; font-family: '宋体'">上面创建目录的过程也可以在Windows的图形界面中去创建。其中</span></span><br /><span style="font-size: 18px; line-height: 1.3em">D:/oracle/product/10.1.0/admin/book<span style="line-height: 1.3em; font-family: '宋体'">目录下的几个子目录主要用于存放数据库运行过程中的跟踪信息。最重要的两上子目录是bdump和udump目录，bdump目录存放的是数据库动行过程中的各个后台进程的跟踪信息，当中alert文件是警告文件，其文件名称为alert_book.log，当数据库出现问题时，首先就可以去查看此文件以找出原因，手工创建过程中出现的各种问题往往也可以通过查看这个文件找到原因。Udump目录存放特定会话相关的跟踪信息D:/oracle/product/10.1.0/oradata/book目录存放各种数据库文件，包括控制文件、数据文件、重做日志文件。</span></span><br /><br /><span style="font-size: 18px; line-height: 1.3em">2<span style="line-height: 1.3em; font-family: '宋体'">、创建初始化参数文件 </span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">数据库系统启动时须要用初始化参数文件的设置分配内存、启动必要的后台进程的。因此，初始化参数文件创建的是否正确、参数设置是否正确关系着整个建库的&#8220;命运&#8221;。 创建初始化参数文件可以通过拷贝现在的初始化参数文件并将其做适当的修改即可，从而不必要用</span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">手工去一句一句地写出来，因为初始化参数文件的结构体系基本上都是一样的。在我们安装Oracle的时候，系统已经为我们安装了一个名为orcl的数据库，于是我们可以从它那里得到一份初始化参数文件。打开D:/oracle/product/10.1.0/admin/orcl/pfile，找到init.ora文件，把它拷贝到D:/oracle/product/10.1.0/bd_1/databse下，并将其改名为initbook.ora。接着用记事本的方式打开initbook.ora，修改以下的内容： db_domain=""</span><br /><span style="font-size: 18px; line-height: 1.3em">db_name=book</span><br /><span style="font-size: 18px; line-height: 1.3em">control_files=("D:/oracle/product/10.1.0/oradata/book/control01.ctl", </span><br /><span style="font-size: 18px; line-height: 1.3em">"D:/oracle/product/10.1.0/oradata/book/control02.ctl", </span><br /><span style="font-size: 18px; line-height: 1.3em">"D:/oracle/product/10.1.0/oradata/book/control03.ctl") undo_management=AUTO</span><br /><span style="font-size: 18px; line-height: 1.3em">undo_tablespace=UNDOTBS1<span style="line-height: 1.3em; font-family: '宋体'">　</span></span><br /><span style="font-size: 18px; line-height: 1.3em">&#8213;&#8213;<span style="line-height: 1.3em; font-family: '宋体'">注意此处的&#8220;UNDOTBS1&#8221;要和建库脚步本中对应 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">background_dump_dest=D:/oracle/product/10.1.0/admin/book/bdump </span><br /><span style="font-size: 18px; line-height: 1.3em">core_dump_dest=D:/oracle/product/10.1.0/admin/book/cdump</span><br /><span style="font-size: 18px; line-height: 1.3em">user_dump_dest=D:/oracle/product/10.1.0/admin/book/udump</span><br /><span style="font-size: 18px; line-height: 1.3em"><span style="line-height: 1.3em; font-family: '宋体'">３、打开命令行，设置环境变量oracle_sid </span></span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;set oracle_sid=book <span style="line-height: 1.3em; font-family: '宋体'">设置环境变量的目地是在默认的情况下，指定命令行中所操作的数据库实例是book。</span></span><br /><span style="font-size: 18px; line-height: 1.3em"><span style="line-height: 1.3em; font-family: '宋体'">４、创建实例（即后台控制服务）</span></span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;oradim &#8211;new &#8211;sid book oradim<span style="line-height: 1.3em; font-family: '宋体'">是创建实例的工具程序名称，-new表明执行新建实例，-delete表明执行删掉实例，-sid指定害例的名称。 ５、创建口令文件 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">C:/&gt;orapwd file=D:/oracle/product/10.1.0/db_1/database/pwdbook.ora password=bookstore entries=2 </span><br /><span style="font-size: 18px; line-height: 1.3em">orapwd<span style="line-height: 1.3em; font-family: '宋体'">是创建口令文件的工肯程序各称，file参数指定口令文件所在的目录和文件名称，password参数指定sys用户的口令，entries参数指定数据库拥用DBA权限的用户的个数，当然还有一个force参数，相信您不指即明，这里就不再细述。 请注意，这里的命令要一行输入，中间不得换行，否则会出现不必要的错误。 口令文件是专门存放sys用户的口令，因为sys用户要负责建库、启动数据库、关闭数据库等特殊任务，把以sys用户的中令单独存放于口令文件中，这样数据库末打开时也能进行口令验证。</span></span><br /><span style="font-size: 18px; line-height: 1.3em">6<span style="line-height: 1.3em; font-family: '宋体'">、启动数据</span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">库到nomount(实例)状态 C:/&gt;sqlplus /nolog SQL*Plus:Release 10.1.0.2.0 - Production on 星期三 6月 29 </span><br /><br /><span style="font-size: 18px; line-height: 1.3em">23:09:35 2005 Copyright 1982,2004,Oracle. All rights reserved. SQL&gt;connect sys/bookstore as sysdba</span><br /><span style="font-size: 18px; line-height: 1.3em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---<span style="line-height: 1.3em; font-family: '宋体'">这里是用sys连接数据库 已连接到空闲例程 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;startup nomount ORACLE <span style="line-height: 1.3em; font-family: '宋体'">例程已经启动。</span></span><br /><span style="font-size: 18px; line-height: 1.3em">Total System Global Area 319888364 </span><br /><span style="font-size: 18px; line-height: 1.3em">bytes Fixed Size 453612bytes </span><br /><span style="font-size: 18px; line-height: 1.3em">Variable Size 209715200bytes </span><br /><span style="font-size: 18px; line-height: 1.3em">DatabaseBuffers 109051904bytes </span><br /><span style="font-size: 18px; line-height: 1.3em">Redo Buffers 667648bytes</span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;</span><br /><span style="font-size: 18px; line-height: 1.3em">7<span style="line-height: 1.3em; font-family: '宋体'">、执行建库脚本 </span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">执行建库脚本，首先要有建库的脚本。（去哪找建库脚本呢？我又没有！）不用着急，请接着往下看。 得到一个符合自己要求的建库脚本有两种方法，一种方法是在自己的电脑上用DBCA来建，接照它的提示一步步地去做，在做到第十二步的时候，请选择&#8220;生成建库脚本&#8221;，然后就大功告成，你就可以到相应的目录上去找到那个脚本并适当地修它便可便用。另一种方法就是自己手工去写一份建库脚本，这也是这里要见意使用的方法，用记事本编辑如下的内容，并将其保存为文件名任取而后缀名为（*.sql）的SQL脚本，这里保存到E盘根本录下且文件名称为book.sql。 </span><br /><br /><span style="font-size: 18px; line-height: 1.3em">Create database book datafile 'D:/oracle/product/10.1.0/oradata/book/system01.dbf' size 300M reuse </span><br /><span style="font-size: 18px; line-height: 1.3em">autoextend on next 10240Kmaxsize unlimited extent management local sysaux datafile </span><br /><span style="font-size: 18px; line-height: 1.3em">'D:/oracle/product/10.1.0/oradata/book/sysaux01.dbf' size 120M reuse autoextend on next 10240K </span><br /><span style="font-size: 18px; line-height: 1.3em">maxsize unlimited default temporary tablespace temp tempfile </span><br /><span style="font-size: 18px; line-height: 1.3em">'D:/oracle/product/10.1.0/oradata/book/temp01.dbf' size 20M reuse autoextend on next 640Kmaxsize unlimited undo tablespace "UNDOTBS1" </span><br /><span style="font-size: 18px; line-height: 1.3em">--<span style="line-height: 1.3em; font-family: '宋体'">请注意这里的undo表空间要和参数文件对应 datafile </span></span><br /><span style="font-size: 18px; line-height: 1.3em">'D:/oracle/product/10.1.0/oradata/book/undotbs01.dbf' size 200M reuse autoextend on next 5120K</span><br /><span style="font-size: 18px; line-height: 1.3em">maxsize unlimited logfile</span><br /><span style="font-size: 18px; line-height: 1.3em">group 1 ('D:/oracle/product/10.1.0/oradata/book/redo01.log') size 10240K, </span><br /><span style="font-size: 18px; line-height: 1.3em">group 2 ('D:/oracle/product/10.1.0/oradata/book/redo02.log') size 10240K, group 3('D:/oracle/product/10.1.0/oradata/book/redo03.log') size 10240K <span style="line-height: 1.3em; font-family: '宋体'">接着就执行刚建的建库脚本：</span></span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;start E:/book.sql </span><br /><span style="font-size: 18px; line-height: 1.3em">8、<span style="line-height: 1.3em; font-family: '宋体'">执行catalog脚步本创建数据字典 </span></span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;start D:/oracle/product/10.1.0/db_1/rdbms/admin/catalog.sql </span><br /><span style="font-size: 18px; line-height: 1.3em">9<span style="line-height: 1.3em; font-family: '宋体'">、执行catproc创建package包 SQL&gt;start</span></span><br /><span style="font-size: 18px; line-height: 1.3em">D:/oracle/product/10.1.0/db_1/rdbms/admin/catproc.sql </span><br /><span style="font-size: 18px; line-height: 1.3em">10、<span style="line-height: 1.3em; font-family: '宋体'">执行pupbld </span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">在执行pupbld之前要把当前用户（sys）转换成system,即以system账户连接数据库。因为此数据库是刚建的，所以system的口令是系统默认的口令，即manager。你可以在数据库建好以后再来重新设置此账户的口令。 </span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;connectsystem/manager</span><br /><span style="font-size: 18px; line-height: 1.3em">SQL&gt;start D:/oracle/product/10.1.0/db_1/sqlplus/admin/pupbld.sql </span><br /><span style="font-size: 18px; line-height: 1.3em">11<span style="line-height: 1.3em; font-family: '宋体'">、由初始化参</span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">数文件创建spfile文件 SQL&gt;create spfile from pfile;</span><br /><span style="font-size: 18px; line-height: 1.3em">12<span style="line-height: 1.3em; font-family: '宋体'">、执行scott脚本创建scott模式 SQL&gt;start</span></span><br /><span style="font-size: 18px; line-height: 1.3em">D:/oracle/product/10.1.0/db_1/rdbms/admin/scott.sql </span><br /><span style="font-size: 18px; line-height: 1.3em">13、<span style="line-height: 1.3em; font-family: '宋体'">把数据库打开到正常状态 SQL&gt;alterdatabase open; </span></span><br /><span style="font-size: 18px; line-height: 1.3em">14<span style="line-height: 1.3em; font-family: '宋体'">、以scott连接到数据库（口令为tiger），测试新建数据库是否可以正常运行 至此，整个数据库就已经建好了。接着你就可以在此数据库上建立自己的账户和表空间啦以及数据库对象，这里就不再作更</span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">多地叙述。 </span><br /><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">附：本意是想在linux上创建个oracle实例的，用这个文档捣鼓了半天，都快结束了才发现这个方法只能在window上使用。晕死了。自己机子上装的oracle 11i的，看了下与oracle 10g还是有点区别的：</span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">没仔细研究，就发现amin下目录不一样：</span><br /><span style="font-size: 18px; line-height: 1.3em">Oracle 10G<span style="line-height: 1.3em; font-family: '宋体'">下有</span>bdump <span style="line-height: 1.3em; font-family: '宋体'">，</span>udump <span style="line-height: 1.3em; font-family: '宋体'">，</span>cdump<span style="line-height: 1.3em; font-family: '宋体'">，</span>pfile<span style="line-height: 1.3em; font-family: '宋体'">，</span>create </span><br /><span style="font-size: 18px; line-height: 1.3em">Oracle 11i <span style="line-height: 1.3em; font-family: '宋体'">只有 adump，dpdump，pfile 三个。有空在研究吧。</span></span><br /><span style="font-size: 18px; line-height: 1.3em; font-family: '宋体'">还是想在linux下手动创建个。</span><br /><br /><span style="font-size: 18px; line-height: 1.3em">unix<span style="line-height: 1.3em; font-family: '宋体'">和linux下没有oradim命令</span><span style="line-height: 1.3em; font-family: '宋体'">，</span><span style="line-height: 1.3em; font-family: '宋体'">因为没用，oradim主要就是用来控制服务的，unix/linux上oracle 实例不需要建立服务，所以就没有</span><span style="line-height: 1.3em; font-family: '宋体'">。</span></span></p></div><img src ="http://www.blogjava.net/xzclog/aggbug/354554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-07-18 18:50 <a href="http://www.blogjava.net/xzclog/archive/2011/07/18/354554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈谈WINDOWS下重装系统后oracle的恢复</title><link>http://www.blogjava.net/xzclog/archive/2011/07/17/354473.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sun, 17 Jul 2011 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/07/17/354473.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/354473.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/07/17/354473.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/354473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/354473.html</trackback:ping><description><![CDATA[<p><font size="2">WINDOWS是很脆弱的系统，可能装完没几天就会崩溃，如果你在WINDOWS下装有oracle，那怎么来恢复这个数据库呢？</font></p><br />
<p><font size="2">一种方法是重装数据库后用IMP来导入原来的数据，但使用这种方法的前提是你有以前数据的备份，并且这种方法还有许多不足的地方，如备份过旧，可能会丢失许多数据、导入数据太长等。</font></p>
<p><br /><font size="2">一般情况下我们可以采用重用原来的数据库的方法来恢复。在讲步骤前先说说这种方法的原理。</font></p>
<p><font size="2">数据库与实例对应，当数据库服务启动后，我们可以用SQLPLUS "/AS SYSDBA"方法连接到一个空闲的例程，当执行startup启动数据库时，首先会在%ORACLE_HOME%/database下找当前SID对应的参数文件（PFILE或者SPFILE）和密码文件，然后启动例程；接着根据参数文件记录的信息找到控制文件，读取控制文件的信息，这就是mount数据库了；最终根据控制文件的信息打开数据库。这个过程相当于对数据库着了一次冷备份的恢复。</font></p>
<p><font size="2">下面的具体步骤：（我们假设原库的所有相关文件都存在）<br />1、安装数据库软件<br />只需安装同版本的数据库软件即可，不需要创建数据库。最好安装在和原来数据库同样的%ORACLE_HOME%下，省得还要修改参数文件路径等。（直接覆盖原来的oracle即可）<br />再次强调，只安装软件，不创建数据库，否则将数据库软件安装在同样的目录下旧的部分数据文件会被覆盖，这样数据库也不能被恢复了。</font></p>
<p><font size="2">2、新建一个实例<br />在cmd窗口执行<br />oradim -new -sid oracle9i<br />注意，这个SID名称最好与你以前的SID一样，否则在启动的数据需要指明pfile，并且需要重建密码文件，比较麻烦。（当然，如果你就不想用原来的SID也可以，把参数文件、密码文件的名称都改成与新SID对应的名称）。</font></p>
<p><font size="2">3、启动数据库<br />做完以上两步，就可以启动数据库了。<br />用net start 检查oracle服务是否已经启动，如果oracle服务没有启动，则在cmd下运行如下命令：<br />net start oracleserviceoracle9i<br />然后设定必要的环境变量，在cmd窗口运行<br />set ORACLE_SID=oracle9i</font></p>
<p><font size="2">接着连接数据库<br />sqlplus "/as sysdba"<br />startup</font></p>
<p><font size="2">如果正常的话，数据库应该就能起来了</font></p>
<p><font size="2">4、启动监听<br />lsnrctl start</font></p>
<p><font size="2">5、后续工作<br />经过以上几步后，基本上就可以使用oracle了，但是使用起来有点不方便，如每次在cmd中启动数据库都需要先SET ORACLE_SID、在本机连接数据库也都需要加上@TNSNAME等。我们可以修改注册表，添加ORACLE_SID的信息，避免这些麻烦。</font></p>
<p><font size="2">在注册表的HKEY_LOCAL_MACHINESOFTWAREORACLE下新建字符串值，名称为ORACLE_SID,值为oracle9i。<br />也可以将以下内容保持成一个后缀名为reg的文件（文件名随便起），然后双击，即可将信息导入到注册表中。</font></p>
<p><font size="2">Windows Registry Editor Version 5.00</font></p>
<p><font size="2">[HKEY_LOCAL_MACHINESOFTWAREORACLE]<br />"ORACLE_SID"="oracle9i"</font></p>
<p><br /><font size="2">注意，以上步骤都是在%ORACLE_HOME%、%ORACLE_SID%都与原库一样的情况下讨论的，虽然%ORACLE_HOME%和%ORACLE_SID%可以与原库不一样，但为了减少麻烦和出错的几率，建议不要改变则两个值。</font></p><img src ="http://www.blogjava.net/xzclog/aggbug/354473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-07-17 13:45 <a href="http://www.blogjava.net/xzclog/archive/2011/07/17/354473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DML、DDL、DCL区别</title><link>http://www.blogjava.net/xzclog/archive/2011/06/27/353057.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 27 Jun 2011 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/06/27/353057.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/353057.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/06/27/353057.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/353057.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/353057.html</trackback:ping><description><![CDATA[<p>总体解释：<br />DML（data manipulation language）：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它们是SELECT、UPDATE、INSERT、DELETE，就象它的名字一样，这4条命令是用来对数据库里的数据进行操作的语言<br />DDL（data definition language）：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DDL比DML要多，主要的命令有CREATE、ALTER、DROP等，DDL主要是用在定义或改变表（TABLE）的结构，数据类型，表之间的链接和约束等初始化工作上，他们大多在建立表时使用<br />DCL（Data Control Language）：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句，包括（grant,deny,revoke等）语句。在默认状态下，只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL</p>
<p>详细解释：<br />一、DDL is Data Definition Language statements. Some examples:数据定义语言，用于定义和管理 SQL 数据库中的所有对象的语言 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.CREATE - to create objects in the database&nbsp;&nbsp; 创建 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.ALTER - alters the structure of the database&nbsp;&nbsp; 修改 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.DROP - delete objects from the database&nbsp;&nbsp; 删除 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRUNCATE TABLE [Table Name]。 <br />　　下面是对Truncate语句在MSSQLServer2000中用法和原理的说明： <br />　　Truncate table 表名 速度快,而且效率高,因为: <br />　　TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同：二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快，且使用的系统和事务日志资源少。 <br />　　DELETE 语句每次删除一行，并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据，并且只在事务日志中记录页的释放。 <br />　　TRUNCATE TABLE 删除表中的所有行，但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值，请改用 DELETE。如果要删除表定义及其数据，请使用 DROP TABLE 语句。 <br />　　对于由 FOREIGN KEY 约束引用的表，不能使用 TRUNCATE TABLE，而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中，所以它不能激活触发器。 <br />　　TRUNCATE TABLE 不能用于参与了索引视图的表。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.COMMENT - add comments to the data dictionary 注释 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.GRANT - gives user's access privileges to database 授权 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.REVOKE - withdraw access privileges given with the GRANT command&nbsp;&nbsp; 收回已经授予的权限</p>
<p>二、DML is Data Manipulation Language statements. Some examples:数据操作语言，SQL中处理数据等操作统称为数据操纵语言 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.SELECT - retrieve data from the a database&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.INSERT - insert data into a table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.UPDATE - updates existing data within a table&nbsp;&nbsp;&nbsp; 更新 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.DELETE - deletes all records from a table, the space for the records remain&nbsp;&nbsp; 删除 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.CALL - call a PL/SQL or Java subprogram <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.EXPLAIN PLAN - explain access path to data <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle RDBMS执行每一条SQL语句，都必须经过Oracle优化器的评估。所以，了解优化器是如何选择(搜索)路径以及索引是如何被使用的，对优化SQL语句有很大的帮助。Explain可以用来迅速方便地查出对于给定SQL语句中的查询数据是如何得到的即搜索路径(我们通常称为Access Path)。从而使我们选择最优的查询方式达到最大的优化效果。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.LOCK TABLE - control concurrency 锁，用于控制并发</p>
<p>三、DCL is Data Control Language statements. Some examples:数据控制语言，用来授予或回收访问数据库的某种特权，并控制数据库操纵事务发生的时间及效果，对数据库实行监视等 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.COMMIT - save work done 提交 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.SAVEPOINT - identify a point in a transaction to which you can later roll back 保存点 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.ROLLBACK - restore database to original since the last COMMIT&nbsp;&nbsp; 回滚 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.SET TRANSACTION - Change transaction options like what rollback segment to use&nbsp;&nbsp; 设置当前事务的特性，它对后面的事务没有影响．</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/level_level/archive/2009/06/08/4248685.aspx">http://blog.csdn.net/level_level/archive/2009/06/08/4248685.aspx</a></p><img src ="http://www.blogjava.net/xzclog/aggbug/353057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-06-27 10:53 <a href="http://www.blogjava.net/xzclog/archive/2011/06/27/353057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 10g 正则表达式　REGEXP_LIKE</title><link>http://www.blogjava.net/xzclog/archive/2011/06/21/352746.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 21 Jun 2011 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/06/21/352746.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/352746.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/06/21/352746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/352746.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/352746.html</trackback:ping><description><![CDATA[ORACLE中的支持正则表达式的函数主要有下面四个：<br />1，REGEXP_LIKE ：与LIKE的功能相似<br />2，REGEXP_INSTR ：与INSTR的功能相似<br />3，REGEXP_SUBSTR ：与SUBSTR的功能相似<br />4，REGEXP_REPLACE ：与REPLACE的功能相似<br />它们在用法上与Oracle <a href="javascript:;" target="_self"><u><strong>SQL</strong></u></a> 函数LIKE、INSTR、SUBSTR 和REPLACE 用法相同，<br />但是它们使用POSIX 正则表达式代替了老的百分号（%）和通配符（_）字符。<br />POSIX 正则表达式由标准的元字符（metacharacters）所构成：<br />'^' 匹配输入字符串的开始位置，在方括号表达式中使用，此时它表示不接受该字符集合。<br />'$' 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性，则 $ 也匹<br />配 '\n' 或 '\r'。<br />'.' 匹配除换行符之外的任何单字符。<br />'?' 匹配前面的子表达式零次或一次。<br />'+' 匹配前面的子表达式一次或多次。<br />'*' 匹配前面的子表达式零次或多次。<br />'|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的<br />字符串。<br />'( )' 标记一个子表达式的开始和结束位置。<br />'[]' 标记一个中括号表达式。<br />'{m,n}' 一个精确地出现次数范围，m=&lt;出现次数&lt;=n，'{m}'表示出现m次，'{m,}'表示至少<br />出现m次。<br />\num 匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。<br />字符簇：<br />[[:alpha:]] 任何字母。<br />[[:digit:]] 任何数字。<br />[[:alnum:]] 任何字母和数字。<br />[[:space:]] 任何白字符。<br />[[:upper:]] 任何大写字母。<br />[[:lower:]] 任何小写字母。<br />[[:punct:]] 任何标点符号。<br />[[:xdigit:]] 任何16进制的数字，相当于[0-9a-fA-F]。<br />各种操作符的运算优先级<br />\转义符<br />(), (?:), (?=), [] 圆括号和方括号<br />*, +, ?, {n}, {n,}, {n,m} 限定符<br />^, $, anymetacharacter 位置和顺序<br />|<br />*/<br />--创建表<br />create table fzq<br />(<br />&nbsp; id varchar(4),<br />&nbsp; value varchar(10)<br />);<br />--数据插入<br />insert into fzq values<br />('1','1234560');<br />insert into fzq values<br />('2','1234560');<br />insert into fzq values<br />('3','1b3b560');<br />insert into fzq values<br />('4','abc');<br />insert into fzq values<br />('5','abcde');<br />insert into fzq values<br />('6','ADREasx');<br />insert into fzq values<br />('7','123&nbsp; 45');<br />insert into fzq values<br />('8','adc&nbsp; de');<br />insert into fzq values<br />('9','adc,.de');<br />insert into fzq values<br />('10','1B');<br />insert into fzq values<br />('10','abcbvbnb');<br />insert into fzq values<br />('11','11114560');<br />insert into fzq values<br />('11','11124560');<br />--regexp_like<br />--查询value中以1开头60结束的记录并且长度是7位<br />select * from fzq where value like '1____60';<br />select * from fzq where regexp_like(value,'1....60');<br />--查询value中以1开头60结束的记录并且长度是7位并且全部是数字的记录。<br />--使用like就不是很好实现了。<br />select * from fzq where regexp_like(value,'1[0-9]{4}60');<br />-- 也可以这样实现，使用字符集。<br />select * from fzq where regexp_like(value,'1[[:digit:]]{4}60');<br />-- 查询value中不是纯数字的记录<br />select * from fzq where not regexp_like(value,'^[[:digit:]]+$');<br />-- 查询value中不包含任何数字的记录。<br />select * from fzq where regexp_like(value,'^[^[:digit:]]+$');<br />--查询以12或者1b开头的记录.不区分大小写。<br />select * from fzq where regexp_like(value,'^1[2b]','i');<br />--查询以12或者1b开头的记录.区分大小写。<br />select * from fzq where regexp_like(value,'^1[2B]');<br />-- 查询数据中包含空白的记录。<br />select * from fzq where regexp_like(value,'[[:space:]]');<br />--查询所有包含小写字母或者数字的记录。<br />select * from fzq where regexp_like(value,'^([a-z]+|[0-9]+)$');<br />--查询任何包含标点符号的记录。<br />select * from fzq where regexp_like(value,'[[:punct:]]');<br />/*<br />理解它的语法就可以了。其它的函数用法类似。<br />作者：tshfang<br />来源: 泥胚文章写作<a href="http://www.nipei.com/">http://www.nipei.com</a>原文地址：<a href="http://www.nipei.com/article/9865">http://www.nipei.com/article/9865</a><img src ="http://www.blogjava.net/xzclog/aggbug/352746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-06-21 15:39 <a href="http://www.blogjava.net/xzclog/archive/2011/06/21/352746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 字符集的查看和修改</title><link>http://www.blogjava.net/xzclog/archive/2011/04/15/348338.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 15 Apr 2011 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/04/15/348338.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/348338.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/04/15/348338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/348338.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/348338.html</trackback:ping><description><![CDATA[<p>转自：http://blog.csdn.net/tianlesoftware/archive/2009/12/01/4915223.aspx<br />
</p>
<p>一、什么是Oracle字符集 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储，处理，检索数据。它使数据库工具，错误消息，排序次序，日期，时间，货币，数字，和日历自动适应本地化语言和平台。 </p>
<p>&nbsp;</p>
<p>影响Oracle数据库字符集最重要的参数是NLS_LANG参数。</p>
<p>它的格式如下: NLS_LANG = language_territory.charset </p>
<p>它有三个组成部分(语言、地域和字符集)，每个成分控制了NLS子集的特性。</p>
<p>其中: </p>
<p>Language： 指定服务器消息的语言， 影响提示信息是中文还是英文</p>
<p>Territory： 指定服务器的日期和数字格式，</p>
<p>Charset：&nbsp; 指定字符集。</p>
<p>如:AMERICAN _ AMERICA. ZHS16GBK </p>
<p>从NLS_LANG的组成我们可以看出，真正影响数据库字符集的其实是第三部分。</p>
<p>所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据，前面影响的只是提示信息是中文还是英文。</p>
<p>&nbsp;</p>
<p>二．字符集的相关知识：</p>
<p>2.1 字符集<br />
&nbsp;&nbsp;&nbsp; 实质就是按照一定的字符编码方案，对一组特定的符号，分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。<br />
&nbsp;&nbsp;&nbsp; Oracle的字符集命名遵循以下命名规则:<br />
&nbsp;&nbsp;&nbsp; &lt;Language&gt;&lt;bit size&gt;&lt;encoding&gt;<br />
&nbsp;&nbsp;&nbsp; 即: &lt;语言&gt;&lt;比特位数&gt;&lt;编码&gt;<br />
&nbsp;&nbsp;&nbsp; 比如: ZHS16GBK表示采用GBK编码格式、16位（两个字节）简体中文字符集 <br />
&nbsp; <br />
2.2 字符编码方案</p>
<p><br />
2.2.1 单字节编码<br />
&nbsp;&nbsp;&nbsp; （1）单字节7位字符集，可以定义128个字符，最常用的字符集为US7ASCII<br />
&nbsp;&nbsp;&nbsp; （2）单字节8位字符集，可以定义256个字符，适合于欧洲大部分国家<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如：WE8ISO8859P1(西欧、8位、ISO标准8859P1编码) </p>
<p>&nbsp;</p>
<p>2.2.2 多字节编码<br />
&nbsp;&nbsp;&nbsp; （1）变长多字节编码<br />
&nbsp;&nbsp;&nbsp; 某些字符用一个字节表示，其它字符用两个或多个字符表示，变长多字节编码常用于对亚洲语言的支持，&nbsp;&nbsp; 例如日语、汉语、印地语等<br />
&nbsp;&nbsp;&nbsp; 例如：AL32UTF8（其中AL代表ALL,指适用于所有语言）、zhs16cgb231280<br />
&nbsp;&nbsp;&nbsp; （2）定长多字节编码<br />
&nbsp;&nbsp;&nbsp; 每一个字符都使用固定长度字节的编码方案，目前oracle唯一支持的定长多字节编码是AF16UTF16，也是仅用于国家字符集 </p>
<p>2.2.3 unicode编码<br />
&nbsp;&nbsp;&nbsp; Unicode是一个涵盖了目前全世界使用的所有已知字符的单一编码方案，也就是说Unicode为每一个字符提供唯一的编码。UTF-16是unicode的16位编码方式，是一种定长多字节编码，用2个字节表示一个unicode字符，AF16UTF16是UTF-16编码字符集。<br />
&nbsp;&nbsp;&nbsp; UTF-8是unicode的8位编码方式，是一种变长多字节编码，这种编码可以用1、2、3个字节表示一个unicode字符，AL32UTF8，UTF8、UTFE是UTF-8编码字符集 <br />
&nbsp; <br />
2.3 字符集超级<br />
&nbsp;&nbsp;&nbsp; 当一种字符集（字符集A）的编码数值包含所有另一种字符集（字符集B）的编码数值，并且两种字符集相同编码数值代表相同的字符时，则字符集A是字符集B的超级，或称字符集B是字符集A的子集。<br />
&nbsp;&nbsp;&nbsp; Oracle8i和oracle9i官方文档资料中备有子集-超级对照表（subset-superset pairs），例如：WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式，因此有许多字符集是US7ASCII的超集，例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。 <br />
&nbsp; <br />
2.4 数据库字符集（oracle服务器端字符集）<br />
&nbsp;&nbsp;&nbsp; 数据库字符集在创建数据库时指定，在创建后通常不能更改。在创建数据库时，可以指定字符集(CHARACTER SET)和国家字符集(NATIONAL CHARACTER SET)。 </p>
<p>&nbsp;</p>
<p>2.4.1字符集<br />
&nbsp;&nbsp;&nbsp; (1)用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据<br />
&nbsp;&nbsp;&nbsp; (2)用来标示诸如表名、列名以及PL/SQL变量等<br />
&nbsp;&nbsp;&nbsp; (3)用来存储SQL和PL/SQL程序单元等 </p>
<p>&nbsp;</p>
<p>2.4.2国家字符集：<br />
&nbsp;&nbsp;&nbsp; (1)用以存储NCHAR, NVARCHAR2, NCLOB等类型数据<br />
&nbsp;&nbsp;&nbsp; (2)国家字符集实质上是为oracle选择的附加字符集，主要作用是为了增强oracle的字符处理能力，因为NCHAR数据类型可以提供对亚洲使用定长多字节编码的支持，而数据库字符集则不能。国家字符集在oracle9i中进行了重新定义，只能在unicode编码中的AF16UTF16和UTF8中选择，默认值是AF16UTF16 </p>
<p>&nbsp;</p>
<p>2.4.3查询字符集参数<br />
&nbsp;&nbsp;&nbsp; 可以查询以下数据字典或视图查看字符集设置情况<br />
&nbsp;&nbsp;&nbsp; nls_database_parameters、props$、v$nls_parameters<br />
&nbsp;&nbsp;&nbsp; 查询结果中NLS_CHARACTERSET表示字符集，NLS_NCHAR_CHARACTERSET表示国家字符集 </p>
<p>&nbsp;</p>
<p>2.4.4修改数据库字符集<br />
&nbsp;&nbsp;&nbsp; 按照上文所说，数据库字符集在创建后原则上不能更改。不过有2种方法可行。</p>
<p>&nbsp;</p>
<p>1. 如果需要修改字符集，通常需要导出数据库数据，重建数据库，再导入数据库数据的方式来转换。</p>
<p>2. 通过ALTER DATABASE CHARACTER SET语句修改字符集，但创建数据库后修改字符集是有限制的，只有新的字符集是当前字符集的超集时才能修改数据库字符集，例如UTF8是US7ASCII的超集，修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。 <br />
&nbsp; <br />
2.5 客户端字符集（NLS_LANG参数）</p>
<p><br />
2.5.1客户端字符集含义<br />
&nbsp;&nbsp;&nbsp; 客户端字符集定义了客户端字符数据的编码方式，任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用，例如sqlplus,exp/imp等。客户端字符集是通过设置NLS_LANG参数来设定的。 </p>
<p>&nbsp;</p>
<p>2.5.2 NLS_LANG参数格式<br />
&nbsp;&nbsp;&nbsp; NLS_LANG=&lt;language&gt;_&lt;territory&gt;.&lt;client character set&gt; <br />
&nbsp;&nbsp;&nbsp; Language: 显示oracle消息,校验，日期命名<br />
&nbsp;&nbsp;&nbsp; Territory：指定默认日期、数字、货币等格式<br />
&nbsp;&nbsp;&nbsp; Client character set：指定客户端将使用的字符集<br />
&nbsp;&nbsp;&nbsp; 例如：NLS_LANG=AMERICAN_AMERICA.US7ASCII <br />
&nbsp;&nbsp;&nbsp; AMERICAN是语言，AMERICA是地区，US7ASCII是客户端字符集 </p>
<p>&nbsp;</p>
<p>2.5.3客户端字符集设置方法<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)UNIX环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $NLS_LANG=&#8220;simplified chinese&#8221;_china.zhs16gbk<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $export NLS_LANG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑oracle用户的profile文件<br />
&nbsp;&nbsp;&nbsp; 2)Windows环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑注册表<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Regedit.exe ---》 HKEY_LOCAL_MACHINE ---》SOFTWARE ---》 ORACLE-HOME</p>
<p>&nbsp;</p>
<p>2.5.4 NLS参数查询<br />
&nbsp;&nbsp;&nbsp; Oracle提供若干NLS参数定制数据库和用户机以适应本地格式，例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等，可以通过查询以下数据字典或v$视图查看。<br />
NLS_DATABASE_PARAMETERS:显示数据库当前NLS参数取值，包括数据库字符集取值<br />
NLS_SESSION_PARAMETERS：&nbsp; 显示由NLS_LANG 设置的参数，或经过alter session 改变后的参数值（不包括由NLS_LANG 设置的客户端字符集）<br />
NLS_INSTANCE_PARAMETE： 显示由参数文件init&lt;SID&gt;.ora 定义的参数</p>
<p>V$NLS_PARAMETERS：显示数据库当前NLS参数取值 </p>
<p>&nbsp;</p>
<p>2.5.5修改NLS参数<br />
&nbsp;&nbsp;&nbsp; 使用下列方法可以修改NLS参数<br />
&nbsp;&nbsp;&nbsp; （1）修改实例启动时使用的初始化参数文件<br />
&nbsp;&nbsp;&nbsp; （2）修改环境变量NLS_LANG<br />
&nbsp;&nbsp;&nbsp; （3）使用ALTER SESSION语句，在oracle会话中修改<br />
&nbsp;&nbsp;&nbsp; （4）使用某些SQL函数<br />
&nbsp;&nbsp;&nbsp; NLS作用优先级别：Sql function &gt; alter session &gt; 环境变量或注册表 &gt; 参数文件 &gt; 数据库默认参数 </p>
<p>&nbsp;</p>
<p>三．EXP/IMP 与 字符集</p>
<p>3.1 EXP/IMP<br />
&nbsp;&nbsp;&nbsp; Export 和 Import 是一对读写Oracle数据的工具。Export 将 Oracle 数据库中的数据输出到操作系统文件中, Import 把这些文件中的数据读到Oracle 数据库中，由于使用exp/imp进行数据迁移时，数据从源数据库到目标数据库的过程中有四个环节涉及到字符集，如果这四个环节的字符集不一致，将会发生字符集转换。 <br />
EXP<br />
&nbsp;&nbsp;&nbsp;&nbsp; ____________ _________________ _____________<br />
&nbsp;&nbsp;&nbsp;&nbsp; |imp导入文件|&lt;-|环境变量NLS_LANG|&lt;-|数据库字符集|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------------&nbsp;&nbsp; -----------------&nbsp;&nbsp; ------------- </p>
<p>IMP <br />
&nbsp;&nbsp;&nbsp;&nbsp; ____________ _________________ _____________<br />
&nbsp;&nbsp;&nbsp;&nbsp; |imp导入文件|-&gt;|环境变量NLS_LANG|-&gt;|数据库字符集|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------------&nbsp;&nbsp; -----------------&nbsp;&nbsp; ------------- </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>四个字符集是<br />
&nbsp;&nbsp; （1）源数据库字符集 <br />
&nbsp;&nbsp; （2）Export过程中用户会话字符集（通过NLS_LANG设定）<br />
&nbsp;&nbsp; （3）Import过程中用户会话字符集（通过NLS_LANG设定）<br />
&nbsp;&nbsp; （4）目标数据库字符集 <br />
&nbsp; <br />
3.2导出的转换过程<br />
&nbsp;&nbsp;&nbsp; 在Export过程中，如果源数据库字符集与Export用户会话字符集不一致，会发生字符集转换，并在导出文件的头部几个字节中存储Export用户会话字符集的ID号。在这个转换过程中可能发生数据的丢失。</p>
<p><br />
例:如果源数据库使用ZHS16GBK，而Export用户会话字符集使用US7ASCII，由于ZHS16GBK是16位字符集,而US7ASCII是7位字符集，这个转换过程中，中文字符在US7ASCII中不能够找到对等的字符，所以所有中文字符都会丢失而变成&#8220;?? &#8221;形式，这样转换后生成的Dmp文件已经发生了数据丢失。<br />
因此如果想正确导出源数据库数据，则Export过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集 <br />
&nbsp; <br />
3.3导入的转换过程<br />
&nbsp;&nbsp;&nbsp; （1）确定导出数据库字符集环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过读取导出文件头，可以获得导出文件的字符集设置<br />
&nbsp;&nbsp;&nbsp; （2）确定导入session的字符集，即导入Session使用的NLS_LANG环境变量<br />
&nbsp;&nbsp;&nbsp; （3）IMP读取导出文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 读取导出文件字符集ID，和导入进程的NLS_LANG进行比较<br />
&nbsp;&nbsp;&nbsp; （4）如果导出文件字符集和导入Session字符集相同，那么在这一步骤内就不需要转换，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果不同，就需要把数据转换为导入Session使用的字符集。可以看出，导入数据到数据库过程中发生两次字符集转换</p>
<p><br />
&nbsp;&nbsp;&nbsp; 第一次:导入文件字符集与导入Session使用的字符集之间的转换，如果这个转换过程不能正确完成，Import向目标数据库的导入过程也就不能完成。<br />
&nbsp;&nbsp;&nbsp; 第二次:导入Session字符集与数据库字符集之间的转换。</p>
<p>&nbsp;</p>
<p>四. 查看数据库字符集</p>
<p>涉及三方面的字符集，</p>
<p>1. oracel server端的字符集;</p>
<p>2. oracle client端的字符集;</p>
<p>3. dmp文件的字符集。</p>
<p>&nbsp;</p>
<p>在做数据导入的时候，需要这三个字符集都一致才能正确导入。</p>
<p>&nbsp;</p>
<p>4.1 查询oracle server端的字符集 </p>
<p>有很多种方法可以查出oracle server端的字符集，比较直观的查询方法是以下这种:</p>
<p>SQL&gt; select userenv('language') from dual;</p>
<p>USERENV('LANGUAGE')</p>
<p>----------------------------------------------------</p>
<p>SIMPLIFIED CHINESE_CHINA.ZHS16GBK</p>
<p>&nbsp;</p>
<p>SQL&gt;select userenv(&#8216;language&#8217;) from dual; </p>
<p>AMERICAN _ AMERICA. ZHS16GBK </p>
<p>&nbsp;</p>
<p>4.2 如何查询dmp文件的字符集 </p>
<p>用oracle的exp工具导出的dmp文件也包含了字符集信息，dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大，比如只有几M或几十M，可以用UltraEdit打开(16进制方式)，看第2第3个字节的内容，如0354，然后用以下SQL查出它对应的字符集: </p>
<p>SQL&gt; select nls_charset_name(to_number('0354','xxxx')) from dual; </p>
<p>ZHS16GBK </p>
<p>&nbsp;</p>
<p>如果dmp文件很大，比如有2G以上(这也是最常见的情况)，用文本编辑器打开很慢或者完全打不开，可以用以下命令(在unix主机上): </p>
<p>cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6 </p>
<p>然后用上述SQL也可以得到它对应的字符集。</p>
<p>&nbsp;</p>
<p>4.3 查询oracle client端的字符集 </p>
<p>在windows平台下，就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置，</p>
<p>比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK </p>
<p>这样就只影响这个窗口里面的环境变量。 </p>
<p>&nbsp;</p>
<p>在unix平台下，就是环境变量NLS_LANG。 </p>
<p>$echo $NLS_LANG </p>
<p>AMERICAN_AMERICA.ZHS16GBK </p>
<p>&nbsp;</p>
<p>如果检查的结果发现server端与client端字符集不一致，请统一修改为同server端相同的字符集。</p>
<p>&nbsp;</p>
<p>补充：</p>
<p>(1).数据库服务器字符集</p>
<p>select * from nls_database_parameters</p>
<p>来源于props$，是表示数据库的字符集。</p>
<p>&nbsp;</p>
<p>(2).客户端字符集环境</p>
<p>select * from nls_instance_parameters</p>
<p>其来源于v$parameter，表示客户端的字符集的设置，可能是参数文件，环境变量或者是注册表</p>
<p>&nbsp;</p>
<p>(3).会话字符集环境</p>
<p>select * from nls_session_parameters</p>
<p>来源于v$nls_parameters，表示会话自己的设置，可能是会话的环境变量或者是alter session完成，如果会话没有特殊的设置，将与nls_instance_parameters一致。</p>
<p>&nbsp;</p>
<p>(4).客户端的字符集要求与服务器一致，才能正确显示数据库的非Ascii字符。</p>
<p>如果多个设置存在的时候，NLS作用优先级别：Sql function &gt; alter session &gt; 环境变量或注册表 &gt; 参数文件 &gt; 数据库默认参数</p>
<p>&nbsp;</p>
<p>字符集要求一致，但是语言设置却可以不同，语言设置建议用英文。如字符集是zhs16gbk，则nls_lang可以是American_America.zhs16gbk。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>五． 修改oracle的字符集 </p>
<p>按照上文所说，数据库字符集在创建后原则上不能更改。因此，在设计和安装之初考虑使用哪一种字符集十分重要。对数据库server而言，错误的修改字符集将会导致很多不可测的后果，可能会严重影响数据库的正常运行，所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说，除非万不得已，我们不建议修改oracle数据库server端的字符集。特别说明，我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系，因此理论上讲这两种字符集之间的相互转换不受支持。 </p>
<p>&nbsp;</p>
<p>不过修改字符集有2种方法可行。</p>
<p>1. 通常需要导出数据库数据，重建数据库，再导入数据库数据的方式来转换。</p>
<p>2. 通过ALTER DATABASE CHARACTER SET语句修改字符集，但创建数据库后修改字符集是有限制的，只有新的字符集是当前字符集的超集时才能修改数据库字符集，例如UTF8是US7ASCII的超集，修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。 <br />
&nbsp;</p>
<p>&nbsp;</p>
<p>5.1 修改server端字符集(不建议使用) </p>
<p>&nbsp;</p>
<p>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭数据库</p>
<p>SQL&gt;SHUTDOWN IMMEDIATE</p>
<p>&nbsp;</p>
<p>2. 启动到Mount</p>
<p>SQL&gt;STARTUP MOUNT; </p>
<p>SQL&gt;ALTER SYSTEM ENABLE RESTRICTED SESSION; </p>
<p>SQL&gt;ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; </p>
<p>SQL&gt;ALTER SYSTEM SET AQ_TM_PROCESSES=0; </p>
<p>SQL&gt;ALTER DATABASE OPEN; </p>
<p>SQL&gt;ALTER DATABASE CHARACTER SET ZHS16GBK; </p>
<p>SQL&gt;ALTER DATABASE national CHARACTER SET ZHS16GBK; </p>
<p>SQL&gt;SHUTDOWN IMMEDIATE; </p>
<p>SQL&gt;STARTUP</p>
<p>注意：如果没有大对象，在使用过程中进行语言转换没有什么影响，（切记设定的字符集必须是ORACLE支持，不然不能start） 按上面的做法就可以。</p>
<p>&nbsp;</p>
<p>若出现&#8216;ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists&#8217; 这样的提示信息，</p>
<p>要解决这个问题有两种方法</p>
<p>1. 利用INTERNAL_USE 关键字修改区域设置,</p>
<p>2. 利用re-create,但是re-create有点复杂,所以请用internal_use</p>
<p>&nbsp;</p>
<p>SQL&gt;SHUTDOWN IMMEDIATE;</p>
<p>SQL&gt;STARTUP MOUNT EXCLUSIVE;</p>
<p>SQL&gt;ALTER SYSTEM ENABLE RESTRICTED SESSION;</p>
<p>SQL&gt;ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;</p>
<p>SQL&gt;ALTER SYSTEM SET AQ_TM_PROCESSES=0;</p>
<p>SQL&gt;ALTER DATABASE OPEN;</p>
<p>SQL&gt;ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;</p>
<p>SQL&gt;SHUTDOWN immediate;</p>
<p>SQL&gt;startup;</p>
<p>如果按上面的做法做,National charset的区域设置就没有问题</p>
<p>&nbsp;</p>
<p>5.2 修改dmp文件字符集 </p>
<p>上文说过，dmp文件的第2第3字节记录了字符集信息，因此直接修改dmp文件的第2第3字节的内容就可以&#8216;骗&#8217;过oracle的检查。这样做理论上也仅是从子集到超集可以修改，但很多情况下在没有子集和超集关系的情况下也可以修改，我们常用的一些字符集，如US7ASCII，WE8ISO8859P1，ZHS16CGB231280，ZHS16GBK基本都可以改。因为改的只是dmp文件，所以影响不大。 </p>
<p>&nbsp;</p>
<p>具体的修改方法比较多，最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。</p>
<p>比如想将dmp文件的字符集改为ZHS16GBK，可以用以下SQL查出该种字符集对应的16进制代码: SQL&gt; select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual; </p>
<p>0354 </p>
<p>然后将dmp文件的2、3字节修改为0354即可。 </p>
<p>如果dmp文件很大，用ue无法打开，就需要用程序的方法了。</p>
<p>&nbsp;</p>
<p>5.3客户端字符集设置方法<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)UNIX环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $NLS_LANG=&#8220;simplified chinese&#8221;_china.zhs16gbk<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $export NLS_LANG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑oracle用户的profile文件<br />
&nbsp;&nbsp;&nbsp; 2)Windows环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑注册表<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Regedit.exe ---》 HKEY_LOCAL_MACHINE ---》SOFTWARE ---》 ORACLE-HOME</p>
<p>&nbsp; 或者在窗口设置：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set nls_lang=AMERICAN_AMERICA.ZHS16GBK </p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/tianlesoftware/archive/2009/12/01/4915223.aspx</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/348338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-04-15 10:58 <a href="http://www.blogjava.net/xzclog/archive/2011/04/15/348338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 10g Shrink Table 详解［表空间收缩］</title><link>http://www.blogjava.net/xzclog/archive/2011/04/15/348337.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 15 Apr 2011 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/04/15/348337.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/348337.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/04/15/348337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/348337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/348337.html</trackback:ping><description><![CDATA[转自：http://blog.csdn.net/tianlesoftware/archive/2009/11/04/4764254.aspx<br />
<p>从10g开始，oracle开始提供Shrink的命令，假如我们的表空间中支持自动段空间管理 (ASSM),就可以使用这个特性缩小段，即降低HWM。这里需要强调一点，10g的这个新特性，仅对ASSM表空间有效，否则会报 ORA-10635: Invalid segment or tablespace type。 </p>
<p>&nbsp;</p>
<p>有关ASSM的详细信息，请参考我的Blog：Oracle 自动段空间管理</p>
<p>http://blog.csdn.net/tianlesoftware/archive/2009/12/07/4958989.aspx</p>
<p>&nbsp;</p>
<p>如果经常在表上执行DML操作，会造成数据库块中数据分布稀疏，浪费大量空间。同时也会影响全表扫描的性能，因为全表扫描需要访问更多的数据块。从oracle10g开始，表可以通过shrink来重组数据使数据分布更紧密，同时降低HWM释放空闲数据块。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>segment shrink分为两个阶段：</p>
<p>&nbsp;</p>
<p>1、数据重组(compact):通过一系列insert、delete操作，将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁，即只在需要移动的行上加锁。由于涉及到rowid的改变，需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。</p>
<p>&nbsp;</p>
<p>2、HWM调整：第二阶段是调整HWM位置，释放空闲数据块。此过程需要在表上加X锁，会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>shrink space语句两个阶段都执行。</p>
<p>&nbsp;</p>
<p>shrink space compact只执行第一个阶段。</p>
<p>如果系统业务比较繁忙，可以先执行shrink space compact重组数据,然后在业务不忙的时候再执行shrink space降低HWM释放空闲数据块。</p>
<p>&nbsp;</p>
<p>shrink必须开启行迁移功能。</p>
<p>alter table table_name enable row movement ;</p>
<p>&nbsp;</p>
<p>注意：alter table XXX enable row movement语句会造成引用表XXX的对象(如存储过程、包、视图等)变为无效。执行完成后，最好执行一下utlrp.sql来编译无效的对象。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>语法：</p>
<p>alter table &lt;table_name&gt; shrink space [ &lt;null&gt; | compact | cascade ];</p>
<p>alter table &lt;table_name&gt; shrink space compcat;</p>
<p>收缩表，相当于把块中数据打结实了，但会保持 high water mark; </p>
<p>&nbsp;</p>
<p>alter table &lt;tablespace_name&gt; shrink space;</p>
<p>收缩表，降低 high water mark;</p>
<p>&nbsp;</p>
<p>alter table &lt;tablespace_name&gt; shrink space cascade;</p>
<p>收缩表，降低 high water mark，并且相关索引也要收缩一下下。</p>
<p>&nbsp;</p>
<p>alter index idxname shrink space;</p>
<p>回缩索引</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>1：普通表</p>
<p>&nbsp;</p>
<p>Sql脚本，改脚本会生成相应的语句</p>
<p>select'alter table '||table_name||' enable row movement;'||chr(10)||'alter table '||table_name||' shrink space;'||chr(10)from user_tables;</p>
<p>&nbsp;</p>
<p>select'alter index '||index_name||' shrink space;'||chr(10)from user_indexes;</p>
<p>&nbsp;</p>
<p>2：分区表的处理</p>
<p>&nbsp;</p>
<p>进行shrink space时 发生ORA-10631错误.shrink space有一些限制.</p>
<p>&nbsp;</p>
<p>在表上建有函数索引（包括全文索引）会失败。</p>
<p>&nbsp;</p>
<p>Sql脚本，改脚本会生成相应的语句</p>
<p>&nbsp;</p>
<p>select 'alter table '||table_name||' enable row movement;'||chr(10)||'alter table '||table_name||' shrink space;'||chr(10) from user_tables where ;</p>
<p>&nbsp;</p>
<p>select 'alter index '||index_name||' shrink space;'||chr(10) from user_indexes where uniqueness='NONUNIQUE' ;</p>
<p>&nbsp;</p>
<p>select 'alter table '||segment_name||' modify subpartition '||partition_name||' shrink space;'||chr(10) from user_segments where segment_type='TABLE SUBPARTITION' ';</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>详细测试：</p>
<p>&nbsp;</p>
<p>我们用系统视图all_objects来在上个测试的tablespace ASSM上创建测试表my_objects</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 20:42:45 (QP5 v5.115.810.9015) */</p>
<p>CREATE TABLESPACE ASSM DATAFILE 'd:\ASSM01.dbf' SIZE 100M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 20:39:26 (QP5 v5.115.810.9015) */</p>
<p>SELECT&nbsp;&nbsp; TABLESPACE_NAME,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK_SIZE,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXTENT_MANAGEMENT,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALLOCATION_TYPE,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEGMENT_SPACE_MANAGEMENT</p>
<p>&nbsp; FROM&nbsp;&nbsp; dba_tablespaces</p>
<p>&nbsp;WHERE&nbsp;&nbsp; TABLESPACE_NAME = 'ASSM';</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>TABLESPACE_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK_SIZE EXTENT_MAN ALLOCATIO SEGMEN</p>
<p>--------------------- ---------- ---------- --------- ------</p>
<p>ASSM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8192&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOCAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYSTEM&nbsp;&nbsp;&nbsp; AUTO&nbsp; </p>
<p>1 row selected.</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 20:44:15 (QP5 v5.115.810.9015) */</p>
<p>CREATE TABLE my_objects</p>
<p>TABLESPACE assm</p>
<p>AS</p>
<p>&nbsp;&nbsp; SELECT&nbsp;&nbsp; * FROM all_objects;</p>
<p>&nbsp;</p>
<p>然后我们随机地从table MY_OBJECTS中删除一部分数据： </p>
<p>SQL&gt; SELECT&nbsp;&nbsp; COUNT ( * ) FROM my_objects;</p>
<p>COUNT(*) </p>
<p>---------- </p>
<p>49477 </p>
<p>SQL&gt; delete from my_objects where object_name like '%C%'; </p>
<p>SQL&gt; delete from my_objects where object_name like '%U%'; </p>
<p>SQL&gt; delete from my_objects where object_name like '%A%'; </p>
<p>&nbsp;</p>
<p>现在我们使用show_space()来看看my_objects的数据存储状况： </p>
<p>注： show_space() 存储过程代码参看一下连接的附件</p>
<p>http://blog.csdn.net/tianlesoftware/archive/2009/12/07/4958989.aspx</p>
<p>&nbsp;</p>
<p>SQL&gt;exec show_space('my_objects','auto','T','Y');</p>
<p>Total Blocks............................768</p>
<p>Total Bytes.............................6291456</p>
<p>Unused Blocks...........................68</p>
<p>Unused Bytes............................557056</p>
<p>Last Used Ext FileId....................8</p>
<p>Last Used Ext BlockId...................649</p>
<p>Last Used Block.........................60</p>
<p>&nbsp;*************************************************</p>
<p>The segment is analyzed</p>
<p>0% -- 25% free space blocks.............41</p>
<p>0% -- 25% free space bytes..............335872</p>
<p>25% -- 50% free space blocks............209</p>
<p>25% -- 50% free space bytes.............1712128</p>
<p>50% -- 75% free space blocks............190</p>
<p>50% -- 75% free space bytes.............1556480</p>
<p>75% -- 100% free space blocks...........229</p>
<p>75% -- 100% free space bytes............1875968</p>
<p>Unused Blocks...........................0</p>
<p>Unused Bytes............................0</p>
<p>Total Blocks............................11</p>
<p>Total bytes.............................90112</p>
<p>PL/SQL 过程已成功完成。 </p>
<p>这里，table my_objects的HWM下有767个block，其中，free space为25-50%的block有209个，free space为50-75%的block有190个，free space为75-100%的block有229个. Total blocks 11个。</p>
<p>&nbsp;</p>
<p>这种情况下，我们需要对这个table的现有数据行进行重组。 </p>
<p>&nbsp;</p>
<p>要使用assm上的shink，首先我们需要使该表支持行移动，可以用这样的命令来完成： </p>
<p>alter table my_objects enable row movement; </p>
<p>现在，就可以来降低my_objects的HWM，回收空间了，使用命令： </p>
<p>alter table bookings shrink space; </p>
<p>&nbsp;</p>
<p>我们具体的看一下实验的结果： </p>
<p>SQL&gt; alter table my_objects enable row movement; </p>
<p>表已更改。 </p>
<p>SQL&gt; alter table my_objects shrink space; </p>
<p>表已更改。 </p>
<p>SQL&gt;exec show_space('my_objects','auto','T','Y');</p>
<p>Total Blocks............................272</p>
<p>Total Bytes.............................2228224</p>
<p>Unused Blocks...........................0</p>
<p>Unused Bytes............................0</p>
<p>Last Used Ext FileId....................8</p>
<p>Last Used Ext BlockId...................265</p>
<p>Last Used Block.........................16</p>
<p>&nbsp;*************************************************</p>
<p>The segment is analyzed</p>
<p>0% -- 25% free space blocks.............0</p>
<p>0% -- 25% free space bytes..............0</p>
<p>25% -- 50% free space blocks............0</p>
<p>25% -- 50% free space bytes.............0</p>
<p>50% -- 75% free space blocks............1</p>
<p>50% -- 75% free space bytes.............8192</p>
<p>75% -- 100% free space blocks...........0</p>
<p>75% -- 100% free space bytes............0</p>
<p>Unused Blocks...........................0</p>
<p>Unused Bytes............................0</p>
<p>Total Blocks............................257</p>
<p>Total bytes.............................2105344</p>
<p>&nbsp;</p>
<p>在执行玩shrink命令后，我们可以看到，table my_objects的HWM现在降到了271的位置，而且HWM下的block的空间使用状况，Total blocks 的block有257个，free space 为25-50% Block只有0个。 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Shrink 的实现机制：</p>
<p>我们接下来讨论一下shrink的实现机制，我们同样使用讨论move机制的那个实验来观察。 </p>
<p>/* Formatted on 2009-12-7 20:58:40 (QP5 v5.115.810.9015) */</p>
<p>CREATE TABLE TEST_HWM (id&nbsp; INT, name CHAR (2000))</p>
<p>TABLESPACE ASSM;</p>
<p>&nbsp;</p>
<p>INSERT INTO TEST_HWM&nbsp; VALUES&nbsp;&nbsp; (1, 'aa');</p>
<p>INSERT INTO TEST_HWM&nbsp; VALUES&nbsp;&nbsp; (2, 'bb');</p>
<p>INSERT INTO TEST_HWM&nbsp; VALUES&nbsp;&nbsp; (2, 'cc');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (3, 'dd');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (4, 'ds');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (5, 'dss');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (6, 'dss');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (7, 'ess');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (8, 'es');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (9, 'es');</p>
<p>INSERT INTO TEST_HWM VALUES&nbsp;&nbsp; (10, 'es');</p>
<p>&nbsp;</p>
<p>我们来看看这个table的rowid和block的ID和信息： </p>
<p>/* Formatted on 2009-12-7 21:00:02 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; ROWID, id, name FROM TEST_HWM;ROWID ID NAME </p>
<p>ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID NAME</p>
<p>-------------------------------------&nbsp;&nbsp;&nbsp; ---------- --------</p>
<p>AAANMEAAIAAAAEcAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 dd</p>
<p>AAANMEAAIAAAAEcAAB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 ds</p>
<p>AAANMEAAIAAAAEcAAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 dss</p>
<p>AAANMEAAIAAAAEdAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 dss</p>
<p>AAANMEAAIAAAAEdAAB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 ess</p>
<p>AAANMEAAIAAAAEdAAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 es</p>
<p>AAANMEAAIAAAAEeAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 es</p>
<p>AAANMEAAIAAAAEeAAB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 es</p>
<p>AAANMEAAIAAAAEgAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 aa</p>
<p>AAANMEAAIAAAAEgAAB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 bb</p>
<p>AAANMEAAIAAAAEgAAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 cc</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 21:00:49 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; EXTENT_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RELATIVE_FNO,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>&nbsp; FROM&nbsp;&nbsp; dba_extents</p>
<p>&nbsp;WHERE&nbsp;&nbsp; segment_name = 'TEST_HWM';</p>
<p>&nbsp;</p>
<p>&nbsp;EXTENT_ID&nbsp;&nbsp;&nbsp; FILE_ID RELATIVE_FNO&nbsp;&nbsp; BLOCK_ID&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>---------- ---------- ------------ ---------- ----------</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 281&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8</p>
<p>1 row selected.</p>
<p>&nbsp;</p>
<p>然后从table test_hwm中删除一些数据： </p>
<p>delete from TEST_HWM where id = 2; </p>
<p>delete from TEST_HWM where id = 4; </p>
<p>delete from TEST_HWM where id = 3; </p>
<p>delete from TEST_HWM where id = 7; </p>
<p>delete from TEST_HWM where id = 8; </p>
<p>&nbsp;</p>
<p>观察table test_hwm的rowid和blockid的信息： </p>
<p>SQL&gt; select rowid , id,name from TEST_HWM; </p>
<p>ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID NAME</p>
<p>------------------------------------------ ---------- ---------</p>
<p>AAANMEAAIAAAAEcAAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 dss</p>
<p>AAANMEAAIAAAAEdAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 dss</p>
<p>AAANMEAAIAAAAEeAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 es</p>
<p>AAANMEAAIAAAAEeAAB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 es</p>
<p>AAANMEAAIAAAAEgAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 aa</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 21:00:49 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; EXTENT_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RELATIVE_FNO,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>&nbsp; FROM&nbsp;&nbsp; dba_extents</p>
<p>&nbsp;WHERE&nbsp;&nbsp; segment_name = 'TEST_HWM';</p>
<p>&nbsp;</p>
<p>&nbsp;EXTENT_ID&nbsp;&nbsp;&nbsp; FILE_ID RELATIVE_FNO&nbsp;&nbsp; BLOCK_ID&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>---------- ---------- ------------ ---------- ----------</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 281&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8</p>
<p>1 row selected.</p>
<p>&nbsp;</p>
<p>从以上的信息，我们可以看到，在table test_hwm中，剩下的数据是分布在AAAAEc，AAAAEd，AAAAEf，AAAAEg这样四个连续的block中。 </p>
<p>&nbsp;</p>
<p>SQL&gt; exec show_space('TEST_HWM','auto','T','Y');</p>
<p>Total Blocks............................8</p>
<p>Total Bytes.............................65536</p>
<p>Unused Blocks...........................0</p>
<p>Unused Bytes............................0</p>
<p>Last Used Ext FileId....................8</p>
<p>Last Used Ext BlockId...................281</p>
<p>Last Used Block.........................8</p>
<p>&nbsp;*************************************************</p>
<p>The segment is analyzed</p>
<p>0% -- 25% free space blocks.............0</p>
<p>0% -- 25% free space bytes..............0</p>
<p>25% -- 50% free space blocks............1</p>
<p>25% -- 50% free space bytes.............8192</p>
<p>50% -- 75% free space blocks............3</p>
<p>50% -- 75% free space bytes.............24576</p>
<p>75% -- 100% free space blocks...........1</p>
<p>75% -- 100% free space bytes............8192</p>
<p>Unused Blocks...........................0</p>
<p>Unused Bytes............................0</p>
<p>Total Blocks............................0</p>
<p>Total bytes.............................0</p>
<p>&nbsp;</p>
<p>我们可以看到目前这四个block的空间使用状况，AAAAEc，AAAAEd，AAAAEf，AAAAEg上各有一行数据，我们猜测free space为50-75%的3个block是这三个block，那么free space为25-50%的1个block就是AAAAEg了，剩下free space为 75-100% 的3个block，是HWM下已格式化的尚未使用的block。（在extent不大于于16个block时，是以一个extent为单位来移动的） </p>
<p>&nbsp;</p>
<p>然后，我们对table my_objects执行shtink的操作： </p>
<p>SQL&gt; alter table test_hwm enable row movement; </p>
<p>Table altered </p>
<p>SQL&gt; alter table test_hwm shrink space; </p>
<p>Table altered </p>
<p>SQL&gt; select rowid ,id,name from TEST_HWM; </p>
<p>ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID NAME</p>
<p>------------------ ---------- ------------</p>
<p>AAANMEAAIAAAAEcAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 es</p>
<p>AAANMEAAIAAAAEcAAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 dss</p>
<p>AAANMEAAIAAAAEcAAD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 aa</p>
<p>AAANMEAAIAAAAEcAAE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 es</p>
<p>AAANMEAAIAAAAEdAAA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 dss</p>
<p>&nbsp;</p>
<p>/* Formatted on 2009-12-7 21:00:49 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; EXTENT_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RELATIVE_FNO,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCK_ID,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>&nbsp; FROM&nbsp;&nbsp; dba_extents</p>
<p>&nbsp;WHERE&nbsp;&nbsp; segment_name = 'TEST_HWM';</p>
<p>&nbsp;</p>
<p>&nbsp;EXTENT_ID&nbsp;&nbsp;&nbsp; FILE_ID RELATIVE_FNO&nbsp;&nbsp; BLOCK_ID&nbsp;&nbsp;&nbsp;&nbsp; BLOCKS</p>
<p>---------- ---------- ------------ ---------- ----------</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 281&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8</p>
<p>1 row selected.</p>
<p>&nbsp;</p>
<p>当执行了shrink操作后，有意思的现象出现了。我们来看看oracle是如何移动行数据的，这里的情况和move已经不太一样了。我们知道，在move操作的时候，所有行的rowid都发生了变化，table所位于的block的区域也发生了变化，但是所有行物理存储的顺序都没有发生变化，所以我们得到的结论是，oracle以block为单位，进行了block间的数据copy。那么shrink后，我们发现，部分行数据的rowid发生了变化，同时，部分行数据的物理存储的顺序也发生了变化，而table所位于的block的区域却没有变化，这就说明，shrink只移动了table其中一部分的行数据，来完成释放空间，而且，这个过程是在table当前所使用的block中完成的。 </p>
<p>&nbsp;</p>
<p>那么Oracle具体移动行数据的过程是怎样的呢？我们根据这样的实验结果，可以来猜测一下： </p>
<p>Oracle是以行为单位来移动数据的。Oracle从当前table存储的最后一行数据开始移动，从当前table最先使用的block开始搜索空间，所以，shrink之前，rownum＝10的那行数据（10,es），被移动到block AAAAEc上，写到（1,aa）这行数据的后面，所以（10,es）的rownum和rowid同时发生改变。然后是（9,es）这行数据，重复上述过程。这是oracle从后向前移动行数据的大致遵循的规则，那么具体移动行数据的的算法是比较复杂的，包括向ASSM的table中insert数据使用block的顺序的算法也是比较复杂的，大家有兴趣的可以自己来研究，在这里我们不多做讨论。 </p>
<p>&nbsp;</p>
<p>在shrink table的同时shrink这个table上的index： </p>
<p>alter table my_objects shrink space cascade; </p>
<p>同样地，这个操作只有当table上的index也是ASSM时，才能使用。 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Move 和 Shrink 产生日志的对比</p>
<p>我们对比了同样数据量和分布状况的两张table，在move和shrink下生成的redo size（table上没有index的情况下）： </p>
<p>/* Formatted on 2009-12-7 21:20:43 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; tablespace_name, SEGMENT_SPACE_MANAGEMENT</p>
<p>&nbsp; FROM&nbsp;&nbsp; dba_tablespaces</p>
<p>&nbsp;WHERE&nbsp;&nbsp; tablespace_name IN ('ASSM', 'HWM');</p>
<p>&nbsp;</p>
<p>TABLESPACE_NAME&nbsp;&nbsp; SEGMENT_SPACE_MANAGEMENT </p>
<p>------------------------------&nbsp; ------------------------ </p>
<p>ASSM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AUTO </p>
<p>HWM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MANUAL </p>
<p>SQL&gt; create table my_objects tablespace ASSM as select * from all_objects where rownum&lt;20000; </p>
<p>Table created </p>
<p>SQL&gt; create table my_objects1 tablespace HWM as select * from all_objects where rownum&lt;20000; </p>
<p>Table created </p>
<p>SQL&gt; select bytes/1024/1024 from user_segments where segment_name = 'MY_OBJECTS'; </p>
<p>BYTES/1024/1024 </p>
<p>--------------- </p>
<p>2.1875 </p>
<p>SQL&gt; delete from my_objects where object_name like '%C%'; </p>
<p>7278 rows deleted </p>
<p>SQL&gt; delete from my_objects1 where object_name like '%C%'; </p>
<p>7278 rows deleted </p>
<p>SQL&gt; delete from my_objects where object_name like '%U%'; </p>
<p>2732 rows deleted </p>
<p>SQL&gt; delete from my_objects1 where object_name like '%U%'; </p>
<p>2732 rows deleted </p>
<p>SQL&gt; commit; </p>
<p>Commit complete </p>
<p>SQL&gt; alter table my_objects enable row movement; </p>
<p>Table altered </p>
<p>/* Formatted on 2009-12-7 21:21:48 (QP5 v5.115.810.9015) */</p>
<p>SQL&gt;SELECT&nbsp;&nbsp; VALUE</p>
<p>&nbsp; FROM&nbsp;&nbsp; v$mystat, v$statname</p>
<p>&nbsp;WHERE&nbsp;&nbsp; v$mystat.statistic# = v$statname.statistic#</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND v$statname.name = 'redo size';</p>
<p>VALUE </p>
<p>---------- </p>
<p>27808792 </p>
<p>SQL&gt; alter table my_objects shrink space; </p>
<p>Table altered </p>
<p>SQL&gt;SELECT&nbsp;&nbsp; VALUE</p>
<p>&nbsp; FROM&nbsp;&nbsp; v$mystat, v$statname</p>
<p>&nbsp;WHERE&nbsp;&nbsp; v$mystat.statistic# = v$statname.statistic#</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND v$statname.name = 'redo size';</p>
<p>VALUE </p>
<p>---------- </p>
<p>32579712 </p>
<p>SQL&gt; alter table my_objects1 move; </p>
<p>Table altered </p>
<p>SQL&gt;SELECT&nbsp;&nbsp; VALUE</p>
<p>&nbsp; FROM&nbsp;&nbsp; v$mystat, v$statname</p>
<p>&nbsp;WHERE&nbsp;&nbsp; v$mystat.statistic# = v$statname.statistic#</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND v$statname.name = 'redo size';</p>
<p>VALUE </p>
<p>---------- </p>
<p>32676784 </p>
<p>对于table my_objects，进行shrink，产生了32579712 &#8211; 27808792=4770920，约4.5M的redo ；对table my_objects1进行move，产生了32676784-32579712= 97072,约95K的redo size。</p>
<p>&nbsp;</p>
<p>结论：与move比较起来，shrink的日志写要大得多。 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Shrink的几点问题： </p>
<p>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shrink后index是否需要rebuild： </p>
<p>&nbsp;</p>
<p>因为shrink的操作也会改变行数据的rowid，那么，如果table上有index时，shrink table后index会不会变为UNUSABLE呢？</p>
<p>我们来看这样的实验，同样构建my_objects的测试表： </p>
<p>create table my_objects tablespace ASSM as select * from all_objects where rownum&lt;20000; </p>
<p>create index i_my_objects on my_objects (object_id); </p>
<p>delete from my_objects where object_name like '%C%'; </p>
<p>delete from my_objects where object_name like '%U%'; </p>
<p>现在我们来shrink table my_objects： </p>
<p>SQL&gt; alter table my_objects enable row movement; </p>
<p>Table altered </p>
<p>SQL&gt; alter table my_objects shrink space; </p>
<p>Table altered </p>
<p>SQL&gt; select index_name,status from user_indexes where index_name='I_MY_OBJECTS'; </p>
<p>INDEX_NAME STATUS </p>
<p>------------------------------ -------- </p>
<p>I_MY_OBJECTS VALID </p>
<p>我们发现，table my_objects上的index的状态为VALID，估计shrink在移动行数据时，也一起维护了index上相应行的数据rowid的信息。我们认为，这是对于move操作后需要rebuild index的改进。但是如果一个table上的index数量较多，我们知道，维护index的成本是比较高的，shrink过程中用来维护index的成本也会比较高。 </p>
<p>&nbsp;</p>
<p>2. shrink时对table的lock </p>
<p>在对table进行shrink时，会对table进行怎样的锁定呢？当我们对table MY_OBJECTS进行shrink操作时，查询v$locked_objects视图可以发现，table MY_OBJECTS上加了row-X (SX) 的lock： </p>
<p>SQL&gt;select OBJECT_ID, SESSION_ID,ORACLE_USERNAME,LOCKED_MODE from v$locked_objects; </p>
<p>OBJECT_ID SESSION_ID ORACLE_USERNAME LOCKED_MODE </p>
<p>---------- ---------- ------------------ ----------- </p>
<p>55422 153 DLINGER 3 </p>
<p>SQL&gt; select object_id from user_objects where object_name = 'MY_OBJECTS'; </p>
<p>OBJECT_ID </p>
<p>---------- </p>
<p>55422 </p>
<p>那么，当table在进行shrink时，我们对table是可以进行DML操作的。 </p>
<p>&nbsp;</p>
<p>3． shrink对空间的要求 </p>
<p>我们在前面讨论了shrink的数据的移动机制，既然oracle是从后向前移动行数据，那么，shrink的操作就不会像move一样，shrink不需要使用额外的空闲空间。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/tianlesoftware/archive/2009/11/04/4764254.aspx</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/348337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-04-15 10:57 <a href="http://www.blogjava.net/xzclog/archive/2011/04/15/348337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORA-01122: 数据库文件 1 验证失败</title><link>http://www.blogjava.net/xzclog/archive/2011/04/15/348336.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 15 Apr 2011 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/04/15/348336.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/348336.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/04/15/348336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/348336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/348336.html</trackback:ping><description><![CDATA[<p>转自:http://blog.csdn.net/rein07/archive/2010/11/25/6033937.aspx<br />
</p>
<p>1.SQL&gt;shutdown abort 如果数据库是打开状态，强行关闭</p>
<p>2.SQL&gt;sqlplus / as sysdba</p>
<p>3.SQL&gt;startup<br />
ORACLE 例程已经启动。</p>
<p>Total System Global Area 293601280 bytes<br />
Fixed Size 1248624 bytes<br />
Variable Size 121635472 bytes<br />
Database Buffers 167772160 bytes<br />
Redo Buffers 2945024 bytes<br />
数据库装载完毕。<br />
ORA-01122: 数据库文件 1 验证失败<br />
ORA-01110: 数据文件 1:<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\SYSTEM01.DBF'<br />
ORA-01207: 文件比控制文件更新 - 旧的控制文件</p>
<p>4.SQL&gt;alter database backup controlfile to trace as 'f:\aa';<br />
数据库已更改。</p>
<p>5.SQL&gt;shutdown immediate 如果数据库是打开状态，则关闭<br />
ORA-01109: 数据库未打开<br />
已经卸载数据库</p>
<p>6.SQL&gt;startup nomount;<br />
ORACLE 例程已经启动。<br />
Total System Global Area 105979576 bytes<br />
Fixed Size 454328 bytes<br />
Variable Size 79691776 bytes<br />
Database Buffers 25165824 bytes<br />
Redo Buffers 667648 bytes</p>
<p>7.Editplus之类的编辑器打开在第四步生成的f:\aa文件；<br />
其实在这个文件中的已经告诉你咋样恢复你的数据库了，找到STARTUP NOMOUNT字样，然后下面可以看到类似语句，这个文件有好几个类似的生成控制文件语句，主要针对不懂的环境执行不同的语句，象我的数据库没有做任何备份，也不是在归档模式，就执行这句<br />
CREATE CONTROLFILE REUSE DATABASE "ORCLDW" NORESETLOGS NOARCHIVELOG<br />
MAXLOGFILES 16<br />
MAXLOGMEMBERS 3<br />
MAXDATAFILES 100<br />
MAXINSTANCES 8<br />
MAXLOGHISTORY 292<br />
LOGFILE<br />
GROUP 1 'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\REDO01.LOG' SIZE 50M,<br />
GROUP 2 'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\REDO02.LOG' SIZE 50M,<br />
GROUP 3 'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\REDO03.LOG' SIZE 50M<br />
DATAFILE<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\SYSTEM01.DBF',<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\UNDOTBS01.DBF',<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\SYSAUX01.DBF',<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\USERS01.DBF',<br />
'F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCLDW\EXAMPLE01.DBF'<br />
CHARACTER SET ZHS16GBK<br />
;<br />
执行上面这段语句，这个语句重建控制文件,然后你可以看着f:\aa文件完成下面的恢复工作了，</p>
<p>8.SQL&gt;RECOVER DATABASE （恢复指定表空间、数据文件或整个数据库）</p>
<p>9.SQL&gt;ALTER DATABASE OPEN 打开数据库</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/rein07/archive/2010/11/25/6033937.aspx</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/348336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-04-15 10:56 <a href="http://www.blogjava.net/xzclog/archive/2011/04/15/348336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>引用 Oracle:Rank,Dense_Rank,Row_Number比较</title><link>http://www.blogjava.net/xzclog/archive/2011/04/03/347593.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sun, 03 Apr 2011 13:46:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/04/03/347593.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/347593.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/04/03/347593.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/347593.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/347593.html</trackback:ping><description><![CDATA[<p><em>引用</em></p>
<blockquote><a href="http://trailblizer.blog.163.com/" target="_blank">trailblizer</a> 的 <a href="http://trailblizer.blog.163.com/blog/static/59630364200982792143361" target="_blank">Oracle:Rank,Dense_Rank,Row_Number比较</a><br />
<p style="text-indent: 2em">Oracle:Rank,Dense_Rank,Row_Number比较</p>
<p style="text-indent: 2em">一个员工信息表</p>
<p style="text-indent: 2em">Create Table EmployeeInfo (CO<wbr>DE Number(3) Not Null,EmployeeName varchar2(15),DepartmentID Number(3),Salary NUMBER(7,2),</p>
<p style="text-indent: 2em">Constraint PK_EmployeeInfo Primary Key (CO<wbr>DE));</p>
<p style="text-indent: 2em">Select * From EMPLOYEEINFO</p>
<p style="text-indent: 2em"><a href="http://img.bimg.126.net/photo/MVFSxEwAAAQTocQskYv8Ow==/593349250906589044.jpg"><img alt="Oracle:Rank,Dense_Rank,Row_Number比较 - trailblizer - trailblizer的博客" src="http://img.bimg.126.net/photo/MVFSxEwAAAQTocQskYv8Ow==/593349250906589044.jpg" border="0" __1301838278468__="ev_9000324519" /></a></p>
<p style="text-indent: 2em">现执行SQL语句：</p>
<p style="text-indent: 2em">Select EMPLOYEENAME,SALARY, </p>
<p style="text-indent: 2em">RANK() OVER (Order By SALARY Desc)&nbsp; "RANK",</p>
<p style="text-indent: 2em">DENSE_RANK() OVER (Order By SALARY Desc ) "DENSE_RANK",</p>
<p style="text-indent: 2em">ROW_NUMBER() OVER(Order By SALARY Desc) "ROW_NUMBER"</p>
<p style="text-indent: 2em">&nbsp;From EMPLOYEEINFO </p>
<p style="text-indent: 2em">结果如下：</p>
<p style="text-indent: 2em"><a href="http://img.bimg.126.net/photo/hEt7rBa-A9uP0VCTwpWELg==/4261531147400411727.jpg"><img alt="Oracle:Rank,Dense_Rank,Row_Number比较 - trailblizer - trailblizer的博客" src="http://img.bimg.126.net/photo/hEt7rBa-A9uP0VCTwpWELg==/4261531147400411727.jpg" border="0" __1301838278468__="ev_9684341031" /></a></p>
<p style="text-indent: 2em">Rank，Dense_rank，Row_number函数为每条记录产生一个从1开始至N的自然数，N的值可能小于等于记录的总数。这3个函数的唯一区别在于当碰到相同数据时的排名策略。 </p>
<p style="text-indent: 2em">①ROW_NUMBER： </p>
<p style="text-indent: 2em">Row_number函数返回一个唯一的值，当碰到相同数据时，排名按照记录集中记录的顺序依次递增。 </p>
<p style="text-indent: 2em">②DENSE_RANK： </p>
<p style="text-indent: 2em">Dense_rank函数返回一个唯一的值，除非当碰到相同数据时，此时所有相同数据的排名都是一样的。 </p>
<p style="text-indent: 2em">③RANK： </p>
<p style="text-indent: 2em">Rank函数返回一个唯一的值，除非遇到相同的数据时，此时所有相同数据的排名是一样的，同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。 </p>
<p style="text-indent: 2em">同时也可以分组排序,也就是在Over从句内加入Partition by groupField：</p>
<p style="text-indent: 2em">&nbsp;Select DEPARTMENTID,EMPLOYEENAME,SALARY, </p>
<p style="text-indent: 2em">RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc)&nbsp; "RANK",</p>
<p style="text-indent: 2em">DENSE_RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc ) "DENSE_RANK",</p>
<p style="text-indent: 2em">ROW_NUMBER() OVER( Partition By DEPARTMENTID Order By SALARY Desc) "ROW_NUMBER"</p>
<p style="text-indent: 2em">&nbsp;From EMPLOYEEINFO </p>
<p style="text-indent: 2em">结果如下：</p>
<p style="text-indent: 2em"><a href="http://img.bimg.126.net/photo/Wz7ISGDMkbKUAeJOVPpAxw==/4288834220141338023.jpg"><img alt="Oracle:Rank,Dense_Rank,Row_Number比较 - trailblizer - trailblizer的博客" src="http://img.bimg.126.net/photo/Wz7ISGDMkbKUAeJOVPpAxw==/4288834220141338023.jpg" border="0" __1301838278468__="ev_8505889234" /></a></p>
<p style="text-indent: 2em">现在如果插入一条工资为空的记录，那么执行上述语句，结果如下：</p>
<p style="text-indent: 2em"><a href="http://img.bimg.126.net/photo/b4NZ-uK_V804SZqrgbGDgA==/3112550292467384108.jpg"><img alt="Oracle:Rank,Dense_Rank,Row_Number比较 - trailblizer - trailblizer的博客" src="http://img.bimg.126.net/photo/b4NZ-uK_V804SZqrgbGDgA==/3112550292467384108.jpg" border="0" __1301838278468__="ev_7365063231" /></a></p>
<p style="text-indent: 2em">会发现空值的竟然排在了第一位，这显然不是想要的结果。解决的办法是在Over从句Order&nbsp;By后加上 NULLS Last即：</p>
<p style="text-indent: 2em">Select EMPLOYEENAME,SALARY, </p>
<p style="text-indent: 2em">RANK() OVER (Order By SALARY Desc&nbsp; Nulls Last)&nbsp; "RANK",</p>
<p style="text-indent: 2em">DENSE_RANK() OVER (Order By SALARY Desc Nulls Last) "DENSE_RANK",</p>
<p style="text-indent: 2em">ROW_NUMBER() OVER(Order By SALARY Desc Nulls Last ) "ROW_NUMBER"</p>
<p style="text-indent: 2em">&nbsp;From EMPLOYEEINFO </p>
<p style="text-indent: 2em">结果如下：</p>
<p style="text-indent: 2em"><a href="http://img.bimg.126.net/photo/XK5Ycwg9lh1H-yS3E7MJXA==/1691101660078250243.jpg"><img alt="Oracle:Rank,Dense_Rank,Row_Number比较 - trailblizer - trailblizer的博客" src="http://img.bimg.126.net/photo/XK5Ycwg9lh1H-yS3E7MJXA==/1691101660078250243.jpg" border="0" __1301838278468__="ev_2023154627" /></a></p>
</blockquote>
<img src ="http://www.blogjava.net/xzclog/aggbug/347593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-04-03 21:46 <a href="http://www.blogjava.net/xzclog/archive/2011/04/03/347593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Sql Loader中文字符导入乱码的解决方案</title><link>http://www.blogjava.net/xzclog/archive/2011/03/08/345955.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 08 Mar 2011 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/03/08/345955.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/345955.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/03/08/345955.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/345955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/345955.html</trackback:ping><description><![CDATA[<p>Oracle Sql Loader中文字符导入乱码的解决方案<br />
服务器端字符集NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK</p>
<p>控制文件ctl:<br />
LOAD DATA<br />
<span style="color: red">CHARACTERSET ZHS16GBK<br />
</span>INFILE 'c:\testfile.txt'<br />
id name desc </p>
<p>FIELDS TERMINATED BY ","<br />
(id,name ,desc )</p>
<p>导入成功</p>
<p>其中c:\testfile.txt文件中有中文，在将此文件导入到oracle数据库中时，需要设置字符集CHARACTERSET ZHS16GBK<br />
&nbsp;<br />
（1）查看服务器端字符集 <br />
通过客户端或服务器端的sql*plus登录ORACLE的一个合法用户，执行下列SQL语句： <br />
SQL &gt; <span style="color: red">select * from V$NLS_PARAMETERS </span><br />
------------------------<br />
（2）控制文件ctl:<br />
LOAD DATA<br />
<span style="color: red">CHARACTERSET ZHS16GBK<br />
</span>INFILE '/inffile/vac/subs-vac.csv'<br />
TRUNCATE<br />
INTO TABLE INF_VAC_SUBS_PRODUCT<br />
FIELDS TERMINATED BY ',' <span style="color: red">OPTIONALLY ENCLOSED BY '"'<br />
</span>TRAILING NULLCOLS<br />
(<br />
USER_NUMBER,<br />
PRODUCT_ID,<br />
EFFECTIVE_DATE <span style="color: red">DATE "YYYY/MM/DD HH24:MI:SS",<br />
</span>EXPIRATION_DATE DATE "YYYY/MM/DD HH24:MI:SS"<br />
)<br />
</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/345955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-03-08 17:20 <a href="http://www.blogjava.net/xzclog/archive/2011/03/08/345955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle,sql loader 及 快速生成大量数据 CSV文件sqlldr</title><link>http://www.blogjava.net/xzclog/archive/2011/03/08/345953.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 08 Mar 2011 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/03/08/345953.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/345953.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/03/08/345953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/345953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/345953.html</trackback:ping><description><![CDATA[<strong>文章分类:<a style="padding-right: 10px; text-decoration: none" href="http://www.javaeye.com/blogs/category/database">数据库</a></strong>
<div class="blog_content">
<p>要测试sql loader 以及快速产生大量测试数据</p>
<p>生成大量测试数据思路。</p>
<p>&nbsp; 一，用plsql developer 生成csv 文件</p>
<p>&nbsp; 二，用&gt;&gt;输出重定向，追加到一个cvs 文件里。</p>
<p>&nbsp; 三，再用sql loader 快速载入。</p>
<p>&nbsp;</p>
<p>在plsql developer 执行</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://chinapkw.javaeye.com/blog/568948#"><img alt="复制代码" src="http://chinapkw.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span class="keyword">SELECT</span><span>&nbsp;object_id,object_name&nbsp;</span><span class="keyword">FROM</span><span>&nbsp;dba_objects;&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="sql" title="男人oracle,sql loader 及 快速生成大量数据" style="display: none" name="code" pre_index="0" source_url="http://chinapkw.javaeye.com/blog/568948" codeable_type="Post" codeable_id="1327100">SELECT object_id,object_name FROM dba_objects;</pre>
<p>&nbsp;</p>
<p>右键plsql developer 导出csv 格式 1.csv。在linux 上执行下面的脚本</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">C代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://chinapkw.javaeye.com/blog/568948#"><img alt="复制代码" src="http://chinapkw.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-cpp">
    <li><span><span class="preprocessor">#!/bin/bash </span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span class="keyword">for</span><span>((i=1;i&lt;200;i=i+1)) &nbsp;&nbsp;</span></span>
    <li><span class="keyword">do</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat&nbsp;1.csv&nbsp;&gt;&gt;&nbsp;2.csv; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$i; &nbsp;&nbsp;</span>
    <li><span>done&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="c" title="男人oracle,sql loader 及 快速生成大量数据" style="display: none" name="code" pre_index="1" source_url="http://chinapkw.javaeye.com/blog/568948" codeable_type="Post" codeable_id="1327100">#!/bin/bash
for((i=1;i&lt;200;i=i+1))
do
cat 1.csv &gt;&gt; 2.csv;
echo $i;
done</pre>
<p>&nbsp;这样 50000&nbsp; *&nbsp; 200 差不到就有一千万的数据了。我测试的&nbsp; 11047500&nbsp; 392M</p>
<p>&nbsp;可以用:</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Linux代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://chinapkw.javaeye.com/blog/568948#"><img alt="复制代码" src="http://chinapkw.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>wc&nbsp;-l&nbsp;</span><span class="number">2</span><span>.csv&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="linux" title="男人oracle,sql loader 及 快速生成大量数据" style="display: none" name="code" pre_index="2" source_url="http://chinapkw.javaeye.com/blog/568948" codeable_type="Post" codeable_id="1327100">wc -l 2.csv</pre>
<p>&nbsp;</p>
<p>查看csv 里有多少条数据。现在测试数据有了。我们来试一下sql loader 的载入效果吧。</p>
<p>创建sqlloader 控制文件如下,保存为1.ctl</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sqlldr ctl代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://chinapkw.javaeye.com/blog/568948#"><img alt="复制代码" src="http://chinapkw.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>load&nbsp;data &nbsp;&nbsp;</span></span>
    <li><span>infile&nbsp;</span><span class="string">'2.csv'</span><span>&nbsp;&nbsp;</span></span>
    <li><span>into&nbsp;table&nbsp;my_objects &nbsp;&nbsp;</span>
    <li style="color: red"><span>fields&nbsp;terminated&nbsp;by&nbsp;</span><span class="string">','</span><span>optionally&nbsp;enclosed&nbsp;by&nbsp;</span><span class="string">'"'</span><span>&nbsp;&nbsp;</span></span>
    <li><span>(object_id, &nbsp;&nbsp;</span>
    <li><span>object_name &nbsp;&nbsp;</span>
    <li><span>);&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="sqlldr ctl" title="男人oracle,sql loader 及 快速生成大量数据" style="display: none" name="code" pre_index="3" source_url="http://chinapkw.javaeye.com/blog/568948" codeable_type="Post" codeable_id="1327100">load data
infile '2.csv'
into table my_objects
fields terminated by ','optionally enclosed by '"'
(object_id,
object_name
);</pre>
<p>&nbsp;</p>
<p>控制文件简要说明：</p>
<p>-- INFILE 'n.csv'&nbsp; &nbsp;导入多个文件&nbsp; <br />
-- INFILE *&nbsp; 要导入的内容就在control文件里 下面的BEGINDATA后面就是导入的内容</p>
<p>--BADFILE '1.bad'&nbsp; &nbsp;指定坏文件地址&nbsp; </p>
<p>--apend into table my_objects 追加<br />
-- INSERT&nbsp; 装载空表 如果原先的表有数据 sqlloader会停止 默认值&nbsp; <br />
-- REPLACE&nbsp; &nbsp;原先的表有数据 原先的数据会全部删除&nbsp; <br />
-- TRUNCATE&nbsp; 指定的内容和replace的相同 会用truncate语句删除现存数据&nbsp; </p>
<p>--可以指定位置加载<br />
--(object_id position(1:3) char,object_name position(5:7) char)<br />
--分别指定分隔符<br />
--(object_id char terminated by ",", object_name char terminated by ",")<br />
--执行sqlldr userid=scott/a123 control=1.ctl log=1.out direct=true<br />
--30秒可以载入200万的测试数据 79MB</p>
<p><br />
--sqlldr userid＝/ control＝result1.ctl direct＝true parallel＝true<br />
--sqlldr userid＝/ control＝result2.ctl direct＝true parallel＝true<br />
--sqlldr userid＝/ control＝result2.ctl direct＝true parallel＝true<br />
--当加载大量数据时（大约超过10GB），最好抑制日志的产生：<br />
--SQLALTER TABLE RESULTXT nologging;<br />
--这样不产生REDO　LOG，可以提高效率。然后在CONTROL文件中load data上面加一行：unrecoverable <br />
--此选项必须要与DIRECT共同应用。<br />
--在并发操作时，ORACLE声称可以达到每小时处理100GB数据的能力！其实，估计能到1－10G就算不错了，开始可用结构<br />
--相同的文件，但只有少量数据，成功后开始加载大量数据，这样可以避免时间的浪费</p>
<p>&nbsp;</p>
<p>下面就是执行了</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://chinapkw.javaeye.com/blog/568948#"><img alt="复制代码" src="http://chinapkw.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>sqlldr&nbsp;userid=scott/a123&nbsp;control=</span><span class="number">1</span><span>.ctl&nbsp;log=</span><span class="number">1</span><span>.out&nbsp;direct=true&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="shell" title="男人oracle,sql loader 及 快速生成大量数据" style="display: none" name="code" pre_index="4" source_url="http://chinapkw.javaeye.com/blog/568948" codeable_type="Post" codeable_id="1327100">sqlldr userid=scott/a123 control=1.ctl log=1.out direct=true</pre>
<p>&nbsp;结果：30秒可以载入200万的测试数据 79MB<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 226秒载入1100万的测试数据 392Mb</p>
<p>&nbsp;</p>
<p>我的环境是在虚拟机，测得的结果</p>
<p>MemTotal:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 949948 kB</p>
<p>model name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Intel(R) Pentium(R) D CPU 2.80GHz<br />
stepping&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 8<br />
cpu MHz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2799.560<br />
cache size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 1024 KB</p>
<p>&nbsp;</p>
<p>还是挺快的：）</p>
</div>
 <img src ="http://www.blogjava.net/xzclog/aggbug/345953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-03-08 16:47 <a href="http://www.blogjava.net/xzclog/archive/2011/03/08/345953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 重启与关闭</title><link>http://www.blogjava.net/xzclog/archive/2011/01/04/342262.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 04 Jan 2011 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/01/04/342262.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/342262.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/01/04/342262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/342262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/342262.html</trackback:ping><description><![CDATA[<span>&nbsp;
<p style="text-indent: 2em">Oracle中不同启动和关闭方式的区别</p>
<p style="text-indent: 2em">Oracle数据库提供了几种不同的数据库启动和关闭方式，本文将周详介绍这些启动和关闭方式之间的区别连同他们各自不同的功能。</p>
<p style="text-indent: 2em">一、启动和关闭Oracle数据库</p>
<p style="text-indent: 2em">对于大多数Oracle DBA来说，启动和关闭Oracle数据库最常用的方式就是在命令行方式下的Server Manager。从Oracle 8i以后，系统将Server Manager的任何功能都集中到了SQL*Plus中，也就是说从8i以后对于数据库的启动和关闭能够直接通过SQL*Plus来完成，而不再另外需要Server Manager，但系统为了保持向下兼容，依旧保留了Server Manager工具。另外也可通过图像用户工具（GUI）的Oracle Enterprise Manager来完成系统的启动和关闭，图像用户界面Instance Manager很简单，这里不再详述。</p>
<p style="text-indent: 2em">要启动和关闭数据库，必须要以具备Oracle 管理员权限的用户登陆，通常也就是以具备SYSDBA权限的用户登陆。一般我们常用INTERNAL用户来启动和关闭数据库（INTERNAL用户实际上是SYS用户以SYSDBA连接的同义词）。Oracle数据库的新版本将逐步淘汰INTERNAL这个内部用户，所以我们最好还是配置DBA用户具备SYSDBA权限。</p>
<p style="text-indent: 2em">二、数据库的启动（STARTUP）</p>
<p style="text-indent: 2em">启动一个数据库需要三个步骤：</p>
<p style="text-indent: 2em">1、 创建一个Oracle实例（非安装阶段）</p>
<p style="text-indent: 2em">2、 由实例安装数据库（安装阶段）</p>
<p style="text-indent: 2em">3、 打开数据库（打开阶段）</p>
<p style="text-indent: 2em">在Startup命令中，能够通过不同的选项来控制数据库的不同启动步骤。</p>
<p style="text-indent: 2em">1、STARTUP NOMOUNT</p>
<p style="text-indent: 2em">NOMOUNT选项仅仅创建一个Oracle实例。读取init.ora初始化参数文档、启动后台进程、初始化系统全局区（SGA）。Init.ora文档定义了实例的配置，包括内存结构的大小和启动后台进程的数量和类型等。实例名根据Oracle_SID配置，不一定要和打开的数据库名称相同。当实例打开后，系统将显示一个SGA内存结构和大小的列表，如下所示：</p>
<p style="text-indent: 2em">SQL&gt; startup nomount</p>
<p style="text-indent: 2em">ORACLE 例程已启动。</p>
<p style="text-indent: 2em">Total System Global Area 35431692 bytes</p>
<p style="text-indent: 2em">Fixed Size 70924 bytes</p>
<p style="text-indent: 2em">Variable Size 18505728 bytes</p>
<p style="text-indent: 2em">Database Buffers 16777216 bytes</p>
<p style="text-indent: 2em">Redo Buffers 77824 bytes</p>
<p style="text-indent: 2em">2、STARTUP MOUNT</p>
<p style="text-indent: 2em">该命令创建实例并且安装数据库，但没有打开数据库。Oracle系统读取控制文档中关于数据文档和重作日志文档的内容，但并不打开该文档。这种打开方式常在数据库维护操作中使用，如对数据文档的更名、改变重作日志连同打开归档方式等。在这种打开方式下，除了能够看到SGA系统列表以外，系统还会给出"数据库装载完毕"的提示。</p>
<p style="text-indent: 2em">3、STARTUP</p>
<p style="text-indent: 2em">该命令完成创建实例、安装实例和打开数据库的任何三个步骤。此时数据库使数据文档和重作日志文档在线，通常还会请求一个或是多个回滚段。这时系统除了能够看到前面Startup Mount方式下的任何提示外，还会给出一个"数据库已打开"的提示。此时，数据库系统处于正常工作状态，能够接受用户请求。</p>
<p style="text-indent: 2em">假如采用STARTUP NOMOUNT或是STARTUP MOUNT的数据库打开命令方式，必须采用ALTER DATABASE命令来执行打开数据库的操作。例如，假如您以STARTUP NOMOUNT方式打开数据库，也就是说实例已创建，但是数据库没有安装和打开。这是必须运行下面的两条命令，数据库才能正确启动。</p>
<p style="text-indent: 2em">ALTER DATABASE MOUNT;</p>
<p style="text-indent: 2em">ALTER DATABASE OPEN;</p>
<p style="text-indent: 2em">而假如以STARTUP MOUNT方式启动数据库，只需要运行下面一条命令即能够打开数据库：</p>
<p style="text-indent: 2em">ALTER DATABASE OPEN.</p>
<p style="text-indent: 2em">4、其他打开方式</p>
<p style="text-indent: 2em">除了前面介绍的三种数据库打开方式选项外，更有另外其他的一些选项。</p>
<p style="text-indent: 2em">(1) STARTUP RESTRICT</p>
<p style="text-indent: 2em">这种方式下，数据库将被成功打开，但仅仅允许一些特权用户（具备DBA角色的用户）才能够使用数据库。这种方式常用来对数据库进行维护，如数据的导入/导出操作时不希望有其他用户连接到数据库操作数据。</p>
<p style="text-indent: 2em">(2) STARTUP FORCE</p>
<p style="text-indent: 2em">该命令其实是强行关闭数据库（shutdown abort）和启动数据库（startup）两条命令的一个综合。该命令仅在关闭数据库碰到问题不能关闭数据库时采用。</p>
<p style="text-indent: 2em">(3) ALTER DATABASE OPEN READ ONLY;</p>
<p style="text-indent: 2em">该命令在创建实例连同安装数据库后，以只读方式打开数据库。对于那些仅仅提供查询功能的产品数据库能够采用这种方式打开。</p>
<p style="text-indent: 2em">三、数据库的关闭（SHUTDOWN）</p>
<p style="text-indent: 2em">对于数据库的关闭，有四种不同的关闭选项，下面对其进行一一介绍。</p>
<p style="text-indent: 2em">1、SHUTDOWN NORMAL</p>
<p style="text-indent: 2em">这是数据库关闭SHUTDOWN命令的确省选项。也就是说假如您发出SHUTDOWN这样的命令，也即是SHUTDOWN NORNAL的意思。</p>
<p style="text-indent: 2em">发出该命令后，任何新的连接都将再不允许连接到数据库。在数据库关闭之前，Oracle将等待现在连接的任何用户都从数据库中退出后才开始关闭数据库。采用这种方式关闭数据库，在下一次启动时无需进行任何的实例恢复。但需要注意一点的是，采用这种方式，也许关闭一个数据库需要几天时间，也许更长。</p>
<p style="text-indent: 2em">2、SHUTDOWN IMMEDIATE</p>
<p style="text-indent: 2em">这是我们常用的一种关闭数据库的方式，想很快地关闭数据库，但又想让数据库干净的关闭，常采用这种方式。</p>
<p style="text-indent: 2em">当前正在被Oracle处理的SQL语句立即中断，系统中任何没有提交的事务全部回滚。假如系统中存在一个很长的未提交的事务，采用这种方式关闭数据库也需要一段时间（该事务回滚时间）。系统不等待连接到数据库的任何用户退出系统，强行回滚当前任何的活动事务，然后断开任何的连接用户。</p>
<p style="text-indent: 2em">3、SHUTDOWN TRANSACTIONAL</p>
<p style="text-indent: 2em">该选项仅在Oracle 8i后才能够使用。该命令常用来计划关闭数据库，他使当前连接到系统且正在活动的事务执行完毕，运行该命令后，任何新的连接和事务都是不允许的。在任何活动的事务完成后，数据库将和SHUTDOWN IMMEDIATE同样的方式关闭数据库。</p>
<p style="text-indent: 2em">4、SHUTDOWN ABORT</p>
<p style="text-indent: 2em">这是关闭数据库的最后一招，也是在没有任何办法关闭数据库的情况下才不得不采用的方式，一般不要采用。假如下列情况出现时能够考虑采用这种方式关闭数据库。</p>
<p style="text-indent: 2em">1、 数据库处于一种非正常工作状态，不能用shutdown normal或shutdown immediate这样的命令关闭数据库;</p>
<p style="text-indent: 2em">2、 需要立即关闭数据库；</p>
<p style="text-indent: 2em">3、 在启动数据库实例时碰到问题；</p>
<p style="text-indent: 2em">任何正在运行的SQL语句都将立即中止。任何未提交的事务将不回滚。Oracle也不等待现在连接到数据库的用户退出系统。下一次启动数据库时需要实例恢复，因此，下一次启动可能比平时需要更多的时间。</p>
<p style="text-indent: 2em">表1能够清楚地看到上述四种不同关闭数据库的区别和联系。</p>
<p style="text-indent: 2em">　　　　　　　　　关闭方式 A I T N</p>
<p style="text-indent: 2em">允许新的连接 &#215; &#215; &#215; &#215;</p>
<p style="text-indent: 2em">等待直到当前会话中止 &#215; &#215; &#215; &#8730;</p>
<p style="text-indent: 2em">等待直到当前事务中止 &#215; &#215; &#8730; &#8730;</p>
<p style="text-indent: 2em">强制CheckPoint，关闭任何文档 &#215; &#8730; &#8730; &#8730;</p>
<p style="text-indent: 2em">其中：A-Abort I-Immediate T-Transaction N-Nornal</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em">pl/sql developer的Commander Windows下执行shutdown命令报&#8220;ORA-00900: 无效 SQL 语句&#8221;，</p>
<p style="text-indent: 2em">但在服务器本地sqlplus下却可以执行关闭数据库命令，PL/SQL DEVELOPER只支持部分的sql*plus命令？</p>
<p style="text-indent: 2em">另外在数据库unmount(instance 已经启动)的情况下，PL/SQL DEVELOPER无法连接上，</p>
<p style="text-indent: 2em">报&#8220;ORA-12528: TNS:监听程序:所有适用例程都无法建立新连接&#8221;。</p>
<p style="text-indent: 2em">在instance已经启动但数据库还没mount的情况下PL/SQL DEVELOPER等客户端都无法连接到实例上</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em">如何查看Oracle当前数据库实例名</p>
<p style="text-indent: 2em">数据库实例名在编程的很多地方都需要用到，配置数据库的jdbc:oracle:thin:@192.168.2.1:1521:WW ,还有sqlPlus的连接字符串中也需要用到 conn <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#47;&#112;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&#64;&#87;&#87;"><font color="#294a09">sys/password@WW</font></a> as sysdba; 如何查看当前数据库实例名呢?方式有三：</p>
<p style="text-indent: 2em">　　&#183;使用SQL语句：select instance_name from v$instance;</p>
<p style="text-indent: 2em">　　&#183;使用show命令：show parameter instance</p>
<p style="text-indent: 2em">　　&#183;查看参数文件：查看init.ora文件</p>
</span>
<img src ="http://www.blogjava.net/xzclog/aggbug/342262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-01-04 10:32 <a href="http://www.blogjava.net/xzclog/archive/2011/01/04/342262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速掌握重启Oracle数据库的操作步骤</title><link>http://www.blogjava.net/xzclog/archive/2011/01/04/342250.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 04 Jan 2011 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/01/04/342250.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/342250.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/01/04/342250.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/342250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/342250.html</trackback:ping><description><![CDATA[<div class="ciodigest"><strong>[摘要] </strong>在实际的应用中，有时候工作数据库需要重新启动。本文介绍了一个特别实用的操作步骤，希望对大家有所帮助。<br />
<strong></strong>[关键字] <a class="cyewunder" href="http://www.enet.com.cn/tech/inforcenter/search.jsp?keyword=Oracle&amp;ACondtion=keyword&amp;siteid=security" target="_blank">Oracle</a> <a class="cyewunder" href="http://www.enet.com.cn/tech/inforcenter/search.jsp?keyword=%D6%D8%C6%F4&amp;ACondtion=keyword&amp;siteid=security" target="_blank">重启</a> </div>
<div class="contenttxt">　　在实际的应用中，有时候工作数据库需要重新启动。本文介绍了一个特别实用的操作步骤，希望对大家有所帮助。 <br />
<br />
　　1. 停应用层的各种程序 <br />
<br />
　　2. 停Oralce的监听进程 <br />
<br />
　　$ lsnrctl stop <br />
<br />
　　3. 在独占的系统用户下，备份控制文件: <br />
<br />
　　$ sqlplus "/as sysdba" <br />
<br />
　　SQL&gt; alter database backup controlfile to trace; <br />
<br />
　　4. 在独占的系统用户下，手工切换重作日志文件，确保当前已修改过的数据存入文件: <br />
<br />
　　SQL&gt; alter system switch logfile; <br />
<br />
　　5. 在独占的系统用户下，运行下面SQL语句，生成杀数据库用户连接的kill_all_session.sql文件: <br />
<br />
　　SQL&gt; set head off; <br />
<br />
　　SQL&gt; set feedback off; <br />
<br />
　　SQL&gt; set newpage none; <br />
<br />
　　SQL&gt; spool ./kill_session.sql <br />
<br />
　　SQL&gt; select 'alter system kill session '''　　sid　　','　　serial#　　''';' from v$session where username is not null; <br />
<br />
　　SQL&gt; spool off; <br />
<br />
　　6. 在独占的系统用户下，执行杀数据库用户连接的kill_session.sql文件 <br />
<br />
　　SQL&gt; @./kill_session.sql <br />
<br />
　　7. 在独占的系统用户下，用immediate方式关闭数据库: <br />
<br />
　　SQL&gt; shutdown immediate; <br />
<br />
　　或者 <br />
<br />
　　SVRMGRL&gt; shutdown immediate; <br />
<br />
　　8. 启动oralce的监听进程 <br />
<br />
　　$ lsnrctl start <br />
<br />
　　9. 进入独占的系统用户下，启动Oralce数据库 <br />
<br />
　　$ sqlplus /nolog <br />
<br />
　　SQL&gt; connect / as sysdba <br />
<br />
　　SQL&gt; startup; <br />
<br />
　　或者 <br />
<br />
　　$ svrmgrl <br />
<br />
　　SVRMGRL&gt; connect internal; <br />
<br />
　　SVRMGRL&gt; startup; <br />
<br />
　　10.启动应用层的各种程序</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/342250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-01-04 10:10 <a href="http://www.blogjava.net/xzclog/archive/2011/01/04/342250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ETL通用解决方案---oracle+存储过程 实现</title><link>http://www.blogjava.net/xzclog/archive/2010/12/31/342048.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 31 Dec 2010 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/12/31/342048.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/342048.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/12/31/342048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/342048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/342048.html</trackback:ping><description><![CDATA[转自：http://www.javaeye.com/topic/321719<br />
<h2>方案理念--四化理念</h2>
<p style="padding-left: 30px"></p>
<ol>
    <li>数据规格化
    <li>处理自动化
    <li>信息集中化
    <li>操作人性化 </li>
</ol>
<div><br />
</div>
<p>&nbsp;</p>
<h2>架构</h2>
<p style="padding-left: 30px">通过视图实现来至两个不同数据库的表的结构完全一致, &nbsp;在结构完全相同的两个表之间进行数据同步, 问题变得相当简单. 同步代码如下.</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">&nbsp;</p>
<h2>ETL</h2>
<p style="padding-left: 30px"></p>
<p style="padding-left: 30px">---初始同步</p>
<p style="padding-left: 30px">delete from ods_table;</p>
<p style="padding-left: 30px">insert into v_table</p>
<p style="padding-left: 30px">select * from db_table;</p>
<p style="padding-left: 30px">commit;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">---新增同步</p>
<p style="padding-left: 30px">insert into v_table</p>
<p style="padding-left: 30px">select * from db_table t</p>
<p style="padding-left: 30px">where t.id not in (select id from v_table);</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">commit;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">---变更同步</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">update ods_table t</p>
<p style="padding-left: 30px">set t.c_number = (select db.c_number from db_table db where db.id = t.id)</p>
<p style="padding-left: 30px">where t.c_number != (select db.c_number from db_table db where db.id = t.id);</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">commit;</p>
<p>&nbsp;</p>
<h2>实现两个表结构完全一致的方法如下</h2>
<h2>---建表<br />
</h2>
<p>CREATE SEQUENCE SEQ_ETL_INCREASE_ID</p>
<p>INCREMENT BY 1</p>
<p>START WITH 1</p>
<p>&nbsp;&nbsp;NOCACHE;</p>
<p>&nbsp;</p>
<p>/*==============================================================*/</p>
<p>/* Table: ETL_TABLES &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</p>
<p>/*==============================================================*/</p>
<p>CREATE TABLE ETL_TABLES &nbsp;(</p>
<p>&nbsp;&nbsp; "ID" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT -1 NOT NULL,</p>
<p>&nbsp;&nbsp; "TABLE_NAME" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NOT NULL,</p>
<p>&nbsp;&nbsp; "TABLE_TYPE" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(30) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "TABLE_ROOT_IN" &nbsp; &nbsp; &nbsp;VARCHAR2(30),</p>
<p>&nbsp;&nbsp; "TABLE_NEED_CREATE_VIEW" NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1,</p>
<p>&nbsp;&nbsp; "TABLE_CREATE_VIEW_NAME_PREFIX" VARCHAR2(30) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 'v',</p>
<p>&nbsp;&nbsp; "DB_LINK_NAME" &nbsp; &nbsp; &nbsp; VARCHAR2(100),</p>
<p>&nbsp;&nbsp; "CURRENT_VERSION" &nbsp; &nbsp;NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "VERSION_HISTORY" &nbsp; &nbsp;VARCHAR2(3000) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 'init input' NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_DATE" &nbsp; &nbsp; &nbsp; DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_BY" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_DATE" DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_BY" &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "MEMO" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(500),</p>
<p>&nbsp;&nbsp; "STATUS" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1,</p>
<p>&nbsp;&nbsp; CONSTRAINT PK_ETL_TABLES PRIMARY KEY ("ID")</p>
<p>);</p>
<p>&nbsp;</p>
<p>COMMENT ON TABLE ETL_TABLES IS</p>
<p>'此表用于维护ETL涉及到所有表, 包括:</p>
<p>1, db---业务系统数据库</p>
<p>2, ods---操作数据数据库</p>
<p>3, dw---数据仓库';</p>
<p>&nbsp;</p>
<p>/*==============================================================*/</p>
<p>/* Table: ETL_VIEWS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</p>
<p>/*==============================================================*/</p>
<p>CREATE TABLE ETL_VIEWS &nbsp;(</p>
<p>&nbsp;&nbsp; "ID" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT -1 NOT NULL,</p>
<p>&nbsp;&nbsp; "VIEW_NAME" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NOT NULL,</p>
<p>&nbsp;&nbsp; "VIEW_TYPE" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VARCHAR2(30) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "VIEW_ROOT_IN" &nbsp; &nbsp; &nbsp; VARCHAR2(30),</p>
<p>&nbsp;&nbsp; "VIEW_SELECT" &nbsp; &nbsp; &nbsp; &nbsp;VARCHAR2(4000) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "VIEW_FROM" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VARCHAR2(600) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NOT NULL,</p>
<p>&nbsp;&nbsp; "VIEW_WHERE" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(2000),</p>
<p>&nbsp;&nbsp; "VIEW_ORDER_BY" &nbsp; &nbsp; &nbsp;VARCHAR2(600),</p>
<p>&nbsp;&nbsp; "VIEW_GROUP_BY" &nbsp; &nbsp; &nbsp;VARCHAR2(600),</p>
<p>&nbsp;&nbsp; "VIEW_HAVING" &nbsp; &nbsp; &nbsp; &nbsp;VARCHAR2(600),</p>
<p>&nbsp;&nbsp; "VIEW_DB_LINK_NAME" &nbsp;VARCHAR2(100),</p>
<p>&nbsp;&nbsp; "CURRENT_VERSION" &nbsp; &nbsp;NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "VERSION_HISTORY" &nbsp; &nbsp;VARCHAR2(3000) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 'init input' NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_DATE" &nbsp; &nbsp; &nbsp; DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_BY" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_DATE" DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_BY" &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "MEMO" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(500),</p>
<p>&nbsp;&nbsp; "STATUS" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1,</p>
<p>&nbsp;&nbsp; CONSTRAINT PK_ETL_VIEWS PRIMARY KEY ("ID")</p>
<p>);</p>
<p>&nbsp;</p>
<p>COMMENT ON TABLE ETL_VIEWS IS</p>
<p>'此表用于维护ETL涉及到所有视图, 包括:</p>
<p>1, v1---db表中与ods对应到视图</p>
<p>2, v2---ods表中与db对应到视图</p>
<p>3, v3---ods表中与dw对应到视图</p>
<p>4, v4---dw表中与ods中对应到视图';</p>
<p>&nbsp;</p>
<p>/*==============================================================*/</p>
<p>/* Table: ETLS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</p>
<p>/*==============================================================*/</p>
<p>CREATE TABLE ETLS &nbsp;(</p>
<p>&nbsp;&nbsp; "ID" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_NAME" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(300) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_TYPE" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(30) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_SRC_VIEW_OR_TABLE" NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_DES_VIEW_OR_TABLE" NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_INIT_ENABLE" &nbsp; &nbsp;NUMBER(1) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_ADD_ENABLE" &nbsp; &nbsp; NUMBER(1) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "ETL_CHARGE_ENABLE" &nbsp;NUMBER(1) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "CURRENT_VERSION" &nbsp; &nbsp;NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1 NOT NULL,</p>
<p>&nbsp;&nbsp; "VERSION_HISTORY" &nbsp; &nbsp;VARCHAR2(3000) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 'init input' NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_DATE" &nbsp; &nbsp; &nbsp; DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "DEVELOP_BY" &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_DATE" DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT SYSDATE NOT NULL,</p>
<p>&nbsp;&nbsp; "LAST_MAINTAIN_BY" &nbsp; VARCHAR2(100) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFAULT 'cyyan@isoftstone' NOT NULL,</p>
<p>&nbsp;&nbsp; "MEMO" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VARCHAR2(500),</p>
<p>&nbsp;&nbsp; "STATUS" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NUMBER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DEFAULT 1,</p>
<p>&nbsp;&nbsp; CONSTRAINT PK_ETLS PRIMARY KEY ("ID")</p>
<p>);</p>
<p>&nbsp;</p>
<p>COMMENT ON TABLE ETLS IS</p>
<p>'此表用于维护ETL转换时设计到源表和目的表</p>
<p>&nbsp;</p>
<p>源表(或视图)---&gt;目的表(或视图)-</p>
<p>(推荐全部使用视图, 视图具有更过到灵活性, 而且更统一)</p>
<p>&nbsp;</p>
<p>整体架构是在完全相同两张表(或视图)之间进行同步处理</p>
<p>&nbsp;</p>
<p>规范:</p>
<p>1, &nbsp;源表(或视图)-和目的表(或视图)-完全相同</p>
<p>2, &nbsp;目的视图必须是单表';</p>
<div><br />
</div>
<div><br />
</div>
<h2>--存储过程<br />
</h2>
<div><br />
</div>
<div>
<div>/*==============================================================*/</div>
<div>/* Database name: &nbsp;%DATABASE% &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</div>
<div>/* DBMS name: &nbsp; &nbsp; &nbsp;ORACLE Version 10g &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 