﻿<?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">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">50</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000">);<br />   vcount:</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">v_numtable.</span><span style="COLOR: #ff00ff">count</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">..vcount loop<br />       dbms_output.put_line(v_numtable(idx));<br />   </span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"> loop;<br /></span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"> table_demo;<br /></span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000"> test;<br /></span></div><br />集合方法<br />pl/sql预定义了在varray 和嵌套表实例上进行调用的方法。这些方法能在集合上执行一定的功能。<br /><table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="mso-yfti-irow: 0"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="130"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">EXISTS</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 138.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="185"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">该函数返回集合中第一个元素的索引，如果集合为空，返回</span><span lang="EN-US">NULL</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 189.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="253"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Collection.EXISTS(index)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span></p></td></tr><tr style="mso-yfti-irow: 1"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="130"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">COUNT</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 138.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="185"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">该函数集合元素的数目</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 189.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="253"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Collection.COUNT<o:p></o:p></span></p></td></tr><tr style="mso-yfti-irow: 2"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="130"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">DELETE</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 138.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="185"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">该过程从嵌套表中删除一个或多个或合部元素</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 189.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="253"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Table_name.DELETE </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">删除所有元素</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Table_name.delete(index)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">删除指定索引的记录</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Table_name.delete(start_index,end_index)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">删除区间内元素</span></p></td></tr><tr style="mso-yfti-irow: 3"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="130"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">FIRST</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 138.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="185"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回集合第一个元素索引，如果集合为空，返回</span><span lang="EN-US">NULL</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 189.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="253"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Collection.FIRST<o:p></o:p></span></p></td></tr><tr style="mso-yfti-irow: 4"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="130"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">LAST</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 138.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="185"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回集合中最后一个元素索引，如果集合为空，返回</span><span lang="EN-US">NULL</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 189.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="253"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Collection. LAST<o:p></o:p></span></p></td></tr><tr style="mso-yfti-irow: 5"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="130"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">NEXT</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 138.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="185"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回集合当前元素的下一个元素的索引，如果它不存在就返回</span><span lang="EN-US">NULL</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 189.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="253"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Collection. NEXT</span></p></td></tr><tr style="mso-yfti-irow: 6"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="130"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">PRIOR</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 138.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="185"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回集合当前元素的上一个元素的索引，如果它不存在就返回</span><span lang="EN-US">NULL</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 189.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="253"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Collection. PRIOR</span></p></td></tr><tr style="mso-yfti-irow: 7"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="130"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">LIMIT</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 138.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="185"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</span><span lang="EN-US">varray</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中创建元素的最大个数</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 189.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="253"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Collection. LIMIT<o:p></o:p></span></p></td></tr><tr style="mso-yfti-irow: 8"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="130"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">EXTENDS</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 138.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="185"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">该过程在集合的末尾添加新的元素</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 189.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="253"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Collection.EXTEND</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">添加一个</span><span lang="EN-US">NULL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">元素；</span><span lang="EN-US">Collection.extends(n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">添加</span><span lang="EN-US">N</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个</span><span lang="EN-US">NULL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">元素，</span><span lang="EN-US">Collection.extend(n,index)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">添加由</span><span lang="EN-US">index</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指定位置上元素的</span><span lang="EN-US">n</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个副表</span><span lang="EN-US"><o:p></o:p></span></p></td></tr><tr style="mso-yfti-irow: 9; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="130"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">TRIM</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 138.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="185"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从集合末尾处删除元素</span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 189.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="253"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Collection.TRIM </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">删除最后一个元素</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Collection.TRIM(n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">删除最后</span><span lang="EN-US">N</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个元素</span></p></td></tr></tbody></table><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p>数据加中的集合<br />与index-by表不同，varray和嵌套表可以作为对象-关系表中的珍存储在数据库中。它们也可以作为对象关系表中的列使用。为了表示出作为数据库列的数据类型，集合类型必须是在pl/sql和sql中可见。这需要使用create or replace type 语句定义而不能仅在pl/sql块中进行局部定义。语法如下：<br />create of  replace type table_name is table of data_type<br /><br />      <img src ="http://www.blogjava.net/pdw2009/aggbug/95335.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-01-22 14:34 <a href="http://www.blogjava.net/pdw2009/archive/2007/01/22/95335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>select 语句的N种写法</title><link>http://www.blogjava.net/pdw2009/archive/2006/12/08/86394.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Fri, 08 Dec 2006 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/12/08/86394.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/86394.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/12/08/86394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/86394.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/86394.html</trackback:ping><description><![CDATA[<p>一个分页内嵌套的查询脚本<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: #0000ff">select</span> <span style="color: #000000">&nbsp;</span> <span style="color: #808080">*</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #0000ff">from</span> <span style="color: #000000">&nbsp;(&nbsp;</span> <span style="color: #0000ff">select</span> <span style="color: #000000">&nbsp;E.</span> <span style="color: #808080">*</span> <span style="color: #000000">,rownum&nbsp;&nbsp;&nbsp;row_id&nbsp;</span> <span style="color: #0000ff">from</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span> <span style="color: #0000ff">select</span> <span style="color: #000000">&nbsp;A.ST_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st_id,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.SUBSCRBID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subscrbid,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.SVCNUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;svcnum,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.USERNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.CLUBLEVEL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clublevel,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.SCORE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;score,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span> <span style="color: #0000ff">select</span> <span style="color: #000000">&nbsp;nvl(name,</span> <span style="color: #ff0000">''</span> <span style="color: #000000">)&nbsp;&nbsp;</span> <span style="color: #0000ff">from</span> <span style="color: #000000">&nbsp;CODE_SVCID&nbsp;</span> <span style="color: #0000ff">where</span> <span style="color: #000000">&nbsp;code</span> <span style="color: #808080">=</span> <span style="color: #000000">A.Svcid)&nbsp;svcid,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span> <span style="color: #0000ff">select</span> <span style="color: #000000">&nbsp;nvl(substr(name,instr(name,</span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">.</span> <span style="color: #ff0000">'</span> <span style="color: #000000">)</span> <span style="color: #808080">+</span> <span style="font-weight: bold; color: #800000">1</span> <span style="color: #000000">,</span> <span style="font-weight: bold; color: #800000">4</span> <span style="color: #000000">),</span> <span style="color: #ff0000">''</span> <span style="color: #000000">)&nbsp;</span> <span style="color: #0000ff">from</span> <span style="color: #000000">&nbsp;code_areaid&nbsp;</span> <span style="color: #0000ff">where</span> <span style="color: #000000">&nbsp;code</span> <span style="color: #808080">=</span> <span style="color: #000000">A.cityid)&nbsp;cityid,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span> <span style="color: #0000ff">select</span> <span style="color: #000000">&nbsp;nvl(BCT_NAME,</span> <span style="color: #ff0000">''</span> <span style="color: #000000">)&nbsp;</span> <span style="color: #0000ff">from</span> <span style="color: #000000">&nbsp;&nbsp;BC_TEAM&nbsp;</span> <span style="color: #0000ff">where</span> <span style="color: #000000">&nbsp;BCT_ID</span> <span style="color: #808080">=</span> <span style="color: #000000">A.Bct_Id)&nbsp;bct_id,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nvl((</span> <span style="color: #0000ff">select</span> <span style="color: #000000">&nbsp;name&nbsp;&nbsp;</span> <span style="color: #0000ff">from</span> <span style="color: #000000">&nbsp;bc_managerinfo&nbsp;</span> <span style="color: #0000ff">where</span> <span style="color: #000000">&nbsp;bcmi_id</span> <span style="color: #808080">=</span> <span style="color: #000000">A.Exeman&nbsp;&nbsp;),</span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">不详</span> <span style="color: #ff0000">'</span> <span style="color: #000000">)&nbsp;exeman,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.LINKMAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linkman,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.LINKPHONE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linkphone,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span> <span style="color: #0000ff">select</span> <span style="color: #000000">&nbsp;&nbsp;nvl(code_abbr,</span> <span style="color: #ff0000">''</span> <span style="color: #000000">)&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">from</span> <span style="color: #000000">&nbsp;&nbsp;&nbsp;bcms_code_base&nbsp;</span> <span style="color: #0000ff">where</span> <span style="color: #000000">&nbsp;type_id</span> <span style="color: #808080">=</span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">00009</span> <span style="color: #ff0000">'</span> <span style="color: #000000">&nbsp;</span> <span style="color: #808080">and</span> <span style="color: #000000">&nbsp;code_id</span> <span style="color: #808080">=</span> <span style="color: #000000">A.State)&nbsp;state,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.CREATEDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createdate,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.REMARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remark<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">from</span> <span style="color: #000000">&nbsp;ss_Club_SaleTask&nbsp;A<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff">where</span> <span style="color: #000000">&nbsp;&nbsp;&nbsp;A.STATE&nbsp;</span> <span style="color: #808080">=</span> <span style="color: #000000">&nbsp;</span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">1</span> <span style="color: #ff0000">'</span> <span style="color: #000000">&nbsp;</span> <span style="color: #808080">and</span> <span style="color: #000000">&nbsp;A.svcnum</span> <span style="color: #808080">=</span> <span style="color: #ff0000">'</span> <span style="color: #ff0000">13071593789</span> <span style="color: #ff0000">'</span> <span style="color: #000000">&nbsp;</span> <span style="color: #808080">and</span> <span style="color: #000000">&nbsp;</span> <span style="font-weight: bold; color: #800000">1</span> <span style="color: #000000">&nbsp;</span> <span style="color: #808080">=</span> <span style="color: #000000">&nbsp;</span> <span style="font-weight: bold; color: #800000">1</span> <span style="color: #000000">)&nbsp;E&nbsp;</span> <span style="color: #0000ff">where</span> <span style="color: #000000">&nbsp;rownum</span> <span style="color: #808080">&lt;=</span> <span style="font-weight: bold; color: #800000">30</span> <span style="color: #000000"><br />
&nbsp;)</span> <span style="color: #0000ff">where</span> <span style="color: #000000">&nbsp;row_id</span> <span style="color: #808080">&gt;</span> <span style="font-weight: bold; color: #800000">0</span> </div>
连接查询的作用是从多个表中使用相等或不相等的连接方式存储资料，<br />
1、表格连接<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;相等的连接一般使用两上表中有相同的字段及字段值，当两上表被join后，只能看到两个条件联系的字段价是相等到的记录，除非使用了外连结(outer join 或+)。N个表格的连接需要N-1个条件表达式，所以两个表的连结需要一个条件以上的表达式。<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">SQL&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;name,sal&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;employees&nbsp;e,dept&nbsp;d&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;e.deptno</span><span style="color: #808080">=</span><span style="color: #000000">d.deptno&nbsp;&nbsp;&nbsp;&#8592;&nbsp;一般<br />
SQL&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;name,sal&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;employees&nbsp;e&nbsp;</span><span style="color: #0000ff">JOIN</span><span style="color: #000000">&nbsp;dept&nbsp;d&nbsp;</span><span style="color: #0000ff">ON</span><span style="color: #000000">&nbsp;e.deptno</span><span style="color: #808080">=</span><span style="color: #000000">d.deptno&nbsp;&nbsp;&#8592;&nbsp;ANSI语法<br />
</span></div>
以上两行条码表示了同一个意思。<br />
<br />
2、外连结<br />
&nbsp;&nbsp;&nbsp;当两个表外部连接条件，两个字段值没有区配(match)时可以使用外部连接<br />
3、自我连结<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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: #0000ff">SELECT</span><span style="color: #000000">&nbsp;e1.name,e1.sal&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;employee&nbsp;e1,employee&nbsp;e2&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;e1.empno</span><span style="color: #808080">=</span><span style="color: #000000">e2.empno&nbsp;;</span></div>
4、卡笛儿积<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;last_name,&nbsp;department_name<br />
</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;employees<br />
</span><span style="color: #0000ff">CROSS</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">JOIN</span><span style="color: #000000">&nbsp;departments;<br />
</span></div>
5、自动连结两表查询<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两表必须有相同的字段名和字段类型才能使用这种方法查询<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;seq_id,u_id,email&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;t_email&nbsp;A&nbsp;&nbsp;natural&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;t_user&nbsp;B&nbsp;</span></div>
6、使用join on建立多表查询<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;employee_id&nbsp;,&nbsp;city&nbsp;,&nbsp;department_name<br />
</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;&nbsp;employees&nbsp;e<br />
</span><span style="color: #0000ff">JOIN</span><span style="color: #000000">&nbsp;&nbsp;departments&nbsp;d<br />
</span><span style="color: #0000ff">ON</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;d.department_id&nbsp;&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;&nbsp;e.department_id<br />
</span><span style="color: #0000ff">JOIN</span><span style="color: #000000">&nbsp;&nbsp;locations&nbsp;&nbsp;l<br />
</span><span style="color: #0000ff">ON</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;d.location_id&nbsp;&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;&nbsp;l.location_id&nbsp;;<br />
</span></div>
&nbsp;&nbsp;当使用连结果查询时，没有匹配的记录并没有出现在查询结果中，如果要包含没有符合条件的记录，则必须使用外部连结的方式，<br />
7、left outer join外部连接<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;A.Seq_Id,A.u_Id,A.Email&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;t_email&nbsp;A&nbsp;&nbsp;</span><span style="color: #ff00ff">left</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">outer</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;&nbsp;t_user&nbsp;B&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;A.u_Id</span><span style="color: #808080">=</span><span style="color: #000000">B.Id&nbsp;<br />
这个语句的查询结果将包启A 表中不符合条件的记录,这是一个等条件的pl/sql查询语句<br />
select&nbsp; A.Seq_Id,A.u_Id,A.Email&nbsp; from t_email A ,t_user B where B.Id(+)=A.u_Id&nbsp; </span></div>
<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;name,vv,</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;tt_job&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;NAME,vv&nbsp;</span><span style="color: #0000ff">having</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #008080">--</span><span style="color: #008080">查询重复记录</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">delete</span><span style="color: #000000">&nbsp;tt_job&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;name&nbsp;</span><span style="color: #808080">in</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;name&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;name,</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;tt_job&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;NAME&nbsp;</span><span style="color: #0000ff">having</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">))<br />
</span><span style="color: #0000ff">delete</span><span style="color: #000000">&nbsp;tt_job&nbsp;a<br />
&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;(a.name&nbsp;,a.vv&nbsp;)</span><span style="color: #808080">in</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;name,vv<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;name,vv,&nbsp;</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">)<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;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;tt_job<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;</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;NAME,vv<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;</span><span style="color: #0000ff">having</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">))&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">删掉所有重复记录</span><span style="color: #008080"><br />
</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">delete</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;tt_job&nbsp;a<br />
&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;a.rowid&nbsp;</span><span style="color: #808080">!=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">max</span><span style="color: #000000">(b.rowid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;tt_job&nbsp;b<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;a.name&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;b.name<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;a.vv&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;b.vv)&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">只保留一条重复记录<br />
&nbsp;select distinct&nbsp; table_name from USER_COL_COMMENTS&nbsp;&nbsp; --过虑字段中有重复的记录</span></div>
<p>&nbsp;</p>
<p>&nbsp;几个统计语句<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: #008080">--</span><span style="color: #008080">区域统计分析</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(sell_count)&nbsp;,</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(sell_amount)&nbsp;,</span><span style="color: #ff00ff">ROUND</span><span style="color: #000000">(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(sell_amount)</span><span style="color: #808080">/</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(sell_count),</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">),</span><span style="color: #ff00ff">round</span><span style="color: #000000">(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(sell_count)&nbsp;</span><span style="color: #808080">/</span><span style="color: #ff00ff">count</span><span style="color: #000000">(Terminal_Sell_Id),</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">)网点平均售额,</span><span style="color: #ff00ff">max</span><span style="color: #000000">(sell_amount),</span><span style="color: #ff00ff">min</span><span style="color: #000000">(sell_amount)&nbsp;,term&nbsp;,to_char(open_result_time,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm</span><span style="color: #ff0000">'</span><span style="color: #000000">),C.AREA_NAME,D.Playtype_Name<br />
</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;terminal_sell&nbsp;A,touzhuzhan_info&nbsp;B,area&nbsp;C,playtype&nbsp;D<br />
</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;B.Sell_Id(</span><span style="color: #808080">+</span><span style="color: #000000">)</span><span style="color: #808080">=</span><span style="color: #000000">A.Terminal_Sell_Id&nbsp;<br />
&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">)</span><span style="color: #808080">=</span><span style="color: #000000">B.Area_Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;D.PLAYTYPE_ID(</span><span style="color: #808080">+</span><span style="color: #000000">)</span><span style="color: #808080">=</span><span style="color: #000000">A.Lottery_Type<br />
</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;term&nbsp;,to_char(open_result_time,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm</span><span style="color: #ff0000">'</span><span style="color: #000000">),C.AREA_NAME,D.Playtype_Name<br />
<br />
</span><span style="color: #008080">--</span><span style="color: #008080">历史高/低统计(按时段分)</span><span style="color: #008080"><br />
</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">max</span><span style="color: #000000">(sell_amount)&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;terminal_sell&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">日历史最高</span><span style="color: #008080"><br />
</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">max</span><span style="color: #000000">(sell_amount),qq&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;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(sell_amount)sell_amount,&nbsp;&nbsp;to_char(open_result_time,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-q</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;qq&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;terminal_sell&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;to_char(open_result_time,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-q</span><span style="color: #ff0000">'</span><span style="color: #000000">))&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;qq&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">按季度</span><span style="color: #008080"><br />
</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">max</span><span style="color: #000000">(sell_amount)&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;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(sell_amount)sell_amount&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;terminal_sell&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;to_char(open_result_time,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-mm</span><span style="color: #ff0000">'</span><span style="color: #000000">))&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">按月</span><span style="color: #008080"><br />
</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">max</span><span style="color: #000000">(sell_amount)&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;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(sell_amount)sell_amount,&nbsp;&nbsp;to_char(open_result_time,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-ww</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;ww&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;terminal_sell&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;to_char(open_result_time,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy-ww</span><span style="color: #ff0000">'</span><span style="color: #000000">))&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">按周统计</span><span style="color: #008080"><br />
</span><span style="color: #000000">&nbsp;<br />
&nbsp;<br />
&nbsp;</span></div>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/pdw2009/aggbug/86394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-12-08 16:40 <a href="http://www.blogjava.net/pdw2009/archive/2006/12/08/86394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 调用PL/SQL Returning Object Array </title><link>http://www.blogjava.net/pdw2009/archive/2006/11/03/78881.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Fri, 03 Nov 2006 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/11/03/78881.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/78881.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/11/03/78881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/78881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/78881.html</trackback:ping><description><![CDATA[
		<p>oracle 存储过程返回数组的方法： <br />1.建立包<br />create or replace package test is <br />TYPE filename_array IS TABLE OF varchar2(1);<br /> filename filename_array; <br />end test; <br />2. 建立存储过程 <br />create or replace procedure test_array(v_cfjg out test.filename_array ) is <br />begin DECLARE i number; <br />D_cfjg dic_cfjg%rowTYPE; <br />-- D_nr dic_cfjg%rowTYPE; <br />cursor c1 is SELECT * FROM dic_cfjg; <br />BEGIN <br />i:=0; <br />v_cfjg := test.filename_array(); --数组初始化</p>
		<p>open c1; <br />LOOP fetch c1 into D_cfjg; <br />EXIT WHEN c1%NOTFOUND ; <br />i:=i+1; <br />v_cfjg.EXTEND; <br />-- DBMS_OUTPUT.PUT_LINE(TO_CHAR(D_cfjg.dm)); <br />v_cfjg(v_cfjg.count):=D_cfjg.dm; <br />DBMS_OUTPUT.PUT_LINE(v_cfjg(v_cfjg.count)); <br />-- 测试<br />-- FETCH C1 INTO D_cfjg; <br />-- EXIT WHEN c1%NOTFOUND ; <br />END LOOP; <br />end; <br />EXCEPTION <br />WHEN TOO_MANY_ROWS THEN <br />DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS'); <br />WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(sqlerrm); <br />end test_array; </p>
		<p>===========================<br /><br /></p>
		<p>Java 调用PL/SQL Returning Object Array</p>
		<p>上次写了oracle 存储过程返回数组的方法。这次实现在java调用返回值是数组的存储过程方法。</p>
		<p>1. 数组：CYJ_ARRAY</p>
		<p>CREATE OR REPLACE TYPE CYJ_ARRAY is VARRAY(20) OF integer</p>
		<p>2. 存储过程：getTestArray()</p>
		<p>CREATE OR REPLACE FUNCTION getTestArray RETURN CYJ_ARRAY<br />AS<br />  l_test CYJ_ARRAY :=CYJ_ARRAY();</p>
		<p>   begin<br />    FOR i IN 1..10 LOOP<br />      l_test.extend;<br />      l_test(l_test.count) := i;<br />      dbms_output.put_line(l_test(l_test.count));<br />    END LOOP;<br />    RETURN  l_test;<br />  END;<br />3. 调用存储过程的java 类</p>
		<p>public class TestOracleReturnArray  {<br /> </p>
		<p>public static void main(String[] args) throws SQLException {<br /> Connection conn = null;<br /> CallableStatement cstmt = null;<br /> ResultSet rs = null;<br /> try {<br />  <br />  DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());<br />  conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ora","zzz","sss");<br />  <br />  conn.setAutoCommit(false);<br />  String procedure = "{? = call getTestArray() }";// 调用存储过程<br />  cstmt = conn.prepareCall(procedure);<br />  cstmt.registerOutParameter(1, OracleTypes.ARRAY,"CYJ_ARRAY"); //注：type name：区分大小，不是包中的type, 使用包中定义的type如何调用还不知道<br />  <br />  cstmt.execute();<br />  ARRAY array = (ARRAY)cstmt.getObject(1);<br />  Object[] items = (Object[])array.getArray();<br />  Object obj;<br />  <br />  for (int i = 0; i &lt; items.length; i++) {<br />    obj = items[i];<br />   <br />   System.out.println(obj);<br />   <br />   } // for<br /> } catch (Exception e) {<br />  e.printStackTrace();<br /> } finally {<br />  //DbConnRestore.connRestore(rs, cstmt, null, conn);<br /> }<br />}</p>
		<p>}<br /><br />参考如下资料：<br /><br /><a href="http://www.oracle.com/technology/global/cn/sample_code/tech/java/codesnippet/jdbc/varray/index.html">http://www.oracle.com/technology/global/cn/sample_code/tech/java/codesnippet/jdbc/varray/index.html</a></p>
<img src ="http://www.blogjava.net/pdw2009/aggbug/78881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-11-03 11:24 <a href="http://www.blogjava.net/pdw2009/archive/2006/11/03/78881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle本地批绑定</title><link>http://www.blogjava.net/pdw2009/archive/2006/09/30/73072.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Sat, 30 Sep 2006 08:38:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/09/30/73072.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/73072.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/09/30/73072.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/73072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/73072.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 可以在				PL/SQL				块的内部运行				SQL				语句，一般的方法是：								A 				使用通常位于服务器端的				PL/SQL				引擎，做纯粹的				PL/SQL				执行。但是，客户端程序有它自己的				PL/SQL				引擎。								B 				所有的				SQL ...&nbsp;&nbsp;<a href='http://www.blogjava.net/pdw2009/archive/2006/09/30/73072.html'>阅读全文</a><img src ="http://www.blogjava.net/pdw2009/aggbug/73072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-09-30 16:38 <a href="http://www.blogjava.net/pdw2009/archive/2006/09/30/73072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>本地动态SQL和PLSQ</title><link>http://www.blogjava.net/pdw2009/archive/2006/09/28/72614.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Thu, 28 Sep 2006 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/09/28/72614.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/72614.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/09/28/72614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/72614.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/72614.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">Oracle </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持两种类型</span>
				<span lang="EN-US">SQL:</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">静态</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和动态</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。在静态</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句在编译时就已经全部确定，语法和语义的引用问题也是在编译时全部解析确定。在动态</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句是由字符串组成的，在运行时动态执行。动态</span>
				<span lang="EN-US">PL/SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也是如此。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US">DBMS_SQL</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与本地动态</span>
						<span lang="EN-US">SQL</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比较</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 29.25pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 29.25pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动态</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句最长度限制在</span>
				<span lang="EN-US">32K</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以内。比这个长的语句就只能用</span>
				<span lang="EN-US">DBMS_SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来处理</span>
				<span lang="EN-US">.</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 29.25pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 29.25pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还有很多。。省略</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个最简单的例子</span>
				<span lang="EN-US">:</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">SQL&gt;<span style="mso-spacerun: yes">  </span>declare</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>2<span style="mso-spacerun: yes">      </span>dyn_tab_name varchar2(20):='t_temp';</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>3<span style="mso-spacerun: yes">      </span>dyn_string varchar2(150);</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>4<span style="mso-spacerun: yes">   </span>begin</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>5<span style="mso-spacerun: yes">     </span>dyn_string:='create table '||dyn_tab_name||' (colA number not null)';</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>6<span style="mso-spacerun: yes">     </span>execute immediate dyn_string;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>7<span style="mso-spacerun: yes">  </span>end;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>8<span style="mso-spacerun: yes">  </span>/</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</span>
				<span lang="EN-US">DBMS_SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的过程包括以下五个步骤</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42.75pt; TEXT-INDENT: -21.75pt; mso-list: l0 level1 lfo2; tab-stops: list 42.75pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1、<span style="FONT: 7pt 'Times New Roman'">    </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以字符串的形式构造动态</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42.75pt; TEXT-INDENT: -21.75pt; mso-list: l0 level1 lfo2; tab-stops: list 42.75pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2、<span style="FONT: 7pt 'Times New Roman'">    </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">专用明游标句柄并为该句柄打开游标</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42.75pt; TEXT-INDENT: -21.75pt; mso-list: l0 level1 lfo2; tab-stops: list 42.75pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">3、<span style="FONT: 7pt 'Times New Roman'">    </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解板动态构造的</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句，把该</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句与游标句柄关联。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42.75pt; TEXT-INDENT: -21.75pt; mso-list: l0 level1 lfo2; tab-stops: list 42.75pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">4、<span style="FONT: 7pt 'Times New Roman'">    </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42.75pt; TEXT-INDENT: -21.75pt; mso-list: l0 level1 lfo2; tab-stops: list 42.75pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">5、<span style="FONT: 7pt 'Times New Roman'">    </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关闭游标</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">SQL&gt; declare</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>2<span style="mso-spacerun: yes">          </span>dyn_tab_name varchar2(20):='t_temp';</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>3<span style="mso-spacerun: yes">          </span>dyn_string varchar2(150);</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>
						<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?>
						<st1:chmetcnv w:st="on" unitname="C" sourcevalue="4" hasspace="True" negative="False" numbertype="1" tcsc="0">4<span style="mso-spacerun: yes">          </span>c</st1:chmetcnv>
						<span style="mso-spacerun: yes">  </span>integer;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>5<span style="mso-spacerun: yes">          </span>ret_code integer;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>6<span style="mso-spacerun: yes">      </span>begin</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>7<span style="mso-spacerun: yes">        </span>dyn_string:='create table '||dyn_tab_name||'( colA number not null)';</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>
						<st1:chmetcnv w:st="on" unitname="C" sourcevalue="8" hasspace="True" negative="False" numbertype="1" tcsc="0">8<span style="mso-spacerun: yes">        </span>c</st1:chmetcnv>:=dbms_sql.open_cursor;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>9<span style="mso-spacerun: yes">       </span>dbms_sql.parse(c,dyn_string,dbms_sql.v7);</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes"> </span>10<span style="mso-spacerun: yes">       </span>ret_code:=dbms_sql.execute(c);</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes"> </span>11<span style="mso-spacerun: yes">       </span>dbms_sql.close_cursor(c);</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes"> </span>12<span style="mso-spacerun: yes">     </span>end;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 11.25pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes"> </span>13<span style="mso-spacerun: yes">  </span>/</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本地动态</span>
						<span lang="EN-US">SQL</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于动态</span>
				<span lang="EN-US">DDL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">DML</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和会话控制的本地动态</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句如下所示</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span lang="EN-US">Execute immediate &lt;dyn_string&gt; </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span lang="EN-US">Execute immediate &lt;dum_string&gt; using &lt;</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数</span>
				<span lang="EN-US">&gt;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">3、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span lang="EN-US">Execute immediate &lt;dyn_string&gt;into &lt;index-by</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">array</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、嵌套表</span>
				<span lang="EN-US">&gt;using&lt;</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数</span>
				<span lang="EN-US">&gt;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">4、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span lang="EN-US">Open cursor for &lt;dyn_string&gt;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">5、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span lang="EN-US">Open cursor form &lt;dyn_string&gt;<span style="mso-spacerun: yes">  </span>using &lt;</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数</span>
				<span lang="EN-US">&gt;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">6、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span lang="EN-US">Close &lt;cursor&gt;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">7、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span lang="EN-US">Execute immediate ‘begin…..end’ using &lt;</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数</span>
				<span lang="EN-US">&gt;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动态</span>
						<span lang="EN-US">DDL<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动态</span>
				<span lang="EN-US">DDL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理的是使用运行时为数据库对象提供的值的</span>
				<span lang="EN-US">DDL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句。动态</span>
				<span lang="EN-US">DDL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个典型的用法就是，创建仅在运行时表名和列名才可用的一个动态表。可以使用以下</span>
				<span lang="EN-US">DDL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</span>
				<span lang="EN-US">:</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">Execute immediate &lt;dyn_string&gt; </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">Execute immediate &lt;dum_string&gt; using &lt;</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数</span>
				<span lang="EN-US">&gt;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个使用动态</span>
				<span lang="EN-US">DDL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建表的存储过程</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">create</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<b>or</b>
						<b>replace</b>
						<b>procedure</b> dyn_ddl_demo(tablename <b>varchar2</b>,errnum<span style="mso-spacerun: yes">  </span><b>out</b><b>number</b>,errtext <b>out</b><b>varchar2</b>) <br /><b>authid</b><b>current_user</b><br /><b>is</b><br /><span style="mso-spacerun: yes">  </span>dyn_string <b>varchar2</b>(</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">1000</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);<br /><span style="mso-spacerun: yes">  </span>dyn_tablename <b>varchar2</b>(</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">30</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);<br /><b>begin</b><br /><span style="mso-spacerun: yes">  </span>dyn_tablename:=tablename;<br /><span style="mso-spacerun: yes">  </span>dyn_string:=</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'create table '</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">||dyn_tablename||<br /><span style="mso-spacerun: yes">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'(order_id number(10) primary key,<br /><span style="mso-spacerun: yes">    </span>order_date date not null,<br /><span style="mso-spacerun: yes">    </span>total_qty number,<br /><span style="mso-spacerun: yes">    </span>total_price number(15,2)<br /><span style="mso-spacerun: yes">   </span>)'</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">;<br /><span style="mso-spacerun: yes">   </span>dbms_output.put_line(</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'dyn_string---&gt;'</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">||dyn_string);<br /><span style="mso-spacerun: yes">   </span><b>execute</b><b>immediate</b> dyn_string;<br /><span style="mso-spacerun: yes">   </span>errnum:=</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">0</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">;<br /><b>exception</b><br /><span style="mso-spacerun: yes">   </span><b>when</b><b>others</b><b>then</b><br /><span style="mso-spacerun: yes">      </span>errnum:=<b>sqlcode</b>;<br /><span style="mso-spacerun: yes">      </span>errtext:=</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'ERR: Create table '</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">||dyn_tablename||</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'---'</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">||<b>sqlerrm</b>;<br /><b>end</b> dyn_ddl_demo;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动态</span>
						<span lang="EN-US">SELECTS<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查询可以返回一行记录或多行记录。多行记录的在《本地批绑定》里再介绍</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">单行</span>
						<span lang="EN-US">Selects<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">Execute immediate &lt;dyn_string&gt; into &lt;</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变量</span>
				<span lang="EN-US">&gt; using &lt;</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数</span>
				<span lang="EN-US">&gt;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如</span>
				<span lang="EN-US">:</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">create</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<b>or</b>
						<b>replace</b>
						<b>procedure</b> dyn_selects(<br />vid <b>number</b>,<br />errnum <b>out</b><b>number</b>,<br />errtext <b>out</b><b>varchar2</b>) <br /><b>is</b><br /><span style="mso-spacerun: yes">  </span>sql_string <b>varchar2</b>(</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">500</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);<br /><span style="mso-spacerun: yes">  </span>id <b>number</b>;<br /><span style="mso-spacerun: yes">  </span>uname <b>varchar2</b>(</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">200</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);<br /><span style="mso-spacerun: yes">  </span>sex <b>varchar2</b>(</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">2</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);<br /><span style="mso-spacerun: yes">  </span><br /><span style="mso-spacerun: yes">  </span>upd_string <b>varchar2</b>(</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">500</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);<br /><span style="mso-spacerun: yes">  </span>vname <b>varchar2</b>(</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">200</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);<br /><span style="mso-spacerun: yes">  </span>vsex <b>varchar2</b>(</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">2</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);<br /><span style="mso-spacerun: yes">  </span>vvid <b>number</b>;<br /><b>begin</b><br /><span style="mso-spacerun: yes">  </span>sql_string :=</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'select * from t_user where id=:vid'</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">;<br /><span style="mso-spacerun: yes">  </span><b>execute</b><b>immediate</b> sql_string <b>into</b> id,uname,sex <b>using</b> vid;<br /><span style="mso-spacerun: yes">  </span>dbms_output.put_line(id||</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'----'</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">||uname||</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'----'</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">||sex);<br /><span style="mso-spacerun: yes">  </span><br /><span style="mso-spacerun: yes">  </span>upd_string:=</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'update t_user set name=:vname,sex=:vsex where id=:vvid'</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">;<br /><span style="mso-spacerun: yes">  </span>vname:=</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'</span>
				<span style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'">傻瓜</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">;<br /><span style="mso-spacerun: yes">  </span>vsex:=</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">'xx'</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">;<br /><span style="mso-spacerun: yes">  </span>vvid:=</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">3</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">;<br /><span style="mso-spacerun: yes">  </span><br /><span style="mso-spacerun: yes">  </span><b>execute</b><b>immediate</b> upd_string <b>using</b> vname,vsex,vvid;<br /><span style="mso-spacerun: yes">  </span>errnum:=</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #0000f0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">0</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">;<br /><b>exception</b><br /><span style="mso-spacerun: yes">  </span><b>when</b><b>others</b><b>then</b><br /><span style="mso-spacerun: yes">     </span>errnum:=<b>sqlcode</b>;<br /><span style="mso-spacerun: yes">     </span>errtext:=<b>sqlerrm</b>;<br /><b>end</b> dyn_selects;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动态</span>
						<span lang="EN-US">INSERT</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
						<span lang="EN-US">UPDATE </span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
						<span lang="EN-US">DELETE<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除了</span>
				<span lang="EN-US">DDL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句和</span>
				<span lang="EN-US">DML</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的单</span>
				<span lang="EN-US">SELECT</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句以外，还能动态地构造</span>
				<span lang="EN-US">INSERT</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">UPDATE</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">DELETE</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句并在运行时执行它们。可以使用以下语句执行</span>
				<span lang="EN-US">insert,update,delete</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>Execute immediate &lt;dyn_string&gt;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>Execute immediate &lt;dyn_string&gt; into &lt;</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变量</span>
				<span lang="EN-US">&gt; using &lt;</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数</span>
				<span lang="EN-US">&gt;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</b>
		</p>
<img src ="http://www.blogjava.net/pdw2009/aggbug/72614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-09-28 16:26 <a href="http://www.blogjava.net/pdw2009/archive/2006/09/28/72614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自治事务</title><link>http://www.blogjava.net/pdw2009/archive/2006/09/24/71582.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Sun, 24 Sep 2006 09:17:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/09/24/71582.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/71582.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/09/24/71582.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/71582.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/71582.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务前的事务管理（一般事务管理）</span>
						<span lang="EN-US">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">   </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">像</span>
				<span lang="EN-US">DML</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样的数据库扣作都是在事务的上下文环境中执行的。事务是一个或多个</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句的序列，执行一定的工作逻辑单元。事务、定义的特定会话可以由</span>
				<span lang="EN-US">commit</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">rollback</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作进行控制。只要发生</span>
				<span lang="EN-US">commit</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US">rollback</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作就会释放锁定资源的锁。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务的定义和使用</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务是将单一的、完整的事务分割为多个子事务。控制从主事务（</span>
				<span lang="EN-US">MT</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）转移到自治事务（</span>
				<span lang="EN-US">AT</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。一旦自治事务执行了，主事务就会恢复执行。自治事务独立于主事务，</span>
				<span lang="EN-US">COMMIT</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">ROLLBACK</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的范围仅仅限制在自治事务的上下文中。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务的优点</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码的模块人程度更高而且更简单。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在触发器内执行</span>
				<span lang="EN-US">COMMIT</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">3、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从执行</span>
				<span lang="EN-US">DML</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中调用用户自定义的函数。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将事务指定为自治事务</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以在代码的声明部分使用下面语句，以便在</span>
				<span lang="EN-US">PL/SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">块中定义一个自治事务：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">PRAGMA<span style="mso-spacerun: yes">   </span>AUTONOMOUS_TRANSACTION</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其中</span>
				<span lang="EN-US">pragma</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关键字的作用是通知</span>
				<span lang="EN-US">PL/SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译器，将声明它的这个</span>
				<span lang="EN-US">PL/SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码块分割为一个自治的或独立的事务。定义自治事务时，要遵守以下几条规则：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、如果</span>
				<span lang="EN-US">PL/SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">块是匿名的，那么该匿名</span>
				<span lang="EN-US">PL/SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">块必须是一个顶层块。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、如果</span>
				<span lang="EN-US">PL/SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">块不是匿名的，那么它必须作为包或存储过程序单元一部分的一个过程或函数。当在包中定义自治事务时，只有包中具体的函数或过程才能被指定为自治的的。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">3</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">PL/SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">块也可以是存储对象类型的一个方法</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">4</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">PL/SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">块也可以是一个数据库触发器</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个例子程序</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">create</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<b>or</b>
						<b>replace</b>
						<b>procedure</b> writelog(<br /><span style="mso-spacerun: yes">  </span>vid <b>number</b>,errtext <b>varchar2</b><span style="mso-spacerun: yes">     </span><br />)<br /><b>is</b><br /><b>pragma</b><b>autonomous_transaction</b>;<span style="mso-spacerun: yes">  </span></span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">--</span>
				</i>
				<i>
						<span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">定义事务</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<br />
						<b>begin</b>
						<br />
						<span style="mso-spacerun: yes">  </span>
						<b>insert</b>
						<b>into</b> t_log <b>values</b>(vid,errtext);<br /><span style="mso-spacerun: yes">  </span><b>commit</b>;<br /><b>end</b>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<i>
						<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
								<o:p> </o:p>
						</span>
				</i>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">create</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<b>or</b>
						<b>replace</b>
						<b>procedure</b> createuser(uid <b>number</b> ,vname <b>varchar2</b>,vsex <b>varchar2</b>)<br /><b>is</b><br /><b>begin</b><br /><span style="mso-spacerun: yes">   </span><b>insert</b><b>into</b> t_user <b>values</b> (uid,vname,vsex);<br /><span style="mso-spacerun: yes">   </span><b>commit</b>;<br /><b>exception</b><br /><span style="mso-spacerun: yes">  </span><b>when</b><b>others</b><b>then</b><br /><span style="mso-spacerun: yes">    </span>writelog(<b>sqlcode</b>,<b>sqlerrm</b>);<br /><span style="mso-spacerun: yes">    </span><b>rollback</b>;<span style="mso-spacerun: yes">  </span><br /><b>end</b>;<br /><br /></span>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">自治事务处理</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主事务开始执行</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主事务遇到一个对自治子程序的调用，这时主事务就暂停，将控制转移到自治例程中</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务开始执行</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务执行</span>
				<span lang="EN-US">commit</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US">rollback</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作，这将结束当前自治事务。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主事务恢复</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主事务结束</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务的一些关键问题</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">带</span>
				<span lang="EN-US">ALTER SESSION </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的自治事务</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务应该与主事务共享一个会话，因此通过</span>
				<span lang="EN-US">ALTER SESSION</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句，对该会话的任何修改，对自治事务和主事务应该都是可见的。但自治事务执行与主事务不同的上下文中。任何从自治块中引发的自治子程序调用都与自治事务共享相同的事务上下文。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务与死锁</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">必须以下面的这种方式定义自治事务：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">  </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不创建主事务对资源和锁的死锁。死锁在自治事务试图访问一个被主事务占用的资源时发生，这时主事务会挂起，直到自治事务结束。自治事务死等主事务释放资源，结果可能导致死锁。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">3、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义自治事务的条件</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只有顶层匿名块才能包括</span>
				<span lang="EN-US">PRAGMA<span style="mso-spacerun: yes">  </span>AUTONOMOUS_TRANSTRACTION</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">4、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span lang="EN-US">COMMIT</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US">ROLLBACK</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行为与自治事务</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务是以</span>
				<span lang="EN-US">commit </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US"> rollback</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句结束的。因此，应该在自治事务程序的内部显式地包含一个</span>
				<span lang="EN-US">commit</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US">rollback</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句。如果没有这样做，任何一个未确定的事务都会回滚。这是一个事务级的回滚，而不是一个语句级的回滚。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">5、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">异常与自治事务</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当自治事务以一个异常的方式退出时，就发生一个事务级的回滚，自事事务中所有未确定的改变都会回滚</span>
				<span lang="EN-US">.</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">6、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多自治事务</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个自治事务的上下文中，初始化多个自治事务。可以在一个自治块内定义多个</span>
				<span lang="EN-US">commit</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US">rollback</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句来完成这项任务，当包含一个</span>
				<span lang="EN-US">rollback</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，它就会属于当前事务，而不属于主事务。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">7、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务的并发问题</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务与主事务是并发运行的，初始化文件</span>
				<span lang="EN-US">init.ora</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span>
				<span lang="EN-US">transactions</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数决定着每个会话中并发事务的数量。</span>
				<span lang="EN-US">.</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">8、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过自治事务和从</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中调用用户自定义函数</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过自治事务，可以从</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中调用用户自定义函数来执行</span>
				<span lang="EN-US">DML</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作。只需把用户自定义函数定义为自治事务，函数就变为可从</span>
				<span lang="EN-US">SQL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中调用的。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">9、<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治事务和隔离等级</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应该在自治事务中给出</span>
				<span lang="EN-US">commit</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US">rollback</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">命令，一旦</span>
				<span lang="EN-US">commit</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US">rollback</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在自治事务内部执行，那些改变对主事务而言是可见。但是</span>
				<span lang="EN-US">oracle</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也允许从主事务中通过设定主事务的隔离等级为</span>
				<span lang="EN-US">SERIALIZABLE</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，而不是默认的</span>
				<span lang="EN-US">READ COMMITTED</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，对主事务隐藏这些改变，这可以通过</span>
				<span lang="EN-US">Set TRANSCTION</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句完成，其语法如下：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">Set transaction isolation level serializable;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于隔离等级的问题，以下两点值得注意：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 10.5pt; mso-para-margin-left: 1.71gd; mso-char-indent-count: 1.0">
				<span lang="EN-US">1 </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当自治事务以</span>
				<span lang="EN-US">commit</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US">rollback</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而结束时，由自治事务造成的改变对主事务以外的其它事务是可见的</span>
				<span lang="EN-US">.</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 10.5pt; mso-para-margin-left: 1.71gd; mso-char-indent-count: 1.0">
				<span lang="EN-US">2 </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置隔离等级为</span>
				<span lang="EN-US">serializable</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，对主事务隐藏自治事务的变化。直到主事务提交，主事务一旦提交，自治事务中的改变对自治事务也就可见。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">10、<span style="FONT: 7pt 'Times New Roman'">              </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">什么是隔离级别</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">隔离级别是一种处理修改数据库事务的方法，它影响到一个事务中的改变对另一个事务的可见性。</span>
				<span lang="EN-US">SQL92</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中定义了</span>
				<span lang="EN-US">4</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">种隔离级别即：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes"> </span>READ UNCOMMITTED</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes"> </span>REPEATABLE<span style="mso-spacerun: yes">  </span>READ</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">READ COMMOTTED</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes"> </span>SERIALIZABLE</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">些外</span>
				<span lang="EN-US">oracle</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持</span>
				<span lang="EN-US">READ COMMOTTED</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">SERIALIZABLE</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两种隔离级别</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">Read committed </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：这种设置是</span>
				<span lang="EN-US">oracle</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">默认的</span>
				<span lang="EN-US">,</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它使</span>
				<span lang="EN-US">oracle</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查询可以看到查询之前提将近的数据。换句话说，这种模式的事务是基于每句一致的事务集的。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">Serializable</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这种设置意味着一个事务中的所有语句，都在操作一个事务开始时的数据库映像中，这意味着没有</span>
				<span lang="EN-US">commit</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之前，当前事务都不能看到其它事务所提交的数据。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt -27pt; TEXT-INDENT: -63pt; mso-para-margin-left: -8.57gd; mso-char-indent-count: -6.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/pdw2009/aggbug/71582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-09-24 17:17 <a href="http://www.blogjava.net/pdw2009/archive/2006/09/24/71582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pl/sql异常学习笔记</title><link>http://www.blogjava.net/pdw2009/archive/2006/09/19/70595.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Tue, 19 Sep 2006 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/09/19/70595.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/70595.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/09/19/70595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/70595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/70595.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在				PL / SQL				中错误信息处理过程分为两步：				引发错误和处理错误。编译处误是由				PL/SQL				编译器产生的，它们应该在执行程序前解决。																				 																		 												PL/SQL				异常：类型与定义		...&nbsp;&nbsp;<a href='http://www.blogjava.net/pdw2009/archive/2006/09/19/70595.html'>阅读全文</a><img src ="http://www.blogjava.net/pdw2009/aggbug/70595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-09-19 18:09 <a href="http://www.blogjava.net/pdw2009/archive/2006/09/19/70595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pl/sql记录与indexby表.doc</title><link>http://www.blogjava.net/pdw2009/archive/2006/09/15/69882.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Fri, 15 Sep 2006 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/09/15/69882.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/69882.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/09/15/69882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/69882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/69882.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 标量数据类型																																														 																																																												Number 												系列及其子类型																																C...&nbsp;&nbsp;<a href='http://www.blogjava.net/pdw2009/archive/2006/09/15/69882.html'>阅读全文</a><img src ="http://www.blogjava.net/pdw2009/aggbug/69882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-09-15 14:20 <a href="http://www.blogjava.net/pdw2009/archive/2006/09/15/69882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游标变量和隐藏游标</title><link>http://www.blogjava.net/pdw2009/archive/2006/09/12/69100.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Tue, 12 Sep 2006 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/09/12/69100.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/69100.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/09/12/69100.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/69100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/69100.html</trackback:ping><description><![CDATA[
		<p>SQL%FOUND 指明insert ,update或delete是否影响到行<br />SQL%ISOPEN 指明游标是否打开，这个值在隐式游标中永远为false,因为隐式游标在DML语句执行后自动关闭<br />SQL%NOTFOUND  表示DML语句在修改行的是候是否失败了<br />SQL%ROWCOUNT 指明DML语句影响到的行数</p>
		<p>游标变量就是一个PL/SQL变量，你可以在运行时针对不同的查询使用该变量同一游标变量能指行不同的工作区</p>
		<p>游标变量的定义包括两个步骤：<br />1 定义CURSOR类型的指针<br />  在pl/SQL中，使用下面语法定义CURSOR类型的指针<br />  ref type<br />  如<br />  TYPE rc IS REF CURSOR<br />2 定义REF CURSOR 类型的变量<br />  v_rc rc <br />  完整的声明游标变量方法如下：<br />  type rc is ref cursor;<br />  v_rc rc;</p>
		<p>这样定义的游标类型叫弱类ref curosr 类型 ，这是因为没指明游标的返回类型，因此它能指向任何一个具有任意多列的select 查询。<br />定义带有返回类型的强ref cursor 类型<br />type ref_type_name is ref cursor return return_type;<br />如<br />type rc is ref cursor return hrc_tab%rowtype;<br />v_rc rc;<br />游标变量的使用<br /> 1) 分配内存<br /> 2) 为查询打开游标变量<br /> 3) 把结果取到pl/sql记录中<br /> 4) 关闭游标变量</p>
		<p>
				<br />1 分配内存<br />   在pl/sql中声明游标变量后，pl/sql引擎会自动为期分配存储数据行的内存空间<br />2 打开游标<br />  open   游标变量名 fro select_query<br />3 把结果取到pl/sql记录或单独pl/sql变量中  fetch cursor_variable_name into var1,var2<br />或<br /> fetch   cursor_variable_name into table_name%rowtype;</p>
		<p>4 关闭游标变量<br />  close  cursor_variable_name </p>
		<p>一个例子<br />declare <br /> type rc is ref cursor ;<br /> v_rc rc;<br /> v_rc2 rc;<br /> hrc_rec hrc_tab%rowtype;<br />begin<br />  open v_rc for select * form hrc_tab;<br />  v_rc2:=vrc;<br />loop<br />  fetch v_rc into hrc_rec;<br />  exit when v_rc%nofound;<br />  dbms_output.put_line();<br />end loop; <br />close v_rc;  <br />end;<br />注意：当关闭v_rc的同时也会关闭v_rc2,反之亦然。为一个游标变量简单的赋上一个已经打开的游标变量值，实际上是一个游标指向另一个工作区。不要把一个没打开的游标变量赋值给另一个游标变量，那样会出现invalid_cursor错误<br />游标变量也有4个属性curosr_variable_name%ISOPEN，curosr_variable_name%FOUND,curosr_variable_name%NOTFOUND,curosr_variable_name%ROWCOUNT<br />使用的办法和普通游标一样。</p>
		<p>游标的高级功能</p>
		<p>使用游标变量真正的好处是必须使用同一个游标变量打开多个查询，或根据运行时的条件需要动态的把不同的<br />查询赋给相同的游标变量时体现。</p>
		<p>使用同一游标变理打开多个查询</p>
		<p> declare <br /> type rc is ref cursor ;<br /> v_rc rc;<br /> v_rc2 rc;<br /> hrc_rec hrc_tab%rowtype;<br />begin<br />  open v_rc for select * form hrc_tab;<br />  v_rc2:=vrc;<br />loop<br />  fetch v_rc into hrc_rec;<br />  exit when v_rc%nofound;<br />  dbms_output.put_line();<br />end loop; <br /> open v_rc for select * from hrc_tab where class_id='55';<br />loop<br />  fetch v_rc into hrc_rec;<br />  exit when v_rc%nofound;<br />  dbms_output.put_line();<br />end loop; <br />close v_rc;  <br />end;</p>
		<p>两个地方值得注意：<br /> 同一游标变量v_rc指向两个不同的查询<br /> 第一个查询打开v_rc并取得值后，v_rc并没有立即关闭，它只是简单地为第二个查询重新打开一次，一个新<br />的结果值就确定下来</p>
		<p>
				<br />-===========================------<br />游标表达式<br />使用游标表达式的原因：使用游标表这式可以避免声明和使用多个游标这种复杂的使用方法，因此它能通过<br />SQL引擎产生更加优化的解决方案，之所以如此，是由于游标表达式相对于多个游标使用多个SQL语句来说，它只使用了一个SQL语句。还有oracle9i中解除了嵌入到pl/sql代码的的SQL中使用游标表达式的限制。，现在可以把游标表达式作为PL/SQL游标的一部分使用</p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p>
				<br /> </p>
<img src ="http://www.blogjava.net/pdw2009/aggbug/69100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-09-12 10:18 <a href="http://www.blogjava.net/pdw2009/archive/2006/09/12/69100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> pl/sql 显式游标</title><link>http://www.blogjava.net/pdw2009/archive/2006/09/07/68351.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Thu, 07 Sep 2006 10:11:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/09/07/68351.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/68351.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/09/07/68351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/68351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/68351.html</trackback:ping><description><![CDATA[
		<p>create or replace package body peidw_test as<br />procedure createJob as  <br />      jobid number;<br />      v_sql varchar2(2000);<br />  begin<br />      v_sql:='begin<br />      if to_char(sysdate,''HH24:MI'')=''15:30'' then<br />                    select * from test;<br />                    dbms_output.put_line(''inserted success'');<br />                 end if;<br />                 commit;<br />              exception<br />                 when others then<br />                 rollback;<br />                 dbms_output.put_line(SQLERRM);<br />              end;<br />             ';</p>
		<p>      dbms_job.submit(jobid,v_sql,sysdate,'sysdate+1/1440');<br />      dbms_job.run(jobid);<br />      dbms_output.put_line('job'||to_char(jobid)||' is running');<br />   end createJob; <br />procedure selectAddr_alias(addrid in number,arecord out cur_talias ) as<br />    <br />begin<br />    open arecord for <br />    select al_id ,al_name from addr_alias where addr_id=addrid;<br />end selectAddr_alias;</p>
		<p>procedure curtest as<br />cursor cur_sel_addrAlias is <br />  select al_id,al_name from addr_alias ;<br />  alias TAlias;<br />begin<br />     --open cur_sel_addrAlias ;<br />     /*<br />     fetch cur_sel_addrAlias into alias;<br />     loop<br />         exit when cur_sel_addrAlias%notfound;<br />         dbms_output.put_line(alias.id||'----'||alias.AL_NAME);<br />     end loop;<br />     */<br />     /*<br />     fetch cur_sel_addrAlias into alias;<br />     while cur_sel_addrAlias%found  loop<br />         dbms_output.put_line(alias.id||'----'||alias.AL_NAME);<br />         fetch cur_sel_addrAlias into alias;<br />     end loop;<br /><br />     */<br />     /*<br />     <br />     for idx in cur_sel_addrAlias loop --使用这方式遍历游标不能先打开游标变量<br />         dbms_output.put_line(idx.al_id||'----'||idx.al_name);<br />     end loop;<br />     close cur_sel_addrAlias;<br />     */<br />     dbms_output.put_line('....避免显式身明游标....');<br />     for idx in (select * from addr_alias) loop<br />        dbms_output.put_line(idx.al_id||'---'||idx.al_name||'---'||idx.addr_id);<br />     end loop;<br />exception<br />  when  others then<br />    dbms_output.put_line(sqlerrm); <br />end curtest;<br />end peidw_test;<br />---------------------------------------------------------------------<br /><br />无聊今天看了一下oracle 9i开发人同指南，好久没写pl/sql了，今天主要看游标这一章。<br />显式游标有4个属性<br />     %found  指明是否取到了指定的记录行<br />         用于判定是否取到一条记录，取到返回true，如果fetch没取到任何行，就返回false。<br />     %isopen 指明游标是打开的还是关闭的<br />         用于检查游标是否打开，游标打开了就返回true,未打开返回false。<br />     %notfound <br />           指示fetch是否失败或是否还有可取的记录行<br />     %rowcount 指明总共取得多少行记录<br /><br /><br /><strong>参数游标：</strong><br />定义<br />  cursor cur_sel_addrAliasByid(vaddr_id number) is<br />         select al_id,al_name from addr_alias where addr_id=vaddr_id;<br />使用<br />     open cur_sel_addrAliasByid(1);<br />     fetch cur_sel_addrAliasByid into alias ;<br />     while cur_sel_addrAliasByid%found loop<br />         dbms_output.put_line(alias.id||'----'||alias.AL_NAME);<br />         fetch cur_sel_addrAliasByid into alias;<br />     end loop;<br />     close cur_sel_addrAliasByid;<br /><strong>Select for Update 游标<br /></strong>   用来更新游标所检索到的记录如：<br />declare <br />    cursor cur_1 is <br />      select al_id,al_name form addr_alias for update of al_name;<br />     vname varchar2(50)<br />begin<br />   for idx in cur_1 loop<br />         vname:=upper(idx.al_name);<br />         upate  addr_alias set al_name=vname where current of cur_1;<br />  end loop;<br /><br />commit;<br />end;    <br /></p>
<img src ="http://www.blogjava.net/pdw2009/aggbug/68351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-09-07 18:11 <a href="http://www.blogjava.net/pdw2009/archive/2006/09/07/68351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLESQL性能优化</title><link>http://www.blogjava.net/pdw2009/archive/2006/09/06/68025.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Wed, 06 Sep 2006 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/09/06/68025.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/68025.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/09/06/68025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/68025.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/68025.html</trackback:ping><description><![CDATA[
		<font color="#333333">　1. 选用适合的ORACLE优化器<br />　　ORACLE的优化器共有3种:<br />　　a.　RULE (基于规则)　 b. COST (基于成本)　c. CHOOSE (选择性)<br />　　设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖.<br />　　<br />　　为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性.<br />　　<br />　　如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器.<br />　　<br />　　在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器.<br />　　2.　　　 访问Table的方式<br />　　ORACLE 采用两种访问表中记录的方式:<br />　　a.　　　 全表扫描 <br />　　　　　　全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描.<br />　　b.　　　 通过ROWID访问表<br />　　　 你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高.<br />　　<br />　　3.　　　 共享SQL语句<br />　　<br />　　为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它<br />　　<br />　　和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的<br />　　<br />　　执行路径. ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用.<br />　　<br />　　 可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询.<br />　　<br />　　数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了.<br />　　<br />　　当你向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句.<br />　　<br />　　 这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须<br />　　<br />　　完全相同(包括空格,换行等).<br />　　<br />　　 共享的语句必须满足三个条件:<br />　　A.　　　字符级的比较:<br />　　<br />　　当前被执行的语句和共享池中的语句必须完全相同.<br />　　<br />　　　例如:<br />　　<br />　　　　　SELECT * FROM EMP;<br />　　<br />　　　和下列每一个都不同<br />　　<br />　　　　　SELECT * from EMP;<br />　　<br />　　　　　Select * From Emp;<br />　　<br />　　　　　SELECT　　　*　　 FROM EMP;<br />　　<br />　　B.　　　两个语句所指的对象必须完全相同:<br />　　<br />　　例如:<br />　　　 <br />　　考虑一下下列SQL语句能否在这两个用户之间共享.<br />　　 <br />　　C.　　　两个SQL语句中必须使用相同的名字的绑定变量(bind variables)<br />　　例如：<br />　　第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值)<br />　　a.<br />　　<br />　　select pin , name from people where pin = :blk1.pin;<br />　　<br />　　select pin , name from people where pin = :blk1.pin;<br />　　<br />　　b.<br />　　<br />　　select pin , name from people where pin = :blk1.ot_ind;<br />　　select pin , name from people where pin = :blk1.ov_ind;</font>
		<br />
		<br />
		<font color="#333333">4. 选择最有效率的表名顺序(只在基于规则的优化器中有效)<br /><br />　　ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.<br />　　<br />　　例如:<br />　　<br />　　 表 TAB1 16,384 条记录<br />　　<br />　　 表 TAB2 1 条记录<br />　　 选择TAB2作为基础表 (最好的方法)<br />　　<br />　　 select count(*) from tab1,tab2 执行时间0.96秒<br />　　<br />　　 选择TAB2作为基础表 (不佳的方法)<br />　　 select count(*) from tab2,tab1 执行时间26.09秒<br /><br />　　如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.<br /><br />　　例如:<br /><br />　　 EMP表描述了LOCATION表和CATEGORY表的交集.<br /><br />　　 SELECT * <br />　　<br />　　FROM LOCATION L , <br />　　<br />　　 CATEGORY C,<br />　　<br />　　 EMP E <br />　　<br />　　WHERE E.EMP_NO BETWEEN 1000 AND 2000<br />　　<br />　　AND E.CAT_NO = C.CAT_NO<br />　　<br />　　AND E.LOCN = L.LOCN<br /><br />　　将比下列SQL更有效率<br /><br />　　SELECT * <br />　　<br />　　FROM EMP E ,<br />　　<br />　　LOCATION L , <br />　　<br />　　 CATEGORY C<br />　　<br />　　WHERE E.CAT_NO = C.CAT_NO<br />　　<br />　　AND E.LOCN = L.LOCN<br />　　<br />　　AND E.EMP_NO BETWEEN 1000 AND 2000<br /><br />　　<br />　　5. WHERE子句中的连接顺序．<br /><br />　　ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.<br /><br />　　例如:<br /><br />　　(低效,执行时间156.3秒)<br />　　<br />　　SELECT … <br />　　<br />　　FROM EMP E<br />　　<br />　　WHERE SAL &gt; 50000<br />　　<br />　　AND JOB = ‘MANAGER’<br />　　<br />　　AND 25 &lt; (SELECT COUNT(*) FROM EMP<br />　　<br />　　 WHERE MGR=E.EMPNO);<br />　　<br />　　(高效,执行时间10.6秒)<br />　　<br />　　SELECT … <br />　　<br />　　FROM EMP E<br />　　<br />　　WHERE 25 &lt; (SELECT COUNT(*) FROM EMP<br />　　<br />　　 WHERE MGR=E.EMPNO)<br />　　<br />　　AND SAL &gt; 50000<br />　　<br />　　AND JOB = ‘MANAGER’;<br />　　<br />　　6. SELECT子句中避免使用 ‘ * ‘<br />　　<br />　　当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间. <br />　　<br />　　7. 减少访问数据库的次数<br />　　<br />　　当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量.<br />　　<br />　　例如,<br />　　<br />　　 以下有三种方法可以检索出雇员号等于0342或0291的职员.<br />　　方法1 (最低效)<br />　　<br />　　 SELECT EMP_NAME , SALARY , GRADE<br />　　 FROM EMP <br />　　 WHERE EMP_NO = 342;<br />　　 SELECT EMP_NAME , SALARY , GRADE<br />　　 FROM EMP <br />　　 WHERE EMP_NO = 291;<br />　　方法2 (次低效)<br />　　<br />　　 DECLARE <br />　　<br />　　 CURSOR C1 (E_NO NUMBER) IS <br />　　 SELECT EMP_NAME,SALARY,GRADE<br />　　 FROM EMP <br />　　 WHERE EMP_NO = E_NO;<br />　　 BEGIN <br />　　 OPEN C1(342);<br />　　 FETCH C1 INTO …,..,.. ;<br />　　<br />　　 …..<br />　　 OPEN C1(291);<br />　　 FETCH C1 INTO …,..,.. ;<br />　　 CLOSE C1;<br />　　 END;<br />　　方法3 (高效)<br />　　<br />　　 SELECT A.EMP_NAME , A.SALARY , A.GRADE,<br />　　<br />　　 B.EMP_NAME , B.SALARY , B.GRADE<br />　　<br />　　 FROM EMP A,EMP B<br />　　<br />　　 WHERE A.EMP_NO = 342<br />　　<br />　　 AND B.EMP_NO = 291;<br />　　<br />　　<br />　　注意:<br />　　<br />　　 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200</font>
		<br />
		<br />
		<font color="#333333">　8. 使用DECODE函数来减少处理时间<br /><br />　　使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.<br />　　例如:<br />　　<br />　　 SELECT COUNT(*)，SUM(SAL)<br />　　<br />　　 FROM　EMP<br />　　<br />　　 WHERE DEPT_NO = 0020<br />　　<br />　　 AND ENAME LIKE　‘SMITH%’;<br />　　<br />　　 <br />　　<br />　　 SELECT COUNT(*)，SUM(SAL)<br />　　<br />　　 FROM　EMP<br />　　<br />　　 WHERE DEPT_NO = 0030<br />　　<br />　　 AND ENAME LIKE　‘SMITH%’;<br />　　<br />　　 <br />　　<br />　　你可以用DECODE函数高效地得到相同结果<br />　　<br />　　 <br />　　<br />　　SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT,<br />　　<br />　　 COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT,<br />　　<br />　　 SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,<br />　　<br />　　 SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL<br />　　<br />　　FROM EMP WHERE ENAME LIKE ‘SMITH%’;<br />　　<br />　　 <br />　　<br />　　类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中.<br />　　<br />　　 <br />　　<br />　　 <br />　　<br />　　9. 整合简单,无关联的数据库访问<br />　　<br />　　 <br />　　<br />　　如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)<br />　　<br />　　例如:<br />　　<br />　　 <br />　　<br />　　SELECT NAME <br />　　<br />　　FROM EMP <br />　　<br />　　WHERE EMP_NO = 1234;<br />　　<br />　　 <br />　　<br />　　SELECT NAME <br />　　<br />　　FROM DPT<br />　　<br />　　WHERE DPT_NO = 10 ;<br />　　<br />　　 <br />　　<br />　　SELECT NAME <br />　　<br />　　FROM CAT<br />　　<br />　　WHERE CAT_TYPE = ‘RD’;<br />　　<br />　　 <br />　　<br />　　上面的3个查询可以被合并成一个:<br />　　<br />　　 <br />　　<br />　　SELECT E.NAME , D.NAME , C.NAME<br />　　<br />　　FROM CAT C , DPT D , EMP E,DUAL X<br />　　<br />　　WHERE NVL(‘X’,X.DUMMY) = NVL(‘X’,E.ROWID(+))<br />　　<br />　　AND NVL(‘X’,X.DUMMY) = NVL(‘X’,D.ROWID(+))<br />　　<br />　　AND NVL(‘X’,X.DUMMY) = NVL(‘X’,C.ROWID(+))<br />　　<br />　　AND E.EMP_NO(+) = 1234<br />　　<br />　　AND D.DEPT_NO(+) = 10<br />　　<br />　　AND C.CAT_TYPE(+) = ‘RD’;<br />　　<br />　　 <br />　　<br />　　(译者按: 虽然采取这种方法,效率得到提高,但是程序的可读性大大降低,所以读者 还是要权衡之间的利弊)<br />　　<br />　　 <br />　　<br />　　10. 删除重复记录<br />　　<br />　　最高效的删除重复记录方法 ( 因为使用了ROWID)<br />　　<br />　　 <br />　　<br />　　DELETE FROM EMP E<br />　　<br />　　WHERE E.ROWID &gt; (SELECT MIN(X.ROWID) <br />　　<br />　　 FROM EMP X<br />　　<br />　　 WHERE X.EMP_NO = E.EMP_NO);<br />　　<br />　　 <br />　　<br />　　11. 用TRUNCATE替代DELETE<br />　　<br />　　当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是<br />　　<br />　　恢复到执行删除命令之前的状况)<br />　　<br />　　 <br />　　<br />　　而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.<br />　　<br />　　12. 尽量多使用COMMIT<br />　　 <br />　　<br />　　只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:<br />　　 COMMIT所释放的资源:<br />　　<br />　　a. 回滚段上用于恢复数据的信息.<br />　　<br />　　b. 被程序语句获得的锁<br />　　<br />　　c. redo log buffer 中的空间<br />　　<br />　　d. ORACLE为管理上述3种资源中的内部花费<br /><br />13. 计算记录条数<br />　　<br />　　 和一般的观点相反, count(*) 比count(1)稍快 , 当然如果可以通过索引检索,对索引列的计数仍旧是最快的. 例如 COUNT(EMPNO)<br />　　<br />　　 <br />　　<br />　　(译者按: 在CSDN论坛中,曾经对此有过相当热烈的讨论, 作者的观点并不十分准确,通过实际的测试,上述三种方法并没有显著的性能差别)<br />　　<br />　　 <br />　　<br />　　14. 用Where子句替换HAVING子句<br />　　<br />　　 <br />　　<br />　　 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.<br />　　<br />　　 <br />　　<br />　　例如:<br />　　<br />　　 <br />　　<br />　　 低效:<br />　　<br />　　 SELECT REGION，AVG(LOG_SIZE)<br />　　<br />　　 FROM LOCATION<br />　　<br />　　 GROUP BY REGION<br />　　<br />　　 HAVING REGION REGION != ‘SYDNEY’<br />　　<br />　　 AND REGION != ‘PERTH’<br />　　<br />　　 <br />　　<br />　　 高效<br />　　<br />　　 SELECT REGION，AVG(LOG_SIZE)<br />　　<br />　　 FROM LOCATION<br />　　<br />　　 WHERE REGION REGION != ‘SYDNEY’<br />　　<br />　　 AND REGION != ‘PERTH’<br />　　<br />　　 GROUP BY REGION<br />　　<br />　　(译者按: HAVING 中的条件一般用于对一些集合函数的比较,如COUNT() 等等. 除此而外,一般的条件应该写在WHERE子句中)<br />　　<br />　　 <br />　　<br />　　15. 减少对表的查询<br />　　<br />　　在含有子查询的SQL语句中,要特别注意减少对表的查询.<br />　　<br />　　 <br />　　<br />　　例如: <br />　　<br />　　 低效<br />　　<br />　　 SELECT TAB_NAME<br />　　<br />　　 FROM TABLES<br />　　<br />　　 WHERE TAB_NAME = ( SELECT TAB_NAME <br />　　<br />　　 FROM TAB_COLUMNS<br />　　<br />　　 WHERE VERSION = 604)<br />　　<br />　　 AND　DB_VER= ( SELECT DB_VER <br />　　<br />　　 FROM TAB_COLUMNS<br />　　<br />　　 WHERE VERSION = 604)<br />　　<br />　　 <br />　　<br />　　 高效<br />　　<br />　　 SELECT TAB_NAME<br />　　<br />　　 FROM TABLES<br />　　<br />　　 WHERE (TAB_NAME,DB_VER)<br />　　<br />　　 = ( SELECT TAB_NAME,DB_VER) <br />　　<br />　　 FROM TAB_COLUMNS<br />　　<br />　　 WHERE VERSION = 604)<br />　　<br />　　 <br />　　<br />　　 Update 多个Column 例子:<br />　　<br />　　 低效:<br />　　<br />　　 UPDATE EMP<br />　　<br />　　 SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),<br />　　<br />　　 SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)<br />　　<br />　　 WHERE EMP_DEPT = 0020;<br />　　<br />　　 <br />　　<br />　　 高效:<br />　　<br />　　 UPDATE EMP<br />　　<br />　　 SET (EMP_CAT, SAL_RANGE)<br />　　<br />　　 = (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)<br />　　<br />　　 FROM EMP_CATEGORIES)<br />　　<br />　　 WHERE EMP_DEPT = 0020;<br />　　<br />　　 <br />　　<br />　　 <br />　　<br />　　16. 通过内部函数提高SQL效率.<br />　　<br />　　 <br />　　<br />　　 SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)<br />　　<br />　　 FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H<br />　　<br />　　 WHERE H.EMPNO = E.EMPNO<br />　　<br />　　AND H.HIST_TYPE = T.HIST_TYPE<br />　　<br />　　GROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;<br />　　<br />　　 <br />　　<br />　　通过调用下面的函数可以提高效率.<br />　　<br />　　FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2<br />　　<br />　　AS<br />　　<br />　　 TDESC VARCHAR2(30);<br />　　<br />　　 CURSOR C1 IS <br />　　<br />　　 SELECT TYPE_DESC <br />　　<br />　　 FROM HISTORY_TYPE<br />　　<br />　　 WHERE HIST_TYPE = TYP;<br />　　<br />　　BEGIN <br />　　<br />　　 OPEN C1;<br />　　<br />　　 FETCH C1 INTO TDESC;<br />　　<br />　　 CLOSE C1;<br />　　<br />　　 RETURN (NVL(TDESC,’?’));<br />　　<br />　　END;<br /><br />　　FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2<br />　　<br />　　AS<br />　　<br />　　 ENAME VARCHAR2(30);<br />　　<br />　　 CURSOR C1 IS <br />　　<br />　　 SELECT ENAME<br />　　<br />　　 FROM EMP<br />　　<br />　　 WHERE EMPNO=EMP;<br />　　<br />　　BEGIN <br />　　<br />　　 OPEN C1;<br />　　<br />　　 FETCH C1 INTO ENAME;<br />　　<br />　　 CLOSE C1;<br />　　<br />　　 RETURN (NVL(ENAME,’?’));<br />　　<br />　　END;<br />　　SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO),<br />　　<br />　　H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)<br />　　<br />　　FROM EMP_HISTORY H<br />　　<br />　　GROUP BY H.EMPNO , H.HIST_TYPE;<br />　17. 使用表的别名(Alias)<br />　　<br />　　当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.<br /><br />　　(译者注: Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中出现这个Column时,SQL解析器无法判断这个Column的归属)<br /><br />　　18. 用EXISTS替代IN<br />　　<br />　　在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.<br /><br />　　低效:<br />　　<br />　　SELECT * <br />　　<br />　　FROM EMP (基础表)<br />　　<br />　　WHERE EMPNO &gt; 0<br />　　<br />　　AND DEPTNO IN (SELECT DEPTNO <br />　　<br />　　FROM DEPT <br />　　<br />　　WHERE LOC = ‘MELB’)<br />　　高效:<br />　　<br />　　SELECT * <br />　　<br />　　FROM EMP (基础表)<br />　　<br />　　WHERE EMPNO &gt; 0<br />　　<br />　　AND EXISTS (SELECT ‘X’ <br />　　<br />　　FROM DEPT <br />　　<br />　　WHERE DEPT.DEPTNO = EMP.DEPTNO<br />　　<br />　　AND LOC = ‘MELB’)<br />　　 (译者按: 相对来说,用NOT EXISTS替换NOT IN 将更显著地提高效率,下一节中将指出)<br /><br />　　<br />　　19. 用NOT EXISTS替代NOT IN<br />　　<br />　　在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.<br /><br />　　例如:<br />　　<br />　　SELECT …<br />　　<br />　　FROM EMP<br />　　<br />　　WHERE DEPT_NO NOT IN (SELECT DEPT_NO <br />　　<br />　　 FROM DEPT <br />　　<br />　　 WHERE DEPT_CAT=’A’);<br />　　为了提高效率.改写为:<br /><br />　　(方法一: 高效)<br />　　<br />　　SELECT ….<br />　　<br />　　FROM EMP A,DEPT B<br />　　<br />　　WHERE A.DEPT_NO = B.DEPT(+)<br />　　<br />　　AND B.DEPT_NO IS NULL<br />　　<br />　　AND B.DEPT_CAT(+) = ‘A’<br /><br />　　(方法二: 最高效)<br />　　<br />　　SELECT ….<br />　　<br />　　FROM EMP E<br />　　<br />　　WHERE NOT EXISTS (SELECT ‘X’ <br />　　<br />　　 FROM DEPT D<br />　　<br />　　 WHERE D.DEPT_NO = E.DEPT_NO<br />　　<br />　　 AND DEPT_CAT = ‘A’);<br />　　<br />　20. 用表连接替换EXISTS<br /><br />　　 通常来说 , 采用表连接的方式比EXISTS更有效率<br />　　<br />　　 SELECT ENAME<br />　　<br />　　 FROM EMP E<br />　　<br />　　 WHERE EXISTS (SELECT ‘X’ <br />　　<br />　　 FROM DEPT<br />　　<br />　　 WHERE DEPT_NO = E.DEPT_NO<br />　　<br />　　 AND DEPT_CAT = ‘A’);<br /><br />　　 (更高效)<br />　　<br />　　 SELECT ENAME<br />　　<br />　　 FROM DEPT D,EMP E<br />　　<br />　　 WHERE E.DEPT_NO = D.DEPT_NO<br />　　<br />　　 AND DEPT_CAT = ‘A’ ;<br /><br />　　(译者按: 在RBO的情况下,前者的执行路径包括FILTER,后者使用NESTED LOOP)<br /><br />　　21. 用EXISTS替换DISTINCT<br />　　<br />　　当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换<br /><br />　　例如:<br />　　低效:<br />　　<br />　　 SELECT DISTINCT DEPT_NO,DEPT_NAME<br />　　<br />　　 FROM DEPT D,EMP E<br />　　<br />　　 WHERE D.DEPT_NO = E.DEPT_NO<br />　　<br />　　高效:<br />　　<br />　　 SELECT DEPT_NO,DEPT_NAME<br />　　<br />　　 FROM DEPT D<br />　　<br />　　 WHERE EXISTS ( SELECT ‘X’<br />　　<br />　　 FROM EMP E<br />　　<br />　　 WHERE E.DEPT_NO = D.DEPT_NO);<br /><br />　　 EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.<br /><br />　　22. 识别’低效执行’的SQL语句<br /><br />　　用下列SQL工具找出低效SQL:<br />　　<br />　　 <br />　　<br />　　SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,<br />　　<br />　　 ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,<br />　　<br />　　 ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,<br />　　<br />　　 SQL_TEXT<br />　　<br />　　FROM V$SQLAREA<br />　　<br />　　WHERE EXECUTIONS&gt;0<br />　　<br />　　AND BUFFER_GETS &gt; 0 <br />　　<br />　　AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS &lt; 0.8 <br />　　<br />　　ORDER BY 4 DESC;<br /><br />　　(译者按: 虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法)<br /><br />　　23. 使用TKPROF 工具来查询SQL性能状态<br /><br />　　SQL trace 工具收集正在执行的SQL的性能状态数据并记录到一个跟踪文件中. 这个跟踪文件提供了许多有用的信息,例如解析次数.执行次数,CPU使用时间等.这些数据将可以用来优化你的系统.<br /><br />　　设置SQL TRACE在会话级别: 有效<br /><br />　　 ALTER SESSION SET SQL_TRACE TRUE<br /><br />　　设置SQL TRACE 在整个数据库有效仿, 你必须将SQL_TRACE参数在init.ora中设为TRUE, USER_DUMP_DEST参数说明了生成跟踪文件的目录<br /><br />　　24. 用EXPLAIN PLAN 分析SQL语句<br />　　EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称.<br />　　<br />　　你需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读, 如果两个操作处于同一层中,带有最小操作号的将被首先执行.<br />　　<br />　　NESTED LOOP是少数不按照上述规则处理的操作, 正确的执行路径是检查对NESTED LOOP提供数据的操作,其中操作号最小的将被最先处理.<br /><br />　　译者按: <br /><br />　　通过实践, 感到还是用SQLPLUS中的SET TRACE 功能比较方便.<br />　　<br />　　举例:<br />　　<br />　　 <br />　　<br />　　SQL&gt; list<br />　　<br />　　 1 SELECT *<br />　　<br />　　 2 FROM dept, emp<br />　　<br />　　 3* WHERE emp.deptno = dept.deptno<br />　　<br />　　SQL&gt; set autotrace traceonly /*traceonly 可以不显示执行结果*/<br />　　<br />　　SQL&gt; /<br />　　<br />　　14 rows selected.<br />　　<br />　　Execution Plan<br />　　<br />　　----------------------------------------------------------<br />　　<br />　　 0 SELECT STATEMENT Optimizer=CHOOSE<br />　　<br />　　 1 0 NESTED LOOPS<br />　　<br />　　 2 1 TABLE ACCESS (FULL) OF 'EMP' <br />　　<br />　　 3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'<br />　　<br />　　 4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)<br />　　<br />　　 <br />　　<br />　　Statistics<br />　　<br />　　----------------------------------------------------------<br />　　<br />　　 0 recursive calls<br />　　<br />　　 2 db block gets<br />　　<br />　　 30 consistent gets<br />　　<br />　　 0 physical reads<br />　　<br />　　 0 redo size<br />　　<br />　　 2598 bytes sent via SQL*Net to client<br />　　<br />　　 503 bytes received via SQL*Net from client<br />　　<br />　　 2 SQL*Net roundtrips to/from client<br />　　<br />　　 0 sorts (memory)<br />　　<br />　　 0 sorts (disk)<br />　　<br />　　 14 rows processed<br />　　<br />　　 <br />　　<br />　　通过以上分析,可以得出实际的执行步骤是:<br />　　<br />　　1. TABLE ACCESS (FULL) OF 'EMP' <br />　　<br />　　2. INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)<br />　　<br />　　3. TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'<br />　　<br />　　4. NESTED LOOPS (JOINING 1 AND 3)<br />　　<br />　　注: 目前许多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze都提供了极其方便的EXPLAIN PLAN工具.也许喜欢图形化界面的朋友们可以选用它们.<br />　 <br />　　<br /><br /><br /></font>
<img src ="http://www.blogjava.net/pdw2009/aggbug/68025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-09-06 14:29 <a href="http://www.blogjava.net/pdw2009/archive/2006/09/06/68025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE索引与高性能SQL介绍(转)</title><link>http://www.blogjava.net/pdw2009/archive/2006/09/06/67981.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Wed, 06 Sep 2006 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/09/06/67981.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/67981.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/09/06/67981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/67981.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/67981.html</trackback:ping><description><![CDATA[
		<font color="#333333">
				<strong>什么是索引<br /></strong>　　<br />　　索引是建立在表的一列或多个列上的辅助对象，目的是加快访问表中的数据；<br />　　<br />　　Oracle存储索引的数据结构是B*树，位图索引也是如此，只不过是叶子节点不同B*数索引；<br />　　<br />　　索引由根节点、分支节点和叶子节点组成，上级索引块包含下级索引块的索引数据，叶节点包含索引数据和确定行实际位置的rowid。<br />　　<br />　　使用索引的目的<br />　　加快查询速度<br />　　减少I/O操作<br />　　消除磁盘排序<br />　　<br />　　何时使用索引<br />　　查询返回的记录数<br />　　排序表&lt;40%<br />　　非排序表 &lt;7%<br />　　表的碎片较多（频繁增加、删除）<br />　　<br />　　索引的种类<br />　　非唯一索引（最常用）<br />　　唯一索引<br />　　位图索引<br />　　局部有前缀分区索引<br />　　局部无前缀分区索引<br />　　全局有前缀分区索引<br />　　散列分区索引<br />　　基于函数的索引<br />　　<br />　　</font>
		<font color="#333333">
				<b>管理索引的准则<br />　　<br />　　在表中插入数据后创建索引<br />　　</b>
				<br />　　。在用SQL*Loader或import工具插入或装载数据后，建立索引比较有效；<br />　　<br />　　<b>索引正确的表和列</b><br />　　<br />　　。经常检索排序大表中40%或非排序表7%的行，建议建索引；<br />　　。为了改善多表关联，索引列用于联结；<br />　　。列中的值相对比较唯一；<br />　　。取值范围（大：B*树索引，小：位图索引）；<br />　　。Date型列一般适合基于函数的索引；<br />　　。列中有许多空值，不适合建立索引<br />　　<br />　　<b>为性能而安排索引列</b><br />　　<br />　　。经常一起使用多个字段检索记录，组合索引比单索引更有效；<br />　　。把最常用的列放在最前面，例：dx_groupid_serv_id(groupid,serv_id)，在where条件中使用groupid或groupid,serv_id，查询将使用索引，若仅用到serv_id字段，则索引无效；<br />　　。合并/拆分不必要的索引。<br />　　<br />　　<b>限制每个表索引的数量</b><br />　　<br />　　。一个表可以有几百个索引（你会这样做吗？），但是对于频繁插入和更新表，索引越多系统CPU，I/O负担就越重；<br />　　。建议每张表不超过5个索引。<br />　　<br />　　<b>删除不再需要的索引</b><br />　　<br />　　。索引无效，集中表现在该使用基于函数的索引或位图索引，而使用了B*树索引；<br />　　。应用中的查询不使用索引；<br />　　。重建索引之前必须先删除索引，若用alter index … rebuild重建索引，则不必删除索引。<br />　　<br />　　<b>索引数据块空间使用</b><br />　　<br />　　。创建索引时指定表空间，特别是在建立主键时，应明确指定表空间；<br />　　。合理设定pctfress，注意：不能给索引指定pctused；<br />　　。估计索引的大小和合理地设置存储参数，默认为表空间大小，或initial与next设置成一样大。<br />　　<br />　　<b>考虑并行创建索引</b><br />　　<br />　　。对大表可以采用并行创建索引，在并行创建索引时，存储参数被每个查询服务器进程分别使用，例如：initial为1M，并行度为8，则创建索引期间至少要消耗8M空间；<br />　　<br />　　<b>考虑用nologging创建索引</b><br />　　<br />　　。对大表创建索引可以使用nologging来减少重做日志；<br />　　。节省重做日志文件的空间；<br />　　。缩短创建索引的时间；<br />　　。改善了并行创建大索引时的性能。<br />　　<br />　　<b>怎样建立最佳索引</b><br />　　<br />　　明确地创建索引<br />　　create index index_name on table_name(field_name)<br />　　tablespace tablespace_name<br />　　pctfree 5<br />　　initrans 2<br />　　maxtrans 255<br />　　storage<br />　　(<br />　　minextents 1<br />　　maxextents 16382<br />　　pctincrease 0<br />　　);<br />　　<br />　　<b>创建基于函数的索引</b><br />　　<br />　　。常用与UPPER、LOWER、TO_CHAR(date)等函数分类上，例：<br />　　create index idx_func on emp (UPPER(ename)) tablespace tablespace_name;<br />　　<br />　　<b>创建位图索引</b><br />　　<br />　　。对基数较小，且基数相对稳定的列建立索引时，首先应该考虑位图索引，例：<br />　　create bitmap index idx_bitm on class (classno) tablespace tablespace_name;<br />　　<br />　　<b>明确地创建唯一索引</b><br />　　<br />　　。可以用create unique index语句来创建唯一索引，例：<br />　　create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;<br />　　<br />　　<b>创建与约束相关的索引</b><br />　　<br />　　。可以用using index字句，为与unique和primary key约束相关的索引，例如：<br />　　alter table table_name<br />　　add constraint PK_primary_keyname primary key (field_name)<br />　　using index tablespace tablespace_name；<br />　　<br />　　<b>如何创建局部分区索引</b><br />　　<br />　　。基础表必须是分区表；<br />　　。分区数量与基础表相同；<br />　　。每个索引分区的子分区数量与相应的基础表分区相同；<br />　　。基础表的子分区中的行的索引项，被存储在该索引的相应的子分区中,例如:<br />　　Create Index TG_CDR04_SERV_ID_IDX On TG_CDR04(SERV_ID)<br />　　Pctfree 5<br />　　Tablespace TBS_AK01_IDX<br />　　Storage (<br />　　MaxExtents 32768<br />　　PctIncrease 0<br />　　FreeLists 1<br />　　FreeList Groups 1<br />　　)<br />　　local<br />　　/<br />　　<br />　　<b>如何创建范围分区的全局索引</b><br />　　<br />　　。基础表可以是全局表和分区表。<br />　　create index idx_start_date on tg_cdr01(start_date)<br />　　global partition by range(start_date)<br />　　(partition p01_idx vlaues less than (‘0106’)<br />　　partition p01_idx vlaues less than (‘0111’)<br />　　…<br />　　partition p01_idx vlaues less than (‘0401’ ))<br />　　/<br />　　<br />　　<b>重建现存的索引</b><br />　　<br />　　重建现存的索引的当前时刻不会影响查询；<br />　　<br />　　重建索引可以删除额外的数据块；<br />　　<br />　　提高索引查询效率；<br />　　alter index idx_name rebuild nologging;<br />　　<br />　　对于分区索引：<br />　　alter index idx_name rebuild partition partiton_name nologging;<br />　　<br />　　<b>要删除索引的原因</b><br />　　<br />　　。不再需要的索引；<br />　　。索引没有针对其相关的表所发布的查询提供所期望的性能改善；<br />　　。应用没有用该索引来查询数据；<br />　　。该索引无效，必须在重建之前删除该索引；<br />　　。该索引已经变的太碎了，必须在重建之前删除该索引；<br />　　。语句：drop index idx_name;drop index idx_name drop partition partition_name;<br />　　<br />　　<b>建立索引的代价</b><br />　　<br />　　基础表维护时，系统要同时维护索引，不合理的索引将严重影响系统资源，主要表现在CPU和I/O上；<br />　　<br />　　插入、更新、删除数据产生大量db file sequential read锁等待；<br />　　<br />　　</font>
		<font color="#333333">
				<b>SQL优化器简介<br />　　<br />　　基于规则的优化器</b>
				<br />　　<br />　　。总是使用索引<br />　　。总是从驱动表开始（from子句最右边的表）<br />　　。只有在不可避免的情况下，才使用全表扫描<br />　　。任何索引都可以<br />　　<br />　　<b>基于成本的优化器</b><br />　　<br />　　。需要表、索引的统计资料<br />　　Analyze table customer compute statistics;<br />　　Analyze table customer estimate statistics sample 5000 rows;<br />　　。表中设置并行度、表分区<br />　　<br />　　优化器模式<br />　　<br />　　rule模式<br />　　<br />　　。总忽略CBO和统计信息而基于规则<br />　　choose模式<br />　　<br />　　。Oracle根据情况选择rule or first_rows or all_rows<br />　　first_rows 模式<br />　　<br />　　。基于成本，以最快的速度返回记录，会造成总体查询速度的下降或消耗更多的资源，倾向索引扫描，适合OLTP系统<br />　　all_rows模式<br />　　<br />　　。基于成本，确保总体查询时间最短，倾向并行全表扫描<br />　　<br />　　例如：<br />　　Select last_name from customer order by last_name;用first_rows时，迅速返回记录，但I/O量大，用all_rows时，返回记录慢，但使用资源少。<br />　　<br />　　<b>调整SQL表访问</b><br />　　<br />　　全表扫描<br />　　<br />　　。返回记录：未排序表&gt;40%，排序表&gt;7%，建议采用并行机制来提高访问速度，DDS；<br />　　<br />　　索引访问<br />　　<br />　　。最常用的方法，包括索引唯一扫描和索引范围扫描，OLTP；<br />　　<br />　　快速完全索引扫描<br />　　<br />　　。访问索引中所有数据块，结果相当于全表扫描，可以用索引扫描代替全表扫描，例如：<br />　　<br />　　Select serv_id,count(* ) from tg_cdr01 group by serv_id;<br />　　<br />　　评估全表扫描的合法性<br />　　<br />　　如何实现并行扫描<br />　　<br />　　。永久并行化（不推荐）<br />　　alter table customer parallel degree 8;<br />　　<br />　　。单个查询并行化<br />　　select /*+ full(emp) parallel(emp,8)*/ * from emp;<br />　　<br />　　分区表效果明显<br />　　<br />　　优化SQL语句排序<br />　　<br />　　排序的操作：<br />　　<br />　　。order by 子句<br />　　。group by 子句<br />　　。select distinct子句<br />　　。创建索引时<br />　　。union或minus<br />　　。排序合并连接<br />　　<br />　　如何避免排序<br />　　<br />　　。添加索引<br />　　。在索引中使用distinct子句<br />　　。避免排序合并连接<br />　　<br />　　<b>使用提示进行调整</b><br />　　<br />　　使用提示的原则<br />　　<br />　　。语法：/*+ hint */<br />　　。使用表别名:select /*+ index(e dept_idx)*/ * from emp e<br />　　。检验提示<br />　　<br />　　常用的提示<br />　　<br />　　。rule<br />　　。all_rows<br />　　。first_rows<br />　　。use_nl<br />　　。use_hash<br />　　。use_merge<br />　　。index<br />　　。index_asc<br />　　。no_index<br />　　。index_desc（常用于使用max内置函数）<br />　　。index_combine(强制使用位图索引)<br />　　。index_ffs（索引快速完全扫描）<br />　　。use_concat(将查询中所有or条件使用union all)<br />　　。parallel<br />　　。noparallel<br />　　。full<br />　　。ordered（基于成本）<br />　　<br />　　<b>调整表连接</b><br />　　<br />　　表连接的类型<br />　　<br />　　。等连接<br />　　where 条件中用等式连接；<br />　　。外部连接（左、右连接）<br />　　<br />　　在where条件子句的等式谓词放置一个(+)来实现，例如：<br />　　select a.ename,b.comm from emp a,bonus b where a.ename=b.ename(+);<br />　　<br />　　该语句返回所有emp表的记录；<br />　　。自连接<br />　　　Select a.value total, B.value hard, (A.value - b.value) soft ,<br />　　Round((b.value/a.value)*100,1) perc<br />　　From v$sysstat a,v$sysstat b<br />　　Where a.statistic# = 179<br />　　and B.statistic# = 180;<br />　　<br />　　反连接<br />　　<br />　　反连接常用于not in or not exists中，是指在查询中找到的任何记录都不包含在结果集中的子查询；不建议使用not in or not exists;<br />　　<br />　　。半连接<br />　　<br />　　查询中使用exists，含义：即使在子查询中返回多条重复的记录，外部查询也只返回一条记录。<br />　　<br />　　嵌套循环连接<br />　　<br />　　。被连接表中存在索引的情况下使用；<br />　　。使用use_nl。<br />　　<br />　　hash连接<br />　　<br />　　。Hash连接将驱动表加载在内存中，并使用hash技术连接第二个表，提高等连接速度。<br />　　。适合于大表和小表连接；<br />　　。使用use_hash。<br />　　<br />　　排序合并连接<br />　　<br />　　。排序合并连接不使用索引<br />　　。使用原则：<br />　　<br />　　连接表子段中不存在可用索引；<br />　　<br />　　查询返回两个表中大部分的数据快；<br />　　<br />　　CBO认为全表扫描比索引扫描执行的更快。<br />　　<br />　　。使用use_merge<br />　　<br />　　<b>使用临时/中间表</b><br />　　<br />　　多个大表关联时，可以分别把满足条件的结果集存放到中间表，然后用中间表关联；<br />　　<br />　　<b>SQL子查询的调整</b><br />　　<br />　　关联与非关联子查询<br />　　<br />　　。关联：子查询的内部引用的是外部表，每行执行一次；<br />　　。非关联：子查询只执行一次，存放在内存中。<br />　　<br />　　调整not in 和not exists语句<br />　　<br />　　。可以使用外部连接优化not in子句，例如：<br />　　select ename from emp where dept_no not in<br />　　(select dept_no from dept where dept_name =‘Math’);<br />　　<br />　　改为：<br />　　select ename from emp,dept<br />　　where emp.dept_no=dept.dept_no<br />　　and dept.dept_name is null;<br />　　<br />　　使用索引调整SQL<br />　　<br />　　Oracle 为什么不使用索引<br />　　<br />　　。检查被索引的列或组合索引的首列是否出现在PL/SQL语句的WHERE子句中，这是“执行计划”能用到相关索引的必要条件。<br />　　<br />　　。看采用了哪种类型的连接方式。ORACLE的共有Sort Merge Join（SMJ）、Hash Join（HJ）和Nested Loop Join（NL）。在两张表连接，且内表的目标列上建有索引时，只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引，最多只能因索引的存在，避免数据排序过程。HJ由于须做HASH运算，索引的存在对数据查询速度几乎没有影响。<br />　　<br />　　。看连接顺序是否允许使用相关索引。假设表emp的deptno列上有索引，表dept的列deptno上无索引，WHERE语句有emp.deptno=dept.deptno条件。在做NL连接时，emp做为外表，先被访问，由于连接机制原因，外表的数据访问方式是全表扫描，emp.deptno上的索引显然是用不上，最多在其上做索引全扫描或索引快速全扫描。<br />　　<br />　　。是否用到系统数据字典表或视图。由于系统数据字典表都未被分析过，可能导致极差的“执行计划”。但是不要擅自对数据字典表做分析，否则可能导致死锁，或系统性能下降。<br />　　<br />　　。索引列是否函数的参数。如是，索引在查询时用不上。<br />　　<br />　　。是否存在潜在的数据类型转换。如将字符型数据与数值型数据比较，ORACLE会自动将字符型用to_number()函数进行转换，从而导致上一种现象的发生。<br />　　<br />　　。是否为表和相关的索引搜集足够的统计数据。对数据经常有增、删、改的表最好定期对表和索引进行分析，可用SQL语句“analyze table xxxx compute statistics for all indexes;”。ORACLE掌握了充分反映实际的统计数据，才有可能做出正确的选择。<br />　　<br />　　。索引列的选择性不高。 　　我们假设典型情况，有表emp，共有一百万行数据，但其中的emp.deptno列，数据只有4种不同的值，如10、20、30、40。虽然emp数据行有很多，ORACLE缺省认定表中列的值是在所有数据行均匀分布的，也就是说每种deptno值各有25万数据行与之对应。假设SQL搜索条件DEPTNO=10，利用deptno列上的索引进行数据搜索效率，往往不比全表扫描的高。<br />　　<br />　　。索引列值是否可为空（NULL）。如果索引列值可以是空值，在SQL语句中那些要返回NULL值的操作，将不会用到索引，如COUNT（*），而是用全表扫描。这是因为索引中存储值不能为全空。<br />　　<br />　　。看是否有用到并行查询（PQO）。并行查询将不会用到索引。<br />　　<br />　　。如果从以上几个方面都查不出原因的话，我们只好用采用在语句中加hint的方式强制ORACLE使用最优的“执行计划”。 　hint采用注释的方式，有行注释和段注释两种方式。 　如我们想要用到A表的IND_COL1索引的话，可采用以下方式： 　“SELECT /*+ INDEX（A IND_COL1）*/ * FROM A WHERE COL1 = XXX;"<br />　　<br />　　<b>如何屏蔽索引</b><br />　　<br />　　语句的执行计划中有不良索引时，可以人为地屏蔽该索引，方法：<br />　　<br />　　。数值型：在索引字段上加0，例如<br />　　select * from emp where emp_no+0 = v_emp_no;<br />　　<br />　　。字符型：在索引字段上加‘’，例如<br />　　select * from tg_cdr01 where msisdn||’’=v_msisdn;</font>
		<br />
		<div>
		</div>
		<br />
<img src ="http://www.blogjava.net/pdw2009/aggbug/67981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-09-06 11:26 <a href="http://www.blogjava.net/pdw2009/archive/2006/09/06/67981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle调优</title><link>http://www.blogjava.net/pdw2009/archive/2006/04/28/43815.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Fri, 28 Apr 2006 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/04/28/43815.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/43815.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/04/28/43815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/43815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/43815.html</trackback:ping><description><![CDATA[载自itpub xbxing <br />很好，很全面的一篇关于oracle sql调优的文章。文章非常长，大家可一有空就看一点。 <br />1. 选用适合的ORACLE优化器 <br />    ORACLE的优化器共有3种: <br />   a.  RULE (基于规则)   b. COST (基于成本)  c. CHOOSE (选择性) <br />    设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖. <br />   为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. <br />   如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器. <br />   在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器. <br />  2.       访问Table的方式 <br />  ORACLE 采用两种访问表中记录的方式: <br />a.       全表扫描  <br />            全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描. <br />    b.       通过ROWID访问表 <br />       你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高. <br /> 3.       共享SQL语句 <br />为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它 <br />和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的<br /><br /><br /><hr /><b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=73628" target="_blank">txfy</a> 回复于：2003-12-02 10:04:43</b><br /><br />执行路径. ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用. <br />     可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询. <br />数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了. <br />当你向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句. <br /> 这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须 <br />完全相同(包括空格,换行等). <br />     共享的语句必须满足三个条件: <br /> A.      字符级的比较: <br />当前被执行的语句和共享池中的语句必须完全相同. <br />      例如: <br />          SELECT * FROM EMP; <br />      和下列每一个都不同 <br />          SELECT * from EMP; <br />          Select * From Emp; <br />          SELECT      *     FROM EMP; <br />B.      两个语句所指的对象必须完全相同: <br />例如: <br />   用户 对象名 如何访问 <br />Jack sal_limit private synonym <br />Work_city public synonym <br />Plant_detail public synonym <br />Jill sal_limit private synonym <br />Work_city public synonym <br />Plant_detail table owner <br />     考虑一下下列SQL语句能否在这两个用户之间共享. <br /> SQL 能否共享 原因 <br />select max(sal_cap) from sal_limit; 不能 每个用户都有一个private synonym - sal_limit , 它们是不同的对象 <br />select count(*0 from work_city where sdesc like 'NEW%'; 能 两个用户访问相同的对象public synonym - work_city  <br />select a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id 不能 用户jack 通过private synonym访问plant_detail 而jill 是表的所有者,对象不同.<br /><br /><hr /><b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=73628" target="_blank">txfy</a> 回复于：2003-12-02 10:04:59</b><br /><br />C.      两个SQL语句中必须使用相同的名字的绑定变量(bind variables) <br />例如：第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值) <br />a. <br />select pin , name from people where pin = :blk1.pin; <br />select pin , name from people where pin = :blk1.pin; <br />b. <br />select pin , name from people where pin = :blk1.ot_ind; <br />select pin , name from people where pin = :blk1.ov_ind; <br />4. 选择最有效率的表名顺序(只在基于规则的优化器中有效) <br />ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并. <br />例如:      表 TAB1 16,384 条记录 <br />         表 TAB2 1      条记录 <br />     选择TAB2作为基础表 (最好的方法) <br />     select count(*) from tab1,tab2   执行时间0.96秒 <br />     选择TAB2作为基础表 (不佳的方法)<br /><br /><hr /><b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=73628" target="_blank">txfy</a> 回复于：2003-12-02 10:06:03</b><br /><br />select count(*) from tab2,tab1   执行时间26.09秒 <br />如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. <br />例如:   EMP表描述了LOCATION表和CATEGORY表的交集. <br />SELECT *  <br />FROM LOCATION L ,  <br />      CATEGORY C, <br />      EMP E  <br />WHERE E.EMP_NO BETWEEN 1000 AND 2000 <br />AND E.CAT_NO = C.CAT_NO <br />AND E.LOCN = L.LOCN <br /> 将比下列SQL更有效率 <br />SELECT *  <br />FROM EMP E , <br />LOCATION L ,  <br />      CATEGORY C <br />WHERE  E.CAT_NO = C.CAT_NO <br />AND E.LOCN = L.LOCN <br />AND E.EMP_NO BETWEEN 1000 AND 2000 <br />5.       WHERE子句中的连接顺序． <br />   ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. <br /> 例如: <br /> (低效,执行时间156.3秒) <br />SELECT …  <br />FROM EMP E <br />WHERE  SAL &gt;; 50000 <br />AND    JOB = ‘MANAGER’ <br />AND    25 &lt; (SELECT COUNT(*) FROM EMP<br /><br /><hr /><b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=73628" target="_blank">txfy</a> 回复于：2003-12-02 10:06:21</b><br /><br />WHERE MGR=E.EMPNO); <br /> (高效,执行时间10.6秒) <br />SELECT …  <br />FROM EMP E <br />WHERE 25 &lt; (SELECT COUNT(*) FROM EMP <br />             WHERE MGR=E.EMPNO) <br />AND    SAL &gt;; 50000 <br />AND    JOB = ‘MANAGER’; <br />6.     SELECT子句中避免使用 ‘ * ‘ <br />当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.  <br />7.     减少访问数据库的次数 <br />当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量. <br /> 例如, <br />    以下有三种方法可以检索出雇员号等于0342或0291的职员. <br /> 方法1 (最低效) <br />    SELECT EMP_NAME , SALARY , GRADE <br />    FROM EMP  <br />    WHERE EMP_NO = 342; <br />     SELECT EMP_NAME , SALARY , GRADE <br />    FROM EMP  <br />    WHERE EMP_NO = 291; <br />方法2 (次低效) <br />       DECLARE  <br />        CURSOR C1 (E_NO NUMBER) IS  <br />        SELECT EMP_NAME,SALARY,GRADE<br /><br /><hr /><b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=73628" target="_blank">txfy</a> 回复于：2003-12-02 10:06:58</b><br /><br />FROM EMP  <br />        WHERE EMP_NO = E_NO; <br />    BEGIN  <br />        OPEN C1(342); <br />        FETCH C1 INTO …,..,.. ; <br />                OPEN C1(291); <br />       FETCH C1 INTO …,..,.. ; <br />         CLOSE C1; <br />      END; <br />方法3 (高效) <br />    SELECT A.EMP_NAME , A.SALARY , A.GRADE, <br />            B.EMP_NAME , B.SALARY , B.GRADE <br />    FROM EMP A,EMP B <br />    WHERE A.EMP_NO = 342 <br />    AND   B.EMP_NO = 291; <br /> 注意: <br />在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200. <br />8.       使用DECODE函数来减少处理时间 <br />使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. <br />例如: <br />   SELECT COUNT(*)，SUM(SAL) <br />   FROM　EMP <br />   WHERE DEPT_NO = 0020 <br />   AND ENAME LIKE　‘SMITH%’; <br />   SELECT COUNT(*)，SUM(SAL) <br />   FROM　EMP <br />   WHERE DEPT_NO = 0030 <br />   AND ENAME LIKE　‘SMITH%’; <br />你可以用DECODE函数高效地得到相同结果 <br />SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT, <br />        COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT, <br />        SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL, <br />        SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL <br />FROM EMP WHERE ENAME LIKE ‘SMITH%’; <br />类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中. <br />9.       整合简单,无关联的数据库访问 <br />如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) <br />例如: <br /> SELECT NAME  <br />FROM EMP  <br />WHERE EMP_NO = 1234; <br /><br /> SELECT NAME  <br />FROM DPT <br />WHERE DPT_NO = 10 ; <br /><br />SELECT NAME  <br />FROM CAT <br />WHERE CAT_TYPE = ‘RD’; <br />上面的3个查询可以被合并成一个: <br /> SELECT E.NAME , D.NAME , C.NAME <br />FROM CAT C , DPT D , EMP E,DUAL X <br />WHERE NVL(‘X’,X.DUMMY) = NVL(‘X’,E.ROWID(+)) <br />AND NVL(‘X’,X.DUMMY) = NVL(‘X’,D.ROWID(+)) <br />AND NVL(‘X’,X.DUMMY) = NVL(‘X’,C.ROWID(+)) <br />AND E.EMP_NO(+) = 1234 <br />AND D.DEPT_NO(+) = 10 <br />AND C.CAT_TYPE(+) = ‘RD’; <br /> (译者按: 虽然采取这种方法,效率得到提高,但是程序的可读性大大降低,所以读者 还是要权衡之间的利弊) <br />10.       删除重复记录 <br />最高效的删除重复记录方法 ( 因为使用了ROWID) <br />DELETE FROM EMP E <br />WHERE E.ROWID &gt;; (SELECT MIN(X.ROWID)  <br />                   FROM EMP X <br />                   WHERE X.EMP_NO = E.EMP_NO); <br />11.       用TRUNCATE替代DELETE <br />当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) <br />而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. <br /> (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML) <br />12.       尽量多使用COMMIT <br />只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少: <br /> COMMIT所释放的资源: <br />a.       回滚段上用于恢复数据的信息. <br />b.       被程序语句获得的锁 <br />c.       redo log buffer 中的空间 <br />d.       ORACLE为管理上述3种资源中的内部花费 <br /> (译者按: 在使用COMMIT时必须要注意到事务的完整性,现实中效率和事务完整性往往是鱼和熊掌不可得兼) <br />13.       计算记录条数 <br />     和一般的观点相反, count(*) 比count(1)稍快 , 当然如果可以通过索引检索,对索引列的计数仍旧是最快的. 例如 COUNT(EMPNO) <br />  (译者按: 在CSDN论坛中,曾经对此有过相当热烈的讨论, 作者的观点并不十分准确,通过实际的测试,上述三种方法并没有显著的性能差别) <br /> 14.       用Where子句替换HAVING子句 <br />      避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. <br /> 例如: <br />     低效: <br />     SELECT REGION，AVG(LOG_SIZE) <br />     FROM LOCATION <br />     GROUP BY REGION <br />     HAVING REGION REGION != ‘SYDNEY’ <br />     AND REGION != ‘PERTH’ <br />      高效 <br />     SELECT REGION，AVG(LOG_SIZE) <br />     FROM LOCATION <br />     WHERE REGION REGION != ‘SYDNEY’ <br />     AND REGION != ‘PERTH’ <br />     GROUP BY REGION <br />(译者按: HAVING 中的条件一般用于对一些集合函数的比较,如COUNT() 等等. 除此而外,一般的条件应该写在WHERE子句中) <br />15.       减少对表的查询 <br />在含有子查询的SQL语句中,要特别注意减少对表的查询. <br />  例如:  <br />     低效 <br />          SELECT TAB_NAME <br />          FROM TABLES <br />          WHERE TAB_NAME = ( SELECT TAB_NAME  <br />                                FROM TAB_COLUMNS <br />                                WHERE VERSION = 604) <br />          AND　DB_VER= ( SELECT DB_VER  <br />                           FROM TAB_COLUMNS <br />                           WHERE VERSION = 604) <br />     高效 <br />          SELECT TAB_NAME <br />          FROM TABLES <br />          WHERE  (TAB_NAME,DB_VER) <br /> = ( SELECT TAB_NAME,DB_VER)  <br />                   FROM TAB_COLUMNS <br />                   WHERE VERSION = 604) <br />     Update 多个Column 例子: <br />     低效: <br />           UPDATE EMP <br />           SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES), <br />              SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES) <br />           WHERE EMP_DEPT = 0020; <br />     高效: <br />           UPDATE EMP <br />           SET (EMP_CAT, SAL_RANGE) <br /> = (SELECT MAX(CATEGORY) , MAX(SAL_RANGE) <br /> FROM EMP_CATEGORIES) <br />           WHERE EMP_DEPT = 0020; <br />   16.       通过内部函数提高SQL效率. <br />      SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*) <br />     FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H <br />     WHERE H.EMPNO = E.EMPNO <br />AND H.HIST_TYPE = T.HIST_TYPE <br />GROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC; <br />通过调用下面的函数可以提高效率. <br />FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2 <br />AS <br />    TDESC VARCHAR2(30); <br />    CURSOR C1 IS   <br />        SELECT TYPE_DESC  <br />        FROM HISTORY_TYPE <br />        WHERE HIST_TYPE = TYP; <br />BEGIN  <br />    OPEN C1; <br />    FETCH C1 INTO TDESC; <br />    CLOSE C1; <br />    RETURN (NVL(TDESC,’?’)); <br />END; <br />  <br />FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2 <br />AS <br />    ENAME VARCHAR2(30); <br />    CURSOR C1 IS   <br />        SELECT ENAME <br />        FROM EMP <br />        WHERE EMPNO=EMP; <br />BEGIN  <br />    OPEN C1; <br />    FETCH C1 INTO ENAME; <br />    CLOSE C1; <br />    RETURN (NVL(ENAME,’?’)); <br />END; <br />  <br />SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO), <br />H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*) <br />FROM EMP_HISTORY H <br />GROUP BY H.EMPNO , H.HIST_TYPE; <br /> (译者按: 经常在论坛中看到如 ’能不能用一个SQL写出….’ 的贴子, 殊不知复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的) <br />17.       使用表的别名(Alias) <br />当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误. <br />  (译者注: Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中出现这个Column时,SQL解析器无法判断这个Column的归属) <br />18.       用EXISTS替代IN <br />在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. <br /> 低效: <br />SELECT *  <br />FROM EMP (基础表) <br />WHERE EMPNO &gt;; 0 <br />AND DEPTNO IN (SELECT DEPTNO  <br />FROM DEPT  <br />WHERE LOC = ‘MELB’) <br />    高效: <br />SELECT *  <br />FROM EMP (基础表) <br />WHERE EMPNO &gt;; 0 <br />AND EXISTS (SELECT ‘X’  <br />FROM DEPT  <br />WHERE DEPT.DEPTNO = EMP.DEPTNO <br />AND LOC = ‘MELB’) <br />(译者按: 相对来说,用NOT EXISTS替换NOT IN 将更显著地提高效率,下一节中将指出) <br />19.       用NOT EXISTS替代NOT IN <br />在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历).  为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. <br /> 例如: <br />SELECT … <br />FROM EMP <br />WHERE DEPT_NO NOT IN (SELECT DEPT_NO  <br />                         FROM DEPT  <br />                         WHERE DEPT_CAT=’A’); <br />为了提高效率.改写为: <br /> (方法一: 高效) <br />SELECT …. <br />FROM EMP A,DEPT B <br />WHERE A.DEPT_NO = B.DEPT(+) <br />AND B.DEPT_NO IS NULL <br />AND B.DEPT_CAT(+) = ‘A’ <br /> (方法二: 最高效) <br />SELECT …. <br />FROM EMP E <br />WHERE NOT EXISTS (SELECT ‘X’  <br />                    FROM DEPT D <br />                    WHERE D.DEPT_NO = E.DEPT_NO <br />                    AND DEPT_CAT = ‘A’); <br />20.       用表连接替换EXISTS <br />     通常来说 , 采用表连接的方式比EXISTS更有效率 <br />      SELECT ENAME <br />      FROM EMP E <br />      WHERE EXISTS (SELECT ‘X’  <br />                      FROM DEPT <br />                      WHERE DEPT_NO = E.DEPT_NO <br />                      AND DEPT_CAT = ‘A’); <br />     (更高效) <br />      SELECT ENAME <br />      FROM DEPT D,EMP E <br />      WHERE E.DEPT_NO = D.DEPT_NO <br />      AND DEPT_CAT = ‘A’ ; <br />  (译者按: 在RBO的情况下,前者的执行路径包括FILTER,后者使用NESTED LOOP) <br /> 21.       用EXISTS替换DISTINCT <br />当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换 <br /> 例如: <br />低效: <br />    SELECT DISTINCT DEPT_NO,DEPT_NAME <br />    FROM DEPT D,EMP E <br />    WHERE D.DEPT_NO = E.DEPT_NO <br />高效: <br />    SELECT DEPT_NO,DEPT_NAME <br />    FROM DEPT D <br />    WHERE EXISTS ( SELECT ‘X’ <br />                    FROM EMP E <br />                    WHERE E.DEPT_NO = D.DEPT_NO); <br />  EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果. <br /> 22.       识别’低效执行’的SQL语句 <br />用下列SQL工具找出低效SQL: <br /> SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, <br />        ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, <br />        ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run, <br />        SQL_TEXT <br />FROM   V$SQLAREA <br />WHERE  EXECUTIONS&gt;;0 <br />AND     BUFFER_GETS &gt;; 0  <br />AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS &lt; 0.8  <br />ORDER BY 4 DESC; <br />     (译者按: 虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法)<br /><br /><hr /><b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=73628" target="_blank">txfy</a> 回复于：2003-12-02 10:07:39</b><br /><br />23.       使用TKPROF 工具来查询SQL性能状态 <br /> SQL trace 工具收集正在执行的SQL的性能状态数据并记录到一个跟踪文件中. 这个跟踪文件提供了许多有用的信息,例如解析次数.执行次数,CPU使用时间等.这些数据将可以用来优化你的系统. <br />设置SQL TRACE在会话级别: 有效 <br />   ALTER SESSION SET SQL_TRACE TRUE <br />设置SQL TRACE 在整个数据库有效仿, 你必须将SQL_TRACE参数在init.ora中设为TRUE, USER_DUMP_DEST参数说明了生成跟踪文件的目录 <br />  (译者按: 这一节中,作者并没有提到TKPROF的用法, 对SQL TRACE的用法也不够准确, 设置SQL TRACE首先要在init.ora中设定TIMED_STATISTICS, 这样才能得到那些重要的时间状态. 生成的trace文件是不可读的,所以要用TKPROF工具对其进行转换,TKPROF有许多执行参数. 大家可以参考ORACLE手册来了解具体的配置. ) <br />24.       用EXPLAIN PLAN 分析SQL语句 <br /> EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称. <br />你需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读, 如果两个操作处于同一层中,带有最小操作号的将被首先执行. <br />NESTED LOOP是少数不按照上述规则处理的操作, 正确的执行路径是检查对NESTED LOOP提供数据的操作,其中操作号最小的将被最先处理. <br />译者按:  <br /> 通过实践, 感到还是用SQLPLUS中的SET TRACE 功能比较方便. <br />举例: <br /> SQL&gt;; list <br />  1  SELECT * <br />  2  FROM dept, emp <br />  3* WHERE emp.deptno = dept.deptno <br />SQL&gt;; set autotrace traceonly /*traceonly 可以不显示执行结果*/ <br />SQL&gt;; / <br />14 rows selected. <br />Execution Plan <br />---------------------------------------------------------- <br />   0      SELECT STATEMENT Optimizer=CHOOSE <br />   1    0   NESTED LOOPS <br />   2    1     TABLE ACCESS (FULL) OF 'EMP'  <br />   3    1     TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' <br />   4    3       INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) <br />  <br />Statistics <br />---------------------------------------------------------- <br />          0  recursive calls <br />          2  db block gets <br />         30  consistent gets <br />          0  physical reads <br />          0  redo size <br />       2598  bytes sent via SQL*Net to client <br />        503  bytes received via SQL*Net from client <br />          2  SQL*Net roundtrips to/from client <br />          0  sorts (memory) <br />          0  sorts (disk) <br />         14  rows processed <br />通过以上分析,可以得出实际的执行步骤是: <br />1.       TABLE ACCESS (FULL) OF 'EMP'  <br />2.       INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) <br />3.       TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' <br />4.       NESTED LOOPS (JOINING 1 AND 3) <br />注: 目前许多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze都提供了极其方便的EXPLAIN PLAN工具.也许喜欢图形化界面的朋友们可以选用它们. <br />25.       用索引提高效率 <br /><br />索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证. <br />除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率. <br />虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来 <br />存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢. <br /><br />译者按:  <br />定期的重构索引是有必要的.  <br />ALTER INDEX &lt;INDEXNAME&gt;; REBUILD &lt;TABLESPACENAME&gt;; <br /><br />26.       索引的操作 <br /><br />ORACLE对索引有两种访问模式. <br /><br />索引唯一扫描 ( INDEX UNIQUE SCAN) <br /><br />大多数情况下, 优化器通过WHERE子句访问INDEX. <br /><br />例如: <br />表LODGING有两个索引 : 建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER.  <br /><br /><br /><br />SELECT *  <br />FROM LODGING <br />WHERE LODGING = ‘ROSE HILL’; <br /><br />   在内部 , 上述SQL将被分成两步执行, 首先 , LODGING_PK 索引将通过索引唯一扫描的方式被访问 , 获得相对应的ROWID, 通过ROWID访问表的方式 执行下一步检索. <br />   如果被检索返回的列包括在INDEX列中,ORACLE将不执行第二步的处理(通过ROWID访问表). 因为检索数据保存在索引中, 单单访问索引就可以完全满足查询结果.  <br />   下面SQL只需要INDEX UNIQUE SCAN 操作. <br />         <br />        SELECT LODGING <br />        FROM  LODGING <br />WHERE LODGING = ‘ROSE HILL’; <br /><br />  索引范围查询(INDEX RANGE SCAN) <br />      适用于两种情况: <br />1.       基于一个范围的检索 <br />2.       基于非唯一性索引的检索 <br /><br /> 例1: <br /><br />      SELECT LODGING <br />      FROM  LODGING <br />WHERE LODGING LIKE ‘M%’; <br /><br />WHERE子句条件包括一系列值, ORACLE将通过索引范围查询的方式查询LODGING_PK . 由于索引范围查询将返回一组值, 它的效率就要比索引唯一扫描 <br />低一些.  <br /><br />例2: <br /><br />      SELECT LODGING <br />      FROM  LODGING <br />WHERE MANAGER = ‘BILL GATES’; <br />  <br />  这个SQL的执行分两步, LODGING$MANAGER的索引范围查询(得到所有符合条件记录的ROWID) 和下一步同过ROWID访问表得到LODGING列的值. 由于LODGING$MANAGER是一个非唯一性的索引,数据库不能对它执行索引唯一扫描.  <br /><br />  由于SQL返回LODGING列,而它并不存在于LODGING$MANAGER索引中, 所以在索引范围查询后会执行一个通过ROWID访问表的操作.  <br /><br />  WHERE子句中, 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始, 索引将不被采用. <br /><br /> SELECT LODGING <br />      FROM  LODGING <br />WHERE MANAGER LIKE ‘％HANMAN’; <br /><br /> 在这种情况下，ORACLE将使用全表扫描. <br />27.       基础表的选择 <br /><br />基础表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问). 根据优化器的不同, SQL语句中基础表的选择是不一样的. <br />如果你使用的是CBO (COST BASED OPTIMIZER),优化器会检查SQL语句中的每个表的物理大小,索引的状态,然后选用花费最低的执行路径. <br />如果你用RBO (RULE BASED OPTIMIZER) , 并且所有的连接条件都有索引对应, 在这种情况下, 基础表就是FROM 子句中列在最后的那个表. <br />举例: <br />     SELECT A.NAME , B.MANAGER <br />     FROM　WORKER A,  <br />             LODGING B <br />     WHERE　A.LODGING = B.LODING; <br />由于LODGING表的LODING列上有一个索引, 而且WORKER表中没有相比较的索引, WORKER表将被作为查询中的基础表. <br /><br />28.       多个平等的索引 <br />当SQL语句的执行路径可以使用分布在多个表上的多个索引时, ORACLE会同时使用多个索引并在运行时对它们的记录进行合并, 检索出仅对全部索引有效的记录. <br />在ORACLE选择执行路径时,唯一性索引的等级高于非唯一性索引. 然而这个规则只有 <br />当WHERE子句中索引列和常量比较才有效.如果索引列和其他表的索引类相比较. 这种子句在优化器中的等级是非常低的. <br />如果不同表中两个想同等级的索引将被引用, FROM子句中表的顺序将决定哪个会被率先使用. FROM子句中最后的表的索引将有最高的优先级. <br />如果相同表中两个想同等级的索引将被引用, WHERE子句中最先被引用的索引将有最高的优先级. <br />举例: <br />     DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. <br />     SELECT ENAME, <br />     FROM EMP <br />     WHERE DEPT_NO = 20 <br />     AND EMP_CAT = ‘A’; <br />这里,DEPTNO索引将被最先检索,然后同EMP_CAT索引检索出的记录进行合并. 执行路径如下: <br /><br />TABLE ACCESS BY ROWID ON EMP <br />    AND-EQUAL <br />        INDEX RANGE SCAN ON DEPT_IDX <br />        INDEX RANGE SCAN ON CAT_IDX <br /><br />29.        等式比较和范围比较 <br />     当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较. <br /><br />     举例: <br />     DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. <br />     SELECT ENAME <br />     FROM EMP <br />     WHERE DEPTNO &gt;; 20 <br />     AND EMP_CAT = ‘A’; <br />     <br />     这里只有EMP_CAT索引被用到,然后所有的记录将逐条与DEPTNO条件进行比较. 执行路径如下: <br />     TABLE ACCESS BY ROWID ON EMP  <br />           INDEX RANGE SCAN ON CAT_IDX <br /><br />30.       不明确的索引等级 <br /><br />当ORACLE无法判断索引的等级高低差别,优化器将只使用一个索引,它就是在WHERE子句中被列在最前面的. <br />     举例: <br />     DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. <br />      <br />     SELECT ENAME <br />     FROM EMP <br />     WHERE DEPTNO &gt;; 20 <br />     AND EMP_CAT &gt;; ‘A’; <br /><br />     这里, ORACLE只用到了DEPT_NO索引. 执行路径如下: <br />      <br />     TABLE ACCESS BY ROWID ON EMP <br />          INDEX RANGE SCAN ON DEPT_IDX <br /><br />译者按: <br />我们来试一下以下这种情况: <br />SQL&gt;; select index_name, uniqueness from user_indexes where table_name = 'EMP'; <br /><br />INDEX_NAME                     UNIQUENES <br />------------------------------ --------- <br />EMPNO                          UNIQUE <br />EMPTYPE                        NONUNIQUE <br /><br />SQL&gt;; select * from emp where empno &gt;;= 2 and emp_type = 'A' ; <br /><br />no rows selected <br /><br /><br />Execution Plan <br />---------------------------------------------------------- <br />   0      SELECT STATEMENT Optimizer=CHOOSE <br />   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' <br />   2    1     INDEX (RANGE SCAN) OF 'EMPTYPE' (NON-UNIQUE) <br />  <br />虽然EMPNO是唯一性索引,但是由于它所做的是范围比较, 等级要比非唯一性索引的等式比较低! <br />31.       强制索引失效 <br /><br />    <br />如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) . <br /><br />举例: <br />    <br />SELECT ENAME <br />FROM EMP <br />WHERE EMPNO = 7935   <br />AND DEPTNO + 0 = 10    /*DEPTNO上的索引将失效*/ <br />AND EMP_TYPE || ‘’ = ‘A’  /*EMP_TYPE上的索引将失效*/ <br /><br />这是一种相当直接的提高查询效率的办法. 但是你必须谨慎考虑这种策略,一般来说,只有在你希望单独优化几个SQL时才能采用它. <br /><br />这里有一个例子关于何时采用这种策略,  <br /><br />假设在EMP表的EMP_TYPE列上有一个非唯一性的索引而EMP_CLASS上没有索引.  <br /><br />SELECT ENAME <br />FROM EMP <br />WHERE EMP_TYPE = ‘A’  <br />AND EMP_CLASS = ‘X’; <br /><br />优化器会注意到EMP_TYPE上的索引并使用它. 这是目前唯一的选择. 如果,一段时间以后, 另一个非唯一性建立在EMP_CLASS上,优化器必须对两个索引进行选择,在通常情况下,优化器将使用两个索引并在他们的结果集合上执行排序及合并. 然而,如果其中一个索引（EMP_TYPE）接近于唯一性而另一个索引（EMP_CLASS）上有几千个重复的值. 排序及合并就会成为一种不必要的负担. 在这种情况下,你希望使优化器屏蔽掉EMP_CLASS索引. <br />用下面的方案就可以解决问题. <br />SELECT ENAME <br />FROM EMP <br />WHERE EMP_TYPE = ‘A’  <br />AND EMP_CLASS||’’ = ‘X’; <br /><br />32.       避免在索引列上使用计算． <br />WHERE子句中，如果索引列是函数的一部分．优化器将不使用索引而使用全表扫描． <br /><br />举例: <br /><br />低效： <br />SELECT … <br />FROM DEPT <br />WHERE SAL * 12 &gt;; 25000; <br /><br />高效: <br />SELECT … <br />FROM DEPT <br />WHERE SAL  &gt;; 25000/12; <br /><br />译者按: <br />这是一个非常实用的规则，请务必牢记 <br /><br />33.       自动选择索引 <br />如果表中有两个以上（包括两个）索引，其中有一个唯一性索引，而其他是非唯一性． <br />在这种情况下，ORACLE将使用唯一性索引而完全忽略非唯一性索引． <br /><br />举例: <br />SELECT ENAME <br />FROM EMP <br />WHERE EMPNO = 2326   <br />AND DEPTNO  = 20 ; <br /><br />这里，只有EMPNO上的索引是唯一性的，所以EMPNO索引将用来检索记录． <br />TABLE ACCESS BY ROWID ON EMP <br />       INDEX UNIQUE SCAN ON EMP_NO_IDX <br />  <br />34.       避免在索引列上使用NOT <br />通常，　我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的 <br />影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描. <br />   举例: <br /><br />   低效: (这里,不使用索引) <br /><br />   SELECT … <br />   FROM DEPT <br />   WHERE DEPT_CODE NOT = 0; <br />    <br />   高效: (这里,使用了索引) <br /><br />  SELECT … <br />   FROM DEPT <br />   WHERE DEPT_CODE &gt;; 0; <br /><br />   需要注意的是,在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符. <br />   NOT &gt;;  to  &lt;= <br />   NOT &gt;;=  to  &lt; <br />   NOT &lt;  to  &gt;;= <br />   NOT &lt;=  to  &gt;; <br />  <br /><br />译者按: <br />     在这个例子中,作者犯了一些错误. 例子中的低效率SQL是不能被执行的. <br />我做了一些测试: <br />      <br />SQL&gt;; select * from emp where NOT empno &gt;; 1; <br />no rows selected <br />Execution Plan <br />---------------------------------------------------------- <br />   0      SELECT STATEMENT Optimizer=CHOOSE <br />   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' <br />   2    1     INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)      <br /><br />SQL&gt;; select * from emp where empno &lt;= 1; <br />no rows selected <br />Execution Plan <br />---------------------------------------------------------- <br />   0      SELECT STATEMENT Optimizer=CHOOSE <br />   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' <br />   2    1     INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE) <br /><br />      两者的效率完全一样，也许这符合作者关于” 在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符” 的观点<br /><br /><hr /><b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=73628" target="_blank">txfy</a> 回复于：2003-12-02 10:08:15</b><br /><br />35.       用&gt;;=替代&gt;; <br /><br />如果DEPTNO上有一个索引,  <br /><br />高效: <br /><br />   SELECT * <br />   FROM EMP <br />   WHERE DEPTNO &gt;;=4 <br />    <br />   低效: <br /><br />   SELECT * <br />   FROM EMP <br />   WHERE DEPTNO &gt;;3 <br /><br />      两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录. <br />36.       用UNION替换OR (适用于索引列) <br />通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.  <br />   在下面的例子中, LOC_ID 和REGION上都建有索引. <br />高效: <br />   SELECT LOC_ID , LOC_DESC , REGION <br />   FROM LOCATION <br />   WHERE LOC_ID = 10 <br />   UNION <br />   SELECT LOC_ID , LOC_DESC , REGION <br />   FROM LOCATION <br />   WHERE REGION = “MELBOURNE” <br /><br />低效: <br />   SELECT LOC_ID , LOC_DESC , REGION <br />   FROM LOCATION <br />   WHERE LOC_ID = 10 OR REGION = “MELBOURNE” <br /><br />如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面. <br /><br />注意: <br /><br />WHERE KEY1 = 10   (返回最少记录) <br />OR KEY2 = 20        (返回最多记录) <br /><br />ORACLE 内部将以上转换为 <br />WHERE KEY1 = 10 AND <br />((NOT KEY1 = 10) AND KEY2 = 20)         <br /><br />译者按:  <br /><br />下面的测试数据仅供参考: (a = 1003 返回一条记录 , b = 1 返回1003条记录) <br />SQL&gt;; select * from unionvsor /*1st test*/ <br />  2   where a = 1003 or b = 1; <br />1003 rows selected. <br />Execution Plan <br />---------------------------------------------------------- <br />   0      SELECT STATEMENT Optimizer=CHOOSE <br />   1    0   CONCATENATION <br />   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br />   3    2       INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE) <br />   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br />   5    4       INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE) <br />Statistics <br />---------------------------------------------------------- <br />          0  recursive calls <br />          0  db block gets <br />        144  consistent gets <br />          0  physical reads <br />          0  redo size <br />      63749  bytes sent via SQL*Net to client <br />       7751  bytes received via SQL*Net from client <br />         68  SQL*Net roundtrips to/from client <br />          0  sorts (memory) <br />          0  sorts (disk) <br />       1003  rows processed <br />SQL&gt;; select * from unionvsor /*2nd test*/ <br />  2  where b  = 1 or a = 1003 ;  <br />1003 rows selected. <br />Execution Plan <br />---------------------------------------------------------- <br />   0      SELECT STATEMENT Optimizer=CHOOSE <br />   1    0   CONCATENATION <br />   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br />   3    2       INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE) <br />   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br />   5    4       INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE) <br />Statistics <br />---------------------------------------------------------- <br />          0  recursive calls <br />          0  db block gets <br />        143  consistent gets <br />          0  physical reads <br />          0  redo size <br />      63749  bytes sent via SQL*Net to client <br />       7751  bytes received via SQL*Net from client <br />         68  SQL*Net roundtrips to/from client <br />          0  sorts (memory) <br />          0  sorts (disk) <br />       1003  rows processed <br /><br />SQL&gt;; select * from unionvsor /*3rd test*/ <br />  2  where a = 1003 <br />  3  union  <br />  4   select * from unionvsor <br />  5   where b = 1; <br />1003 rows selected. <br />Execution Plan <br />---------------------------------------------------------- <br />   0      SELECT STATEMENT Optimizer=CHOOSE <br />   1    0   SORT (UNIQUE) <br />   2    1     UNION-ALL <br />   3    2       TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br />   4    3         INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE) <br />   5    2       TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br />   6    5         INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE) <br />Statistics <br />---------------------------------------------------------- <br />          0  recursive calls <br />          0  db block gets <br />         10  consistent gets    <br />          0  physical reads <br />          0  redo size <br />      63735  bytes sent via SQL*Net to client <br />       7751  bytes received via SQL*Net from client <br />         68  SQL*Net roundtrips to/from client <br />          1  sorts (memory) <br />          0  sorts (disk) <br />       1003  rows processed <br />用UNION的效果可以从consistent gets和 SQL*NET的数据交换量的减少看出 <br /><br />37.       用IN来替换OR <br /><br />下面的查询可以被更有效率的语句替换: <br /><br />低效: <br /><br />SELECT…. <br />FROM LOCATION <br />WHERE LOC_ID = 10 <br />OR     LOC_ID = 20 <br />OR     LOC_ID = 30 <br /><br />高效 <br />SELECT… <br />FROM LOCATION <br />WHERE LOC_IN IN (10,20,30); <br />     <br />译者按: <br />这是一条简单易记的规则，但是实际的执行效果还须检验，在ORACLE8i下，两者的执行路径似乎是相同的．　 <br /><br /><br />38.       避免在索引列上使用IS NULL和IS NOT NULL <br />避免在索引中使用任何可以为空的列，ORACLE将无法使用该索引 ．对于单列索引，如果列包含空值，索引中将不存在此记录. 对于复合索引，如果每个列都为空，索引中同样不存在此记录.　如果至少有一个列不为空，则记录存在于索引中． <br />举例: <br />  如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值（123,null）的记录(插入). 然而如果 <br />所有的索引列都为空，ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 <br />条具有相同键值的记录,当然它们都是空! <br /><br />      因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引. <br />举例: <br /><br />低效: (索引失效) <br />SELECT … <br />FROM DEPARTMENT <br />WHERE DEPT_CODE IS NOT NULL; <br /><br />高效: (索引有效) <br />SELECT … <br />FROM DEPARTMENT <br />WHERE DEPT_CODE &gt;;=0; <br />39.       总是使用索引的第一个列 <br />如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引.  <br /><br />译者按: <br />这也是一条简单而重要的规则. 见以下实例. <br /><br />SQL&gt;; create table multiindexusage ( inda number , indb number , descr varchar2(10)); <br />Table created. <br />SQL&gt;; create index multindex on multiindexusage(inda,indb); <br />Index created. <br />SQL&gt;; set autotrace traceonly <br /><br />SQL&gt;;  select * from  multiindexusage where inda = 1; <br />Execution Plan <br />---------------------------------------------------------- <br />   0      SELECT STATEMENT Optimizer=CHOOSE <br />   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'MULTIINDEXUSAGE' <br />   2    1     INDEX (RANGE SCAN) OF 'MULTINDEX' (NON-UNIQUE) <br /><br />SQL&gt;; select * from  multiindexusage where indb = 1; <br />Execution Plan <br />---------------------------------------------------------- <br />   0      SELECT STATEMENT Optimizer=CHOOSE <br />   1    0   TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE' <br />    <br />很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引 <br /><br /><br />40.       ORACLE内部操作 <br />当执行查询时,ORACLE采用了内部的操作. 下表显示了几种重要的内部操作. <br />ORACLE Clause 内部操作 <br />ORDER BY SORT ORDER BY <br />UNION UNION-ALL <br />MINUS MINUS <br />INTERSECT INTERSECT <br />DISTINCT,MINUS,INTERSECT,UNION SORT UNIQUE <br />MIN,MAX,COUNT SORT AGGREGATE <br />GROUP BY SORT GROUP BY <br />ROWNUM COUNT or COUNT STOPKEY <br />Queries involving Joins SORT JOIN,MERGE JOIN,NESTED LOOPS <br />CONNECT BY CONNECT BY <br /><br /><br />41.       用UNION-ALL 替换UNION ( 如果有可能的话) <br /><br />当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. <br />如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. <br /><br />举例: <br />   低效： <br />　　　　SELECT ACCT_NUM, BALANCE_AMT <br />        FROM DEBIT_TRANSACTIONS <br />        WHERE TRAN_DATE = ’31-DEC-95’ <br />        UNION <br />        SELECT ACCT_NUM, BALANCE_AMT <br />        FROM DEBIT_TRANSACTIONS <br />        WHERE TRAN_DATE = ’31-DEC-95’ <br />高效: <br />        SELECT ACCT_NUM, BALANCE_AMT <br />        FROM DEBIT_TRANSACTIONS <br />        WHERE TRAN_DATE = ’31-DEC-95’ <br />        UNION ALL <br />        SELECT ACCT_NUM, BALANCE_AMT <br />        FROM DEBIT_TRANSACTIONS <br />        WHERE TRAN_DATE = ’31-DEC-95’ <br /><br />译者按: <br />需要注意的是，UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是 <br />要从业务需求分析使用UNION ALL的可行性. <br />UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这 <br />块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量 <br /><br />Select substr(name,1,25)  "Sort Area Name", <br />    substr(value,1,15)   "Value" <br />from v$sysstat <br />where name like 'sort%' <br />     <br />42.       使用提示(Hints) <br />对于表的访问,可以使用两种Hints. <br />FULL 和 ROWID <br /><br />FULL hint 告诉ORACLE使用全表扫描的方式访问指定表. <br />例如: <br />   SELECT /*+ FULL(EMP) */ * <br />   FROM EMP <br />   WHERE EMPNO = 7893; <br /><br />   ROWID hint 告诉ORACLE使用TABLE ACCESS BY ROWID的操作访问表. <br /><br />   通常, 你需要采用TABLE ACCESS BY ROWID的方式特别是当访问大表的时候, 使用这种方式, 你需要知道ROIWD的值或者使用索引. <br />   如果一个大表没有被设定为缓存(CACHED)表而你希望它的数据在查询结束是仍然停留 <br />在SGA中,你就可以使用CACHE hint 来告诉优化器把数据保留在SGA中. 通常CACHE hint 和 FULL hint 一起使用. <br />例如: <br />SELECT /*+ FULL(WORKER) CACHE(WORKER)*/ * <br />FROM WORK; <br /><br />   索引hint 告诉ORACLE使用基于索引的扫描方式. 你不必说明具体的索引名称 <br />例如: <br />   SELECT /*+ INDEX(LODGING) */ LODGING <br />   FROM LODGING <br />   WHERE MANAGER = ‘BILL GATES’; <br />    <br />   在不使用hint的情况下, 以上的查询应该也会使用索引,然而,如果该索引的重复值过多而你的优化器是CBO, 优化器就可能忽略索引. 在这种情况下, 你可以用INDEX hint强制ORACLE使用该索引. <br /><br />   ORACLE hints 还包括ALL_ROWS, FIRST_ROWS, RULE,USE_NL, USE_MERGE, USE_HASH 等等. <br />    <br />译者按: <br />   使用hint , 表示我们对ORACLE优化器缺省的执行路径不满意,需要手工修改. <br />这是一个很有技巧性的工作. 我建议只针对特定的,少数的SQL进行hint的优化. <br />对ORACLE的优化器还是要有信心(特别是CBO)<br /><br /><hr /><b> <a href="http://bbs.chinaunix.net/viewpro.php?uid=73628" target="_blank">txfy</a> 回复于：2003-12-02 10:08:44</b><br /><br />43.       用WHERE替代ORDER BY <br />ORDER BY 子句只在两种严格的条件下使用索引. <br /><br />ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. <br />ORDER BY中所有的列必须定义为非空. <br /><br />WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列. <br /><br />例如: <br />      表DEPT包含以下列: <br /><br />        DEPT_CODE    PK    NOT NULL <br />        DEPT_DESC           NOT NULL <br />        DEPT_TYPE           NULL <br />     <br />       非唯一性的索引(DEPT_TYPE) <br /><br />     低效: (索引不被使用) <br />            SELECT DEPT_CODE <br />            FROM DEPT <br />            ORDER BY DEPT_TYPE <br /><br />       EXPLAIN PLAN: <br />            SORT ORDER BY  <br />                  TABLE ACCESS FULL <br />     高效: (使用索引) <br />           SELECT DEPT_CODE <br />           FROM DEPT <br />        WHERE DEPT_TYPE &gt;; 0  <br />    EXPLAIN PLAN: <br />      TABLE ACCESS BY ROWID ON EMP <br />             INDEX RANGE SCAN ON DEPT_IDX <br />译者按: <br />      ORDER BY 也能使用索引! 这的确是个容易被忽视的知识点. 我们来验证一下: <br />SQL&gt;;  select * from emp order by empno; <br />Execution Plan <br />---------------------------------------------------------- <br />   0      SELECT STATEMENT Optimizer=CHOOSE <br />   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' <br />   2    1     INDEX (FULL SCAN) OF 'EMPNO' (UNIQUE) <br />44.       避免改变索引列的类型. <br />当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换. <br />假设 EMPNO是一个数值类型的索引列. <br />SELECT … <br />FROM EMP <br />WHERE EMPNO = ‘123’ <br />实际上,经过ORACLE类型转换, 语句转化为: <br />SELECT … <br />FROM EMP <br />WHERE EMPNO = TO_NUMBER(‘123’) <br />幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变. <br />现在,假设EMP_TYPE是一个字符类型的索引列. <br />SELECT … <br />FROM EMP <br />WHERE EMP_TYPE = 123 <br />这个语句被ORACLE转换为: <br />SELECT … <br />FROM EMP <br />WHERE TO_NUMBER(EMP_TYPE)=123 <br />因为内部发生的类型转换, 这个索引将不会被用到!  <br />译者按: <br />为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型. <br />45.       需要当心的WHERE子句 <br />某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子. <br />在下面的例子里, ‘!=’ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.  <br />不使用索引: <br />SELECT ACCOUNT_NAME <br />FROM TRANSACTION <br />WHERE AMOUNT !=0; <br />使用索引: <br />SELECT ACCOUNT_NAME <br />FROM TRANSACTION <br />WHERE AMOUNT &gt;;0; <br />下面的例子中, ‘||’是字符连接函数. 就象其他函数那样, 停用了索引. <br />不使用索引: <br />SELECT ACCOUNT_NAME,AMOUNT <br />FROM TRANSACTION <br />WHERE ACCOUNT_NAME||ACCOUNT_TYPE=’AMEXA’; <br />使用索引: <br />SELECT ACCOUNT_NAME,AMOUNT <br />FROM TRANSACTION <br />WHERE ACCOUNT_NAME = ‘AMEX’ <br />AND  ACCOUNT_TYPE=’ A’; <br />下面的例子中, ‘+’是数学函数. 就象其他数学函数那样, 停用了索引. <br />不使用索引: <br />SELECT ACCOUNT_NAME, AMOUNT <br />FROM TRANSACTION <br />WHERE AMOUNT + 3000 &gt;;5000; <br />使用索引: <br />SELECT ACCOUNT_NAME, AMOUNT <br />FROM TRANSACTION <br />WHERE AMOUNT &gt;; 2000 ; <br />下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描. <br />不使用索引: <br />SELECT ACCOUNT_NAME, AMOUNT <br />FROM TRANSACTION <br />WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME); <br />使用索引: <br />SELECT ACCOUNT_NAME, AMOUNT <br />FROM TRANSACTION <br />WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,’%’); <br />译者按: <br />如果一定要对使用函数的列启用索引, ORACLE新的功能: 基于函数的索引(Function-Based Index) 也许是一个较好的方案. <br /> CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基于函数的索引*/ <br /> SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL’; /*将使用索引*/ <br />46.       连接多个扫描 <br />如果你对一个列和一组有限的值进行比较, 优化器可能执行多次扫描并对结果进行合并连接. <br />举例: <br />    SELECT *  <br />    FROM LODGING <br />    WHERE MANAGER IN (‘BILL GATES’,’KEN MULLER’); <br />    优化器可能将它转换成以下形式 <br />    SELECT *  <br />    FROM LODGING <br />    WHERE MANAGER = ‘BILL GATES’ <br />    OR MANAGER = ’KEN MULLER’; <br />    当选择执行路径时, 优化器可能对每个条件采用LODGING$MANAGER上的索引范围扫描. 返回的ROWID用来访问LODGING表的记录 (通过TABLE ACCESS BY ROWID 的方式). 最后两组记录以连接(CONCATENATION)的形式被组合成一个单一的集合. <br />Explain Plan : <br />SELECT STATEMENT Optimizer=CHOOSE <br />   CONCATENATION <br />      TABLE ACCESS (BY INDEX ROWID) OF LODGING <br />         INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE) <br />     TABLE ACCESS (BY INDEX ROWID) OF LODGING <br />         INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE) <br />译者按: <br />本节和第37节似乎有矛盾之处.  <br />47.       CBO下使用更具选择性的索引 <br />基于成本的优化器(CBO, Cost-Based Optimizer)对索引的选择性进行判断来决定索引的使用是否能提高效率. <br />如果索引有很高的选择性, 那就是说对于每个不重复的索引键值,只对应数量很少的记录. <br />比如, 表中共有100条记录而其中有80个不重复的索引键值. 这个索引的选择性就是80/100 = 0.8 . 选择性越高, 通过索引键值检索出的记录就越少.  <br />如果索引的选择性很低, 检索数据就需要大量的索引范围查询操作和ROWID 访问表的 <br />操作. 也许会比全表扫描的效率更低. <br />译者按: <br />下列经验请参阅: <br />a.       如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.  <br />b.       在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的 <br />区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍! <br />48.       避免使用耗费资源的操作 <br />带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 <br />执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. <br />例如,一个UNION查询,其中每个查询都带有GROUP BY子句, GROUP BY会触发嵌入排序(NESTED SORT) ; 这样, 每个查询需要执行一次排序, 然后在执行UNION时, 又一个唯一排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入排序结束后才能开始执行. 嵌入的排序的深度会大大影响查询的效率. <br />通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. <br />译者按: <br />     如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强 <br />49.       优化GROUP BY <br />提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多. <br />低效: <br />   SELECT JOB , AVG(SAL) <br />   FROM EMP <br />   GROUP JOB  <br />   HAVING JOB = ‘PRESIDENT’ <br />   OR JOB = ‘MANAGER’ <br /> 高效: <br />   SELECT JOB , AVG(SAL) <br />   FROM EMP <br />   WHERE JOB = ‘PRESIDENT’ <br />   OR JOB = ‘MANAGER’ <br />   GROUP JOB  <br />    译者按: <br />     本节和14节相同. 可略过.  <br />50.       使用日期  <br />当使用日期是,需要注意如果有超过5位小数加到日期上, 这个日期会进到下一天! <br />例如: <br />1. <br />SELECT TO_DATE(‘01-JAN-93’+.99999) <br />FROM DUAL; <br />Returns: <br />   ’01-JAN-93 23:59:59’ <br />2. <br />SELECT TO_DATE(‘01-JAN-93’+.999999) <br />FROM DUAL; <br /><br />Returns: <br />   ’02-JAN-93 00:00:00’ <br />译者按: <br />    虽然本节和SQL性能优化没有关系, 但是作者的功力可见一斑 <br />51.   使用显式的游标(CURSORs) <br />使用隐式的游标,将会执行两次操作. 第一次检索记录, 第二次检查TOO MANY ROWS 这个exception . 而显式游标不执行第二次操作.  <br />52.   优化EXPORT和IMPORT <br />使用较大的BUFFER(比如10MB , 10,240,000)可以提高EXPORT和IMPORT的速度. <br />ORACLE将尽可能地获取你所指定的内存大小,即使在内存不满足,也不会报错.这个值至少要和表中最大的列相当,否则列值会被截断.  <br />译者按: <br />可以肯定的是, 增加BUFFER会大大提高EXPORT , IMPORT的效率. (曾经碰到过一个CASE, 增加BUFFER后,IMPORT/EXPORT快了10倍!)  <br />作者可能犯了一个错误: “这个值至少要和表中最大的列相当,否则列值会被截断. “ <br />其中最大的列也许是指最大的记录大小. <br />关于EXPORT/IMPORT的优化,CSDN论坛中有一些总结性的贴子,比如关于BUFFER参数, COMMIT参数等等, 详情请查. <br /><br />53.   分离表和索引 <br />总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上. <br /><br />译者按: <br />“同时,确保数据表空间和索引表空间置与不同的硬盘上.”可能改为如下更为准确 “同时,确保数据表空间和索引表空间置与不同的硬盘控制卡控制的硬盘上.”<br /><br /><img src ="http://www.blogjava.net/pdw2009/aggbug/43815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-04-28 15:33 <a href="http://www.blogjava.net/pdw2009/archive/2006/04/28/43815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决MySQL5.0以上版本乱码问题方法</title><link>http://www.blogjava.net/pdw2009/archive/2006/04/08/39992.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Sat, 08 Apr 2006 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/04/08/39992.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/39992.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/04/08/39992.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/39992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/39992.html</trackback:ping><description><![CDATA[
		<strong>
				<font style="BACKGROUND-COLOR: #ffa500">实践过程如下:</font>
		</strong>
		<br />1  在DOS中执行 mysql -h localhost -u root -p  进入mysql的DOS操作环境,<br />2  执行 show variables like 'character_set_%'; 显示出了我本机mysql的有关字符 编码的设置,结果如下:<br />+--------------------------+-----------------------------+<br />| Variable_name            | Value                       |<br />+--------------------------+-----------------------------+<br />| character_set_client     | latin1                      |<br />| character_set_connection | latin1                      |<br />| character_set_database   | gbk                         |<br />| character_set_results    | latin1                      |<br />| character_set_server     | gbk                         |<br />| character_set_system     | utf8                        |<br />| character_sets_dir       | E:\mysql513\share\charsets\ |<br />+--------------------------+-----------------------------+<br /><br />看到了,这就是乱码的原因了,现在我统一采用UTF-8编码,操作如下:<br />3 <br />   set character_set_client =utf8;<br />   set character_set_connection =utf8;<br />   set character_set_database=utf8;<br />   set character_set_results=utf8;<br />   set character_set_server=utf8<br /><br />执行后后,你需要把c:/winNt/my.ini添加这"default-character-set=utf8"这行.<br /><br />4 把原来的数据全清楚.重新执行脚本导出数据就一切搞定了.<br /><br />5  把开源玩到底!<img src ="http://www.blogjava.net/pdw2009/aggbug/39992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-04-08 14:57 <a href="http://www.blogjava.net/pdw2009/archive/2006/04/08/39992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用rownum实现分页</title><link>http://www.blogjava.net/pdw2009/archive/2006/04/03/38950.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Mon, 03 Apr 2006 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/04/03/38950.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/38950.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/04/03/38950.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/38950.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/38950.html</trackback:ping><description><![CDATA[用rownum实现大于、小于逻辑（返回rownum在4—10之间的数据）（minus操作，速度会受影响） <br /> select rownum,month,sell from sale where rownum&lt;10 <br /> minus <br /> select rownum,month,sell from sale where rownum&lt;5; <br /><br />返回第5—9条纪录，按月份排序 <br /> select * from (select rownum row_id ,month,sell <br />from (select month,sell from sale group by month,sell)) <br /> where row_id between 5 and 9; <br /><br /><img src ="http://www.blogjava.net/pdw2009/aggbug/38950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-04-03 15:55 <a href="http://www.blogjava.net/pdw2009/archive/2006/04/03/38950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>根据表记录构造目录树</title><link>http://www.blogjava.net/pdw2009/archive/2006/04/03/38945.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Mon, 03 Apr 2006 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2006/04/03/38945.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/38945.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2006/04/03/38945.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/38945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/38945.html</trackback:ping><description><![CDATA[
		<p>表格构:<br /><br />  id         name    level   parent_id    note<br /> 1        广州      1           0              <br /> 2        天河区  2         1   <br /> 3        黄埔区 2         1 <br /> 4        东埔镇  3          2<br /><br />所用的存储过程<br />  CREATE OR REPLACE PACKAGE BODY TOOLS  as<br /> <br />/*Inc:字符串自递增长度*/<br />Function IncString(in_String in varchar2,Inc_Count number default 1) return varchar2<br />as<br />  result varchar2(4000);<br />  v_count Integer;<br />begin<br /> v_count := 1;<br /> result := null;<br /> loop<br />  exit when v_count&gt;=Inc_Count;<br />   result := result||in_String; <br />   v_count :=v_count+1;<br />  end loop;<br /> <br /> return result;<br />end;</p>
		<p>
				<br />/*构建一棵树*/<br />Function BuildTree(in_Level in Number) return varchar2<br />as<br />  result varchar2(4000);<br />begin<br /> if in_Level=1 then<br />   return null; <br />  end if;<br /> return '|'||incString('-',(in_Level-1)*4);  <br />end;<br /><br /><br />查询的构语句:<br /><br />   select a.addr_id ,tools.BuildTree(2)||a.addr_name from addr_info a <br />   connect by a.addr_id =   prior a.parent_id<br />    start with a.addr_id='叶子结点id'<br />    order by level desc<br /><br /></p>
<img src ="http://www.blogjava.net/pdw2009/aggbug/38945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2006-04-03 15:32 <a href="http://www.blogjava.net/pdw2009/archive/2006/04/03/38945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>