﻿<?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-努力创造未来！-随笔分类-pl/sql</title><link>http://www.blogjava.net/pdw2009/category/9420.html</link><description>J2EE相关应用技术日志</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 07:38:12 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 07:38:12 GMT</pubDate><ttl>60</ttl><item><title>数据仓库基本概念</title><link>http://www.blogjava.net/pdw2009/archive/2008/05/21/201891.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Wed, 21 May 2008 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2008/05/21/201891.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/201891.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2008/05/21/201891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/201891.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/201891.html</trackback:ping><description><![CDATA[　1.数据仓库概念始于上世纪80年代中期，首次出现是在被誉为&#8220;数据仓库之父&#8221;WilliamH．Inmon的《建立数据仓库》一书中。随着人们对大型数据系统研究、管理、维护等方面的深刻识认和不断完善，在总结、丰富、集中多行企业信息的经验之后，为数据仓库给出了更为精确的定义，即&#8220;数据仓库是在企业管理和决策中面向主题的、集成的、与时间相关的、不可修改的数据集合&#8221;。数据仓库并没有严格的数据理论基础，也没有成熟的基本模式，且更偏向于工程，具有强烈的工程性。通常按其关键技术部份分为数据的抽取、存储与管理以及数据的表现等三个基本方面。
<p>　　数据仓库的重点与要求是能够准确、安全、可靠地从数据库中取出数据，经过加工转换成有规律信息之后，再供管理人员进行分析使用。数据仓库主要是应用于决策支持系统，其主要目的是&#8220;提取&#8221;信息并加以扩展，用来进行处理基于数据仓库的决策支持系统(DSS)的应用。</p>
<p>　　2 基于数据仓库的决策支持系统(DSS)由三个部件组成：数据仓库技术(Data warehousing)，联机分析处理技术(OLAP，On—Line Analytical Pro—cessing)，数据挖掘技术(Data Mining)。</p>
<p>　　联机分析处理(OLAP，On—Analytical Pro—cessing)是使分析人员、管理人员或执行人员能够从多种角度对从原始数据中转化出来的、能够真正为用户所理解的、并真实反映企业给特性的信息进行快速、一致、交互地存取，从而获得对数据的更深入了解的一类软件技术。OLAP的目标是满足决策支持或多维环境特定的查询和报表需求。数据仓库侧重于存储和管理面向决策主题的数据；而OLAP侧重于数据仓库的数据分析，并将其转换成辅助决策信息。OLA P的一个主要特点是多维数据分析，这与数据仓库的多维数据组织正好形成相互结合、相互补充的关系。问此，利用OLAP技术与数据仓库的结合可以较好地解决传统决策支持系统既需要处理大量数据又需要进行大量数值计算的问题。<br />
OLAP的多维数据分析主要通过对多维数据的维进行剖切、钻取和旋转来实现对数据库所提供的数据进行深入分析，为决策者提供决策支持。多维结构是决策支持的支柱，也是OLAP的核心。</p>
<p>　　数据挖掘(Data Mining)是从大量的、不完全的、有噪声的。模糊的、随机的数据中提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。数据挖掘可以看成是一种数据搜寻过程，它不必预先假设或提出问题，但是仍能找到那些非预期的却令人关注的信息，这些信息表示了数据元素的关系和模式。它能挖掘出数据键潜在的模式(pattern)，找出最有价值的信息和知识(knowledge)。指导商业行为或辅助科学研究。研究对象是大规模和超大规模的数据集合。 </p>
<div>　　数据仓库概念的提出者、美国著名信息工程专家 William Inmon 博士在90年代初提出了数据仓库概念的一个表述。他认为：&#8220;一个数据仓库通常是一个面向主题的、集成的、随时间变化的、但信息本身相对稳定的数据集合，它用于对管理决策过程的支持。&#8221;
<p>　　所谓主题，是指用户使用数据仓库进行决策时所关心的重点方面，如：收入、客户、销售渠道等；所谓面向主题，是指数据仓库内的信息是按主题进行组织的，而不是像业务支撑系统那样是按照业务功能进行组织的。</p>
<p>　　所谓集成，是指数据仓库中的信息不是从各个业务系统中简单抽取出来的，而是经过一系列加工、整理和汇总的过程，因此数据仓库中的信息是关于整个企业的一致的全局信息。</p>
<p>　　所谓随时间变化，是指数据仓库内的信息并不只是反映企业当前的状态，而是记录了从过去某一时点到当前各个阶段的信息。通过这些信息，可以对企业的发展历程和未来趋势做出定量分析和预测。</p>
<p>　　而信息本身相对稳定，是指一旦某个数据进入数据仓库以后，一般很少进行修改，更多的是对信息进行查询操作。</p>
<p>　　依据上面的定义，有人可能会把数据仓库简单地理解为仅仅是一个大型的数据存储机制，是一个静态的概念。实际上，数据仓库更像一个过程，这个过程涉及数据的收集、整理和加工，生成决策所需要的信息，并且最终把这些信息提供给需要这些信息的使用者，供他们做出改善业务经营的正确决策。数据仓库的重点与要求就是能够准确、安全、可靠地从业务系统中取出数据，经过加工转换成有规律信息之后，供管理人员进行分析使用。因此数据仓库是一个动态的概念，应该称为数据仓库工程（Data Warehousing）。</p>
</div>
<!-- / message -->
<img src ="http://www.blogjava.net/pdw2009/aggbug/201891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2008-05-21 14:07 <a href="http://www.blogjava.net/pdw2009/archive/2008/05/21/201891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 9i 分析函数参考手册 </title><link>http://www.blogjava.net/pdw2009/archive/2007/12/03/164860.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Mon, 03 Dec 2007 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2007/12/03/164860.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/164860.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2007/12/03/164860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/164860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/164860.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/pdw2009/archive/2007/12/03/164860.html'>阅读全文</a><img src ="http://www.blogjava.net/pdw2009/aggbug/164860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2007-12-03 14:29 <a href="http://www.blogjava.net/pdw2009/archive/2007/12/03/164860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 分析函数使用</title><link>http://www.blogjava.net/pdw2009/archive/2007/11/29/164004.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Thu, 29 Nov 2007 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2007/11/29/164004.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/164004.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2007/11/29/164004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/164004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/164004.html</trackback:ping><description><![CDATA[这两天写的SQL使用到了联机分析函数，自己之前完全没使用过！<br />
参考了以下blog<br />
http://xsb.itpub.net/post/419/33028<br />
<br />
http://www.cnblogs.com/sunsonbaby/archive/2004/09/29/47876.aspx<br />
<br />
这两篇博客介绍得最详细！！现学现用，感觉挺好 <br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;&nbsp;E.地区,E.彩种,E.时段,&nbsp;E.销售票数,&nbsp;E.销售金额,E.销售增长率,E.本次销售排名,E.本次增长率排名,E.上次销量,E.上次销量排名,E.上上次销量,E.上次增长率排名,(E.本次增长率排名</span><span style="color: #808080">-</span><span style="color: #000000">E.上次销量排名)销售排名走势,(E.本次增长率排名</span><span style="color: #808080">-</span><span style="color: #000000">E.上次增长率排名)增长率走势&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;<br />
<br />
(<br />
</span><span style="color: #0000ff">Select</span><span style="color: #000000">&nbsp;A.地区,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.彩种,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.时段,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.销售票数,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.销售金额,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decode(A.上次销量,</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">0%</span><span style="color: #ff0000">'</span><span style="color: #000000">,</span><span style="color: #ff00ff">round</span><span style="color: #000000">(&nbsp;((A.销售金额&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">&nbsp;A.上次销量)&nbsp;</span><span style="color: #808080">/</span><span style="color: #000000">&nbsp;A.上次销量)&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">100</span><span style="color: #000000">,&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">||</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">%</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;)销售增长率,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rank()&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">(</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;A.销售金额&nbsp;</span><span style="color: #0000ff">desc</span><span style="color: #000000">)&nbsp;本次销售排名,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rank()&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">(</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;decode(A.上次销量,</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,</span><span style="color: #ff00ff">round</span><span style="color: #000000">(((A.销售金额&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">&nbsp;A.上次销量)&nbsp;</span><span style="color: #808080">/</span><span style="color: #000000">&nbsp;A.上次销量)&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">100</span><span style="color: #000000">,&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">))&nbsp;</span><span style="color: #0000ff">desc</span><span style="color: #000000">)&nbsp;本次增长率排名,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.上次销量,&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">A.上次销量,</span><span style="color: #008080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rank()&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">(</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;A.上次销量&nbsp;</span><span style="color: #0000ff">desc</span><span style="color: #000000">)&nbsp;上次销量排名,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.上上次销量,</span><span style="color: #008080">--</span><span style="color: #008080">上上次销量</span><span style="color: #008080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rank()&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">(</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;decode(A.上上次销量,</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,</span><span style="color: #ff00ff">round</span><span style="color: #000000">(((A.销售金额&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">&nbsp;A.上次销量)&nbsp;</span><span style="color: #808080">/</span><span style="color: #000000">&nbsp;A.上次销量)&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">100</span><span style="color: #000000">,&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">))&nbsp;</span><span style="color: #0000ff">desc</span><span style="color: #000000">&nbsp;)上次增长率排名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;C.AREA_NAME&nbsp;地区,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D.Playtype_Name&nbsp;彩种,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to_char(open_result_time,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;时段,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(A.sell_count)&nbsp;销售票数,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(A.sell_amount)&nbsp;销售金额,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lag(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(A.Sell_Amount),&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">,&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">(partition&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;AREA_NAME,Playtype_Name&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;to_char(open_result_time,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm</span><span style="color: #ff0000">'</span><span style="color: #000000">))&nbsp;上次销量,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lag(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(A.Sell_Amount),&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">,&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">(partition&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;AREA_NAME&nbsp;,Playtype_Name&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;&nbsp;to_char(open_result_time,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm</span><span style="color: #ff0000">'</span><span style="color: #000000">))&nbsp;上上次销量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;terminal_sell&nbsp;A,&nbsp;SALES_OUTLETS_INFO&nbsp;B,&nbsp;area&nbsp;C,&nbsp;playtype&nbsp;D<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;D.PLAYTYPE_ID(</span><span style="color: #808080">+</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;A.Lottery_Type<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;C.AREA_ID(</span><span style="color: #808080">+</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;B.Area_Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;B.Sell_Id(</span><span style="color: #808080">+</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;A.Terminal_Sell_Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;AREA_NAME,Playtype_Name&nbsp;,to_char(open_result_time,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm</span><span style="color: #ff0000">'</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;A<br />
&nbsp;)&nbsp;E&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span></div>
<br />
imp omas/omas@omas fromuser=omas touser=omas&nbsp; IGNORE=Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file=c:\\anhui_sellData080520.dmp
<img src ="http://www.blogjava.net/pdw2009/aggbug/164004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2007-11-29 15:32 <a href="http://www.blogjava.net/pdw2009/archive/2007/11/29/164004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle课程培训(转)</title><link>http://www.blogjava.net/pdw2009/archive/2007/11/16/160953.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Fri, 16 Nov 2007 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2007/11/16/160953.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/160953.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2007/11/16/160953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/160953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/160953.html</trackback:ping><description><![CDATA[set oracle_sid=sid_name<br />
sqlplus<br />
SQL&gt;@c:\course.sql
<p>然后输入用户名密码：scott/tiger</p>
<p>SQL&gt;set timing on 记录SQL的执行时间</p>
<p>SQL&gt;SET LINESIZE 100</p>
<p>SQL&gt;set autotrace on&nbsp;启动自动跟踪功能<br />
启动自动跟踪功能的方法，执行以下：<br />
创建：<br />
SQL&gt;@%oracle_home%RDBMS\ADMIN\UTLXPLAN.SQL<br />
步骤一：<br />
SQL&gt;conn / AS SYSDBA<br />
步骤二：<br />
SQL&gt;@%Oracle_home%\SQLPLUS\admin\plustrce.sql<br />
步骤三，授权给scott用户：<br />
SQL&gt;set echo off<br />
SQL&gt;grant plustrace to scott;<br />
步骤四，进入SCOTT帐户，执行以下：<br />
SQL&gt;set autotrace on</p>
<p>只看方案和统计数据而不看执行的行的方法，执行以下：<br />
SQL&gt;set autotrace trace</p>
<p><br />
=======================<br />
课程开始<br />
=======================<br />
自然连接:<br />
SQL&gt;select * from employee natural join dept;</p>
<p>优化器提示：<br />
select /*+ USE_HASH(表名1 表名2)*/ ....&nbsp;散列连接(HASH JOIN)<br />
select /*+ USE_NL(表名1 表名2)*/ ....&nbsp;嵌套循环连接(NESTED LOOPS)<br />
select /*+ USE_MERGE(表名1 表名2)*/ ....合并连接(MERGE JOIN)</p>
<p>强制使用散列连接，执行以下：<br />
SQL&gt;select&nbsp; /*+ USE_HASH(emp dept) */ * from emp natural join dept;<br />
USE_NL&nbsp;&nbsp;嵌套循环连接<br />
USE_MERGE&nbsp;合并连接</p>
<p>查询各部门工资最高的人员编号、姓名、工资。<br />
SELECT EMPNO,SAL,DEPTNO<br />
FROM EMPLOYEE A<br />
WHERE SAL=(SELECT MAX(SAL) FROM EMPLOYEE WHERE DEPTNO=A.DEPTNO);</p>
<p>&nbsp; JOIN</p>
<p>&nbsp;&nbsp;&nbsp; 1) 连接的三种实现方法<br />
&nbsp;&nbsp;&nbsp; 2）如何改变语句的连接方法 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （通过优化器提示 optimizer hints)<br />
&nbsp;&nbsp;&nbsp; 3) 优化器有时候并没有选择最快的连接方式 <br />
&nbsp;&nbsp;&nbsp; 4）有时也没有选择正确的驱动表</p>
<p><br />
&nbsp; SUBQUERY</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 1）子查询可能被优化器自动改变为连接去执行<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2) 连接比子查询快<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3) 查询时间与查询返回的列的数目成正比<br />
&nbsp;&nbsp;&nbsp;&nbsp; 4）相关子查询比非相关子查询慢<br />
&nbsp;&nbsp;&nbsp;&nbsp; 5) 相关子查询中，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相关列的值的种类越多，速度越慢</p>
<p>试验：<br />
查询高于所在部门平均工资<br />
的职工编号、姓名、工资、以及高出多少钱。</p>
<p>SELECT A.EMPNO,A.ENAME,A.SAL-B.SAL<br />
FROM EMPLOYEE A,(SELECT DEPTNO,AVG(SAL) SAL FROM EMPLOYEE GROUP BY DEPTNO) B<br />
WHERE A.DEPTNO=B.DEPTNO<br />
AND A.SAL &gt; B.SAL;</p>
<p>SELECT /*+ USE_HASH(A B) */ A.EMPNO,A.ENAME,A.SAL-B.SAL<br />
FROM EMPLOYEE A,(SELECT DEPTNO,AVG(SAL) SAL FROM EMPLOYEE GROUP BY DEPTNO) B<br />
WHERE A.DEPTNO=B.DEPTNO<br />
AND A.SAL &gt; B.SAL;</p>
<p>以下因为在SELECT中存在相关子查询，所以其性能要低于以上的实现方式：<br />
SELECT EMPNO,ENAME,SAL,(SELECT AVG(SAL) FROM EMPLOYEE WHERE DEPTNO=A.DEPTNO)<br />
FROM EMPLOYEE A<br />
WHERE SAL&gt;(SELECT AVG(SAL) FROM EMPLOYEE WHERE DEPTNO=A.DEPTNO);<br />
存在的相关子查询越多，速度越慢。</p>
<p>试验：<br />
查询高于所在部门平均工资的职工编号、<br />
姓名、工资，所在部门的平均工资，以及高出多少钱。</p>
<p>SELECT A.ENAME,A.SAL,B.SAL,A.SAL-B.SAL<br />
FROM EMPLOYEE A,(SELECT DEPTNO,AVG(SAL) SAL FROM EMPLOYEE GROUP BY DEPTNO) B<br />
WHERE A.DEPTNO=B.DEPTNO<br />
AND A.SAL &gt; B.SAL;</p>
<p>IN，EXISTS<br />
NOT IN, NOT EXISTS<br />
SELECT ...<br />
FROM ...<br />
WHERE EXIST(SUB QUERY)<br />
当SUB QUERY有记录返回，则EXIST(SUB QUERY)返回真，否则返回假</p>
<p>试验：<br />
分别用IN和EXISTS查询谁在NEW YORK工作<br />
SELECT * <br />
FROM EMPLOYEE A<br />
WHERE EXISTS (SELECT 1 FROM DEPT WHERE LOC='NEW YORK' AND DEPTNO=A.DEPTNO);</p>
<p>SELECT *<br />
FROM EMPLOYEE<br />
WHERE DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC='NEW YORK');</p>
<p>分别用NOT IN和NOT EXISTS查询谁不在NEW YORK工作</p>
<p>SELECT * <br />
FROM EMPLOYEE A<br />
WHERE NOT EXISTS (SELECT 1 FROM DEPT WHERE LOC='NEW YORK' AND DEPTNO=A.DEPTNO);</p>
<p>SELECT *<br />
FROM EMPLOYEE<br />
WHERE DEPTNO NOT IN (SELECT DEPTNO FROM DEPT WHERE LOC='NEW YORK');</p>
<p>&nbsp;</p>
<p>连接 &gt; 非相关子查询 &gt; 相关子查询<br />
连接 &gt; IN &gt; EXISTS</p>
<p>当主查询或子查询的列中中有空值存在的话,<br />
使用NOT IN会返回错误的结果，这时应该使用NOT EXISTS，<br />
也就是说NOT EXISTS比NOT IN要安全。</p>
<p>=================================<br />
WITH <br />
=================================<br />
练习：<br />
查询各部门工资最高的职工的编号，姓名，工资，所在部门最低工资，所在部门的平均工资<br />
效率低：<br />
WITH<br />
A AS (SELECT DEPTNO,AVG(SAL) ASAL FROM EMPLOYEE GROUP BY DEPTNO),<br />
B AS (SELECT DEPTNO,MIN(SAL) BSAL FROM EMPLOYEE GROUP BY DEPTNO),<br />
C AS (SELECT DEPTNO,MAX(SAL) CSAL FROM EMPLOYEE GROUP BY DEPTNO)<br />
SELECT E.EMPNO,E.ENAME,E.SAL,A.ASAL,B.BSAL<br />
FROM EMPLOYEE E,A,B,C<br />
WHERE E.DEPTNO=A.DEPTNO<br />
AND E.DEPTNO=B.DEPTNO<br />
AND E.DEPTNO=C.DEPTNO<br />
AND E.SAL=C.CSAL;</p>
<p>效率高：<br />
WITH B AS (SELECT DEPTNO,MAX(SAL) MSAL,MIN(SAL) NSAL,AVG(SAL)ASAL FROM EMPLOYEE GROUP BY DEPTNO)<br />
SELECT A.EMPNO,A.ENAME,A.SAL,B.NSAL,B.ASAL<br />
FROM EMPLOYEE A,B<br />
WHERE A.DEPTNO=B.DEPTNO<br />
AND A.SAL=B.MSAL;</p>
<p>=================================<br />
INDEX<br />
=================================<br />
试验：<br />
在employee表的SAL列上创建一个索引，然后查询工资是1000的职工<br />
SQL&gt;CREATE INDEX IDX_SAL ON EMPLOYEE(SAL);<br />
SQL&gt;<br />
观察执行方案是否使用了索引，记录查询的时间<br />
SQL&gt;SELECT /*+NO_INDEX(EMPLOYEE) */ * FROM EMPLOYEE WHERE SAL=1000;</p>
<p>当（查询结果行数/表中所有行数）&lt; 10% 时，使用索引很可能会改善查询速度<br />
当（查询结果行数/表中所有行数）&gt; 10% 时，使用索引不会改善查询速度<br />
如果查询的结果列是索引列的话，那么使用索引一定会提高查询速度。</p>
<p>&nbsp;假设索引建立在(A,B,C)列上</p>
<p>&nbsp;考虑以下语句能够利用此索引提高查询速度</p>
<p>&nbsp; SELECT * FROM T1 WHERE A=? AND B=? AND C=?<br />
&nbsp; SELECT * FROM T1 WHERE A=? AND B=? <br />
&nbsp; SELECT * FROM T1 WHERE A=? <br />
&nbsp; SELECT * FROM T1 WHERE B=? AND C=? AND A=?<br />
&nbsp; SELECT * FROM T1 WHERE A=? AND C=?<br />
&nbsp; SELECT * FROM T1 WHERE B=? AND C=?&nbsp;不能利用索引提高查询速度<br />
&nbsp; SELECT * FROM T1 WHERE A=? AND D=?<br />
&nbsp; SELECT * FROM T1 WHERE C=?&nbsp;不能利用索引提高查询速度</p>
<p>&nbsp; 综上，只有当A类出现的时候才会利用索引提高查询速度。</p>
<p>试验：<br />
在SAL列上创建索引IDX_SAL，<br />
在SAL，DERGEE列上创建索引IND_SAL_DEGREE，<br />
然后让以下语句分别使用上述两个索引，比较区别。<br />
SELECT * FROM EMPLOYEE WHERE SAL=1000;<br />
SELECT * FROM EMPLOYEE WHERE DERGEE=3;</p>
<p>强制使用索引：<br />
SELECT /*+INDEX(表名 索引名) */ * FROM 表名 WHERE ......</p>
<p>试验：<br />
在SAL，DEGREE，ID_NO列上创建一个索引，<br />
执行以下查询，并强制使用这个索引<br />
SELECT * <br />
FROM EMPLOYEE <br />
WHERE SAL=1000<br />
AND DEGREE=1;</p>
<p>SELECT * FROM EMPLOYEE<br />
WHERE SAL=1000<br />
AND ID_NO&gt;210101197200000000<br />
&nbsp;<br />
SELECT * FROM EMPLOYEE<br />
WHERE DEGREE=1<br />
AND ID_NO&gt;210101197200000000</p>
<p>可以利用索引进行排序已提高排序的速度，当然了这时因空间换效率的方法，<br />
因为索引是需要占用空间的。<br />
当使用ORDER BY进行排序，性能比较低的时候，可以使用将排序列建索引的方法来提高性能，<br />
因为索引是排好序的。</p>
<p># 索引必须跟标存放在不同的表空间上，是为了防止争用最大化读写硬盘的效率。<br />
创建索引的方法：<br />
CREATE INDEX 索引名 ON 表名(字段名1,字段名2,...);<br />
TABLESPACE 表空间名</p>
<p>移动索引至新的表空间中的方法：<br />
ALTER INDEX 索引名 REBUILD TABLESPACE 表空间名;</p>
<p><br />
ALTER TABLE EMP ADD CONSTRANT PK_EMP PRIMARY KEY(EMPNO);</p>
<p><br />
SQL&gt;EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','EMPLOYEE',METHOD_OPT=&gt;'FOR COLUMS SIZE 10 SAL');<br />
DBMS_STAS是个包<br />
GATHER_TABLE_STATS其参数为以下：</p>
<p>SQL&gt;DESC DBMS_STATS;<br />
PROCEDURE GATHER_TABLE_STATS<br />
参数名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入/输出默认值？<br />
------------------------------ ----------------------- ------ --------<br />
&nbsp;OWNNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN<br />
&nbsp;TABNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN<br />
&nbsp;PARTNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT<br />
&nbsp;ESTIMATE_PERCENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT<br />
&nbsp;BLOCK_SAMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOLEAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT<br />
&nbsp;METHOD_OPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT<br />
&nbsp;DEGREE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT<br />
&nbsp;GRANULARITY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT<br />
&nbsp;CASCADE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOLEAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT<br />
&nbsp;STATTAB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT<br />
&nbsp;STATID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT<br />
&nbsp;STATOWN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT<br />
&nbsp;NO_INVALIDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOLEAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; DEFAULT</p>
<p>搜集分析资料(改善优化器的数据来源)：<br />
SQL&gt;ANALYZE TABLE EMPLOYEE COMPUTE STATISTICS;</p>
<p>删除分析资料：<br />
SQL&gt;ANALYZE TABLE EMPLOYEE DELETE STATISTICS;</p>
<p>&nbsp;索引&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; 1)索引与全表扫描相比<br />
&nbsp;&nbsp;&nbsp;&nbsp; 当查询返回的行的数量与表中行的总数相比<br />
&nbsp;&nbsp;&nbsp;&nbsp; 比例较低时（至少低于10%），<br />
&nbsp;&nbsp;&nbsp;&nbsp; 索引方式比全表扫描方式快</p>
<p>&nbsp;&nbsp; 2）有时优化器对索引的选择是错误的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （全表扫描快时，优化器选择的是索引方式)</p>
<p>&nbsp;&nbsp; 3) 多列复合索引，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果从前向后按顺序使用索引中的列<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就有可能利用索引提高速度</p>
<p>&nbsp;&nbsp;&nbsp; 4）如果语句中，只出现和返回被索引列，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 则使用索引的速度一般是最快的</p>
<p>&nbsp;&nbsp;&nbsp; 5）索引和表应该存放在不同的表空间<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样就有可能减少竞争，最大化两者的IO性能</p>
<p>&nbsp;&nbsp;&nbsp; 6) 主键约束上自动创建的唯一索引，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 应该放在和表不同的表空间上</p>
<p>=================================<br />
大纲对象&nbsp; OUTLINE<br />
=================================<br />
如何针对性地进行优化，而在以后再修改优化方案的时候不需要修改源代码？以下：<br />
方案：大纲对象&nbsp;OUTLINE</p>
<p>1.准备工作；<br />
SQL&gt;CONN / AS SYSDBA<br />
创建用户：<br />
SQL&gt;CREATE USER USER_NAME IDENTIFIED BY PASSWD;<br />
修改用户的默认表空间：<br />
SQL&gt;ALTER USER USER_NAME DEFAULT TABLESPACE TABLESPACE_NAME;<br />
a.准备一个用来存放大纲数据的表空间<br />
SQL&gt;CONN / AS SYSDBA<br />
SQL&gt;SELECT NAME FROM V$DATAFILE;<br />
SQL&gt;CREATE TABLESPACE OL_TS DATAFILE 'D:\ORACLE\ORADATA\ORA\OL_TS01.DBF' SIZE 100M;<br />
SQL&gt;SELECT NAME FROM V$DATAFILE;<br />
b.将OUTLN帐户的默认表空间设置为这个新建的表空间<br />
SQL&gt;ALTER USER OUTLN DEFAULT TABLESPACE OL_TS;<br />
c.运行脚本dbmsol.sql<br />
d.将OUTLN帐户解锁：<br />
SQL&gt;CONN / AS SYSDBA<br />
SQL&gt;ALTER USER OUTLN ACCOUNT UNLOCK;</p>
<p>2.如何创建大纲，来存储某个语句的当前执行方案<br />
将创建大纲的权限授权给SCOTT：<br />
SQL&gt;GRANT CREATE ANY OUTLINE TO SCOTT</p>
<p>在SCOTT帐户下，为某个特定的语句创建大纲：<br />
SQL&gt;CREATE OUTLINE OL ON SELECT * FROM EMPLOYEE WHERE SAL=1000;</p>
<p>3.如何使用大纲中的存储的方案<br />
全局启用：<br />
SQL&gt;ALTER SYSTEM SET USE_STORED_OUTLINES=TRUE；<br />
当前会话启用：<br />
SQL&gt;ALTER SESSION SET USE_STORED_OUTLINES=TRUE;</p>
<p>4.如何篡改大纲中的存储方案<br />
如果创建了两个大纲：<br />
CREATE OUTLINE OL ON SELECT * FROM EMPLOYEE WHERE SAL=1000;<br />
CREATE OUTLINE OL2 ON SELECT /*+INDEX(EMPLOYEE IND_EMPLOYEE_SAL) */ * FROM EMPLOYEE WHERE SAL=1000;</p>
<p>如何查看目前存在的大纲：<br />
SQL&gt;CONN OUTLN/OUTLN<br />
SQL&gt;SELECT OL_NAME,SQL_TEXT,TEXTLEN,SIGNATURE,HASH_VALUE,HASH_VALUE2,HINTCOUNT FROM OL$;</p>
<p>删除大纲的方法：<br />
SQL&gt;DROP OUTLINE 大纲名;</p>
<p><br />
==========================<br />
分组<br />
==========================</p>
<p>练习：<br />
使用ROLLUP对EMPLOYEE表的SAL,DEGREE列作多重分组<br />
ROLLUP 结果中含有汇总行<br />
SQL&gt; SELECT SAL,DEGREE, COUNT(*) FROM EMPLOYEE GROUP BY ROLLUP (SAL,DEGREE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAL&nbsp;&nbsp;&nbsp;&nbsp; DEGREE&nbsp;&nbsp; COUNT(*)<br />
---------- ---------- ----------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 157287<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 52429<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 52428<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 262144&nbsp;汇总行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 194715<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 52428<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 247143&nbsp;汇总行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 157287<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 52428<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 52429<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 262144&nbsp;汇总行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 262144&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 262144&nbsp;汇总行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;汇总行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000&nbsp;汇总行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10000&nbsp;汇总行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1048576&nbsp;汇总行</p>
<p>使用GRUPING(列名），可以表示出那行记录是自己加进来的，而不是原有记录<br />
SQL&gt; SELECT SAL,DEGREE, COUNT(*),GROUPING(DEGREE) FROM EMPLOYEE GROUP BY ROLLUP (SAL,DEGREE);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAL&nbsp;&nbsp;&nbsp;&nbsp; DEGREE&nbsp;&nbsp; COUNT(*) GROUPING(DEGREE)<br />
---------- ---------- ---------- ----------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 157287&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 52429&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 52428&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 262144&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;是加进来的汇总记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 194715&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 52428&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 247143&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;是加进来的汇总记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 157287&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 52428&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 52429&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 262144&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;是加进来的汇总记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 262144&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 262144&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;是加进来的汇总记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;是加进来的汇总记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;是加进来的汇总记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;是加进来的汇总记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1048576&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;是加进来的汇总记录</p>
<p>===========<br />
CUBE<br />
===========<br />
SELECT ... FROM T1 GROUP BY CUBE(A,B,C,D);<br />
相当于：<br />
&nbsp;...GROUP BY A,B,C,D<br />
+...GROUP BY A,B,C<br />
+...GROUP BY A,B<br />
+...GROUP BY A<br />
+...GROUP BY B,C,D<br />
+...GROUP BY B,C<br />
+...GROUP BY B<br />
+...GROUP BY C,D<br />
+...GROUP BY C<br />
+...GROUP BY D<br />
+...GROUP BY ()</p>
<p>练习：<br />
使用CUBE对EMPLOYEE表的SAL,DEGREE列作多重分组<br />
SQL&gt; SELECT SAL,DEGREE,GROUPING(DEGREE),COUNT(*),SUM(SAL) FROM EMPLOYEE GROUP BY CUBE(SAL,DEGREE);</p>
<p>======<br />
GROUPING SETS((...),(..),(...),...,())<br />
======<br />
练习：<br />
使用GROUPING SETS在一个语句中同时查询出：<br />
各种工资的职工工人数和工资总额<br />
各种学位的职工人数和工资总额<br />
每个部门每种学位的职工人数和工资总额<br />
每个部门工资的职工人数和工资总额<br />
全体人数和工资总额<br />
SELECT DEPTNO,SAL,DEGREE,COUNT(*),SUM(SAL)<br />
FROM EMPLOYEE<br />
GROUP BY GROUPING SETS((SAL),(DEGREE),(DEPTNO,DEGREE),(DEPTNO,SAL),());</p>
<p>&nbsp;</p>
<p>========================================<br />
实体化视图 MATERALIZED VIEW<br />
========================================<br />
实体化视图与普通视图的区别：<br />
普通视图是个虚表，相当一个子查询<br />
实体化视图是将运算结果预先放到实体化视图表中了</p>
<p>CREATE OR REPLACE VIEW 视图名 AS 查询<br />
SQL&gt;CREATE OR REPLACE VIEW V_A AS SELECT SUM(SAL) SS FROM EMPLOYEE;</p>
<p>CREATE MATERIALIZED VIEW 实体化视图名 AS 查询<br />
首先要给用户作CREATE MATERIALIZED VIEW的权限：<br />
SQL&gt;GRANT CREATE MATERIALIZED VIEW TO SCOTT<br />
创建实体化视图：<br />
SQL&gt;CREATE MATERIALIZED VIEW MV_A SA SELECT SUM(SAL) FROM EMPLOYEE;</p>
<p>练习：<br />
创建一个实体化视图，查询所有部门编号，人数和工资总额<br />
然后比较从这个实体化视图上查询数据的速度和从表上查询数据的速度<br />
SQL&gt;CREATE MATERIALIZED VIEW MV_1 AS SELECT DEPTNO,COUNT(*),SUM(SAL) FROM EMPLOYEE GROUP BY DEPTNO;</p>
<p>因为实体化视图是将运算结果预先放到实体化视图表中，<br />
所以实体化视图中的数据在不同的时刻可能会是旧数据<br />
那么就需要对实体化视图进行刷新<br />
a.手动刷新<br />
SQL&gt;EXEC DBMS_MVIEW.REFRESH('实体化视图名');<br />
b.自动刷新<br />
首先在表的列上，建立实体化视图日志对象，用来监视表中列值的变化<br />
CREATE MATERIALIZED VIEW LOG ON 表名<br />
WITH(列名列表),ROWID INCLUDING NEW VALUES;</p>
<p>CREATE MATERIALIZED VIEW LOG ON EMPLOYEE<br />
WITH(SAL), ROWID INCLUDING NEW VALUES;<br />
创建实体化视图，并且加入自动刷新选项<br />
CREATE MATERIALIZED VIEW 实体化视图名<br />
REFRESH FAST ON COMMIT<br />
AS 查询;<br />
#FAST方式不支持UPDATE。<br />
或<br />
CREATE MATERIALIZED VIEW 实体化视图名<br />
REFRESH COMPLETE ON COMMIT<br />
AS 查询;</p>
<p><br />
删实体化视图的方法:<br />
DROP MATERIALIZED VIEW 实体化视图名</p>
<p>===================<br />
查询重写技术 QUERY REWRITE<br />
===================<br />
作用：<br />
当实体化视图中的数据不准确时，Oracle会自动从表中进行查询<br />
当实体化视图中的数据准确时，Oracle会自动从实体化视图中进行查询。<br />
使用查询重写技术的步骤：<br />
a.实体化视图需要支持查询重写<br />
CREATE MATERIALIZED VIEW 实体化视图名<br />
REFRESH COMPLETE ON COMMIT<br />
ENABLE QUERY REWRITE<br />
AS 查询;<br />
b.启用查询重写功能<br />
ALTER SYSTEM SET QUERY_REWRITE_ENABLED=TRUE;<br />
或<br />
ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE;</p>
<p>检查某查询语句查询重写是否启用，如果未启用是什么原因的方法：<br />
a.在当前帐户内运行以下脚本：<br />
SQL&gt;@%ORACLE_HOME%\RDBMS\ADMIN\UTLXRW.SQL<br />
b.执行过程：<br />
SQL&gt;EXEC DBMS_MVIEW.EXPLAIN_REWRITE('查询语句');<br />
c.执行查询：<br />
SQL&gt;SELECT * FROM REWRITE_TABLE; 获得信息</p>
<p><br />
=======================<br />
分布式查询<br />
=======================</p>
<p>数据库=控制文件，充作日志文件，数据文件三种文件逻辑集合</p>
<p>--------------------------<br />
DB LINK<br />
--------------------------<br />
三种方式：<br />
1、Connected user link<br />
CREATE PUBLIC DATABASE LINK 名字<br />
USING &#8216;网络服务名&#8217;;</p>
<p>SELECT * FROM <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#69;&#77;&#80;&#64;&#100;&#98;&#95;&#108;&#105;&#110;&#107;&#95;&#110;&#97;&#109;&#101;">EMP@db_link_name</a>;</p>
<p>2、Fixed user link<br />
CREATE PUBLIC DATABASE LINK 名字<br />
CONNECT TO username IDENTIFIED BY password&nbsp; <br />
USING &#8216;网络服务名&#8217;;</p>
<p>SELECT * FROM <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#69;&#77;&#80;&#64;&#100;&#98;&#95;&#108;&#105;&#110;&#107;&#95;&#110;&#97;&#109;&#101;">EMP@db_link_name</a>;</p>
<p>可以使用以下方式为<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#69;&#77;&#80;&#64;&#68;&#66;&#95;&#76;&#73;&#78;&#75;&#95;&#78;&#65;&#77;&#69;">EMP@DB_LINK_NAME</a>创建别名<br />
CREATE SYNONYM 别名 FRO <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#69;&#77;&#80;&#64;&#68;&#66;&#95;&#76;&#73;&#78;&#75;&#95;&#78;&#65;&#77;&#69;">EMP@DB_LINK_NAME</a><br />
创建后可以按如下方式使用：<br />
SELECT * FROM 别名;</p>
<p><br />
使用DB-Link的方式如果被连接的数据库提交失败(如出现网络故障)，会导致本地数据库挂起:<br />
ORA-01591：锁定以被有问题的分配事务1.37.1794挂起<br />
解决的方式：<br />
不能简单地使用[ROOLBACK]命令，而需要使用[rollback force '1.37.1794']命令。</p>
<p>&nbsp;</p>
<p>如何找到会话信息，并杀掉该会话：<br />
找：<br />
SQL&gt;DESC V$TRANSACTION<br />
SQL&gt;SELECT A.SID,A.SERIAL#,A.TERMINAL,A.USERNAME<br />
FROM V$SESSION A, V$TRANSACTION B<br />
WHERE A.SADDR=B.SES_ADDR</p>
<p>杀：<br />
ALTER SYSTEM KILL SESSION 'SID,SERIAL#'<br />
SQL&gt; ALTER SYSTEM KILL SESSION '12,49'</p>
<p>&nbsp;</p>
<p>=======================<br />
并行执行的SQL<br />
=======================</p>
<p>=======================<br />
DDL&amp;DML<br />
=======================<br />
使用外部表的步骤：<br />
a.创建DIRECTORY对象，该对象指向磁盘上的一个目录<br />
SQL&gt; GRANT CREATE ANY DIRECTORY TO SCOTT<br />
SQL&gt; CREATE DIRECTORY test_dir AS '磁盘上的目录'；</p>
<p>b.将格式化的文本文件放在这个目录中</p>
<p>c.创建外部表，在数据库内部映射这个文件的数据<br />
请参照PPT的P273</p>
<img src ="http://www.blogjava.net/pdw2009/aggbug/160953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2007-11-16 11:26 <a href="http://www.blogjava.net/pdw2009/archive/2007/11/16/160953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pl/sql文件操作</title><link>http://www.blogjava.net/pdw2009/archive/2007/09/05/142928.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Wed, 05 Sep 2007 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2007/09/05/142928.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/142928.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2007/09/05/142928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/142928.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/142928.html</trackback:ping><description><![CDATA[<p>要操作文件，必须先建立你所操作的文件目录<br />
<span style="color: #0000ff"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 70.82%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 25px; background-color: #eeeeee"><span style="color: #0000ff">CREATE</span><span style="color: #000000">&nbsp;DIRECTORY&nbsp;&nbsp;&nbsp;&nbsp;peidw &nbsp;&nbsp;</span><span style="color: #0000ff">AS </span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'/tmp/peidw</span><span style="color: #ff0000">'</span><span style="color: #000000">;</span></div>
<br />
下面代码是读取并遍历一个文件<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">procedure</span><span style="color: #000000">&nbsp;createdatafile&nbsp;<br />
</span><span style="color: #0000ff">as</span><span style="color: #000000"><br />
<br />
&nbsp;file_handle2&nbsp;UTL_FILE.FILE_TYPE;<br />
&nbsp;data_line&nbsp;</span><span style="font-weight: bold; color: #000000">varchar2</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">80</span><span style="color: #000000">);<br />
</span><span style="color: #0000ff">begin</span><span style="color: #000000"><br />
&nbsp;&nbsp;file_handle2:</span><span style="color: #808080">=</span><span style="color: #000000">UTL_FILE.fopen(</span><span style="color: #ff0000">'</span><span style="color: #ff0000">PEIDW</span><span style="color: #ff0000">'</span><span style="color: #000000">,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">t.txt</span><span style="color: #ff0000">'</span><span style="color: #000000">,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">r</span><span style="color: #ff0000">'</span><span style="color: #000000">);<br />
&nbsp;&nbsp;loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">begin</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utl_file.get_line(file_handle2,data_line);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(data_line);<br />
&nbsp;&nbsp;&nbsp;&nbsp;exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">when</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;no_data_found&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000">;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000">&nbsp;loop;<br />
&nbsp;&nbsp;dbms_output.put_line(</span><span style="color: #ff0000">'</span><span style="color: #ff0000">OK</span><span style="color: #ff0000">'</span><span style="color: #000000">);<br />
&nbsp;&nbsp;utl_file.fclose(file_handle2);<br />
</span><span style="color: #0000ff">end</span><span style="color: #000000">&nbsp;createdatafile;</span></div>
</span>写入的方法也差不多，使用utl_file.output()等方法<br />
select name||chr(9)||'cc'||chr(10)||'dd' cname&nbsp; from tt_job<br />
chr(9),是tab键编码<br />
char(10)，换行的编码<br />
用于生成CVS文件挺方便
<img src ="http://www.blogjava.net/pdw2009/aggbug/142928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2007-09-05 16:32 <a href="http://www.blogjava.net/pdw2009/archive/2007/09/05/142928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle临时表</title><link>http://www.blogjava.net/pdw2009/archive/2007/06/20/125383.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Wed, 20 Jun 2007 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2007/06/20/125383.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/125383.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2007/06/20/125383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/125383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/125383.html</trackback:ping><description><![CDATA[在Oracle8i或以上版本中，可以创建以下两种临时表： <br>1。会话特有的临时表 <br>&nbsp;&nbsp;&nbsp;&nbsp;CREATE GLOBAL TEMPORARY &lt;TABLE_NAME&gt; (&lt;column specification&gt;) <br>&nbsp;&nbsp;&nbsp;&nbsp;ON COMMIT PRESERVE ROWS； <br>&nbsp;&nbsp;<br>2。事务特有的临时表 <br>&nbsp;&nbsp;&nbsp;&nbsp;CREATE GLOBAL TEMPORARY &lt;TABLE_NAME&gt; (&lt;column specification&gt;) <br>&nbsp;&nbsp;&nbsp;&nbsp;ON COMMIT DELETE ROWS； <br>&nbsp;&nbsp; CREATE GLOBAL TEMPORARY TABLE MyTempTable <br>所建的临时表虽然是存在的，但是你试一下insert 一条记录然后用别的连接登上去select，记录是空的，明白了吧，我把下面两句话再贴一下： <br>--ON COMMIT DELETE ROWS 说明临时表是事务指定，每次提交后ORACLE将截断表（删除全部行） <br>--ON COMMIT PRESERVE ROWS 说明临时表是会话指定，当中断会话时ORACLE将截断表。 <br>冲突的问题更本不用考虑. <br>&nbsp;&nbsp;<br>临时表只是保存当前会话(session)用到的数据，数据只在事务或会话期间存在。 <br>&nbsp;&nbsp;<br>通过CREATE GLOBAL TEMPORARY TABLE命令创建一个临时表，对于事务类型的临时表， <br>数据只是在事务期间存在，对于会话类型的临时表，数据在会话期间存在。 <br>&nbsp;&nbsp;<br>会话的数据对于当前会话私有。每个会话只能看到并修改自己的数据。DML锁不会加到 <br>临时表的数据上。下面的语句控制行的存在性。 <br>&nbsp;&nbsp; <br>● ON COMMIT DELETE ROWS 表名行只是在事务期间可见 <br>● ON COMMIT PRESERVE ROWS 表名行在整个会话期间可见 <br>&nbsp;&nbsp;<br>可以对临时表创建索引，视图，出发器，可以用export和import工具导入导出表的 <br>定义，但是不能导出数据。表的定义对所有的会话可见。<br><br><br>Temporary Tables临时表<br>1简介<br>&nbsp;&nbsp; ORACLE数据库除了可以保存永久表外，还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据，<br>&nbsp;&nbsp; 或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候，临时表的数据自动清空，<br>&nbsp;&nbsp; 但是临时表的结构以及元数据还存储在用户的数据字典中。<br>&nbsp;&nbsp; 临时表只在oracle8i以及以上产品中支持。<br>2详细介绍<br>&nbsp;&nbsp; Oracle临时表分为 会话级临时表 和 事务级临时表。<br>会话级临时表是指临时表中的数据只在会话生命周期之中存在，当用户退出会话结束的时候，Oracle自动清除临时表中数据。<br>事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束（commit or rollback），Oracle自动清除临时表中数据。<br>临时表中的数据只对当前Session有效，每个Session都有自己的临时数据，并且不能访问其它Session的临时表中的数据。因此，<br>临时表不需要DML锁.当一个会话结束(用户正常退出 用户不正常退出 ORACLE实例崩溃)或者一个事务结束的时候，Oracle对这个会话的<br>表执行 TRUNCATE 语句清空临时表数据.但不会清空其它会话临时表中的数据.<br>你可以索引临时表和在临时表基础上建立视图.同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效.&nbsp;&nbsp;<br>临时表可以拥有触发器.<br>3建立临时表<br>&nbsp;&nbsp; 临时表的定义对所有会话SESSION都是可见的,但是表中的数据只对当前的会话或者事务有效. <br>&nbsp;&nbsp; 建立方法:<br>1) ON COMMIT DELETE ROWS 定义了建立事务级临时表的方法.<br>CREATE GLOBAL TEMPORARY TABLE admin_work_area<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(startdate DATE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enddate DATE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class CHAR(20))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ON COMMIT DELETE ROWS;<br>EXAMPLE:<br>SQL&gt; CREATE GLOBAL TEMPORARY TABLE admin_work_area<br>&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(startdate DATE,<br>&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enddate DATE,<br>&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class CHAR(20))<br>&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ON COMMIT DELETE ROWS;<br>SQL&gt; create table permernate( a number);<br>SQL&gt; insert into admin_work_area values(sysdate,sysdate,'temperary table');<br>SQL&gt; insert into permernate values(1);<br>SQL&gt; commit;<br>SQL&gt; select * from admin_work_area;<br>SQL&gt; select&nbsp;&nbsp;* from permernate;<br>A<br>1<br>2)ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法.<br>CREATE GLOBAL TEMPORARY TABLE admin_work_area<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(startdate DATE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enddate DATE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class CHAR(20))<br>&nbsp;&nbsp;&nbsp;&nbsp; ON COMMIT PRESERVE ROWS;<br>EXAMPLE:<br><br>会话1:<br>SQL&gt; drop table admin_work_area;<br>SQL&gt; CREATE GLOBAL TEMPORARY TABLE admin_work_area<br>&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(startdate DATE,<br>&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enddate DATE,<br>&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class CHAR(20))<br>&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON COMMIT PRESERVE ROWS;<br>SQL&gt; insert into permernate values(2);<br>SQL&gt; insert into admin_work_area values(sysdate,sysdate,'session temperary');<br>SQL&gt; commit;<br>SQL&gt; select * from permernate;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A<br>----------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br><br>SQL&gt; select * from admin_work_area;<br><br>STARTDATE&nbsp;&nbsp;ENDDATE&nbsp;&nbsp;&nbsp;&nbsp;CLASS<br>---------- ---------- --------------------<br>17-1?? -03 17-1?? -03 session temperary<br><br>会话2:<br><br>SQL&gt; select * from permernate;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A<br>----------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br><br>SQL&gt; select * from admin_work_area;<br><br>未选择行.<br><br>会话2看不见会话1中临时表的数据.<br>
<img src ="http://www.blogjava.net/pdw2009/aggbug/125383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2007-06-20 17:34 <a href="http://www.blogjava.net/pdw2009/archive/2007/06/20/125383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle hints30种用法</title><link>http://www.blogjava.net/pdw2009/archive/2007/05/21/118974.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Mon, 21 May 2007 12:18:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2007/05/21/118974.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/118974.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2007/05/21/118974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/118974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/118974.html</trackback:ping><description><![CDATA[1. /*+ALL_ROWS*/<br>　　表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.<br>　　例如:<br>　　SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; <br>　　2. /*+FIRST_ROWS*/<br>　　表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.<br>　　例如:<br>　　SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
<p>　　3. /*+CHOOSE*/<br>　　表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;<br>　　表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;<br>　　例如:<br>　　SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';</p>
<p>　　4. /*+RULE*/<br>　　表明对语句块选择基于规则的优化方法.<br>　　例如:<br>　　SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; </p>
<p>　　5. /*+FULL(TABLE)*/<br>　　表明对表选择全局扫描的方法.<br>　　例如:<br>　　SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';</p>
<p>　　6. /*+ROWID(TABLE)*/<br>　　提示明确表明对指定表根据ROWID进行访问.<br>　　例如:<br>　　SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID&gt;='AAAAAAAAAAAAAA'<br>　　AND EMP_NO='SCOTT';</p>
<p>　　7. /*+CLUSTER(TABLE)*/ <br>　　提示明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效.<br>　　例如:<br>　　SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS<br>　　WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;</p>
<p>　　8. /*+INDEX(TABLE INDEX_NAME)*/<br>　　表明对表选择索引的扫描方法.<br>　　例如:<br>　　SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';</p>
<p>　　9. /*+INDEX_ASC(TABLE INDEX_NAME)*/<br>　　表明对表选择索引升序的扫描方法.<br>　　例如:<br>　　SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';</p>
<p>　　10. /*+INDEX_COMBINE*/<br>　　为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的布尔组合方式.<br>　　例如:<br>　　SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS<br>　　WHERE SAL&lt;5000000 AND HIREDATE </p>
<p>　　11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/<br>　　提示明确命令优化器使用索引作为访问路径.<br>　　例如:<br>　　SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE<br>　　FROM BSEMPMS WHERE SAL&lt;60000;</p>
<p>　　12. /*+INDEX_DESC(TABLE INDEX_NAME)*/<br>　　表明对表选择索引降序的扫描方法.<br>　　例如:<br>　　SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';</p>
<p>　　13. /*+INDEX_FFS(TABLE INDEX_NAME)*/<br>　　对指定的表执行快速全索引扫描,而不是全表扫描的办法.<br>　　例如:<br>　　SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305';</p>
<p>　　14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/<br>　　提示明确进行执行规划的选择,将几个单列索引的扫描合起来.<br>　　例如:<br>　　SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='SCOTT' AND DPT_NO='TDC306';</p>
<p>　　15. /*+USE_CONCAT*/<br>　　对查询中的WHERE后面的OR条件进行转换为UNION ALL的组合查询.<br>　　例如:<br>　　SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';</p>
<p>　　16. /*+NO_EXPAND*/<br>　　对于WHERE后面的OR 或者IN-LIST的查询语句,NO_EXPAND将阻止其基于优化器对其进行扩展.<br>　　例如:<br>　　SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';</p>
<p>　　17. /*+NOWRITE*/<br>　　禁止对查询块的查询重写操作.</p>
<p>　　18. /*+REWRITE*/<br>　　可以将视图作为参数.</p>
<p>　　19. /*+MERGE(TABLE)*/<br>　　能够对视图的各个查询进行相应的合并.<br>　　例如:<br>　　SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO<br>　　,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO<br>　　AND A.SAL&gt;V.AVG_SAL;</p>
<p>　　20. /*+NO_MERGE(TABLE)*/<br>　　对于有可合并的视图不再合并.<br>　　例如:<br>　　SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL&gt;V.AVG_SAL;</p>
<p>　　21. /*+ORDERED*/<br>　　根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接.<br>　　例如:<br>　　SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;</p>
<p>　　22. /*+USE_NL(TABLE)*/<br>　　将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.<br>　　例如:<br>　　SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;</p>
<p>　　23. /*+USE_MERGE(TABLE)*/<br>　　将指定的表与其他行源通过合并排序连接方式连接起来.<br>　　例如:<br>　　SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;</p>
<p>　　24. /*+USE_HASH(TABLE)*/<br>　　将指定的表与其他行源通过哈希连接方式连接起来.<br>　　例如:<br>　　SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;</p>
<p>　　25. /*+DRIVING_SITE(TABLE)*/<br>　　强制与ORACLE所选择的位置不同的表进行查询执行.<br>　　例如:<br>　　SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;</p>
<p>　　26. /*+LEADING(TABLE)*/<br>　　将指定的表作为连接次序中的首表.</p>
<p>　　27. /*+CACHE(TABLE)*/<br>　　当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端<br>　　例如:<br>　　SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;</p>
<p>　　28. /*+NOCACHE(TABLE)*/<br>　　当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端<br>　　例如:<br>　　SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;</p>
<p>　　29. /*+APPEND*/<br>　　直接插入到表的最后,可以提高速度.<br>　　insert /*+append*/ into test1 select * from test4 ;</p>
<p>　　30. /*+NOAPPEND*/<br>　　通过在插入语句生存期内停止并行模式来启动常规插入.<br>　　insert /*+noappend*/ into test1 select * from test4 ;<br></p>
<img src ="http://www.blogjava.net/pdw2009/aggbug/118974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2007-05-21 20:18 <a href="http://www.blogjava.net/pdw2009/archive/2007/05/21/118974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows下oracle启动和关闭的的脚本</title><link>http://www.blogjava.net/pdw2009/archive/2007/04/14/110614.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Sat, 14 Apr 2007 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2007/04/14/110614.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/110614.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2007/04/14/110614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/110614.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/110614.html</trackback:ping><description><![CDATA[<p>启动oracle的bat <br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">@echo&nbsp;Starting&nbsp;Oracle&nbsp;Service<br>net&nbsp;start&nbsp;OracleOraHome90TNSListener<br>net&nbsp;start&nbsp;OracleServiceORA<br>net&nbsp;start&nbsp;OracleOraHome90Agent<br><br>set&nbsp;ORACLE_SID</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ora<br>sqlplus&nbsp;/nolog&nbsp;@start.sql</span></div>
在该文件中调用了start.sql，start.sql文件内容如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">connect&nbsp;sys/</span><span style="COLOR: #000000">123456</span><span style="COLOR: #000000">&nbsp;as&nbsp;sysdba<br>startup<br>exit</span><span style="COLOR: #008000">;</span></div>
<br>关闭oracle服务<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">@echo&nbsp;Stoping&nbsp;Oracle&nbsp;Service&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"><br>set&nbsp;ORACLE_SID</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ora<br>sqlplus&nbsp;/nolog&nbsp;@stop.sql<br>net&nbsp;Stop&nbsp;OracleOraHome90Agent<br>net&nbsp;Stop&nbsp;OracleServiceORA<br>net&nbsp;Stop&nbsp;OracleOraHome90TNSListener</span></div>
要调用的脚本<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">connect&nbsp;sys/</span><span style="COLOR: #000000">123456</span><span style="COLOR: #000000">&nbsp;as&nbsp;sysdba<br>shutdown&nbsp;abort<br>exit</span><span style="COLOR: #008000">;</span></div>
<br>通过这几个文件来就可以方便的启动或关闭oracle了。
<img src ="http://www.blogjava.net/pdw2009/aggbug/110614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2007-04-14 10:58 <a href="http://www.blogjava.net/pdw2009/archive/2007/04/14/110614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql 语句中join和unicom的用法</title><link>http://www.blogjava.net/pdw2009/archive/2007/03/16/104308.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Fri, 16 Mar 2007 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2007/03/16/104308.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/104308.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2007/03/16/104308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/104308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/104308.html</trackback:ping><description><![CDATA[
		<h4 class="TextColor1" id="subjcns!f56cc60f5c102142!155" style="MARGIN-BOTTOM: 0px">SQL 中JOIN的用法(来自CSDN)</h4>
		<div id="msgcns!f56cc60f5c102142!155">
				<p style="TEXT-ALIGN: left" align="left">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">连接组合两个表中的字段记录，包括三种：</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">  </span>
						<span lang="EN-US" style="FONT-SIZE: 9.5pt; COLOR: #404040; FONT-FAMILY: Verdana">
						</span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">INNER JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">运算式：连接组合两个表中的字段记录。</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> </span>
						<span lang="EN-US" style="FONT-SIZE: 9.5pt; COLOR: #404040; FONT-FAMILY: Verdana">
						</span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">LEFT JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">运算式：连接组合两个表中的字段记录，并将包含了</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">LEFT JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">左边表中的全部记录。</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> </span>
						<span lang="EN-US" style="FONT-SIZE: 9.5pt; COLOR: #404040; FONT-FAMILY: Verdana">
						</span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">RIGHT JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">运算式：连接组合两个表中的字段记录，并将包含了</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">RIGHT JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">右边表中的全部记录。</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> </span>
						<span lang="EN-US" style="FONT-SIZE: 9.5pt; COLOR: #404040; FONT-FAMILY: Verdana">
						</span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">INNER JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">设定两个表相关联的运算式，以连接组合两个表中的字段记录。</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">  </span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">INNER JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">语法如下：</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">  </span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">FROM </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1 INNER JOIN </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2 ON </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1 </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">比较运算子</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2  </span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">两个表连接的字段，譬如</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> [</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1=</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2]</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">，必须具有相同的字段类型，但是字段名称不需要相同。</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">  </span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">例如，自动编号字段类型可以连接</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">Long </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">的字段类型，但是单精整数字段类型不能连接双精整数的字段类型。</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">  </span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">比较运算子可为</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">=</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">、</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">&lt;</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">、</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">&gt;</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">、</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">&lt;=</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">、</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">&gt;=</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">、或</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">&lt;&gt;</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">。</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">  </span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">连接的字段，不可以包含</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">MEMO</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段类型或</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">OLE</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">对象类型，否则会发生错误。</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">  </span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">在一个</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表达式中，可以连结多个</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">ON</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">子句：</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">  </span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">SELECT fields <br />FROM </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1 INNER JOIN </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2 <br />ON </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1 </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">比较运算子</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1 AND <br />ON </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2 </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">比较运算子</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2) OR <br />ON </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">3 </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">比较运算子</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">3)  </span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表达式中，可以为巢状式：</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">  </span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">SELECT fields <br />FROM </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1 INNER JOIN <br />(</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2 INNER JOIN [( ]</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">3 <br />[INNER JOIN [( ] </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">x [INNER JOIN ...)] <br />ON </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">3.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">3 </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">比较运算子</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">x.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">x)] <br />ON </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2 </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">比较运算子</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">3.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">3) <br />ON </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">1 </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">比较运算子</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> </span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">表</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2.</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">字段</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">2  </span>
				</p>
				<p style="TEXT-ALIGN: left" align="left">
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">在一个</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">INNER JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">中，可以包括巢状式的</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">LEFT JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">或</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">RIGHT JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">，但是在一个</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">LEFT JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">或</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">RIGHT JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">中不能包括巢状式的</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial">INNER JOIN</span>
						<span style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: 宋体">。</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #404040; FONT-FAMILY: Arial"> <br /><br /><br />==================================================<br /><font color="#000000" size="3">看一下一个查询的问题  <br />我有两张表  <br />tab1  <br />       字段  <br />       aID  <br />       bID  <br /> <br />tab2  <br />       字段  <br />       aID  <br />       bID  </font></span>
				</p>
				<p>
						<br />tab1中有记录：  <br />aID    bID  <br />as1    19  <br />as2    19  <br />as3    23  <br />as4    45  <br />tab2中有记录：  <br />aID    bID  <br />as2    19  <br />as3    19  <br />as4    19  </p>
				<p>
						<br />现在需要查找出两张表中bID相等的且bID=19的记录,应该是5条记录  <br />我用的方法是：  <br />方法1：select  tab1.aID,tab2.aID  from  tab1,tab2  where  tab1.bID=tab2.bID  and  tab2.bID=19  <br />方法2：select  tab1.aID,tab2.aID  from  tab1  join  tab2  on  tab1.bID=tab2.bID  where  tab1.bID=19  <br />上面两中方法选出的记录都是6条，为什么出这样的问题，应该怎么做呢？  <br />---------------------------------------------------------------  <br /> <br />select  *  form  tab1  where  bID=19  <br />union  all    <br />select  *  form  tab2  where  bID=19  <br /> <br /> <br />---------------------------------------------------------------  <br /> <br />create  table  tab1  <br />       (aID  char(10),  <br />       bID  char(10))  <br />go  <br /> <br />insert  into  tab1(aid,bid)  values('as1','19')  <br />insert  tab1  values('as2','19')  <br />insert  tab1  values('as3','38')  <br />insert  tab1  values('as4','45')  <br />go  <br />create  table  tab2  <br />       (aID  char(10),  <br />       bID  char(10))  <br />go  <br />go  <br />insert  tab2  values('as2','19')  <br />insert  tab2  values('as3','19')  <br />insert  tab2  values('as4','19')  <br />go  <br />select  *  from  tab1  <br /> <br />select  *  from  tab1  where  tab1.bid='19'union  all  select  *  from  tab2    where  tab2.bid='19'  <br /> <br /> <br />斑竹加的话：  <br />1、join  产生的是笛卡尔积。  <br />2、union  会排除重复的记录  <br />3、union  all  不会排除重复的记录  <br /> </p>
				<p> </p>
				<p>
						<span style="COLOR: #000000">union子句<br /><img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" />union操作符将两个查询结果合并为一个结果集。为连接查询合并两个表时：列的数日和顺序在查中必须一致；数据类型兼容<br /><img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" />语法：<br /><img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> 语句<br /><img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">union</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #ff0000">[</span>
						<span style="COLOR: #ff0000">all</span>
						<span style="COLOR: #ff0000">]</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> 语句<br /><img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" />注意：<br /><img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">1</span>
						<span style="COLOR: #000000">.union运算从最终结果集中删除重复记录，如想不删除重复记录使用all关键字<br /><img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">2</span>
						<span style="COLOR: #000000">.第一个select语句中不能用order by或compute子句，只能是最后一个select语名后用<br /></span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" />例：查询计算机系的学生式年龄不大于19岁的学习，按年龄倒排序<br /><img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">select</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> department </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> dept</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">computer</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #000000">;<br /><img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">union</span>
						<span style="COLOR: #000000">;<br /><img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff">select</span> </span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">from</span>
						<span style="COLOR: #000000"> student </span>
						<span style="COLOR: #0000ff">where</span>
						<span style="COLOR: #000000"> age</span>
						<span style="COLOR: #808080">&lt;=</span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">19</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">order</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">by</span>
						<span style="COLOR: #000000"> age </span>
						<span style="COLOR: #0000ff">desc</span>
						<span style="COLOR: #000000">
								<br />
						</span>
				</p>
		</div>
<img src ="http://www.blogjava.net/pdw2009/aggbug/104308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2007-03-16 17:04 <a href="http://www.blogjava.net/pdw2009/archive/2007/03/16/104308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle作业例子</title><link>http://www.blogjava.net/pdw2009/archive/2007/02/09/99002.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Fri, 09 Feb 2007 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2007/02/09/99002.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/99002.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2007/02/09/99002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/99002.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/99002.html</trackback:ping><description><![CDATA[<font face=Verdana>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">sql</span> <span style="COLOR: #808080">&gt;</span> <span style="COLOR: #000000">variable&nbsp;jobno&nbsp;</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">number</span> <span style="COLOR: #000000">;<br>sql</span> <span style="COLOR: #808080">&gt;</span> <span style="COLOR: #0000ff">begin</span> <span style="COLOR: #000000"><br>sql</span> <span style="COLOR: #808080">&gt;</span> <span style="COLOR: #000000">DBMS_JOB.submit(:jobno,</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">pro_name();</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">,sysdate,</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">sysdate+1</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">);&nbsp;<br>&nbsp;dbms_job.submit(:job1,</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">MYPROC;</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">,sysdate,</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">sysdate+1/1440</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">);　　</span> <span style="COLOR: #008080">--</span> <span style="COLOR: #008080">每天1440分钟，即一分钟运行test过程一次</span> <span style="COLOR: #008080"><br></span><span style="COLOR: #000000">sql</span> <span style="COLOR: #808080">&gt;</span> <span style="COLOR: #0000ff">commit</span> <span style="COLOR: #000000">;<br>sql</span> <span style="COLOR: #808080">&gt;</span> <span style="COLOR: #0000ff">end</span> <span style="COLOR: #000000">;</span> </div>
<br><br><br><br>------------------------------------<br>在命令控制台中这样就可以建产一个作业了。sysdate表示当前作业将来执行的时间，sysdate+1表示调用频率。<br>&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">描述&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INTERVAL参数值&nbsp;<br>每天午夜12点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">TRUNC(SYSDATE&nbsp;+&nbsp;1)</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">&nbsp;<br>每天早上8点30分&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">TRUNC(SYSDATE&nbsp;+&nbsp;1)&nbsp;+&nbsp;（8*60+30）/(24*60)</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">&nbsp;<br>每星期二中午12点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">NEXT_DAY(TRUNC(SYSDATE&nbsp;),&nbsp;</span><span style="COLOR: #ff0000">''</span><span style="COLOR: #ff0000">TUESDAY</span><span style="COLOR: #ff0000">''</span><span style="COLOR: #ff0000">&nbsp;)&nbsp;+&nbsp;12/24</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">&nbsp;<br>每个月第一天的午夜12点&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">TRUNC(LAST_DAY(SYSDATE&nbsp;)&nbsp;+&nbsp;1)</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">&nbsp;<br>每个季度最后一天的晚上11点&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">TRUNC(ADD_MONTHS(SYSDATE&nbsp;+&nbsp;2/24,&nbsp;3&nbsp;),&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">Q</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">&nbsp;)&nbsp;-1/24</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">&nbsp;<br>每星期六和日早上6点10分&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">TRUNC(LEAST(NEXT_DAY(SYSDATE,&nbsp;</span><span style="COLOR: #ff0000">''</span><span style="COLOR: #ff0000">SATURDAY"),&nbsp;NEXT_DAY(SYSDATE,&nbsp;"SUNDAY")))&nbsp;+&nbsp;（6&#215;60+10）/（24&#215;60）</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">&nbsp;<br><br><br></span></div>
</font><font face=Verdana>select&nbsp;&nbsp; *&nbsp;&nbsp; from&nbsp;&nbsp; user_jobs<br>查询作业记录</font> <br><br><br>1．确保Oracle的工作模式允许启动任务队列管理器 <br>Oracle定时执行&#8220;Job Queue&#8221;的后台程序是SNP进程，而要启动SNP进程，首先要确保整个系统的模式是可以启动SNP进程的，这需要以DBA的身份去执行如下命令： <br>svrmgrl&gt;; alter system enable restricted session; <br>或sql&gt;; alter system disenable restricted session; <br>利用如上命令更改系统的会话方式为disenable restricted，为SNP的启动创造条件。 <br>2．确保Oracle的系统已经配置了任务队列管理器的启动参数 <br>SNP的启动参数位于Oracle的初始化文件中，该文件放在＄ORACLE_HOME/dbs路径下，如果Oracle的SID是myora8的话，则初始化文件就是initmyora8.ora，在文件中对SNP启动参数的描述部分如下： <br>job_queue_process=n <br>job_queue_interval=N <br>第一行定义SNP进程的启动个数为n。系统缺省值为0，正常定义范围为0～36，根据任务的多少，可以配置不同的数值。 <br>第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒，正常范围为1～3600秒。事实上，该进程执行完当前任务后，就进入睡眠状态，睡眠一段时间后，由系统的总控负责将其唤醒。 <br>如果该文件中没有上面两行，请按照如上配置添加。配置完成后，需要重新启动数据库，使其生效。注意：如果任务要求执行的间隔很短的话，N的配置也要相应地小一点。 <br>3．将任务加入到数据库的任务队列中 <br>调用Oracle的dbms_job包中的存储过程，将任务加入到任务队列中： <br>dbms_job.submit( job out binary_integer, <br>what　　　　　　　in　　　archar2, <br>next_date　　　 　in　　　date， <br>interval　　　　　in　　　varchar2, <br>no_parse　　　　　in　　　boolean) <br>其中： <br>●job：输出变量，是此任务在任务队列中的编号； <br>●what：执行的任务的名称及其输入参数； <br>●next_date：任务执行的时间； <br>●interval：任务执行的时间间隔。 <br>下面详细讨论一下dbms_job.submit中的参数interval。严格地讲，interval是指上一次执行结束到下一次开始执行的时间间隔，当interval设置为null时，该job执行结束后，就被从队列中删除。假如我们需要该job周期性地执行，则要用&#8216;sysdate＋m&#8217;表示。&nbsp; <br>将任务加入到任务队列之前，要确定执行任务的数据库用户，若用户是scott, 则需要确保该用户拥有执行包dbms_job的权限；若没有，需要以DBA的身份将权利授予scott用户： <br>svrmgrl&gt;; grant execute on dbms_job to scott; <br>4．将要执行的任务写成存储过程或其他的数据库可执行的pl/sql程序段 <br>例如，我们已经建立了一个存储过程，其名称为my_job，在sql/plus中以scott用户身份登录，执行如下命令： <br>sql&gt;; variable n number; <br>sql&gt;; begin <br>dbms_job.submit(:n&#8216;my_job;&#8217;,sysdate, <br>&#8216;sysdate＋1/360&#8217;); <br>commit; <br>end; <br>/ <br>系统提示执行成功。 <br>Sql&gt;; print :n; <br>系统打印此任务的编号，例如结果为300。 <br>如上，我们创建了一个每隔4分钟执行一次的任务号为300的任务。可以通过Oracle提供的数据字典user_jobs察看该任务的执行情况： <br>sql&gt;; select job,next_date,next_sec,failures,broken from user_jobs; <br>执行结果如下： <br>job next_date next_sec failures broken <br>300 2000/10/10 11:45:15 0 N <br>这表示任务号为300的任务，下一次将在2000/10/10 11:45:15执行，此任务的执行失败记录为0次。注意：当执行job出现错误时，Oracle将其记录在日志里，失败次数每次自动加1。当执行失败次数达到16时，Oracle就将该job标志为broken。此后，Oracle不再继续执行它，直到用户调用过程dbms_job.broken，重新设置为not broken，或强制调用dbms_job.run来重新执行它。 <br>除了以上我们讨论的submit存储过程之外，Oracle还提供了其他许多存储过程来操作任务。例如：dbms_job.change 、 dbms_job.what、dbms_job.interval可以用来修改提交的任务。要想删除该任务，只需运行dbms_job.remove(n)即可，其中n为任务号。
<img src ="http://www.blogjava.net/pdw2009/aggbug/99002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2007-02-09 14:07 <a href="http://www.blogjava.net/pdw2009/archive/2007/02/09/99002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pl/sql经验小结(转)</title><link>http://www.blogjava.net/pdw2009/archive/2007/02/08/98697.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Thu, 08 Feb 2007 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2007/02/08/98697.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/98697.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2007/02/08/98697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/98697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/98697.html</trackback:ping><description><![CDATA[　平时在PL/SQL中的编程中遇到一些问题，这里以问答的形式来进行把它们总结下来，以供大家分享。<br /><br />　　1、当需要向表中装载大量的数据流或者需要处理大量的数据流的时候，能否使用管道提高处理效率？<br />管道函数对于改善并行查询的性能非常方便，它加快往表中加载数据的速度。管道函数的使用总结如下两点：<br /><br />　　每当在查询里使用PL/SQL函数时，该查询将被序列化，即一个处理器只能运行一个查询实例，那么在这种情况下不可能使用并行查询（比如在数据仓库中要经常使用这项技术）。因此，为了使用并行查询就必须使用管道函数，这样也就加快了执行的速度。<br /><br />　　管道函数的输入参数必须是一个引用记录集类型（即ref cursor），而返回的是嵌套表类型（其表中每一行对应每一个引用记录）。在使用管道函数之前，必须先在程序头写上PARALLEL_ENABLE，这样才能在查询语句中使用管道函数来处理了。<br /><br />　　2． 如何使PL/SQL程序等待一段时间执行？<br />　<br />　　方法就是使用DBMS_LOCK包的SLEEP函数，可以进行精确定时，其语法为：<br /><br />DBMS_LOCK.SLEEP (seconds IN NUMBER);<br /><br />　　3．需要在一张表插入一条记录之后等若干秒后再执行另外一个操作，如何在PL/SQL程序里进行定时操作？ <br /><br />　　一般的做法是用循环作延迟，利用 DBMS_UTILITY的gettime函数来检测当前的时间，程序代码如下：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1"><tbody><tr><td>DECLARE<br />v_delaytime CONSTANT INTEGER := 100; <br />v_starttime INTEGER ; <br />v_endtime INTEGER ;<br />BEGIN<br />V_starttime := DBMS_UTILITY.get_time;<br />V_endtime := DBMS_UTILITY.get_time;<br />While abs(V_endtime- V_starttime)&lt; v_delaytime loop<br />/*空循环或者简单的耗时执行语句*/<br />End loop; <br />END;<br />/</td></tr></tbody></table><br />　　 另外如果是不同会话（session）之间的定时，就必须使用DBMS_PIPE包的函数来实现会话间的消息传递。<br /><br />　　4．当PL/SQL返回一个数据集的时候，该使用集合还是游标？<br /><br />　　一般情况下，有以下两点作为依据：<br /><br />　　1) 如果PL/SQL程序返回多多行数据给另外一个PL/SQL程序的话，这里就建议使用集合，因为这样可以利用集合的批收集（bulk collection）来提高从数据库提取数据的速度。<br /><br />　　2) 如果需要在PL/SQL程序的环境中把数据返回到宿主语言环境中（如Sql*plus,c,delphi等），这时应该使用游标变量来返回这些数据，因为几乎所有的宿主语言都支持游标变量，但不是所有的宿主语言都支持集合。这样可以增强程序的可移植性。<br /><br />　　5．如何更有效的在PL/SQL中使用游标？<br /><br />　　游标是PL/SQL中一个非常重要的概念，对数据库的检索主要依靠游标来操作。在PL/SQL中有两类游标，一类是隐式游标，如select clno into v_clno from table_detail.另外一类是显式游标，如cursor v_cur is select clno from table_detail。对于游标的使用这里给出以下几点建议：<br /><br />　　1) 尽可能的使用bulk collection。它能够较大的提高运行性能，在Oracl9i的第二版，甚至可以使用bulk collection来直接将数据写入到记录表<br /><br />　　2) 尽量使用显式游标来处理，因为相对于隐式游标来说，显式游标的速度更快一些。<br /><br />　　3) 如果查询的表很小或者是静态的，可以把该表缓存到一个包级的集合里。这样，你的查询函数就直接从集合里（即进程全局区，PGA cache），而不是从系统全局区（SGA）来取数据，这样的处理速度会提升很多。<br /><img src ="http://www.blogjava.net/pdw2009/aggbug/98697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2007-02-08 11:20 <a href="http://www.blogjava.net/pdw2009/archive/2007/02/08/98697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>集合(VarRays和嵌套表)</title><link>http://www.blogjava.net/pdw2009/archive/2007/01/22/95335.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Mon, 22 Jan 2007 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2007/01/22/95335.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/95335.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2007/01/22/95335.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/95335.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/95335.html</trackback:ping><description><![CDATA[Oracle 9i支持三种集合数据类型:index-by 表,Varrays(可变数组)和嵌套表<br /><br />Varrays 由其元素的最大数目限定的单维有限数组,可以改变varrays数组的上界.可以使用varrays按一定顺序存储固定数目的元素.元素插入到Varrays数组时,是从位置1开始的,可以一直增加到数组长度的上限,varrays元素的最大数目为2G<br /><br />1、定义VARRAY类型<br />      Type  type_name is {varray|varraying array}(max size) of data_type [not null]<br /><br />下面是一个定义例子：<br />type num_varray is varray(5) if number;<br />在指定data_type时，以专守以下规则：  <br />    可以使用%TYPE和%ROWTYPE<br />    data_type不能是BOOLEAN、NCHAR、NVARCHAR2、REF CURSOR、NCLOB类型<br /><br />下面是一个可变数组的例程<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">procedure</span><span style="COLOR: #000000"> varrays_demo<br /></span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"><br /> num_varray  num_varray_type;<br /></span><span style="COLOR: #0000ff">begin</span><span style="COLOR: #000000"><br /> num_varray:</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">num_varray_type(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">2</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">3</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">4</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">5</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">6</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">7</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">8</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">9</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span><span style="COLOR: #000000">);<br /> dbms_output.put_line(num_varray(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">));<br /> </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> idx </span><span style="COLOR: #808080">in</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">..</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span><span style="COLOR: #000000"> loop<br />     dbms_output.put_line(num_varray(idx));<br /> </span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"> loop;<br /> <br /> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> num_varray </span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">then</span><span style="COLOR: #000000"><br />    dbms_output.put_line(</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">num_varray is null</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);<br /> </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br />    dbms_output.put_line(</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">num_varray is  not null</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);<br /> </span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"> varrays_demo;<br /></span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"> test;<br /></span></div><br />嵌套表<br />        嵌套表是数据元素可以无限大而且无序的一个一维数据，所有元素的数据类型都相同。除了定义它时不能使用index by binary_integer子句外，与index-by表非常相似，嵌套表数组中没有最大数目限制。（实际上也是一个一维数组）。<br />1、定义TABLE类型<br />     其语法如下<br />      type table_name is table of data_type [not null]<br />      如：<br />      type num_table is table of number<br />     该语句声明了一个元素数目无限大的数字型嵌套表<br />      定义data_type时，要专守以下规划：<br />      A、可以使用%TYPE和%ROWTYPE<br />      B、可以是另一个oracle 9i的varray或table类型<br />      C、不能是BOOLEAN、NCHAR、NVARCHAR2、NCLOB、REF CURSOR类型，下面是一个例程：<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">procedure</span><span style="COLOR: #000000"> table_demo<br /></span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"> <br />   type num_table </span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">of</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">number</span><span style="COLOR: #000000">;<br />   v_numtable num_table;<br />   vcount </span><span style="FONT-WEIGHT: bold; COLOR: #000000">number</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #0000ff">begin</span><span style="COLOR: #000000"><br />   </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> v_numtable </span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">then</span><span style="COLOR: #000000"><br />      dbms_output.put_line(</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">v_numtable is null</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);<br />   </span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ;<br />   v_numtable :</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">num_table(); </span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">不带参数构造一个空表</span><span style="COLOR: #008080"><br /></span><span style="COLOR: #000000">   </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> v_numtable </span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">then</span><span style="COLOR: #000000"><br />      dbms_output.put_line(</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">构造一个空v_numtable is null</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);<br />   </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> <br />      dbms_output.put_line(</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">构造一个空表时,v_numtable 不等于null</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);<br />   </span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ;<br />  </span><span style="COLOR: #008080">--</span><span style="COLOR: #008080"> if v_numtable(1) is null then  --这样的话,编译虽通过,执行时出错</span><span style="COLOR: #008080"><br /></span><span style="COLOR: #000000">  </span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">    dbms_output.put_line('a');</span><span style="COLOR: #008080"><br /></span><span style="COLOR: #000000">  </span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">end if;</span><span style="COLOR: #008080"><br /></span><span style="COLOR: #000000">   v_numtable:</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">num_table(</span><span style="FONT-WEIGHT: bold; COLOR: #800000