﻿<?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-J2EE社区-随笔分类-Database</title><link>http://www.blogjava.net/xcp/category/41972.html</link><description>苟有恒,何必三更起五更眠;&lt;br/&gt;最无益,只怕一日曝十日寒.</description><language>zh-cn</language><lastBuildDate>Mon, 02 May 2016 16:34:23 GMT</lastBuildDate><pubDate>Mon, 02 May 2016 16:34:23 GMT</pubDate><ttl>60</ttl><item><title>oracle 反向索引</title><link>http://www.blogjava.net/xcp/archive/2013/04/27/398512.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Sat, 27 Apr 2013 09:05:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2013/04/27/398512.html</guid><description><![CDATA[create index I_INFO_CLASSID on b_info(CLASSID);<br />create index I_INFO_CLASSID_REVERSE on b_info(reverse(CLASSID));<br />analyze table b_info compute statistics for table for all indexes;<br />--都使用索引<br />select * from b_info where classid like '1E92C5409E99484%';<br />--都使用索引<br />select * from b_info where reverse(classid) like reverse('%33B27');<img src ="http://www.blogjava.net/xcp/aggbug/398512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2013-04-27 17:05 <a href="http://www.blogjava.net/xcp/archive/2013/04/27/398512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中的动态SQL</title><link>http://www.blogjava.net/xcp/archive/2013/04/02/397279.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 02 Apr 2013 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2013/04/02/397279.html</guid><description><![CDATA[<div>http://www.cnblogs.com/gaolonglong/archive/2011/05/31/2064790.html<br /><div>http://www.blogjava.net/cheneyfree/archive/2007/12/17/168272.html<br /><br /><br />记住：select的时候就不需要<span style="background-color: #eeeeee; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 12.727272033691406px;">returning&nbsp;<br />例：</span><span style="font-size: 14px;">&nbsp;execute immediate T_SQL into T_COUNT;</span></div></div><img src ="http://www.blogjava.net/xcp/aggbug/397279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2013-04-02 13:20 <a href="http://www.blogjava.net/xcp/archive/2013/04/02/397279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle查询所有用户表的表名、主键名称、索引、外键等</title><link>http://www.blogjava.net/xcp/archive/2013/04/02/397265.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 02 Apr 2013 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2013/04/02/397265.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/397265.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2013/04/02/397265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/397265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/397265.html</trackback:ping><description><![CDATA[1、查找表的所有索引（包括索引名，类型，构成列）：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">select</span>&nbsp;t.<span style="color: #808080; ">*</span>,i.index_type&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_ind_columns&nbsp;t,user_indexes&nbsp;i&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;t.index_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;i.index_name&nbsp;<span style="color: #808080; ">and</span>&nbsp;t.table_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;i.table_name&nbsp;<span style="color: #808080; ">and</span>&nbsp;t.table_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;要查询的表&nbsp;</div>
<div>2、查找表的主键（包括名称，构成列）：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">select</span>&nbsp;cu.<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_cons_columns&nbsp;cu,&nbsp;user_constraints&nbsp;au&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;cu.constraint_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;au.constraint_name&nbsp;<span style="color: #808080; ">and</span>&nbsp;au.constraint_type&nbsp;<span style="color: #808080; ">=</span>&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">P</span><span style="color: #FF0000; ">'</span>&nbsp;<span style="color: #808080; ">and</span>&nbsp;au.table_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;要查询的表&nbsp;</div>
<div>3、查找表的唯一性约束（包括名称，构成列）：&nbsp;<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">select</span>&nbsp;column_name&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_cons_columns&nbsp;cu,&nbsp;user_constraints&nbsp;au&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;cu.constraint_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;au.constraint_name&nbsp;<span style="color: #808080; ">and</span>&nbsp;au.constraint_type&nbsp;<span style="color: #808080; ">=</span>&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">U</span><span style="color: #FF0000; ">'</span>&nbsp;<span style="color: #808080; ">and</span>&nbsp;au.table_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;要查询的表&nbsp;</div>
<div>4、查找表的外键（包括名称，引用表的表名和对应的键名，下面是分成多步查询）：&nbsp;<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_constraints&nbsp;c&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;c.constraint_type&nbsp;<span style="color: #808080; ">=</span>&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">R</span><span style="color: #FF0000; ">'</span>&nbsp;<span style="color: #808080; ">and</span>&nbsp;c.table_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;要查询的表&nbsp;</div>
<div>5、查询外键约束的列名：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_cons_columns&nbsp;cl&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;cl.constraint_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;外键名称&nbsp;</div>
<div>6、查询引用表的键的列名：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_cons_columns&nbsp;cl&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;cl.constraint_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;外键引用表的键名 &nbsp; &nbsp; &nbsp;</div><br />实例：<br />7、查询没有建立主键的表　<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;u.table_name,&nbsp;u.num_rows<br />&nbsp;&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_tables&nbsp;u<br />&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;<span style="color: #808080; ">not</span>&nbsp;<span style="color: #808080; ">exists</span>&nbsp;(<span style="color: #0000FF; ">select</span>&nbsp;cu.table_name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_cons_columns&nbsp;cu,&nbsp;user_constraints&nbsp;au<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;cu.constraint_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;au.constraint_name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">and</span>&nbsp;au.constraint_type&nbsp;<span style="color: #808080; ">=</span>&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">P</span><span style="color: #FF0000; ">'</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">and</span>&nbsp;au.table_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;u.table_name)<br />&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">and</span>&nbsp;u.num_rows&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;<span style="color: #808080; ">not</span>&nbsp;<span style="color: #0000ff;">null</span><br />&nbsp;<span style="color: #0000FF; ">order</span>&nbsp;<span style="color: #0000FF; ">by</span>&nbsp;u.num_rows&nbsp;<span style="color: #0000FF; ">desc</span>;</div>8、查询表记录中有空值的索引字段<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">--</span><span style="color: #008080; ">&nbsp;Create&nbsp;table</span><span style="color: #008080; "><br /></span><span style="color: #0000FF; ">create</span>&nbsp;<span style="color: #0000FF; ">table</span>&nbsp;TEMP_INDEX<br />(<br />&nbsp;&nbsp;ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold;">VARCHAR2</span>(<span style="color: #800000; font-weight: bold; ">32</span>),<br />&nbsp;&nbsp;TABLE_NAME&nbsp;&nbsp;<span style="font-weight: bold;">VARCHAR2</span>(<span style="color: #800000; font-weight: bold; ">100</span>),<br />&nbsp;&nbsp;COLUMN_NAME&nbsp;<span style="font-weight: bold;">VARCHAR2</span>(<span style="color: #800000; font-weight: bold; ">100</span>),<br />&nbsp;&nbsp;INDEX_NAME&nbsp;&nbsp;<span style="font-weight: bold;">VARCHAR2</span>(<span style="color: #800000; font-weight: bold; ">100</span>),<br />&nbsp;&nbsp;SCSJ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATE<br />)<br />tablespace&nbsp;JG_ZFGFH<br />&nbsp;&nbsp;pctfree&nbsp;<span style="color: #800000; font-weight: bold; ">10</span><br />&nbsp;&nbsp;initrans&nbsp;<span style="color: #800000; font-weight: bold; ">1</span><br />&nbsp;&nbsp;maxtrans&nbsp;<span style="color: #800000; font-weight: bold; ">255</span><br />&nbsp;&nbsp;storage<br />&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;initial&nbsp;<span style="color: #800000; font-weight: bold; ">16</span><br />&nbsp;&nbsp;&nbsp;&nbsp;minextents&nbsp;<span style="color: #800000; font-weight: bold; ">1</span><br />&nbsp;&nbsp;&nbsp;&nbsp;maxextents&nbsp;unlimited<br />&nbsp;&nbsp;);<br /><span style="color: #008080; ">--</span><span style="color: #008080; ">&nbsp;Add&nbsp;comments&nbsp;to&nbsp;the&nbsp;table&nbsp;</span><span style="color: #008080; "><br /></span>comment&nbsp;<span style="color: #0000FF; ">on</span>&nbsp;<span style="color: #0000FF; ">table</span>&nbsp;TEMP_INDEX<br />&nbsp;&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">放入索引值有空的表和列</span><span style="color: #FF0000; ">'</span>;<br /><span style="color: #008080; ">--</span><span style="color: #008080; ">&nbsp;Add&nbsp;comments&nbsp;to&nbsp;the&nbsp;columns&nbsp;</span><span style="color: #008080; "><br /></span>comment&nbsp;<span style="color: #0000FF; ">on</span>&nbsp;<span style="color: #0000FF; ">column</span>&nbsp;TEMP_INDEX.ID<br />&nbsp;&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">自动生成</span><span style="color: #FF0000; ">'</span>;<br />comment&nbsp;<span style="color: #0000FF; ">on</span>&nbsp;<span style="color: #0000FF; ">column</span>&nbsp;TEMP_INDEX.TABLE_NAME<br />&nbsp;&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">表名</span><span style="color: #FF0000; ">'</span>;<br />comment&nbsp;<span style="color: #0000FF; ">on</span>&nbsp;<span style="color: #0000FF; ">column</span>&nbsp;TEMP_INDEX.COLUMN_NAME<br />&nbsp;&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">字段名称</span><span style="color: #FF0000; ">'</span>;<br />comment&nbsp;<span style="color: #0000FF; ">on</span>&nbsp;<span style="color: #0000FF; ">column</span>&nbsp;TEMP_INDEX.INDEX_NAME<br />&nbsp;&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">索引名称</span><span style="color: #FF0000; ">'</span>;<br />comment&nbsp;<span style="color: #0000FF; ">on</span>&nbsp;<span style="color: #0000FF; ">column</span>&nbsp;TEMP_INDEX.SCSJ<br />&nbsp;&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">生成时间</span><span style="color: #FF0000; ">'</span>;</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">create</span>&nbsp;<span style="color: #808080; ">or</span>&nbsp;<span style="color: #FF00FF; ">replace</span>&nbsp;<span style="color: #0000FF; ">procedure</span>&nbsp;P_PROCESS_INDEX<br /><span style="color: #008080; ">/*</span><span style="color: #008080; ">********************************************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------功能：得到表索引字段中有空值字段<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------作者: Xcp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------创建日期：2013-02-20<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------版本&nbsp;v1.0<br />&nbsp;&nbsp;******************************************************************************</span><span style="color: #008080; ">*/</span><br />&nbsp;<span style="color: #0000FF; ">is</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">cursor</span>&nbsp;T_INDEX_CURSOR&nbsp;<span style="color: #0000FF; ">is</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">select</span>&nbsp;i.table_name,&nbsp;t.column_name,&nbsp;t.index_name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_ind_columns&nbsp;t,&nbsp;user_indexes&nbsp;i,&nbsp;user_tab_cols&nbsp;c<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;t.index_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;i.index_name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">and</span>&nbsp;t.column_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;c.column_name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">and</span>&nbsp;t.table_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;i.table_name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">and</span>&nbsp;c.table_name&nbsp;<span style="color: #808080; ">=</span>&nbsp;i.table_name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">order</span>&nbsp;<span style="color: #0000FF; ">by</span>&nbsp;c.column_id;<br />&nbsp;&nbsp;T_COUNT&nbsp;<span style="font-weight: bold;">number</span>:<span style="color: #808080; ">=</span><span style="color: #800000; font-weight: bold; ">0</span>;<br />&nbsp;&nbsp;T_SQL&nbsp;&nbsp;&nbsp;<span style="font-weight: bold;">varchar2</span>(<span style="color: #800000; font-weight: bold; ">1000</span>);<br />&nbsp;&nbsp;T_PRE_TABLE_NAME&nbsp;<span style="font-weight: bold;">varchar2</span>(<span style="color: #800000; font-weight: bold; ">100</span>);<br /><span style="color: #0000FF; ">begin</span><br />&nbsp;&nbsp;<span style="color: #008080; ">--</span><span style="color: #008080; ">清空记录保存表</span><span style="color: #008080; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">delete</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;TEMP_INDEX;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">commit</span>;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<span style="color: #008080; ">--</span><span style="color: #008080; ">重新清理</span><span style="color: #008080; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;T_INDEX&nbsp;<span style="color: #808080; ">in</span>&nbsp;T_INDEX_CURSOR&nbsp;loop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008080; ">--</span><span style="color: #008080; ">事务控制，每个表提交一次</span><span style="color: #008080; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;T_PRE_TABLE_NAME&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;<span style="color: #0000FF; ">then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T_PRE_TABLE_NAME:<span style="color: #808080; ">=</span>T_INDEX.Table_Name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif&nbsp;T_PRE_TABLE_NAME<span style="color: #808080; ">&lt;&gt;</span>T_INDEX.Table_Name&nbsp;<span style="color: #0000FF; ">then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">commit</span>;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">end</span>&nbsp;<span style="color: #0000FF; ">if</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008080; ">--</span><span style="color: #008080; ">求是该索引字段是否有空</span><span style="color: #008080; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">begin</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T_SQL:<span style="color: #808080; ">=</span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">select&nbsp;count(1)&nbsp;&nbsp;from&nbsp;</span><span style="color: #FF0000; ">'</span><span style="color: #808080; ">||</span>T_INDEX.TABLE_NAME<span style="color: #808080; ">||</span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">&nbsp;where&nbsp;</span><span style="color: #FF0000; ">'</span><span style="color: #808080; ">||</span>T_INDEX.Column_Name<span style="color: #808080; ">||</span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">&nbsp;is&nbsp;null&nbsp;</span><span style="color: #FF0000; ">'</span>&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008080; ">--</span><span style="color: #008080; ">dbms_output.put_line(T_SQL);</span><span style="color: #008080; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">execute</span>&nbsp;immediate&nbsp;T_SQL&nbsp;<span style="color: #0000FF; ">into</span>&nbsp;T_COUNT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008080; ">--</span><span style="color: #008080; ">dbms_output.put_line(T_COUNT)&nbsp;;&nbsp;&nbsp;</span><span style="color: #008080; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;T_COUNT<span style="color: #808080; ">&gt;</span><span style="color: #800000; font-weight: bold; ">0</span>&nbsp;<span style="color: #0000FF; ">then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">insert</span>&nbsp;<span style="color: #0000FF; ">into</span>&nbsp;TEMP_INDEX&nbsp;<span style="color: #0000FF; ">values</span>(sys_guid(),T_INDEX.Table_Name,T_INDEX.COLUMN_NAME,T_INDEX.Index_Name,sysdate);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">end</span>&nbsp;<span style="color: #0000FF; ">if</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exception<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">when</span>&nbsp;others&nbsp;<span style="color: #0000FF; ">then</span>&nbsp;dbms_output.put_line(<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">NO&nbsp;DATA&nbsp;FOUND!</span><span style="color: #FF0000; ">'</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">end</span>;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">end</span>&nbsp;loop;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<span style="color: #008080; ">--</span><span style="color: #008080; ">事务控制，最后一个表的事务</span><span style="color: #008080; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;T_INDEX_CURSOR<span style="color: #808080; ">%</span>NOTFOUND&nbsp;<span style="color: #0000FF; ">then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">commit</span>;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">end</span>&nbsp;<span style="color: #0000FF; ">if</span>;<br /><span style="color: #0000FF; ">end</span>&nbsp;P_PROCESS_INDEX;</div></div>
</div>
</div>
</div>
</div><img src ="http://www.blogjava.net/xcp/aggbug/397265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2013-04-02 09:53 <a href="http://www.blogjava.net/xcp/archive/2013/04/02/397265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FORALL语句、FORALL语句自动回滚</title><link>http://www.blogjava.net/xcp/archive/2011/12/31/367652.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Sat, 31 Dec 2011 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/12/31/367652.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/367652.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/12/31/367652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/367652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/367652.html</trackback:ping><description><![CDATA[<div><p align="center" style="text-align:center"><span style="color:fuchsia">FORALL</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:fuchsia">语句</span></p>  <p>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句的一个关键性改进，它可大大简化代码，并且对于那些要在</span>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">程序中更新很多行数据的程序来说，它可显著提高其性能。</span></p>  <p>&nbsp;</p>  <p>1:</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">来增强</span>DML<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">的处理能力</span></p>  <p>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">为</span>Oracle8i<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中的</span>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">引入了两个新的数据操纵语言（</span>DML<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）语句：</span>BULK COLLECT<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。这两个语句在</span>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">内部进行一种数组处理</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">；</span>BULK COLLECT<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">提供对数据的高速检索，</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">可大大改进</span>INSERT<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>UPDATE<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>DELETE<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">操作的性能。</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库使用这些语句大大减少了</span></p>  <p>&nbsp;</p>  <p>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">与</span>SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句执行引擎的环境切换次数，从而使其性能有了显著提高。</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">使用</span>BULK COLLECT<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，你可以将多个行引入一个或多个集合中，而不是单独变量或记录中。下面这个</span><span>BULK COLLECT</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的实例是将标题中包含</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">有</span>"PL/SQL"<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的所有书籍检索出来并置于记录的一个关联数组中，它们都位于通向该数据库的单一通道中。</span></p>  <p>DECLARE</p>  <p><span><span>&nbsp;&nbsp; </span>TYPE books_aat</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>IS TABLE OF book%ROWTYPE</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>INDEX BY PLS_INTEGER;</span></p>  <p><span><span>&nbsp;&nbsp; </span>books books_aat;</span></p>  <p>BEGIN</p>  <p><span><span>&nbsp;&nbsp; </span>SELECT *</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>BULK COLLECT INTO book</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>FROM books</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp; </span>WHERE title LIKE '%PL/SQL%';</span></p>  <p><span><span>&nbsp;&nbsp; </span>...</span></p>  <p>END;</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">类似地，</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">将数据从一个</span>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">集合传送给指定的使用集合的表。下面的代码实例给出一个过程，即接收书籍信息的一个嵌套表，并将该</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">集合（绑定数组）的全部内容插入该书籍表中。注意，这个例子还利用了</span>Oracle9i<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的增强功能，可以将一条记录直接插入到表中。</span></p>  <p>&nbsp;</p>  <p>BULK COLLECT<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">都非常有用，它们不仅提高了性能，而且还简化了为</span>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中的</span>SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">操作所编写的代码。下面的多行</span>FORALL INSERT<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">相当</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">清楚地说明了为什么</span>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">被认为是</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库的最佳编程语言。</span></p>  <p>CREATE TYPE books_nt</p>  <p>IS TABLE OF book%ROWTYPE;</p>  <p>/</p>  <p>CREATE OR REPLACE PROCEDURE add_books (</p>  <p>&nbsp;</p>  <p>books_in IN books_nt)</p>  <p>IS</p>  <p>BEGIN</p>  <p>FORALL book_index</p>  <p><span><span>&nbsp;&nbsp;&nbsp; </span>IN books_in.FIRST .. books_in.LAST</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp; </span>INSERT INTO book</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>VALUES books_in(book_index);</span></p>  <p><span><span>&nbsp;&nbsp; </span>...</span></p>  <p>END;</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">不过在</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">之前，以</span>FORAll<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">方式使用集合有一个重要的限制：该数据库从</span>IN<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">范围子句中的第一行到最后一行，依次读取集合的内容</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。如果在该范围内遇到一个未定义的行，</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库将引发</span>ORA-22160<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">异常事件：</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span>ORA-22160: element at index [N] does not exist</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">对于</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的简单应用，这一规则不会引起任何麻烦。但是，如果想尽可能地充分利用</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，那么要求任意</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">驱动数组都要依次填充可</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">能会增加程序的复杂性并降低性能。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中，</span>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">现在在</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句中提供了两个新子句：</span>INDICES OF<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">与</span>VALUES OF<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，它们使你能够仔细选择驱动数组中该由扩展</span></p>  <p>&nbsp;</p>  <p>DML<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句来处理的行。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">当绑定数组为稀疏数组或者包含有间隙时，</span>INDICES OF<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">会非常有用。该语句的语法结构为：</span></p>  <p>FORALL indx IN INDICES</p>  <p>&nbsp;</p>  <p>OF sparse_collection</p>  <p>INSERT INTO my_table</p>  <p>VALUES sparse_collection (indx);</p>  <p>&nbsp;</p>  <p>VALUES OF<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">用于一种不同的情况：绑定数组可以是稀疏数组，也可以不是，但我只想使用该数组中元素的一个子集。那么我就可以使用</span>VALUES</p>  <p>&nbsp;</p>  <p>OF<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">来指向我希望在</span>DML<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">操作中使用的值。该语句的语法结构为：</span></p>  <p>FORALL indx IN VALUES OF pointer_array</p>  <p>INSERT INTO my_table</p>  <p>VALUES binding_array (indx);</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">不用</span>FOR<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">循环而改用</span>FORALL</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">假定我需要编写一个程序，对合格员工（由</span>comp_analysis.is_eligible<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">函数确定）加薪，编写关于不符合加薪条件的员工的报告并写入</span></p>  <p>&nbsp;</p>  <p>employee_history<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">表。我在一个非常大的公司工作；我们的员工非常非常多。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">对于一位</span>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开发人员来说，这并不是一项十分困难的工作。我甚至不需要使用</span><span>BULK COLLECT</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">或</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">就可以完成这项工作，如清单</span> 1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">所示</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，我使用一个</span><span>CURSOR FOR</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">循环和单独的</span>INSERT<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">及</span>UPDATE<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句。这样的代码简洁明了；不幸地是，我花了</span>10<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">分钟来运行此代码，我的</span>"<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">老式</span>"<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">方法</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">要运行</span>30<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">分钟或更长时间。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">清单</span> 1:</p>  <p><span>CREATE OR REPLACE PROCEDURE give_raises_in_department (</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>dept_in IN employee.department_id%TYPE</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>, newsal IN employee.salary%TYPE</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>)</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>IS</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CURSOR emp_cur</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>IS</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SELECT employee_id, salary, hire_date</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FROM employee</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>WHERE department_id = dept_in;</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>BEGIN</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FOR emp_rec IN emp_cur</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LOOP</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>IF comp_analysis.is_eligible (emp_rec.employee_id)</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>THEN</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPDATE employee</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET salary = newsal</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE employee_id = emp_rec.employee_id;</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ELSE</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO employee_history</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (employee_id, salary</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , hire_date, activity</span></p>  <p><span>&nbsp;&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></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES (emp_rec.employee_id, emp_rec.salary</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , emp_rec.hire_date, 'RAISE DENIED'</span></p>  <p><span>&nbsp;&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></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;END IF;</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>END LOOP;</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>END give_raises_in_department;</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">好在我公司的数据库升级到了</span>Oracle9i<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，而且更幸运的是，在最近的</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">研讨会上（以及</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">技术网站提供的非常不错的演示中）我了解</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">到了批量处理方法。所以我决定使用集合与批量处理方法重新编写程序。写好的程序如清单</span> 2<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">所示。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">清单</span> 2:</p>  <p><span>1 CREATE OR REPLACE PROCEDURE give_raises_in_department (</span></p>  <p><span>2<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>dept_in IN employee.department_id%TYPE</span></p>  <p>3<span>&nbsp;&nbsp; , newsal IN employee.salary%TYPE</span></p>  <p>4 )</p>  <p>5 IS</p>  <p><span>6<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>TYPE employee_aat IS TABLE OF employee.employee_id%TYPE</span></p>  <p><span>7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>INDEX BY PLS_INTEGER;</span></p>  <p><span>8<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>TYPE salary_aat IS TABLE OF employee.salary%TYPE</span></p>  <p><span>9<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>INDEX BY PLS_INTEGER;</span></p>  <p><span>10<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>TYPE hire_date_aat IS TABLE OF employee.hire_date%TYPE</span></p>  <p><span>11<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>INDEX BY PLS_INTEGER;</span></p>  <p>12</p>  <p><span>13<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>employee_ids employee_aat;</span></p>  <p><span>14<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>salaries salary_aat;</span></p>  <p><span>15<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>hire_dates hire_date_aat;</span></p>  <p>16</p>  <p><span>17<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>approved_employee_ids employee_aat;</span></p>  <p>18</p>  <p><span>19<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>denied_employee_ids employee_aat;</span></p>  <p><span>20<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>denied_salaries salary_aat;</span></p>  <p><span>21<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>denied_hire_dates hire_date_aat;</span></p>  <p>22</p>  <p><span>23<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>PROCEDURE retrieve_employee_info</span></p>  <p><span>24<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>IS</span></p>  <p><span>25<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>BEGIN</span></p>  <p><span>26<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SELECT employee_id, salary, hire_date</span></p>  <p><span>27<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>BULK COLLECT INTO employee_ids, salaries, hire_dates</span></p>  <p><span>28<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FROM employee</span></p>  <p><span>29<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;WHERE department_id = dept_in;</span></p>  <p><span>30<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>END;</span></p>  <p>31</p>  <p><span>32<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>PROCEDURE partition_by_eligibility</span></p>  <p><span>33<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>IS</span></p>  <p><span>34<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>BEGIN</span></p>  <p><span>35<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FOR indx IN employee_ids.FIRST .. employee_ids.LAST</span></p>  <p><span>36<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LOOP</span></p>  <p><span>37<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>IF comp_analysis.is_eligible (employee_ids (indx))</span></p>  <p>38 <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THEN</span></p>  <p>39<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; approved_employee_ids (indx) := employee_ids (indx);</span></p>  <p><span>40<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ELSE</span></p>  <p>41<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; denied_employee_ids (indx) := employee_ids (indx);</span></p>  <p>42<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; denied_salaries (indx) := salaries (indx);</span></p>  <p>43<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; denied_hire_dates (indx) := hire_dates (indx);</span></p>  <p><span>44<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>END IF;</span></p>  <p><span>45<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>END LOOP;</span></p>  <p><span>46<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>END;</span></p>  <p>47</p>  <p><span>48<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>PROCEDURE add_to_history</span></p>  <p><span>49<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>IS</span></p>  <p><span>50<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>BEGIN</span></p>  <p><span>51<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FORALL indx IN denied_employee_ids.FIRST .. denied_employee_ids.LAST</span></p>  <p><span>52<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>INSERT INTO employee_history</span></p>  <p>53<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (employee_id</span></p>  <p>54<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , salary</span></p>  <p>55<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , hire_date, activity</span></p>  <p>56<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</span></p>  <p>57<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES (denied_employee_ids (indx)</span></p>  <p>58<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , denied_salaries (indx)</span></p>  <p>59<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , denied_hire_dates (indx), 'RAISE DENIED'</span></p>  <p>60<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>  <p><span>61<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>END;</span></p>  <p>62</p>  <p><span>63<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>PROCEDURE give_the_raise</span></p>  <p><span>64<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>IS</span></p>  <p><span>65<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>BEGIN</span></p>  <p><span>66<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FORALL indx IN approved_employee_ids.FIRST .. approved_employee_ids.LAST</span></p>  <p><span>67<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UPDATE employee</span></p>  <p>68<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET salary = newsal</span></p>  <p>69<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE employee_id = approved_employee_ids (indx);</span></p>  <p><span>70<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>END;</span></p>  <p>71 BEGIN</p>  <p><span>72<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>retrieve_employee_info;</span></p>  <p><span>73<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>partition_by_eligibility;</span></p>  <p><span>74<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>add_to_history;</span></p>  <p><span>75<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>give_the_raise;</span></p>  <p>76 END give_raises_in_department;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">扫一眼清单</span>1 <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和清单</span>2 <span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">就会清楚地认识到：改用集合和批量处理方法将增加代码量和复杂性。但是，如果你需要大幅度提升性能，这还是值得</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的。下面，我们不看这些代码，我们来看一看当使用</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">时，用什么来处理</span><span>CURSOR FOR</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">循环内的条件逻辑。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">定义集合类型与集合</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在清单</span> 2<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中，声明段的第一部分（第</span>6<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行至第</span>11<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">行）定义了几种不同的集合类型，与我将从员工表检索出的列相对应。我更喜欢基于</span>employee%</p>  <p>&nbsp;</p>  <p>ROWTYPE<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">来声明一个集合类型，但是</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">还不支持对某些记录集合的操作，在这样的记录中，我将引用个别字段。所以，我还必须为员工</span>ID<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">薪金和雇用日期分别声明其各自的集合。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">接下来为每一列声明所需的集合（第</span>13<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行至第</span>21<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行）。首先定义与所查询列相对应的集合（第</span>13<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行至第</span>15<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">行）：</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p>employee_ids employee_aat;</p>  <p>salaries salary_aat;</p>  <p>hire_dates hire_date_aat;</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">然后我需要一个新的集合，用于存放已被批准加薪的员工的</span>ID<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">（第</span>17<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行）：</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p>approved_employee_ids employee_aat;</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">最后，我再为每一列声明一个集合（第</span>19<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行至第</span>21<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行），用于记录没有加薪资格的员工：</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p>denied_employee_ids employee_aat;</p>  <p>denied_salaries salary_aat;</p>  <p>denied_hire_dates hire_date_aat;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">深入了解代码</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据结构确定后，我们现在跳过该程序的执行部分（第</span>72<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行至第</span>75<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行），了解如何使用这些集合来加速进程。</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p>retrieve_employee_info;</p>  <p>partition_by_eligibility;</p>  <p>add_to_history;</p>  <p>give_the_raise;</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">我编写此程序使用了逐步细化法（也被称为</span>"<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">自顶向下设计</span>"<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）。所以执行部分不是很长，也不难理解，只有四行，按名称对过程中的每一步进</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行了描述。首先检索员工信息（指定部门的所有员工）。然后进行划分，将要加薪和不予加薪的员工区分出来。完成之后，我就可以将那些不</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">予加薪的员工添加至员工历史表中，对其他员工进行加薪。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">以这种方式编写代码使最终结果的可读性大大增强。因而我可以深入到该程序中对我有意义的任何部分。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">有了已声明的集合，我现在就可以使用</span>BULK COLLECT<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">来检索员工信息（第</span>23<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行至第</span>30<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行）。这一部分有效地替代了</span>CURSOR FOR<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">循环。至此，数</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">据被加载到集合中。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">划分逻辑（第</span>32<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行至第</span>46<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">行）要求对刚刚填充的集合中的每一行进行检查，看其是否符合加薪条件。如果符合，我就将该员工</span>ID<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">从查询填充的</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">集合复制到符合条件的员工的集合。如果不符合，则复制该员工</span>ID<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、薪金和雇用日期，因为这些都需要插入到</span>employee_history<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">表中。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">初始数据现在已被分为两个集合，可以将其分别用作两个不同的</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句（分别从第</span>51<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行和第</span>66<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">行开始）的驱动器。我将不合格员工的集合</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中的数据批量插入到</span>employee_history<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">（</span>add_to_history<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）表中，并通过</span>give_the_raise<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">过程，在</span>employee<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">表中批量更新合格员工的信息。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">最后再仔细地看一看</span>add_to_history<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">（第</span>48<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">行至第</span>61<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行），以此来结束对这个重新编写的程序的分析。</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句（第</span>51<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行）包含一个</span>IN<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">子句</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，它指定了要用于批量</span>INSERT<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的行号范围。在对程序进行第二次重写的说明中，我将把用于定义范围的集合称为</span>"<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">驱动集合</span>"<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。但在</span></p>  <p>&nbsp;</p>  <p>add_to_history<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的这一版本中，我简单地假定：</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">使用在</span>denied_employee_ids<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中定义的所有行。在</span>INSERT<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">自身内部，关于不合格员工的三个集</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">合都会被用到；我将把这些集合称为</span>"<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据集合</span>"<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。可以看到，驱动集合与数据集合无需匹配。在学习</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的新特性时，这是一个关</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">键点。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">结果，清单</span> 2 <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的行数大约是清单</span> 1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行数的</span>2<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">倍，但是清单</span> 2 <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中的代码会在要求的时间内运行。在使用</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">之前，在这种情况下，</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">我只会对能够在这一时间内运行代码并开始下一个任务这一点感到高兴。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">不过，有了</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中最新版的</span>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，现在我就可以在性能、可读性和代码量方面作出更多的改进。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">将</span>VALUES OF<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用于此过程</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中，可以指定</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句使用的驱动集合中的行的子集。可以使用以下两种方法之一来定义该子集：</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">将数据集合中的行号与驱动集合中的行号进行匹配。你需要使用</span>INDICES OF<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">子句。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">将数据集合中的行号与驱动集合中所定义行中找到的值进行匹配。这需要使用</span>VALUES OF<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">子句。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在对</span>give_raises_in_department<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">进行第二次和最后一次改写中我将使用</span>VALUES OF<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">子句。清单</span> 3 <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">包含这个版本的全部代码。我将略过这一程序</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中与前一版本相同的部分。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">从声明集合开始，请注意我不再另外定义集合来存放合格的和不合格的员工信息，而是在清单</span> 3 <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">（第</span>17<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行至第</span>21<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">行）中声明两个</span>"<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">引导</span>"<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">集合：</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">一个用于符合加薪要求的员工，另一个用于不符合加薪要求的员工。这两个集合的数据类型都是布尔型；不久将会看到，这些集合的数据类型</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">与</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句毫无关系。</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句只关心定义了哪些行。</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在员工表中拥有</span>50 000<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行信息的</span>give_raises_in_department<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的三种执行方法的占</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用时间</span> <span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">执行方法</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用时</span></p>  <p>CURSOR FOR<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">循环</span> 00:00:38.01</p>  <p>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">之前的批量处理</span> 00:00:06.09</p>  <p>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的批量处理</span> 00:00:02.06</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在员工表中拥有</span>100,000<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行数据的</span>give_raises_in_department<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的三种执行方法的占用时间</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">执行方法</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用时</span></p>  <p>CURSOR FOR<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">循环</span> 00:00:58.01</p>  <p>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">之前的批量处理</span> 00:00:12.00</p>  <p>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的批量处理</span> 00:00:05.05</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">表</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">：处理</span>50,000<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行和</span>100,000<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行数据的用时测试结果</span></p>  <p>&nbsp;</p>  <p>retrieve_employee_info<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">子程序与前面的相同，但是对数据进行划分的方式完全不同（第</span>32<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行至第</span>44<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">行）。我没有将记录从一个集合复制到另</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">一个集合（这个操作相对较慢），而只是确定与员工</span>ID<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">集合中的行号相匹配的相应引导集合中的行（通过为其指定一个</span>TRUE<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">值）。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">现在可以在两个不同</span>FORALL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句（由第</span>49<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行和第</span>65<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">行开始）中，将</span>approved_list<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>denied_list<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">集合用作驱动集合。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">为了插入到</span>employee_history<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">表中，我使用了如下语句：</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p>FORALL indx IN VALUES OF denied_list</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">为了进行更新（给员工进行加薪），我使用这一格式：</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p>FORALL indx IN VALUES OF approved_list</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在这两个</span>DML<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句中，数据集合是在</span>BULK COLLECT <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">检索步骤中填充的最初的集合；没有进行过复制。利用</span>VALUES OF<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库在这些数据</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">集合的行中进行筛选，仅使用行号与驱动集合中行号相匹配的行</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">利用本程序中的</span><span>VALUES OF</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，可以避免复制对全部记录进行复制，而是用行号的一个简单列表来替换它们。对于大型数组，进行这些复制的开销</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">是非常可观的。为了测试</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的优越性，我装入</span>employee<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">表并对</span>50,000<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行和</span>100,000<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行的数据运行测试。为了模拟更多的现实情况</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，我将</span>Oracle<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>10g<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">之前的批量处理的执行方法作了修改以进行集合内容的多次复制。然后我使用</span>SQL*Plus SET TIMING ON<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">来显示运行各个</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">不同的执行方法所用的时间。表</span><span> 1 </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">给出了结果。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">从这些时间测定得到的结论非常清楚：由单个</span>DML<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句变为批量处理将大幅缩短耗用时间，数据为</span>50,000<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">行时的用时由</span>38<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">秒减为</span>6<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">秒，数据为</span></p>  <p>&nbsp;</p>  <p>100,000<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">行时的用时由</span>58<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">秒减为</span>12<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">秒。而且，通过使用</span>VALUES OF<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">来避免复制数据，我可以将用时缩短一半左右。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">即使没有性能上的改进，</span><span>VALUES OF</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">及其同类子句</span><span>--INDICES OF</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">也提高了</span>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语言的灵活性，使开发人员能够更轻松地编写出更直观和更容易</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">维护的代码。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在产品寿命这一点上，</span>PL/SQL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">是一种成熟且功能强大的语言。因而，其很多新特性都是逐渐增加和改进而成的。不过，这些新特性还是使应用</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">程序的性能和开发人员的开发效率有了重大改变。</span>VALUES OF<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">就是这种特性的一个很好的例子。</span></p>  <p>&nbsp;</p></div><img src ="http://www.blogjava.net/xcp/aggbug/367652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-12-31 15:46 <a href="http://www.blogjava.net/xcp/archive/2011/12/31/367652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Bulk Collect提高Oracle查询效率</title><link>http://www.blogjava.net/xcp/archive/2011/12/31/367650.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Sat, 31 Dec 2011 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/12/31/367650.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/367650.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/12/31/367650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/367650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/367650.html</trackback:ping><description><![CDATA[<div><div>使用Bulk Collect提高Oracle查询效率</div><div>Oracle8i中首次引入了Bulk Collect特性，该特性可以让我们在PL/SQL中能使用批查询，批查询在某些情况下能显著提高查询效率。现在，我们对该特性进行一些简单的测试和分析。</div><div></div><div>一、首先，我们创建一个表，并插入100000条记录</div><div>在SQL/Plus中执行下列脚本：</div><div></div><div>drop table empl_tbl</div><div>/</div><div>create table empl_tbl(last_name varchar2(20),</div><div>first_name varchar2(10),</div><div>salary number(10))</div><div>/</div><div>begin</div><div>for i in 30000..1029999 loop</div><div>insert into empl_tbl(last_name,first_name,salary) values('carl'||(i-3000),'wu'||(1003000-i),i);</div><div>end loop;</div><div>end;</div><div>/</div><div>commit</div><div>/</div><div>select count(*) from empl_tbl;</div><div>/<br /></div><div></div><div></div><div></div><div></div><div></div><div></div><div>二、使用三种方法计算表中某一字段含有多少个不重复值</div><div>2.1 使用常规的Distinct来实现</div><div>SQL&gt; select count(<strong>distinct</strong> last_name) from empl_tbl;</div><div>Distinct Last Name</div><div>------------------</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1000000</div><div>Executed in 1.531 seconds</div><div>我们可以看到，常规方法需要1.531 秒查出该表中有1000000个不重复的Last_name值。</div><div></div><div>2.2 使用游标来实现</div><div>我们执行下面语句来统计Last_name字段的不重复值个数：</div><div>CREATE OR REPLACE PROCEDURE tttt IS</div><div>&nbsp; all_rows number(10);</div><div><strong>&nbsp; temp_last_name empl_tbl.last_name%type;</strong></div><div>begin</div><div>&nbsp; all_rows:=0;</div><div>&nbsp; temp_last_name:=' ';</div><div>&nbsp; for <strong>cur</strong> in (select last_name from empl_tbl order by last_name) loop</div><div></div><div>&nbsp; &nbsp; &nbsp; if cur.last_name!=temp_last_name then</div><div>&nbsp; &nbsp; &nbsp; &nbsp;all_rows:=all_rows+1;</div><div>&nbsp; &nbsp; &nbsp; end if;</div><div>&nbsp; &nbsp; &nbsp; temp_last_name:=cur.last_name;</div><div></div><div>&nbsp; end loop;</div><div>&nbsp; dbms_output.put_line('all_rows are '||all_rows);</div><div>end;</div><div>请注意上面代码中的黑体部分使用了一个For Loop游标，为了提高程序可读性，我们没有显示定义游标变量。</div><div>执行结果：</div><div>all_rows are 1000000</div><div>PL/SQL procedure successfully completed</div><div>Executed in 10.39 seconds</div><div>游标需要10.396秒才能查出该表中有1000000个不重复的Last_name值，所耗时间是Distinct查询的10倍多。</div><div></div><div></div><div>2.3 使用Bulk Collect批查询来实现</div><div>示例代码如下：</div><div>declare</div><div>&nbsp; all_rows number(10);</div><div>&nbsp; --首先，定义一个Index-by表数据类型</div><div>&nbsp;<strong> type last_name_tab is table of empl_tbl.last_name%type index by binary_integer;</strong></div><div><strong>&nbsp; last_name_arr last_name_tab;</strong></div><div>&nbsp; --定义一个Index-by表集合变量</div><div><strong>&nbsp; temp_last_name empl_tbl.last_name%type;</strong></div><div>&nbsp;</div><div>begin</div><div>&nbsp; all_rows:=0;</div><div>&nbsp; temp_last_name:=' ';</div><div>&nbsp; --使用Bulk Collect批查询来充填集合变量</div><div>&nbsp; select last_name bulk collect into last_name_arr from empl_tbl;</div><div>&nbsp;</div><div>&nbsp; f<strong>or i in 1..last_name_arr.count loop</strong></div><div>&nbsp; &nbsp; &nbsp; if temp_last_name!=last_name_arr(i) then</div><div>&nbsp; &nbsp; &nbsp; &nbsp;all_rows:=all_rows+1;</div><div>&nbsp; &nbsp; &nbsp; end if;</div><div>&nbsp; &nbsp; &nbsp; temp_last_name:=last_name_arr(i);</div><div>&nbsp; end loop;</div><div>&nbsp;dbms_output.put_line('all_rows are '||all_rows);</div><div>end;</div><div>请注意上面代码中，我们首先定义了一个Index-by表数据类型last_name_tab，然后定义了一个该集合数据类型的变量last_name_arr，最后我们使用Bulk Collect批查询来充填last_name_arr，请注意它</div><div></div><div>的使用语法。</div><div>执行结果：</div><div>all_rows are 1000000</div><div>PL/SQL procedure successfully completed</div><div>Executed in 2.343 seconds</div><div>从上面执行结果，我们可以看到，Bulk Collect批查询只需要2.343 秒就能查出该表中有1000000个不重复的Last_name值，所耗时间只有游标查询的1/2.5。<br /><div><div><br /><br />三． 测试结果分析</div><div>为什么会出现上面的结果呢？我们可以使用Oracle的SQL_Trace来分析一下结果。在SQL命令行中，使用alter session set sql_trace=true语句打开Oracle的Trace，然后在命令行中执行上面三种查询并使用TKPROF工具生成Trace报告。</div></div><div>3.1 常规Distinct查询结果分析</div><div>3.2 游标查询效率分析<br /><div>3.3 Bulk Collect的查询效率分析</div></div><br /><div><div>四． 结论</div><div>通过上面的测试和分析，我们可以看到Bulk Collect批查询在某种程度上可以提高查询效率，它<strong>首先将所需数据读入内存，然后再统计分析</strong>，这样就可以提高查询效率。但是，如果Oracle数据库的内存较小，Shared Pool Size不足以保存Bulk Collect批查询结果，那么该方法需要将Bulk Collect的集合结果保存在磁盘上，在这种情况下，Bulk Collect方法的效率反而不如其他两种方法，有兴趣的读者可以进一步测试。<br /></div><div>另外，除了Bulk Collect批查询外，我们还可以使用<strong>FORALL</strong>语句来实现批插入、删除和更新，这在大批量数据操作时可以显著提高执行效率。</div></div></div></div><img src ="http://www.blogjava.net/xcp/aggbug/367650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-12-31 15:03 <a href="http://www.blogjava.net/xcp/archive/2011/12/31/367650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle_常用系统表</title><link>http://www.blogjava.net/xcp/archive/2011/12/31/367624.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Sat, 31 Dec 2011 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/12/31/367624.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/367624.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/12/31/367624.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/367624.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/367624.html</trackback:ping><description><![CDATA[<div><p>dba_<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开头</span>.....</p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_users&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库用户信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_segments </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">表段信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_extents&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据区信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_objects&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库对象信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_tablespaces&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库表空间信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_data_files&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据文件设置信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_temp_files&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">临时数据文件信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_rollback_segs&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">回滚段信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_ts_quotas&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户表空间配额信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_free_space </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库空闲空间信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_profiles&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库用户资源限制信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_sys_privs&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户的系统权限信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_tab_privs </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户具有的对象权限信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_col_privs </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户具有的列对象权限信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_role_privs </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户具有的角色信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_audit_trail </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">审计跟踪记录信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_stmt_audit_opts </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">审计设置信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_audit_object&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">对象审计结果信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_audit_session </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">会话审计结果信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dba_indexes </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户模式的索引信息</span></p>  <p>&nbsp;</p>  <p>user_<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开头</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_objects&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户对象信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_source&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库用户的所有资源对象信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_segments&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户的表段信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_tables&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户的表对象信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_tab_columns&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户的表列信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_constraints&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户的对象约束信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_sys_privs&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">当前用户的系统权限信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_tab_privs&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">当前用户的对象权限信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_col_privs&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">当前用户的表列权限信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_role_privs&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">当前用户的角色权限信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_indexes&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户的索引信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_ind_columns </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户的索引对应的表列信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_cons_columns&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户的约束对应的表列信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_clusters&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户的所有簇信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_clu_columns </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户的簇所包含的内容信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>user_cluster_hash_expressions&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">散列簇的信息</span></p>  <p>&nbsp;</p>  <p>v$<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开头</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$database&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$datafile&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据文件信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$controlfile </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">控制文件信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$logfile&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">重做日志信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$instance&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库实例信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$log&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">日志组信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$loghist </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">日志历史信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$sga&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库</span>SGA<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$parameter </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">初始化参数信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$process&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库服务器进程信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$bgprocess&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库后台进程信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$controlfile_record_section&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">控制文件记载的各部分信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$thread&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">线程信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$datafile_header&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据文件头所记载的信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$archived_log </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">归档日志信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$archive_dest &nbsp;&nbsp;</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">归档日志的设置信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$logmnr_contents&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">归档日志分析的</span>DML DDL<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">结果信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$logmnr_dictionary&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">日志分析的字典文件信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$logmnr_logs&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">日志分析的日志列表信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$tablespace&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">表空间信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$tempfile&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">临时文件信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$filestat&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据文件的</span>I/O<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">统计信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$undostat&nbsp;&nbsp; Undo</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$rollname&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在线回滚段信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$session&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">会话信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$transaction </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">事务信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$rollstat&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">回滚段统计信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$pwfile_users&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">特权用户信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$sqlarea&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">当前查询过的</span>sql<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语句访问过的资源及相关的信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">与</span>v$sqlarea<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">基本相同的相关信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>v$sysstat&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库系统状态信息</span></p>  <p>&nbsp;</p>  <p>all_<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开头</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>all_users&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库所有用户的信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>all_objects&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">数据库所有的对象的信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>all_def_audit_opts&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">所有默认的审计设置信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>all_tables&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">所有的表对象信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>all_indexes </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">所有的数据库对象索引的信息</span></p>  <p>&nbsp;</p>  <p>session_<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">开头</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>session_roles&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">会话的角色信息</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>session_privs&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">会话的权限信息</span></p>  <p>&nbsp;</p>  <p>index_<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开头</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>index_stats&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">索引的设置和存储信息</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">伪表</span></p>  <p>&nbsp;</p>  <p><span><span>&nbsp;&nbsp; </span>dual&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">系统伪列表信息</span></p></div><img src ="http://www.blogjava.net/xcp/aggbug/367624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-12-31 11:04 <a href="http://www.blogjava.net/xcp/archive/2011/12/31/367624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 查看用户 用户权限 用户表空间 用户默认表空间[转]</title><link>http://www.blogjava.net/xcp/archive/2011/12/31/367623.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Sat, 31 Dec 2011 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/12/31/367623.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/367623.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/12/31/367623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/367623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/367623.html</trackback:ping><description><![CDATA[<div><div>1、查看所有用户<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;dba_users;<span style="color: #808080; ">//</span>dba<br /><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;all_users;<span style="color: #808080; ">//all</span><br /><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_users;<span style="color: #808080; ">//</span>当前</div><div>2、查看当前用户连接：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;v$Session;</div><div>3、查看当前用户权限：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;session_privs;</div>4、查看所有用户系统权限<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;dba_sys_privs;<br /><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_sys_privs;</div>5、查看所有用户对象权限<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;dab_tab_privs;<br /><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;all_tab_privs;<br /><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_tab_privs;</div>6、查看所有角色<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;dba_roles;<br /><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;dba_role_privs;<br /><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_role_privs;</div>7、查看所有表空间、临时表空间等信息<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;tablespace_name,<span style="color: #FF00FF; ">file_name</span>,bytes&nbsp;file_size,autoextensible&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;dba_data_files;<br /><span style="color: #0000FF; ">select</span>&nbsp;tablespace_name,<span style="color: #FF00FF; ">file_name</span>,bytes&nbsp;file_size,autoextensible&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;dba_temp_files;</div>8、查看用户表空间使用情况：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;<br />&nbsp;&nbsp;a.<span style="color: #FF00FF; ">file_id</span>&nbsp;"FileNo",a.tablespace_name&nbsp;"Tablespace_name",<br />&nbsp;&nbsp;a.bytes&nbsp;"Bytes",a.bytes<span style="color: #808080; ">-</span><span style="color: #FF00FF; ">sum</span>(nvl(b.bytes,<span style="color: #800000; font-weight: bold; ">0</span>))&nbsp;"Used",&nbsp;<span style="color: #FF00FF; ">sum</span>(nvl(b.bytes,<span style="color: #800000; font-weight: bold; ">0</span>))&nbsp;"Free",<span style="color: #FF00FF; ">sum</span>(nvl(b.bytes,<span style="color: #800000; font-weight: bold; ">0</span>))<span style="color: #808080; ">/</span>a.bytes<span style="color: #808080; ">*</span><span style="color: #800000; font-weight: bold; ">100</span>&nbsp;"<span style="color: #808080; ">%</span>free"&nbsp;<br /><span style="color: #0000FF; ">from</span>&nbsp;dba_data_files&nbsp;a,dba_free_space&nbsp;b&nbsp;<br /><span style="color: #0000FF; ">where</span>&nbsp;a.<span style="color: #FF00FF; ">file_id</span><span style="color: #808080; ">=</span>b.<span style="color: #FF00FF; ">file_id</span>(<span style="color: #808080; ">+</span>)&nbsp;<br /><span style="color: #0000FF; ">group</span>&nbsp;<span style="color: #0000FF; ">by</span>&nbsp;a.tablespace_name&nbsp;,&nbsp;a.<span style="color: #FF00FF; ">file_id</span>,a.bytes&nbsp;<br /><span style="color: #0000FF; ">order</span>&nbsp;<span style="color: #0000FF; ">by</span>&nbsp;a.tablespace_name;&nbsp;</div>9、查看用户所有对象<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;table_name,num_rows&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_tables;<br /><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;all_tables;</div>10、询所有函数和存储过程<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;dba_source;<br /><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #808080; ">*</span>&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;user_source;</div></div></div></div><div></div></div><img src ="http://www.blogjava.net/xcp/aggbug/367623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-12-31 10:42 <a href="http://www.blogjava.net/xcp/archive/2011/12/31/367623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle数据恢复</title><link>http://www.blogjava.net/xcp/archive/2011/12/23/367052.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Fri, 23 Dec 2011 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/12/23/367052.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/367052.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/12/23/367052.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/367052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/367052.html</trackback:ping><description><![CDATA[&nbsp;<strong style="font-size: 18pt">1. 
<div style="display: inline-block"></div></strong><strong style="font-size: 18pt">表查询闪回</strong><br />create table xcp as (select * from b_za_bzdzkxx);<br />select * from xcp;<br />select count(1) from xcp;--22001<br />select count(1) from xcp t where t.dzbh like '510521%';--7011<br />delete from xcp t where t.dzbh like '510521%';<br />select count(1) from xcp;--14990<br /><strong><span style="background-color: yellow">－－查找指定时间点前</span><span style="background-color: yellow">的数据</span><br /></strong><span style="background-color: yellow">select count(1) from xcp </span><span style="color: red; background-color: yellow"><strong>as of timestamp</strong> </span><span style="background-color: yellow">to_timestamp('2011-12-23 10:49:30','yyyy-MM-dd hh24:mi:ss');--</span><span style="background-color: yellow">22001<br /></span><br />select * from xcp for update;－－添加一条记录<br />select count(1) from xcp;--14991<br /><strong><span style="background-color: yellow"><br />--恢复指定时间点的前delete数据（将删除恢复时间点后面的数据）</span><br /></strong><span style="background-color: yellow">alter table xcp enable row movement;--启动的行移动功能</span><br /><span style="color: red; background-color: yellow">flashback </span><span style="background-color: yellow">table xcp </span><span style="color: red; background-color: yellow">to timestamp </span><span style="background-color: yellow">to_timestamp('2011-12-23 10:49:30','yyyy-MM-dd hh24:mi:ss');</span><br />select count(1) from xcp;--22001<br /><span style="background-color: yellow"><strong><span style="background-color: yellow"><strong><br />--恢复指定时间点的前delete数据，并保留恢复时间点后面的数据</strong></span></strong></span><br /><span style="background-color: yellow">create table xcp2 as (select * from xcp t where t.createdtime&gt;to_timestamp('2011-12-23 10:49:30','yyyy-MM-dd hh24:mi:ss</span>'));<br />select * from xcp2;--临时表<br /><span style="background-color: yellow">alter table xcp enable row movement;<strong>--启动的行移动功能</strong></span><br /><span style="color: red; background-color: yellow">flashback </span><span style="background-color: yellow">table xcp </span><span style="color: red; background-color: yellow">to timestamp </span><span style="background-color: yellow">to_timestamp('2011-12-23 10:49:30,'yyyy-MM-dd hh24:mi:ss');</span><br />select count(1) from xcp;--22001<br /><font style="background-color: #ffff00">insert into xcp select * from xcp2 --将临时表的数据再插入到源表</font><br />select count(1) from xcp;--22002<br /><strong style="font-size: 18pt"><br /></strong><strong style="font-size: 18pt"><br />2.删除</strong><strong style="font-size: 18pt">闪回[10g+]<br /></strong>&nbsp; &nbsp; 删除闪回为删除oracle 10G提供了一个数据库安全机制，当用户删除一个表时，oracle 10G会将该表放到回收站中，回收站中的对象一直会保留，直到用户决定永久删除它们或出现表空间的空间不足时才会被删除。回收站是一个虚拟容器，用于存储所有被删除的对象。数据字典user_tables中的列dropped表示被删除的表，查询方法如下：<br /><span style="background-color: yellow">select table_name,dropped from user_tables;</span><br />--设置数据库是否启用回收站<br /><span style="background-color: yellow">alert session set recyclebin = off;</span><br />--查询回收站对象<br />
<div style="display: inline-block">
<div></div></div>
<div>
<div><span style="background-color: yellow">select * from recyclebin;</span></div>
<div><span style="background-color: yellow">select * from user_recyclebin;</span></div>
<div><span style="background-color: yellow">select * from dba_recyclebin;<br /><br /></span></div></div><br />drop table xcp;<br />select count(1) from xcp;--0<br /><strong><span style="background-color: yellow">--恢复drop的表</span><br /></strong><span style="color: red; background-color: yellow">flashback </span><span style="background-color: yellow">table xcp </span><span style="color: red; background-color: yellow">to before drop;</span><br />select count(1) from xcp;--22001 <br /><br />如果不知道原表名，可以直接使用回收站中的名称进行闪回..<br />
<div><span style="background-color: yellow">flashback table "BIN$JiXyAUO4R+u3qNVfQK/Kiw==$0" to before drop;</span></div>在回收的同时可以修改表名<br />
<div><span style="background-color: yellow">flashback table "</span> 
<div style="display: inline-block"></div><span style="background-color: yellow">BIN$JiXyAUO4R+u3qNVfQK/Kiw==$0</span><span style="background-color: yellow">" to before drop rename to xcp1;<br /></span></div><br />--真正删除一个表，而不进入回收站，可以在删除表时增加purge选项<span style="background-color: yellow"><br /></span><span style="background-color: yellow">drop table xcp1 purge;</span><br />--也可以从回收站永久性删除表<br /><span style="background-color: yellow">purge table xcp1;</span><br />--删除当前用户回收站<br /><span style="background-color: yellow">purge recyclebin</span><br />--删除全体用户在回收站的资源<br /><span style="background-color: yellow">purge dba_resyclebin<br /></span><strong style="font-size: 18pt"><br /><br /><br />3.数据库闪口 
<div style="display: inline-block"></div></strong><strong style="font-size: 18pt">[10g+]</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;使用数据库闪回功能，可以使数据库回到过去某一状态，语法如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql: <span style="background-color: yellow">alter database flashback on;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql: <span style="background-color: yellow">flashback database to scn 46963;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql: <span style="background-color: yellow">flashback database to timestamp to_timestamp('2007-2-12 12:00:00','yyyy-MM-dd hh24:mi:ss'); <br /><br /><br /><br />注：表结构修改后不能直接恢复<br /><a href="http://blog.csdn.net/colin_liu2009/article/details/6906548">http://blog.csdn.net/colin_liu2009/article/details/6906548</a><br /><br /><a href="http://www.xifenfei.com/2012/06/%E5%88%A9%E7%94%A8flashback-database%E5%AE%9E%E7%8E%B0%E9%83%A8%E5%88%86%E5%AF%B9%E8%B1%A1%E5%9B%9E%E6%BB%9A.html">http://www.xifenfei.com/2012/06/%E5%88%A9%E7%94%A8flashback-database%E5%AE%9E%E7%8E%B0%E9%83%A8%E5%88%86%E5%AF%B9%E8%B1%A1%E5%9B%9E%E6%BB%9A.html</a><br /></span><img src ="http://www.blogjava.net/xcp/aggbug/367052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-12-23 10:33 <a href="http://www.blogjava.net/xcp/archive/2011/12/23/367052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 取得表字段注释</title><link>http://www.blogjava.net/xcp/archive/2011/12/09/365961.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Fri, 09 Dec 2011 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/12/09/365961.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/365961.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/12/09/365961.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/365961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/365961.html</trackback:ping><description><![CDATA[<p>select * from user_tab_cols b where b.table_name='B_ZA_CZRKXX' ORDER BY b.internal_column_id;<br />--USER_TAB_COLUMNS，以避免获取到oracle自行添加的隐藏字段<br />select * from user_tab_columns b where b.TABLE_NAME='B_ZA_CZRKXX';<br />select * from user_tab_comments b where b.TABLE_NAME='B_ZA_CZRKXX';<br />select * from user_col_comments b where b.TABLE_NAME='B_ZA_CZRKXX';</p>
<p><br />select col.COLUMN_NAME ,com.comments,col.DATA_TYPE <br />from user_tab_columns col <br />inner join user_col_comments com<br />on col.TABLE_NAME='B_ZA_CZRKXX' and <br />&nbsp;&nbsp; col.TABLE_NAME=com.TABLE_NAME and<br />&nbsp;&nbsp; col.COLUMN_NAME=com.COLUMN_NAME<br />order by col.COLUMN_ID<br /></p><img src ="http://www.blogjava.net/xcp/aggbug/365961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-12-09 15:27 <a href="http://www.blogjava.net/xcp/archive/2011/12/09/365961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle SQL优化  </title><link>http://www.blogjava.net/xcp/archive/2011/09/29/359791.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Thu, 29 Sep 2011 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/09/29/359791.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/359791.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/09/29/359791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/359791.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/359791.html</trackback:ping><description><![CDATA[
<ul><li><span style="color: rgb(0, 0, 255); font-weight: bold;">尽量少用IN操作符，基本上所有的IN操作符都可以用EXISTS代替</span> </li></ul>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用IN写出来的SQL的优点是比较容易写及清晰易懂，但是用IN的SQL性能总是比较低的，从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORACLE 试图将其转换成多个表的连接，如果转换不成功则先执行IN里面的子查询，再查询外层的表记录，如果转换成功则直接采用多个表的连接方式查询。由此可见用 IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功，但对于含有分组统计等方面的SQL就不能转换了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle在执行IN子查询时，首先执行子查询，将查询结果放入临时表再执行主查询。而EXIST则是首先检查主查询，然后运行子查询直到找到第一个匹配项。NOT EXISTS比NOT IN效率稍高。但具体在选择IN或EXIST操作时，要根据主子表数据量大小来具体考虑。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT * FROM&nbsp; EMP&nbsp; WHERE&nbsp; EMPNO &gt; 0&nbsp; AND&nbsp; EXISTS (SELECT &#8216;X'&nbsp; FROM DEPT&nbsp; WHERE&nbsp; DEPT.DEPTNO = EMP.DEPTNO&nbsp; AND&nbsp; LOC = &#8216;MELB')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp; * FROM&nbsp; EMP&nbsp; WHERE&nbsp; EMPNO &gt; 0&nbsp; AND&nbsp; DEPTNO IN(SELECT DEPTNO&nbsp; FROM&nbsp; DEPT&nbsp; WHERE&nbsp; LOC = &#8216;MELB')</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 推荐方案：在业务密集的SQL当中尽量不采用IN操作符。<br /><br /><br /></p>
<ul style="color: rgb(0, 0, 255); font-weight: bold;"><li>不用NOT IN操作符，可以用NOT EXISTS或者外连接+替代 </li></ul>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 此操作是强列推荐不使用的，因为它不能应用表的索引。<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 推荐方案：用NOT EXISTS 或（外连接+判断为空）方案代替<br /><br /><br />
<ul><li><span style="color: rgb(0, 0, 255); font-weight: bold;">不用&#8220;&lt;&gt;&#8221;或者&#8220;!=&#8221;操作符。对不等于操作符的处理会造成全表扫描，可以用&#8220;&lt;&#8221; or &#8220;&gt;&#8221;代替</span><br /></li></ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不等于操作符是永远不会用到索引的，因此对它的处理只会产生全表扫描。<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 推荐方案：用其它相同功能的操作运算代替，如：<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1）a&lt;&gt;0 改为 a&gt;0 or a&lt;0<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2）a&lt;&gt;&#8217;&#8217; 改为 a&gt;&#8217;&#8217;<br /></p>
<ul style="color: rgb(0, 0, 255); font-weight: bold;"><li>Where子句中出现IS NULL或者IS NOT NULL时，Oracle会停止使用索引而执行全表扫描。可以考虑在设计表时，对索引列设置为NOT NULL。这样就可以用其他操作来取代判断NULL的操作</li></ul>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IS NULL 或IS NOT NULL操作（判断字段是否为空）<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 判断字段是否为空一般是不会应用索引的，因为B树索引是不索引空值的。<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 推荐方案：<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 用其它相同功能的操作运算代替，如：<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1）a is not null 改为 a&gt;0 或a&gt;&#8217;&#8217;等。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2）不允许字段为空，而用一个缺省值代替空值，如业扩申请中状态字段不允许为空，缺省为申请。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3） 建立位图索引（有分区的表不能建，位图索引比较难控制，如字段值太多索引会使性能下降，多人更新操作会增加数据块锁的现象）<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: rgb(0, 0, 255); font-weight: bold;">当通配符&#8220;%&#8221;或者&#8220;_&#8221;作为查询字符串的第一个字符时，索引不会被使用</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于有连接的列&#8220;||&#8221;，最后一个连接列索引会无效。尽量避免连接，可以分开连接或者使用不作用在列上的函数替代。<br /></p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果索引不是基于函数的，那么当在Where子句中对索引列使用函数时，索引不再起作用。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Where子句中避免在索引列上使用计算，否则将导致索引失效而进行全表扫描。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对数据类型不同的列进行比较时，会使索引失效。</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p></li><li style="color: rgb(0, 0, 255); font-weight: bold;">&nbsp;&nbsp;&nbsp;&nbsp;&gt; 及 &lt; 操作符（大于或小于操作符）</li>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 大于或小于操作符一般情况下是不用调整的，因为它有索引就会采用索引查找，但有的情况下可以对它进行优化，如一个表有100万记录，一个数值型字段A， 30万记录的A=0，30万记录的A=1，39万记录的A=2，1万记录的A=3。那么执行A&gt;2与A&gt;=3的效果就有很大的区别了，因为 A&gt;2时ORACLE会先找出为2的记录索引再进行比较，而A&gt;=3时ORACLE则直接找到=3的记录索引。<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 推荐方案：用&#8220;&gt;=&#8221;替代&#8220;&gt;&#8221;。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 例： A&gt;2 改为 A&gt;=3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A&lt;2 改为 A&lt;=1<br /><br /><br /></p>
<ul style="color: rgb(0, 0, 255); font-weight: bold;"><li>UNION操作符</li></ul>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; UNION在进行表链接后会筛选掉重复的记录，所以在表链接后会对所产生的结果集进行排序运算，删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录，最常见的是过程表与历史表UNION。如：<br /><br />&nbsp;&nbsp;&nbsp; select * from gc_dfys<br />&nbsp;&nbsp;&nbsp; union<br />&nbsp;&nbsp;&nbsp; select * from ls_jg_dfys<br /><br />&nbsp;&nbsp;&nbsp; 这个SQL在运行时先取出两个表的结果，再用排序空间进行排序删除重复的记录，最后返回结果集，如果表数据量大的话可能会导致用磁盘进行排序。<br /><br />&nbsp;&nbsp;&nbsp; 推荐方案：采用UNION ALL操作符替代UNION，因为UNION ALL操作只是简单的将两个结果合并后就返回。<br /><br />&nbsp;&nbsp;&nbsp; select * from gc_dfys<br />&nbsp;&nbsp;&nbsp; union all<br />&nbsp;&nbsp;&nbsp; select * from ls_jg_dfys<br /><br /><br />&nbsp;</p>
<ul style="color: rgb(0, 0, 255); font-weight: bold;"><li>LIKE操作符</li></ul>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LIKE 操作符可以应用通配符查询，里面的通配符组合可能达到几乎是任意的查询，但是如果用得不好则会产生性能上的问题，如LIKE &#8216;%5400%&#8217; 这种查询不会引用索引，而LIKE &#8216;X5400%&#8217;则会引用范围索引。一个实际例子：用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE &#8216;%5400%&#8217; 这个条件会产生全表扫描，如果改成YY_BH LIKE &#8217;X5400%&#8217; OR YY_BH LIKE &#8217;B5400%&#8217; 则会利用YY_BH的索引进行两个范围的查询，性能肯定大大提高。<br /><br /><br /><br /></p>
<ul style="color: rgb(0, 0, 255); font-weight: bold;"><li>SQL书写的影响（共享SQL语句可以提高操作效率）</li></ul>
<p>&nbsp;&nbsp;&nbsp; 同一功能同一性能不同写法SQL的影响<br /><br />&nbsp;&nbsp;&nbsp; 如一个SQL在A程序员写的为<br />&nbsp;&nbsp;&nbsp; Select * from zl_yhjbqk<br /><br />&nbsp;&nbsp;&nbsp; B程序员写的为<br />&nbsp;&nbsp;&nbsp; Select * from dlyx.zl_yhjbqk（带表所有者的前缀）<br /><br />&nbsp;&nbsp;&nbsp; C程序员写的为<br />&nbsp;&nbsp;&nbsp; Select * from DLYX.ZLYHJBQK（大写表名）<br /><br />&nbsp;&nbsp;&nbsp; D程序员写的为<br />&nbsp;&nbsp;&nbsp; Select *&nbsp; from DLYX.ZLYHJBQK（中间多了空格）<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的，但是从ORACLE共享内存SGA的原理，可以得出ORACLE对每个SQL 都会对其进行一次分析，并且占用共享内存，如果将SQL的字符串及格式写得完全相同则ORACLE只会分析一次，共享内存也只会留下一次的分析结果，这不仅可以减少分析SQL的时间，而且可以减少共享内存重复的信息，ORACLE也可以准确统计SQL的执行频率。<br /><br />&nbsp;&nbsp;&nbsp; 推荐方案：不同区域出现的相同的Sql语句，要保证查询字符完全相同，以利用SGA共享池，防止相同的Sql语句被多次分析。<br /><br /><br /><br /><br />&nbsp; </p>
<ul style="color: rgb(0, 0, 255); font-weight: bold;"><li>WHERE后面的条件顺序影响</li></ul>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; Oracle从下到上处理Where子句中多个查询条件，所以表连接语句应写在其他Where条件前，可以过滤掉最大数量记录的条件必须写在Where子句的末尾。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响，如<br /><br />&nbsp;&nbsp;&nbsp; Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1<br /><br />&nbsp;&nbsp;&nbsp; Select * from zl_yhjbqk where xh_bz=1&nbsp; and dy_dj = '1KV以下'<br /><br />&nbsp;&nbsp;&nbsp; 以上两个SQL中dy_dj（电压等级）及xh_bz（销户标志）两个字段都没进行索引，所以执行的时候都是全表扫描，第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%，而xh_bz=1的比率只为0.5%，在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较，而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较，以此可以得出第二条SQL的CPU占用率明显比第一条低。<br /><br /></p>
<ul style="color: rgb(0, 0, 255); font-weight: bold;"><li>查询表顺序的影响</li></ul>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; Oracle从右到左处理From子句中的表名，所以在From子句中包含多个表的情况下，将记录最少的表放在最后。（只在采用RBO优化时有效)<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 在FROM后面的表中的列表顺序会对SQL执行性能影响，在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接，由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。（注：如果对表进行了统计分析， ORACLE会自动先进小表的链接，再进行大表的链接）。<br /></p>
<ul><li>Order By语句中的非索引列会降低性能，可以通过添加索引的方式处理。严格控制在Order By语句中使用表达式</li><li>当在Sql语句中连接多个表时，使用表的别名，并将之作为每列的前缀。这样可以减少解析时间</li><li>多利用内部函数提高Sql效率</li><li>&nbsp;SQL语句索引的利用 
<ul><li>对操作符的优化（见前面）<br /></li><li>对条件字段的一些优化 
<ul><li>采用函数处理的字段不能利用索引</li></ul>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如：<br />&nbsp;&nbsp;&nbsp; substr(hbs_bh,1,4)=&#8217;5400&#8217;，优化处理：hbs_bh like &#8216;5400%&#8217;<br /><br />&nbsp;&nbsp;&nbsp; trunc(sk_rq)=trunc(sysdate)， 优化处理：sk_rq&gt;=trunc(sysdate) and sk_rq&lt;trunc(sysdate+1)<br />
<ul><li>进行了显式或隐式的运算的字段不能进行索引</li></ul>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如：<br /><br />&nbsp;&nbsp;&nbsp; ss_df+20&gt;50，优化处理：ss_df&gt;30<br /><br />&nbsp;&nbsp;&nbsp; &#8216;X&#8217;||hbs_bh&gt;&#8217;X5400021452&#8217;，优化处理：hbs_bh&gt;&#8217;5400021542&#8217;<br /><br />&nbsp;&nbsp;&nbsp; sk_rq+5=sysdate，优化处理：sk_rq=sysdate-5<br /><br />&nbsp;&nbsp;&nbsp; hbs_bh=5401002554，优化处理：hbs_bh=&#8217; 5401002554&#8217;，注：此条件对hbs_bh 进行隐式的to_number转换，因为hbs_bh字段是字符型。<br />
<ul><li>条件内包括了多个本表的字段运算时不能进行索引</li></ul>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ys_df&gt;cx_df，无法进行优化<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qc_bh||kh_bh=&#8217;5400250000&#8217;，优化处理：qc_bh=&#8217;5400&#8217; and kh_bh=&#8217;250000&#8217;<br /></li></ul></li></ul>
<p><br /><br />&nbsp;&nbsp;&nbsp; 可能引起全表扫描的操作<br /></p>
<ul><li>在索引列上使用NOT或者&#8220;&lt;&gt;&#8221;</li><li>对索引列使用函数或者计算</li><li>NOT IN操作</li><li>通配符位于查询字符串的第一个字符</li><li>IS NULL或者IS NOT NULL</li><li>多列索引，但它的第一个列并没有被Where子句引用</li></ul>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORACLE在SQL执行分析方面已经比较成熟，如果分析执行的路径不对首先应在数据库结构（主要是索引）、服务器当前性能（共享内存、磁盘文件碎片）、数据库对象（表、索引）统计信息是否正确这几方面分析。<br /><br /><br /><br /><br /><br /><br />--备注：多表查询时，记录最少的表放到最后<br /><br /></p> 
<img src ="http://www.blogjava.net/xcp/aggbug/359791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-09-29 15:47 <a href="http://www.blogjava.net/xcp/archive/2011/09/29/359791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle树查询及相关函数</title><link>http://www.blogjava.net/xcp/archive/2011/09/29/359788.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Thu, 29 Sep 2011 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/09/29/359788.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/359788.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/09/29/359788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/359788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/359788.html</trackback:ping><description><![CDATA[Oracle树查询的最重要的就是<span style="color: #ff00ff"><strong>select...start with... connect by ...prior</strong> </span>语法了。依托于该语法，我们可以将一个表形结构的中以树的顺序列出来。在下面列述了Oracle中树型查询的常用查询方式以及经常使用的与树查询相关的Oracle特性函数等，在这里只涉及到一张表中的树查询方式而不涉及多表中的关联等。 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以我做过的一个项目中的表为例，表结构如下：</p><pre class="sql" name="code">CREATE TABLE FLFL
(
  ID      NUMBER                                NOT NULL,
  MC      NVARCHAR2(20),
  FLJB    NUMBER,
  SJFLID  NUMBER
)</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FLJB是作为树的级别，在很多查询中可以加快SQL的查询效率。在下面演示的功能基本上不使用这个关键字。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SJFLID存储的是上级ID，如果是顶级父节点，该SJFLID为null（得补充一句，当初的确是这样设计的，不过现在知道，表中最好别有null记录，这会引起全文扫描，建议改成0代替)。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们从最基本的操作，逐步列出树查询中常见的操作，所以查询出来的节点以家族中的辈份作比方。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff"><strong><span>1. 查找树中的所有顶级父节点（辈份最长的人）。</span> </strong></span>假设这个树是个目录结构，那么第一个操作总是找出所有的顶级节点，再根据该节点找到其下属节点。</p><pre class="sql" name="code">SELECT * FROM flfl WHERE sjflid IS NULL;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是个引子，没用到树型查询。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff"><strong><span>2.查找一个节点的直属子节点（所有儿子）。</span> </strong></span>如果查找的是直属子类节点，也是不用用到树型查询的。</p><pre class="sql" name="code">SELECT * FROM flfl WHERE sjflid = 819459;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个可以找到ID为819459的直属子类节点。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff"><strong>3.查找一个节点的<span>所有</span> 直属子节点（所有后代）。</strong> </span></p><pre class="sql" name="code">SELECT * FROM flfl START WITH ID = 819459 CONNECT BY sjflid = PRIOR ID;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个查找的是ID为819459的节点下的所有直属子类节点，包括子辈的和孙子辈的所有直属节点。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff"><strong>4.查找一个节点的直属父节点（父亲）。</strong> </span>如果查找的是节点的直属父节点，也是不用用到树型查询的。</p><pre class="sql" name="code">SELECT b.* FROM flfl a JOIN flfl b ON a.sjflid = b.ID WHERE a.ID = 6758;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个找到的是ID为6758的节点的直属父节点，要用到同一张表的关联了。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color: #0000ff">5.查找一个节点的所有直属父节点（祖宗）。</span> </strong></p><pre class="sql" name="code">SELECT * FROM flfl START WITH ID = 6758 CONNECT BY PRIOR sjflid = ID;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里查找的就是ID为6758的所有直属父节点，打个比方就是找到一个人的父亲、祖父等。但是值得注意的是这个查询出来的结果的顺序是先列出子类节点再列出父类节点，姑且认为是个倒序吧。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff6600">上面列出两个树型查询方式，第3条语句和第5条语句，这两条语句之间的区别在于prior关键字的位置不同，所以决定了查询的方式不同。</span> 当sjflid = PRIOR ID时，数据库会根据当前的ID迭代出sjflid与该ID相同的记录，所以查询的结果是迭代出了所有的子类记录；而PRIOR ID = sjflid时，数据库会跟据当前的sjflid来迭代出与当前的sjflid相同的id的记录，所以查询出来的结果就是所有的父类结果。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下是一系列针对树结构的更深层次的查询，这里的查询不一定是最优的查询方式，或许只是其中的一种实现而已。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color: #0000ff">6.查询一个节点的兄弟节点（亲兄弟）。</span> </strong></p><pre class="sql" name="code">SELECT a.*
  FROM flfl a
 WHERE EXISTS (SELECT *
                 FROM flfl b
                WHERE a.sjflid = b.sjflid AND b.ID = 6757);</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里查询的就是与ID为6757的节点同属一个父节点的节点了，就好比亲兄弟了。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color: #0000ff">7.查询与一个节点同级的节点（族兄弟）。</span> </strong>如果在表中设置了级别的字段，上表中的FLJB，那么在做这类查询时会很轻松，同一级别的就是与那个节点同级的，在这里列出不使用该字段时的实现!</p><pre class="sql" name="code">WITH tmp AS
     (SELECT     a.*, LEVEL lev
            FROM flfl a
      START WITH a.sjflid IS NULL
      CONNECT BY a.sjflid = PRIOR a.ID)
SELECT *
  FROM tmp
 WHERE lev = (SELECT lev
                FROM tmp
               WHERE ID = 819394)</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff6600">这里使用两个技巧，一个是使用了LEVEL来标识每个节点在表中的级别，还有就是使用with语法模拟出了一张带有级别的临时表。</span> </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color: #0000ff">8.查询一个节点的父节点的的兄弟节点（伯父与叔父）。</span> </strong></p><pre class="sql" name="code">WITH tmp AS
     (SELECT     flfl.*, LEVEL lev
            FROM flfl
      START WITH sjflid IS NULL
      CONNECT BY sjflid = PRIOR ID)
SELECT b.*
  FROM tmp b,
       (SELECT *
          FROM tmp
         WHERE ID = 7004 AND lev = 2) a
 WHERE b.lev = 1
UNION ALL
SELECT *
  FROM tmp
 WHERE sjflid = (SELECT DISTINCT x.ID
                            FROM tmp x,
                                 tmp y,
                                 (SELECT *
                                    FROM tmp
                                   WHERE ID = 7004 AND lev &gt; 2) z
                           WHERE y.ID = z.sjflid AND x.ID = y.sjflid);</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里查询分成以下几步。首先，将第7个一样，将全表都使用临时表加上级别；其次，根据级别来判断有几种类型，以上文中举的例子来说，有三种情况：<span style="color: #ff6600">（1）当前节点为顶级节点，即查询出来的lev值为1，那么它没有上级节点，不予考虑。（2）当前节点为2级节点，查询出来的lev值为2，那么就只要保证lev级别为1的就是其上级节点的兄弟节点。（3）其它情况就是3以及以上级别，那么就要选查询出来其上级的上级节点（祖父），再来判断祖父的下级节点都是属于该节点的上级节点的兄弟节点。</span> 最后，就是使用UNION将查询出来的结果进行结合起来，形成结果集。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff"><strong>9.查询一个节点的父节点的同级节点（族叔）。</strong> </span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个其实跟第7种情况是相同的。</p><pre class="sql" name="code">WITH tmp AS
     (SELECT     a.*, LEVEL lev
            FROM flfl a
      START WITH a.sjflid IS NULL
      CONNECT BY a.sjflid = PRIOR a.ID)
SELECT *
  FROM tmp
 WHERE lev = (SELECT lev
                FROM tmp
               WHERE ID = 819394) - 1</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只需要做个级别判断就成了。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本上，常见的查询在里面了，不常见的也有部分了。其中，查询的内容都是节点的基本信息，都是数据表中的基本字段，但是在树查询中还有些特殊需求，是对查询数据进行了处理的，常见的包括列出树路径等。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000">补充一个概念，对于数据库来说，根节点并不一定是在数据库中设计的顶级节点，对于数据库来说，根节点就是start with开始的地方。</span> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面列出的是一些与树相关的特殊需求。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color: #0000ff">10.名称要列出名称全部路径。</span> </strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里常见的有两种情况，一种是是从顶级列出，直到当前节点的名称（或者其它属性）；一种是从当前节点列出，直到顶级节点的名称（或其它属性）。举地址为例：国内的习惯是从省开始、到市、到县、到居委会的，而国外的习惯正好相反（老师说的，还没接过国外的邮件，谁能寄个瞅瞅<img alt="" src="file:///X:/images/smiles/icon_lol.gif" /> ）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff"><strong></strong></span>从顶部开始：</p><pre class="sql" name="code">SELECT     SYS_CONNECT_BY_PATH (mc, '/')
      FROM flfl
     WHERE ID = 6498
START WITH sjflid IS NULL
CONNECT BY sjflid = PRIOR ID;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff"><strong></strong></span>从当前节点开始：</p><pre class="sql" name="code">SELECT     SYS_CONNECT_BY_PATH (mc, '/')
      FROM flfl
START WITH ID = 6498
CONNECT BY PRIOR sjflid = ID;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff"><strong></strong></span>在这里我又不得不放个牢骚了。oracle只提供了一个sys_connect_by_path函数，却忘了字符串的连接的顺序。在上面的例子中，第一个SQL是从根节点开始遍历，而第二个SQL是直接找到当前节点，从效率上来说已经是千差万别，更关键的是第一个SQL只能选择一个节点，而第二个SQL却是遍历出了一颗树来。再次PS一下。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff6600">sys_connect_by_path函数就是从start with开始的地方开始遍历，并记下其遍历到的节点，start with开始的地方被视为根节点，将遍历到的路径根据函数中的分隔符，组成一个新的字符串，这个功能还是很强大的。</span> </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff"><strong></strong></span><strong><span style="color: #0000ff">11.列出当前节点的根节点。</span> </strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff"><strong></strong></span>在前面说过，根节点就是start with开始的地方。</p><pre class="sql" name="code">SELECT     CONNECT_BY_ROOT mc, flfl.*
      FROM flfl
START WITH ID = 6498
CONNECT BY PRIOR sjflid = ID;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff"><span style="color: #ff6600">connect_by_root函数用来列的前面，记录的是当前节点的根节点的内容。</span> <strong></strong></span></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color: #0000ff">12.列出当前节点是否为叶子。</span> </strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个比较常见，尤其在动态目录中，在查出的内容是否还有下级节点时，这个函数是很适用的。<span style="color: #0000ff"><strong></strong> </span></p><pre class="sql" name="code">SELECT     CONNECT_BY_ISLEAF, flfl.*
      FROM flfl
START WITH sjflid IS NULL
CONNECT BY sjflid = PRIOR ID;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff6600">connect_by_isleaf函数用来判断当前节点是否包含下级节点，如果包含的话，说明不是叶子节点，这里返回0；反之，如果不包含下级节点，这里返回1。</span> </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至此，oracle树型查询基本上讲完了，以上的例子中的数据是使用到做过的项目中的数据，因为里面的内容可能不好理解，所以就全部用一些新的例子来进行阐述。以上所有SQL都在本机上测试通过，也都能实现相应的功能，但是并不能保证是解决这类问题的最优方案（如第8条明显写成存储过程会更好），如果谁有更好的解决方案、或者有关oracle树查询的任何问题，欢迎留言讨论，以上的SQL有什么问题也欢迎大家留言批评。</p><img src ="http://www.blogjava.net/xcp/aggbug/359788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-09-29 15:10 <a href="http://www.blogjava.net/xcp/archive/2011/09/29/359788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL的四种连接-左外连接、右外连接、内连接、全连接 </title><link>http://www.blogjava.net/xcp/archive/2011/09/29/359786.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Thu, 29 Sep 2011 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/09/29/359786.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/359786.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/09/29/359786.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/359786.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/359786.html</trackback:ping><description><![CDATA[<p>今天在看一个遗留系统的数据表的时候发现平时查找的视图是FULL OUT JOIN的，导致平时的数据记录要进行一些限制性处理，其实也可以设置视图各表为右外连接并在视图上设置各列的排序和筛选条件就可以达到效果。</p>
<p>&nbsp;</p>
<p>联接条件可在FROM或WHERE子句中指定，建议在FROM子句中指定联接条件。WHERE和HAVING子句也可以包含搜索条件，以进一步筛选联接条件所选的行。&nbsp;&nbsp; &nbsp;<br />联接可分为以下几类：&nbsp;&nbsp; &nbsp;</p>
<p><br /><strong><span style="color: #ff0000">1、内联接</span></strong>（典型的联接运算，使用像 = &nbsp;或 &lt;&gt; 之类的比较运算符）。包括相等联接和自然联接。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如，检索 students和courses表中学生标识号相同的所有行。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><strong><span style="color: #ff0000">2、外联接</span></strong>。外联接可以是左向外联接、右向外联接或完整外部联接。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />在 FROM子句中指定外联接时，可以由下列几组关键字中的一组指定： &nbsp; &nbsp;&nbsp;</p>
<p><span style="color: #ff0000">1）<span style="color: #000000">LEFT &nbsp;JOIN或LEFT OUTER JOIN </span></span>&nbsp; &nbsp;&nbsp;<br />左向外联接的结果集包括 &nbsp;LEFT OUTER子句中指定的左表的所有行，而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行，则在相关联的结果集行中右表的所有选择列表列均为空值。 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</p>
<p><span style="color: #ff0000">2）<span style="color: #000000">RIGHT &nbsp;JOIN 或 RIGHT &nbsp;OUTER &nbsp;JOIN </span></span>&nbsp; &nbsp;&nbsp;<br />右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行，则将为左表返回空值。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br /><span style="color: #ff0000">3）<span style="color: #000000">FULL &nbsp;JOIN 或 FULL OUTER JOIN</span></span><br />完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时，则另一个表的选择列表列包含空值。如果表之间有匹配行，则整个结果集行包含基表的数据值。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><strong><span style="color: #ff0000">3、交叉联接 </span></strong>&nbsp;&nbsp;<br />交叉联接返回左表中的所有行，左表中的每一行与右表中的所有行组合。交叉联接也称作<span style="color: #ff0000">笛卡尔积</span>。&nbsp;&nbsp; &nbsp;<br /><br />FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定；但是，用左或右向外联接指定表或视图时，表或视图的<span style="color: #ff0000">顺序</span>很重要。有关使用左或右向外联接排列表的更多信息，请参见使用外联接。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #ff0000">例子</span>： &nbsp;&nbsp;</p>
<p>-------------------------------------------------<br />&nbsp; a表 &nbsp; &nbsp; id &nbsp; name &nbsp; &nbsp; b表 &nbsp; &nbsp; id &nbsp; job &nbsp; parent_id &nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 &nbsp; 张3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 &nbsp; &nbsp; 23 &nbsp; &nbsp; 1 &nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 &nbsp; 李四 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 &nbsp; &nbsp; 34 &nbsp; &nbsp; 2 &nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 &nbsp; 王武 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 &nbsp; &nbsp; 34 &nbsp; &nbsp; 4 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp; a.id同parent_id &nbsp; 存在关系&nbsp;&nbsp;&nbsp;</p>
<p>--------------------------------------------------&nbsp;&nbsp; &nbsp;<br /><span style="color: #0000ff">&nbsp;1） 内连接 </span>&nbsp;&nbsp;<br />&nbsp; select &nbsp; a.*,b.* &nbsp; from &nbsp; a &nbsp; inner &nbsp; join &nbsp; b &nbsp; &nbsp; on &nbsp; a.id=b.parent_id &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp; 结果是 &nbsp; &nbsp;&nbsp;<br />&nbsp; 1 &nbsp; 张3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 &nbsp; &nbsp; 23 &nbsp; &nbsp; 1 &nbsp;&nbsp;<br />&nbsp; 2 &nbsp; 李四 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2 &nbsp; &nbsp; 34 &nbsp; &nbsp; 2 &nbsp;&nbsp;<br />&nbsp; &nbsp;&nbsp;<br />&nbsp;<span style="color: #0000ff">&nbsp;2）左连接&nbsp;&nbsp;</span>&nbsp;<br />&nbsp; select &nbsp; a.*,b.* &nbsp; from &nbsp; a &nbsp; left &nbsp; join &nbsp; b &nbsp; &nbsp; on &nbsp; a.id=b.parent_id &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp; 结果是 &nbsp; &nbsp;&nbsp;<br />&nbsp; 1 &nbsp; 张3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 &nbsp; &nbsp; 23 &nbsp; &nbsp; 1 &nbsp;&nbsp;<br />&nbsp; 2 &nbsp; 李四 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2 &nbsp; &nbsp; 34 &nbsp; &nbsp; 2 &nbsp;&nbsp;<br />&nbsp; 3 &nbsp; 王武 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;null&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;</p>
<p>&nbsp;<span style="color: #0000ff">3）&nbsp;右连接 &nbsp;&nbsp;</span><br />&nbsp; select &nbsp; a.*,b.* &nbsp; from &nbsp; a &nbsp; right &nbsp; join &nbsp; b &nbsp; &nbsp; on &nbsp; a.id=b.parent_id &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp; 结果是 &nbsp; &nbsp;&nbsp;<br />&nbsp; 1 &nbsp; 张3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 &nbsp; &nbsp; 23 &nbsp; &nbsp; 1 &nbsp;&nbsp;<br />&nbsp; 2 &nbsp; 李四 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2 &nbsp; &nbsp; 34 &nbsp; &nbsp; 2 &nbsp;&nbsp;<br />&nbsp; null &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 &nbsp; &nbsp; 34 &nbsp; &nbsp; 4 &nbsp;&nbsp;<br />&nbsp; &nbsp;&nbsp;<br />&nbsp;<span style="color: #0000ff">4）&nbsp;完全连接&nbsp;</span>&nbsp;&nbsp;<br />&nbsp; select &nbsp; a.*,b.* &nbsp; from &nbsp; a &nbsp; full &nbsp; join &nbsp; b &nbsp; &nbsp; on &nbsp; a.id=b.parent_id&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp; 结果是 &nbsp; &nbsp;&nbsp;<br />&nbsp; 1 &nbsp; 张3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; 23 &nbsp; &nbsp; 1 &nbsp;&nbsp;<br />&nbsp; 2 &nbsp; 李四 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;2 &nbsp; &nbsp; 34 &nbsp; &nbsp; 2 &nbsp;&nbsp;<br />&nbsp; null &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 　　&nbsp; 3 &nbsp; &nbsp; 34 &nbsp; &nbsp; 4 &nbsp;&nbsp;<br />&nbsp; 3 &nbsp; 王武 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; null</p><img src ="http://www.blogjava.net/xcp/aggbug/359786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-09-29 14:36 <a href="http://www.blogjava.net/xcp/archive/2011/09/29/359786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 利用 rownum分页的方法</title><link>http://www.blogjava.net/xcp/archive/2011/09/16/358762.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Fri, 16 Sep 2011 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/09/16/358762.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/358762.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/09/16/358762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/358762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/358762.html</trackback:ping><description><![CDATA[<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><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;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;rownum&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;num,t.ID,&nbsp;t.NAME,&nbsp;t.MODEL,&nbsp;t.DEPTH,&nbsp;t.FATHER,&nbsp;t.PCS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;v_za_bzdzk&nbsp;t<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;t.FATHER&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">510502</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;PCS&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">%510502400000%</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;depth&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">2</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">and</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">)&nbsp;gg<br />&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;num&nbsp;</span><span style="color: #808080">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">16</span><span style="color: #000000"><br /></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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><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;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;rownum&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;num,&nbsp;gg.</span><span style="color: #808080">*</span><span style="color: #000000"><br />&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;t.ID,&nbsp;t.NAME,&nbsp;t.MODEL,&nbsp;t.DEPTH,&nbsp;t.FATHER,&nbsp;t.PCS<br />&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;v_za_bzdzk&nbsp;t<br />&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;t.FATHER&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">510502</span><span style="color: #ff0000">'</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;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;PCS&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">%510502400000%</span><span style="color: #ff0000">'</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;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;depth&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">2</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;ORDERNAME)&nbsp;gg<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;Rownum&nbsp;</span><span style="color: #808080">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">30</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;tt<br />&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;tt.num&nbsp;</span><span style="color: #808080">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">16</span><span style="color: #000000"><br /></span></div><br /></div><img src ="http://www.blogjava.net/xcp/aggbug/358762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-09-16 09:45 <a href="http://www.blogjava.net/xcp/archive/2011/09/16/358762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>破解移植wm_concat</title><link>http://www.blogjava.net/xcp/archive/2011/08/15/356546.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Mon, 15 Aug 2011 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/08/15/356546.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/356546.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/08/15/356546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/356546.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/356546.html</trackback:ping><description><![CDATA[<p>--<br />/*****************************************<br />&nbsp;&nbsp; 功能: 破解移植wm_concat<br />&nbsp;&nbsp; 作者：xcp<br />&nbsp;&nbsp; 日期：2011-07-14<br />&nbsp;&nbsp; 说明：wm_concat出现在oracle10g版本中，不仅是加密的，而且是在一个单独的用户中，不方便使用。并且10g以前的版本也用不上。经过破解移植，可以方便大家使用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将下边的一个type，一个函数的创建脚本执行，就可以构建自己的wm_concat（这里叫zh_concat）。使用方法同wm_concat：<br />******************************************/<br />--type：<br />create or replace TYPE za_concat_im <br />AUTHID CURRENT_USER AS OBJECT<br />(<br />&nbsp; CURR_STR VARCHAR2(32767),<br />&nbsp; STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT za_concat_im) RETURN NUMBER,<br />&nbsp; MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT za_concat_im, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P1 IN VARCHAR2) RETURN NUMBER,<br />&nbsp; MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN za_concat_im,<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; RETURNVALUE OUT VARCHAR2,<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; FLAGS IN NUMBER)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN NUMBER,<br />&nbsp; MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT za_concat_im, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCTX2 IN&nbsp; za_concat_im) RETURN NUMBER<br />);<br />/<br />create or replace TYPE BODY za_concat_im<br />IS<br />&nbsp; STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT za_concat_im)<br />&nbsp; RETURN NUMBER <br />&nbsp; IS<br />&nbsp; BEGIN<br />&nbsp;&nbsp;&nbsp; SCTX := za_concat_im(NULL) ;<br />&nbsp;&nbsp;&nbsp; RETURN ODCICONST.SUCCESS;<br />&nbsp; END;<br />&nbsp; MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT za_concat_im,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P1 IN VARCHAR2) <br />&nbsp; RETURN NUMBER <br />&nbsp; IS<br />&nbsp; BEGIN<br />&nbsp;&nbsp;&nbsp; IF(CURR_STR IS NOT NULL) THEN <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CURR_STR := CURR_STR || ',' || P1;<br />&nbsp;&nbsp;&nbsp; ELSE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CURR_STR := P1;<br />&nbsp;&nbsp;&nbsp; END IF;<br />&nbsp;&nbsp;&nbsp; RETURN ODCICONST.SUCCESS;<br />&nbsp; END;<br />&nbsp; MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN za_concat_im,<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; RETURNVALUE OUT VARCHAR2,<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; FLAGS IN NUMBER)<br />&nbsp;&nbsp;&nbsp; RETURN NUMBER <br />&nbsp; IS<br />&nbsp; BEGIN<br />&nbsp;&nbsp;&nbsp; RETURNVALUE := CURR_STR ;<br />&nbsp;&nbsp;&nbsp; RETURN ODCICONST.SUCCESS;<br />&nbsp; END;<br />&nbsp; MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT za_concat_im, <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; SCTX2 IN za_concat_im) <br />&nbsp; RETURN NUMBER <br />&nbsp; IS<br />&nbsp; BEGIN<br />&nbsp;&nbsp;&nbsp; IF(SCTX2.CURR_STR IS NOT NULL) THEN <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ;<br />&nbsp;&nbsp;&nbsp; END IF;<br />&nbsp;&nbsp;&nbsp; RETURN ODCICONST.SUCCESS;<br />&nbsp; END;<br />END;<br />/</p>
<p>--函数：<br />create or replace FUNCTION za_concat(P1 VARCHAR2) <br />RETURN VARCHAR2 AGGREGATE USING za_concat_im ;<br />/</p><img src ="http://www.blogjava.net/xcp/aggbug/356546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-08-15 11:01 <a href="http://www.blogjava.net/xcp/archive/2011/08/15/356546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle复制表的sql语句</title><link>http://www.blogjava.net/xcp/archive/2011/07/18/354513.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Mon, 18 Jul 2011 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/07/18/354513.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/354513.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2011/07/18/354513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/354513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/354513.html</trackback:ping><description><![CDATA[1、只复制表结构的sql<br />create table b as select * from a where 1&lt;&gt;1<br /><br />2、即复制表结构又复制表中数据的sql<br />create table b as select * from a<br /><br />3、复制表的制定字段的sql<br />create table b as select row_id,name,age from a where 1&lt;&gt;1//前提是row_id,name,age都是a表的列<br /><br />4、复制表的指定字段及这些指定字段的数据的sql<br />create table b as select row_id,name,age from a<br /><br />以上语句虽然能够很容易的根据a表结构复制创建b表，但是a表的索引等却复制不了，需要在b中手动建立。<br />
<p><br />5、insert into 会将查询结果保存到已经存在的表中<br />insert into t2(column1, column2, ....) select column1, column2, .... from t1 <script src="/ggao/news_js/MyClass_it.js"></script><script type="text/javascript"> /*悬浮300*250，创建于2010-10-21*/ var cpro_id = 'u249277';</script><script src="http://cpro.baidu.com/cpro/ui/f.js" type="text/javascript"></script><script src="http://pos.baidu.com/ecom?di=u249277&amp;tm=BAIDU_CPRO_SETJSONADSLOT&amp;fn=BAIDU_CPRO_FSETADSLOT&amp;baidu_id=" type="text/javascript" charset="utf-8"></script></p><img src ="http://www.blogjava.net/xcp/aggbug/354513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-07-18 11:01 <a href="http://www.blogjava.net/xcp/archive/2011/07/18/354513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ibatis的$与#的区别</title><link>http://www.blogjava.net/xcp/archive/2011/05/17/350389.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 17 May 2011 04:26:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/05/17/350389.html</guid><description><![CDATA[# 会根据不同类型而生产字符串，如 String 类型 : aa ---&gt; 'aa'<br />$ 表示原生类型，如 String 类型 : aa ---&gt; aa<br />
<h1 class="title_txt">&nbsp;</h1>
<div class="blogstory">
<p>每天遇到问题记录</p>
<p>1.#变量名#&nbsp; 会转化为 jdbc 的 ？， 比如 select * from user where name=#name# 会转化为jdbc的 select * from user where name=？，把？参数设置为name的值，而$变量名$就直接把 $name$替换为 name的内容， 也就是由可能 select * from user where name=$name$ 如果name为 "' '&nbsp;or 1 = 1", 那么这样就有可能导致sql注入，所以ibatis用#比$好，不会造成sql注入。</p>
<p>2.ibatis中的参数传入的值参数比较多，最好用bean方式传入，也就是通过set/get取值的方式给sql map注入参数，不要用hashmap结构传入，每次用hashmap传入会占用比较多的内容。如果参数少，用hashmap也比较方便简单。但是对传入参数的判断，用bean方式比较容易检测发现，配置也能够统一配置。</p></div><br /><br /><br />select * from user u where u.username=#name#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //自动加''号<br />select * from user u where age=$age$ and username=$username$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;username=$username$ 会出错<br /><br />select * from $username$ u where age =$age$&nbsp;&nbsp;&nbsp;&nbsp;order by&nbsp;$filed$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //$主要用处是动态表名&nbsp;，指定排序字端 <img src ="http://www.blogjava.net/xcp/aggbug/350389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-05-17 12:26 <a href="http://www.blogjava.net/xcp/archive/2011/05/17/350389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle学习</title><link>http://www.blogjava.net/xcp/archive/2010/10/01/333613.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Fri, 01 Oct 2010 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/10/01/333613.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/333613.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/10/01/333613.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/333613.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/333613.html</trackback:ping><description><![CDATA[一、服务说明<br />
1、OracleDBCConsoleeasy888 就是<a href="http://localhost:1156/em">em</a>等的控制台的开启<br />
2、OracleOraDb10g_home3iSQL*Plus就是浏览器里面的sqlplus调试工具<br />
3、OracleOraDb10g_home3TNSListener就是监听程序<br />
4、OracleServiceeasy888就是Oracle服务<br />
二、本地文件说明（sqlplus "sys/yjtc888 as sysdba"）<br />
1. oradata&nbsp; 存放控制文件，数据文件，日志文件<br />
&nbsp;&nbsp;&nbsp; a. 控制文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1).查看表结构：desc v$controlfile&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2).查看记录&nbsp; select status,name from v$controlfile<br />
&nbsp;&nbsp;&nbsp; b. 数据文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1).查看表结构：desc v$datafile<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2).查看记录 select status,name from v$datafile<br />
&nbsp;&nbsp;&nbsp; c.日志文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1).查看表结构：desc v$logfile<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2).查看记录 select status,name from v$logfile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
2.flash_recovery_area 自动保存数据库目录&nbsp; 记录日志文件<br />
3.db_3等文件，在其下面配置listener.ora、sqlnet.ora、tnsnames.ora <br />
<br />
三、ORACLE10g服务器端自带工具集<br />
<p>(一)、配置和移植工具</p>
<p>1.Oracle Administration Assistant for window</p>
<p>作用：管理ORACEL本地账户</p>
<p>2.Database Configuration Assistant</p>
<p>作用：数据库创建、配置、删除、集群配置等<br />
每个数据库都会有三个服务：OracleService[XXX]、OracleDBConsole[XXX]、OracleJobScheduler[XXX]</p>
<p>3.Database Upgrade Assistant</p>
<p>作用：将oracle8、9、10等版本数据库升级到10g2版本。</p>
<p>4.Locale Builder</p>
<p>作用：管理地域、语言、字符集等本地化内容。</p>
<p>5.Microsoft ODBC 管理员</p>
<p>作用：不用解释了吧，创建连接字符串的。</p>
<p>6.Net Configuration Assistant</p>
<p>作用：网络服务，包括监听程序配置、命名方法配置、本地NET服务名配置和目录使用配置。</p>
<p>默认监听：Oracle[XXX]10g_home1TNSListener</p>
<p>添加1522端口监听：Oracle[XXX]10g_home1TNSListener[新监听名称]</p>
<p>7.Net Manager</p>
<p>作用：管理服务命名、监听程序等。</p>
<p>(二)、应用程序开发</p>
<p>1.SQL Plus</p>
<p>作用：这个我就不多说了。</p>
<p>(三)、集成管理工具</p>
<p>1.Oracle Directory Manager</p>
<p>作用：ORACLE目录管理</p>
<p>2.Wallet Manager</p>
<p>作用：ORACLE钱包管理，我也没用过。</p>
<p>(四)、Oracle Installation Products</p>
<p>1.Universal Installer<br />
</p>
<img src ="http://www.blogjava.net/xcp/aggbug/333613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-10-01 17:32 <a href="http://www.blogjava.net/xcp/archive/2010/10/01/333613.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大哥大姐们：帮帮小弟 ， 急！！</title><link>http://www.blogjava.net/xcp/archive/2010/05/14/321004.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Fri, 14 May 2010 13:07:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/05/14/321004.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/321004.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/05/14/321004.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/321004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/321004.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/xcp/archive/2010/05/14/321004.html'>阅读全文</a><img src ="http://www.blogjava.net/xcp/aggbug/321004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-05-14 21:07 <a href="http://www.blogjava.net/xcp/archive/2010/05/14/321004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle11g 使用</title><link>http://www.blogjava.net/xcp/archive/2010/03/18/315758.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Thu, 18 Mar 2010 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/03/18/315758.html</guid><description><![CDATA[http://hi.baidu.com/anran0711/blog/item/f76c54f4cae128d1f2d385fa.html<br />
<img src ="http://www.blogjava.net/xcp/aggbug/315758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-03-18 11:50 <a href="http://www.blogjava.net/xcp/archive/2010/03/18/315758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三种SQL分页法</title><link>http://www.blogjava.net/xcp/archive/2009/11/10/SqlPager.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 10 Nov 2009 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2009/11/10/SqlPager.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/301797.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2009/11/10/SqlPager.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/301797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/301797.html</trackback:ping><description><![CDATA[<p>三种SQL分页法<br />
表中主键必须为标识列，[ID] int IDENTITY (1,1)</p>
<p>1.分页方案一：(利用Not In和SELECT TOP分页)</p>
<p>语句形式：&nbsp; <br />
SELECT TOP 页记录数量 *<br />
FROM 表名<br />
WHERE (ID NOT IN<br />
&nbsp; (SELECT TOP (每页行数*(页数-1)) ID<br />
&nbsp;&nbsp; FROM 表名<br />
&nbsp;&nbsp; ORDER BY ID))<br />
&nbsp;&nbsp; ORDER BY ID<br />
//自己还可以加上一些查询条件</p>
<p><br />
例:<br />
select top 2 *<br />
from Sys_Material_Type<br />
where (MT_ID not in <br />
&nbsp;&nbsp;&nbsp; (select top (2*(3-1)) MT_ID from Sys_Material_Type&nbsp; order by MT_ID))<br />
order by MT_ID</p>
<p>&nbsp;</p>
<p>2.分页方案二：(利用ID大于多少和SELECT TOP分页）</p>
<p>语句形式：<br />
SELECT TOP 每页记录数量 *<br />
FROM 表名<br />
WHERE (ID &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT MAX(id)<br />
&nbsp;&nbsp;&nbsp; FROM (SELECT TOP 每页行数*页数 id&nbsp;&nbsp; FROM 表<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY id) AS T)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />
ORDER BY ID</p>
<p>例:<br />
SELECT TOP 2 *<br />
FROM Sys_Material_Type<br />
WHERE (MT_ID &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT MAX(MT_ID)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM (SELECT TOP (2*(3-1)) MT_ID<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM Sys_Material_Type<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY MT_ID) AS T))<br />
ORDER BY MT_ID</p>
<p>&nbsp;</p>
<p>3.分页方案三：(利用SQL的游标存储过程分页)<br />
create&nbsp; procedure SqlPager<br />
@sqlstr nvarchar(4000), --查询字符串<br />
@currentpage int, --第N页<br />
@pagesize int --每页行数<br />
as<br />
set nocount on<br />
declare @P1 int, --P1是游标的id<br />
&nbsp;@rowcount int<br />
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output<br />
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 <br />
set @currentpage=(@currentpage-1)*@pagesize+1<br />
exec sp_cursorfetch @P1,16,@currentpage,@pagesize <br />
exec sp_cursorclose @P1<br />
set nocount off</p>
<p>&nbsp;</p>
<p>4.总结:<br />
其它的方案：如果没有主键，可以用临时表，也可以用方案三做，但是效率会低。<br />
建议优化的时候，加上主键和索引，查询效率会提高。</p>
<p>通过SQL 查询分析器，显示比较：我的结论是:<br />
分页方案二：(利用ID大于多少和SELECT TOP分页）效率最高，需要拼接SQL语句<br />
分页方案一：(利用Not In和SELECT TOP分页)&nbsp;&nbsp; 效率次之，需要拼接SQL语句<br />
分页方案三：(利用SQL的游标存储过程分页)&nbsp;&nbsp;&nbsp; 效率最差，但是最为通用 </p>
<p>本文转摘自『IT学习者』http://www.itlearner.com/article/2007/3740.shtml</p>
<img src ="http://www.blogjava.net/xcp/aggbug/301797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2009-11-10 11:20 <a href="http://www.blogjava.net/xcp/archive/2009/11/10/SqlPager.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 2005 使用指南(个人笔记)</title><link>http://www.blogjava.net/xcp/archive/2009/11/08/sql2005.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Sat, 07 Nov 2009 17:17:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2009/11/08/sql2005.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/301584.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2009/11/08/sql2005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/301584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/301584.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:   最近要做一个项目,规定用数据库Sqlserver 2005,但是最开始还是有一点模糊的感觉,下面的笔记主要是讲从数据库的安装和简单使用&nbsp;&nbsp;<a href='http://www.blogjava.net/xcp/archive/2009/11/08/sql2005.html'>阅读全文</a><img src ="http://www.blogjava.net/xcp/aggbug/301584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2009-11-08 01:17 <a href="http://www.blogjava.net/xcp/archive/2009/11/08/sql2005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JDBC连接Sql Server 2005总结</title><link>http://www.blogjava.net/xcp/archive/2009/10/21/jdbcSqlerver2005.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Wed, 21 Oct 2009 14:29:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2009/10/21/jdbcSqlerver2005.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/299255.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2009/10/21/jdbcSqlerver2005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/299255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/299255.html</trackback:ping><description><![CDATA[原帖及讨论：http://www.bccn.net/Article/kfyy/java/jszl/200706/4588.html<br />
<br />
* 最近因为开发活动需要,用上了Eclipse,并要求使用精简版的SQL数据库(即Sql server 2005)来进行开发项目 *<br />
工作: 准备相关的软件(Eclipse除外,开源软件可以从官网下载)
<p>&lt;1&gt;.Microsoft SQL server 2005 Express Edition</p>
<p>下载地址:<a href="http://download.microsoft.com/download/0/9/0/09020fab-d2c3-4a8c-b9e0-db53a7a30ae8/SQLEXPR_CHS.EXE" target="_blank"><u><font color="#0000ff">http://download.microsoft.com/download/0/9/0/09020fab-d2c3-4a8c-b9e0-db53a7a30ae8/SQLEXPR_CHS.EXE</font></u></a></p>
<p>&lt;2&gt;.SQL Server Management Studio</p>
<p>下载地址:<a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796#filelist" target="_blank"><u><font color="#0000ff">http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796#filelist</font></u></a></p>
<p>&lt;3&gt;.SQL Server 2005 driver for JDBC</p>
<p>下载地址:<a href="http://download.microsoft.com/download/8/B/D/8BDABAE2-B6EA-41D4-B903-7916EF3690EF/sqljdbc_1.2.2323.101_enu.exe" target="_blank"><u><font color="#0000ff">http://download.microsoft.com/download/8/B/D/8BDABAE2-B6EA-41D4-B903-7916EF3690EF/sqljdbc_1.2.2323.101_enu.exe</font></u></a></p>
<p><strong>2</strong>.都下载完之后开始进行安装 ,前两个是属于数据库软件,正常安装即可(注意数据库登陆不要使用windows验证)</p>
<p>&lt;<strong>1</strong>&gt; 将JDBC解压缩到任意位置,比如解压到C盘program files下面,并在安装目录里找到sqljdbc.jar文件,得到其路径开始配置环境变量</p>
<p>在环境变量classpath 后面追加 C:\Program Files\Microsoft SQL Server2005 JDBC Driver\sqljdbc_1.2\enu\sqljdbc.jar</p>
<p>&lt;<strong>2</strong>&gt; 设置SQLEXPRESS服务器:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;a.打开SQL Server Configuration Manager -&gt; SQLEXPRESS的协议 -&gt; TCP/IP <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;b.右键单击启动TCP/IP <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;c.双击进入属性,把IP地址中的IP all中的TCP端口设置为1433<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;d.重新启动SQL Server 2005服务中的SQLEXPRESS服务器<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.关闭SQL Server Configuration Manager</p>
<p>&lt;<strong>3</strong>&gt; 打开刚刚安装好的 SQL Server Management Studio,连接SQLEXPRESS服务器, 新建数据库,起名字为sample </p>
<p>&lt;<strong>4</strong>&gt; 打开Eclipse</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;a.新建工程-&gt; java -&gt; java project,起名为Test <br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;b.选择eclipse-&gt;窗口-&gt;首选项-&gt;java-&gt;installed JRE&nbsp;&nbsp;编辑已经安装好的jdk,查找目录添加sqljdbc.jar<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;c.右键单击目录窗口中的Test, 选择Build Path -&gt;Configure Build Path..., 添加扩展jar文件,即把sqljdbc.jar添加到其中<br />
<br />
&lt;<strong>5</strong>&gt; 编写java代码来测试连接数据库 </p>
<p>程序代码:
<div class="htmlcode"><br />
import java.sql.*;
<p>&nbsp;</p>
<p>public class Test {<br />
public static void main(String[] srg) {<br />
&nbsp;&nbsp;String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";&nbsp;&nbsp;//加载JDBC驱动<br />
&nbsp;&nbsp;String dbURL = "jdbc:sqlserver://localhost:1433; DatabaseName=sample";&nbsp;&nbsp;//连接服务器和数据库sample<br />
&nbsp;&nbsp;String userName = "sa";&nbsp;&nbsp;//默认用户名<br />
&nbsp;&nbsp;String userPwd = "123456";&nbsp;&nbsp;//密码<br />
&nbsp;&nbsp;Connection dbConn;</p>
<p>&nbsp;&nbsp;try {<br />
&nbsp;&nbsp; Class.forName(driverName);<br />
&nbsp;&nbsp; dbConn = DriverManager.getConnection(dbURL, userName, userPwd);<br />
&nbsp;&nbsp; System.out.println("Connection Successful!");&nbsp;&nbsp;//如果连接成功 控制台输出Connection Successful!<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
}<br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<p>&nbsp;</p>
<p><br />
<font color="#ff0000"><strong>注</strong></font>:</p>
<p>1.因为SQLexpress服务器默认是禁用的并且端口号没有配置,所以要进行重新设置</p>
<p>2.如果你以前用java连接sql server 2000的话就要注意了:</p>
<p>在sql server 2000 中加载驱动和URL路径的语句是</p>
<p>String driverName = "com.microsoft.<font color="#0000ff"><strong>jdbc</strong></font>.<font color="#ff3300"><strong>sqlserver</strong></font>.SQLServerDriver";<br />
String dbURL = "<font color="#ee11ee"><strong>jdbc</strong></font>:<font style="background-color: #ffffff"><strong>microsoft</strong>:<font color="#ee11c2">sqlserver</font></font>://localhost:1433; DatabaseName=sample";</p>
<p>而sql server 2005 中加载驱动和url的语句则为</p>
<p>String driverName = "com.microsoft.<font color="#f70909"><strong>sqlserver</strong></font>.<font color="#3809f7"><strong>jdbc</strong></font>.SQLServerDriver";<br />
String dbURL = "<font color="#ee11ee"><strong>jdbc:sqlserver</strong></font>://localhost:1433; DatabaseName=sample"; </p>
<p>如果写法错误将会找不到驱动.<br />
<br />
<br />
好了,应该没什么疑问了吧...偶是有连接失败经历才分享给大家的...</p>
<img src ="http://www.blogjava.net/xcp/aggbug/299255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2009-10-21 22:29 <a href="http://www.blogjava.net/xcp/archive/2009/10/21/jdbcSqlerver2005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE 中ROWNUM用法总结! (转) </title><link>http://www.blogjava.net/xcp/archive/2009/10/07/rownum1.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Wed, 07 Oct 2009 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2009/10/07/rownum1.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/297392.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2009/10/07/rownum1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/297392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/297392.html</trackback:ping><description><![CDATA[<p>&nbsp; </p>
<p style="text-align: left; margin-bottom: 12pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">ORACLE </span><span style="font-family: 宋体; font-size: 12pt">中ROWNUM用法总结! <br />
&nbsp;&nbsp;&nbsp; 对于 Oracle 的 rownum 问题，很多资料都说不支持&gt;,&gt;=,=,between...and，只能用以上符号(&lt;、&lt;=、!=)，并非说用&gt;,&gt;=,=,between..and 时会提示SQL语法错误，而是经常是查不出一条记录来，还会出现似乎是莫名其妙的结果来，其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇，同样是伪列，rownum 与 rowid 可有些不一样，下面以例子说明</span></p>
<p style="text-align: left; text-indent: 18pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">假设某个表 t1(c1) 有 20 条记录<br />
<br />
&nbsp;&nbsp; 如果用 select rownum,c1 from t1 where rownum &lt; 10, 只要是用小于号，查出来的结果很容易地与一般理解在概念上能达成一致，应该不会有任何疑问的。<br />
<br />
&nbsp;&nbsp; 可如果用 select rownum,c1 from t1 where rownum &gt; 10 (如果写下这样的查询语句，这时候在您的头脑中应该是想得到表中后面10条记录)，你就会发现，显示出来的结果要让您失望了，也许您还会怀疑是不谁删了一些记录，然后查看记录数，仍然是 20 条啊？那问题是出在哪呢？<br />
<br />
&nbsp;&nbsp; 先好好理解 rownum 的意义吧。ROWNUM是一个虚假的列,它将被分配为 1，2，3，4，...N，N 是行的数量。<strong>即查到结果集之后,任何排序和聚合之前,加上去的一个列 (强调：先要有结果集)。</strong>简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1，而有其他大于1的值。所以您没办法期望得到下面的结果集：<br />
&nbsp;&nbsp;11 aaaaaaaa<br />
&nbsp;&nbsp;12 bbbbbbb<br />
&nbsp;&nbsp;13 ccccccc<br />
&nbsp;&nbsp;&nbsp;.................</span></p>
<p style="text-align: left; text-indent: 12pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">&nbsp;ROWNUM</span><span style="font-family: 宋体; font-size: 12pt">是一个序列，是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1，第二条为2，依次类推。如果你用&gt;,&gt;=,=,between...and这些条件，因为从缓冲区或数据文件中得到的第一条记录的rownum为1，不满足条件，则被删除，接着取下条，可是它的rownum还是1，又被删除，依次类推，便没有了数据。</span></p>
<p style="text-align: left; text-indent: 12pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">有了以上从不同方面建立起来的对 rownum 的概念，那我们可以来认识使用 rownum 的几种现像:</span></p>
<p style="text-align: left; text-indent: 12pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">1. select rownum,c1 from t1 where rownum != 10 </span><span style="font-family: 宋体; font-size: 12pt">为何是返回前9条数据呢？它与 select rownum,c1 from tablename where rownum &lt; 10 返回的结果集是一样的呢？<br />
&nbsp;因为是在查询到结果集后，显示完第 9 条记录后，之后的记录也都是 != 10,或者 &gt;=10,所以只显示前面9条记录。也可以这样理解，rownum 为9后的记录的 rownum为10，因条件为 !=10，所以去掉，其后记录补上，rownum又是10，也去掉，如果下去也就只会显示前面9条记录了</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">&nbsp;2. </span><span style="font-family: 宋体; font-size: 12pt">为什么 rownum &gt;1 时查不到一条记录，而 rownum &gt;0 或 rownum &gt;=1 却总显示所以的记录?</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp; </span><span style="font-family: 宋体; font-size: 12pt">因为 rownum 是在查询到的结果集后加上去的，它总是从1开始，如果rownum&gt;1的话，查询第一数据的rownum=1，不满足条件，删除，第二条的rownum 又等于1，还是不满足，删除，所以到最后一天数据也没有。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp; 3. </span><span style="font-family: 宋体; font-size: 12pt">为什么 between 1 and 10 或者 between 0 and 10 能查到结果，而用 between 2 and 10 却得不到结果<br />
&nbsp;&nbsp; 原因同上一样，因为 rownum 总是从 1 开始</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp; </span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp; </span><span style="font-family: 宋体; font-size: 12pt">从上可以看出，任何时候想把 rownum = 1 这条记录抛弃是不对的，它在结果集中是不可或缺的，少了rownum=1 就像空中楼阁一般不能存在，所以你的 rownum 条件要包含到 1 </span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left; text-indent: 18pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">但如果就是想要用 rownum &gt; 10 这种条件的话话就要用嵌套语句,把 rownum 先生成，然后对他进行查询。<br />
&nbsp;&nbsp;select * from (selet rownum as rn，t1.* from a where ...) where rn &gt;10</span></p>
<p style="text-align: left; text-indent: 18pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">一般代码中对结果集进行分页就是这么干的。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp; </span></p>
<p style="line-height: 150%; margin-bottom: 8.35pt" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">&nbsp;&nbsp; </span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">另外：rowid 与 rownum 虽都被称为伪列，但它们的存在方式是不一样的，rowid 可以说是物理存在的，表示记录在表空间中的唯一位置ID，在DB中唯一。只要记录没被搬动过，rowid是不变的。rowid 相对于表来说又像表中的一般列，所以以 rowid 为条件就不会有 rownum那些情况发生。<br />
&nbsp;&nbsp; 另外还要注意：rownum不能以任何基表的名称作为前缀。</span></p>
&nbsp;&nbsp;<span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp; 本文转载于：<font face="宋体"><a href="http://www.cnblogs.com/chinhr/archive/2007/09/30/911685.html">http://www.cnblogs.com/chinhr/archive/2007/09/30/911685.html</a></font></span>
<img src ="http://www.blogjava.net/xcp/aggbug/297392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2009-10-07 18:39 <a href="http://www.blogjava.net/xcp/archive/2009/10/07/rownum1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle中varchar,varchar2,nvarchar,nvarchar2有什么区别?</title><link>http://www.blogjava.net/xcp/archive/2009/10/06/oracle1.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Mon, 05 Oct 2009 17:55:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2009/10/06/oracle1.html</guid><description><![CDATA[<p>&nbsp;现在版本的Oracle，varchar和varchar2是没有区别的，varchar2和ANSI&nbsp;&nbsp; varchar的区别是varchar2把空串等同于null处理。这也是为什么ORACLE推荐使用varchar2类型的原因，因为如果新版本Oralce的varchar类型完全兼容ANSI标准时，使用varchar2的脚本可以不修改。 <br />
<br />
至于一个varchar2字符要用几个字节存储，要看数据库使用的字符集，比如GBK，汉字就会占两个字节，英文1个，如果是UTF-8，汉字一般占3个字节，英文还是1个。 <br />
<br />
而NCHAR、NVARCHAR是以UNICODE-16存储，每个字符固定两个字节。</p>
<br />
<br />
转载于http://topic.csdn.net/u/20070918/09/762642ab-4dbd-41cb-b412-0ebe380f85a1.html
 <img src ="http://www.blogjava.net/xcp/aggbug/297286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2009-10-06 01:55 <a href="http://www.blogjava.net/xcp/archive/2009/10/06/oracle1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>