﻿<?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-黄小二的讀書筆記-文章分类-Oracle</title><link>http://www.blogjava.net/kiant/category/34315.html</link><description>有才而性缓定属大才，有智而气和斯为大智。人偏狭我受之以宽容，人险仄我持之以坦荡。缓事宜急干，敏则有功；急事宜缓办，忙则多措。
--李叔同</description><language>zh-cn</language><lastBuildDate>Tue, 13 Apr 2010 18:07:30 GMT</lastBuildDate><pubDate>Tue, 13 Apr 2010 18:07:30 GMT</pubDate><ttl>60</ttl><item><title>SQL Server、MySQL和 Oracle的行合并</title><link>http://www.blogjava.net/kiant/articles/317866.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Fri, 09 Apr 2010 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/317866.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/317866.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/317866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/317866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/317866.html</trackback:ping><description><![CDATA[<br />
内容引自：<br />
多行一列数据合并成一行一列数据<br />
http://topic.csdn.net/u/20090714/17/5FE6A0F7-CE78-4936-BE31-21D462236059.html<br />
<br />
在MySQL和Oracle中实现行合并 <br />
http://www.blogjava.net/rain1102/archive/2009/06/24/283867.html<br />
<br />
<br />
SQL Server<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">--</span><span style="color: #008080">SQL2005中的方法2&nbsp;</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;tb(id&nbsp;</span><span style="font-weight: bold; color: #000000">int</span><span style="color: #000000">,&nbsp;value&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">))&nbsp;<br />
</span><span style="color: #0000ff">insert</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">into</span><span style="color: #000000">&nbsp;tb&nbsp;</span><span style="color: #0000ff">values</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">aa</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;<br />
</span><span style="color: #0000ff">insert</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">into</span><span style="color: #000000">&nbsp;tb&nbsp;</span><span style="color: #0000ff">values</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">bb</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;<br />
</span><span style="color: #0000ff">insert</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">into</span><span style="color: #000000">&nbsp;tb&nbsp;</span><span style="color: #0000ff">values</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">aaa</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;<br />
</span><span style="color: #0000ff">insert</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">into</span><span style="color: #000000">&nbsp;tb&nbsp;</span><span style="color: #0000ff">values</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">bbb</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;<br />
</span><span style="color: #0000ff">insert</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">into</span><span style="color: #000000">&nbsp;tb&nbsp;</span><span style="color: #0000ff">values</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">ccc</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;<br />
</span><span style="color: #0000ff">go</span><span style="color: #000000">&nbsp;<br />
<br />
</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;id,&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">values</span><span style="color: #ff0000">]</span><span style="color: #808080">=</span><span style="color: #ff00ff">stuff</span><span style="color: #000000">((</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">,</span><span style="color: #ff0000">'</span><span style="color: #808080">+</span><span style="color: #ff0000">[</span><span style="color: #ff0000">value</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;tb&nbsp;t&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;id</span><span style="color: #808080">=</span><span style="color: #000000">tb.id&nbsp;<br />
</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;xml&nbsp;path(</span><span style="color: #ff0000">''</span><span style="color: #000000">)),&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">,&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #000000">)&nbsp;<br />
</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;tb&nbsp;<br />
</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;id&nbsp;<br />
<br />
</span><span style="color: #008080">/*</span><span style="color: #008080">&nbsp;<br />
id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values&nbsp;<br />
-----------&nbsp;--------------------&nbsp;<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa,bb&nbsp;<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aaa,bbb,ccc&nbsp;<br />
<br />
(2&nbsp;row(s)&nbsp;affected)&nbsp;<br />
<br />
</span><span style="color: #008080">*/</span><span style="color: #000000">&nbsp;<br />
<br />
</span><span style="color: #0000ff">drop</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;tb&nbsp;<br />
</span></div>
<br />
<br />
MySQL<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;name&nbsp;,&nbsp;group_concat(email&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;email&nbsp;separator&nbsp;",&nbsp;")&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;email&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;student&nbsp;</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;name</span></div>
<br />
<br />
Oracle<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">如果以上效果想在Oracle中显示,&nbsp;则比较复杂点了,&nbsp;因为Oracle中没有行合并函数,&nbsp;则需要使用sys_connect_by_path()来实现,&nbsp;代码如下:<br />
</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;name,&nbsp;</span><span style="color: #ff00ff">ltrim</span><span style="color: #000000">(sys_connect_by_path(email,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">,</span><span style="color: #ff0000">'</span><span style="color: #000000">),</span><span style="color: #ff0000">'</span><span style="color: #ff0000">,</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;email&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">(<br />
</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;name,email,<br />
row_number()&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">(partition&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;name&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;email)&nbsp;rn,<br />
</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">over</span><span style="color: #000000">(partition&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;name)&nbsp;cnt<br />
</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;student&nbsp;<br />
)&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">level</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;cnt<br />
start&nbsp;</span><span style="color: #0000ff">with</span><span style="color: #000000">&nbsp;rn&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000"><br />
connect&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;prior&nbsp;name&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;name&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;prior&nbsp;rn&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;rn&nbsp;</span></div>
<img src ="http://www.blogjava.net/kiant/aggbug/317866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2010-04-09 16:24 <a href="http://www.blogjava.net/kiant/articles/317866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标量子查询</title><link>http://www.blogjava.net/kiant/articles/286847.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Wed, 15 Jul 2009 04:47:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/286847.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/286847.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/286847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/286847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/286847.html</trackback:ping><description><![CDATA[<br />
<fieldset><legend>引用: 标量子查询</legend>
<p>一个标量子查询是一个放在圆括弧里的普通 SELECT查询， 它只返回只有一个字段的一行．（参阅 Chapter 4 获取有关写查询的信息。） 该 SELECT 将被执行， 而其单个返回值将在周围的值表达式中使用． 把一个返回超过一行或者超过一列的查询用做标量查询是错误的． (不过，在特定的执行中，子查询不返回行则不算错误；标量结果认为是 NULL．)该子查询可以引用周围查询的变量， 那些变量也是在计算任意子查询的时候当做常量使用的． 又见 Section 6.15． </p>
<p>比如，下面的查询找出每个州中的最大人口数量的城市∶ </p>
<p>SELECT name, (SELECT max(pop) FROM cities WHERE cities.state = states.name)<br />
FROM states;</p>
</fieldset><br />
<br />
<a href="http://www.wang48.com/jishubaodianview/?jsd_id=13064" target="_blank">子查询作为标量操作数--MySql数据库</a><br />
ps: 这种方法的只能查询单一值<br />
<br />
<a href="http://www.cnblogs.com/zping/archive/2008/10/19/1314685.html" target="_blank">《Oracle 高效设计》 读书思考--标量子查询查询性能讨论 </a><br />
能提供不少思路<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.ex_name,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.customer_name,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.remark,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.employee_name&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;create_name,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.create_user,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.project_id,&nbsp;&nbsp;&nbsp;n.id&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;node_id,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.model_id,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.</span><span style="color: #ff00ff">file_id</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.grade_name&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;level_name,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.type&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;type_name,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exe.exe_ids,&nbsp;&nbsp;exe.exe_names,&nbsp;&nbsp;&nbsp;&nbsp;dept.dept_ids,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dept.dept_names,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">Convert</span><span style="color: #000000">(DATE_FORMAT(pn.node_end_time,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">%Y年%c月%e日</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;USING&nbsp;utf8)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;end_time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hrp_project_execution&nbsp;n&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #ff00ff">left</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;hrp_cycle_grade&nbsp;g&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;g.id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;n.worklevel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #ff00ff">left</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;hrp_work_type&nbsp;t&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;t.id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;n.worktype&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #ff00ff">left</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;hrp_customer&nbsp;c&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;c.id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;n.customer_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #ff00ff">left</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;hrp_company_employee_info&nbsp;e&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;e.id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;n.create_user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #ff00ff">left</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;hrp_project_node&nbsp;pn&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;pn.id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;n.node_id<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #ff00ff">left</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;ne.execution_id,&nbsp;</span><span style="color: #ff00ff">Convert</span><span style="color: #000000">(GROUP_CONCAT(ne.executor_id)&nbsp;USING&nbsp;utf8)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;exe_ids,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GROUP_CONCAT(e.employee_name)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;exe_names&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;&nbsp;hrp_project_execution_executor&nbsp;ne&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">inner</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;hrp_company_employee_info&nbsp;e&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;e.id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;ne.executor_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;ne.delete_flag&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ne.execution_id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">46</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;ne.execution_id&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;exe&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;exe.execution_id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;n.id<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #ff00ff">left</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;de.exectuion_id,&nbsp;</span><span style="color: #ff00ff">Convert</span><span style="color: #000000">(GROUP_CONCAT(de.deptor_id)&nbsp;USING&nbsp;utf8)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;dept_ids,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GROUP_CONCAT(e.employee_name)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;dept_names&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;&nbsp;hrp_project_execution_deptor&nbsp;de&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">inner</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;hrp_company_employee_info&nbsp;e&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;e.id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;de.deptor_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;de.delete_flag&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;de.exectuion_id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">46</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;de.exectuion_id<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;dept&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;dept.exectuion_id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;n.id<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;n.id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">46</span></div>
<span style="font-size: 8pt"><em>ps. 自己写的部分, 东西镶嵌在 left join 部分</em></span>
<img src ="http://www.blogjava.net/kiant/aggbug/286847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-07-15 12:47 <a href="http://www.blogjava.net/kiant/articles/286847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个关于 联合查询union 和排序order by 的例子</title><link>http://www.blogjava.net/kiant/articles/284131.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Thu, 25 Jun 2009 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/284131.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/284131.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/284131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/284131.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/284131.html</trackback:ping><description><![CDATA[其实还有更简单的方法
<fieldset><legend>Title</legend>
<p>还可以把个别的select命令用圆括号，这样，可以对每次查询以及最终结果做出limit和order by 设置。</p>
<p>(select * from tbl1 order by colA limit 10) union (select * from tbl2 order by colA limit 10) order by </p>
<p>coltimestamp limit 5</p>
</fieldset><br />
<br />
<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #808080">//</span><span style="color: #000000">查询有效期内的计划任务节点<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;sql&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.grade_name,&nbsp;&nbsp;&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;degree_name,"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;reason,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">project_node</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;node_type,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;fact_node_name,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;p.create_time,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;p.id,&nbsp;&nbsp;&nbsp;&nbsp;p.project_id,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.node_name,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.deptids,"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;p.node_begin_time,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.node_end_time,&nbsp;&nbsp;&nbsp;&nbsp;p.worklevel"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hrp_project_node&nbsp;p&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">left</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;hrp_cycle_grade&nbsp;g&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;g.id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;p.worklevel&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;p.state&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;&nbsp;p.node_state&nbsp;</span><span style="color: #808080">&lt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;UNIX_TIMESTAMP(p.node_begin_time)&nbsp;</span><span style="color: #808080">&lt;</span><span style="color: #000000">&nbsp;UNIX_TIMESTAMP(</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;DateTime.Now.ToString()&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">//</span><span style="color: #000000">优先查出所有<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">//+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;UNIX_TIMESTAMP(p.node_end_time)&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;UNIX_TIMESTAMP(</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;DateTime.Now.ToString("yyyy-MM-dd&nbsp;HH:mm:ss")&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;(p.exeids&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;userId&nbsp;+&nbsp;"%</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">or</span><span style="color: #000000">&nbsp;p.exeids&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">%,"&nbsp;+&nbsp;userId&nbsp;+&nbsp;"%</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;";<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">//</span><span style="color: #000000">合并还未执行的任务节点<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;</span><span style="color: #808080">+=</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #0000ff">union</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">all</span><span style="color: #000000">&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.grade_name,&nbsp;&nbsp;&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;degree_name,"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;reason,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">fact_node</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;node_type,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;fact_node_name,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;f.create_time,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;f.id,&nbsp;&nbsp;&nbsp;&nbsp;f.project_id,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.node_name,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.deptids,"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;f.fact_begin_time,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.fact_end_time,&nbsp;&nbsp;&nbsp;&nbsp;f.worklevel"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hrp_fact_node_execute&nbsp;f&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">left</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">join</span><span style="color: #000000">&nbsp;hrp_cycle_grade&nbsp;g&nbsp;</span><span style="color: #0000ff">on</span><span style="color: #000000">&nbsp;g.id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;f.worklevel&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;f.state&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;&nbsp;f.fact_state_id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;(f.exeids&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;userId&nbsp;+&nbsp;"%</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">or</span><span style="color: #000000">&nbsp;f.exeids&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">%,"&nbsp;+&nbsp;userId&nbsp;+&nbsp;"%</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;";<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;string.Format("</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;({</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">})&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;t1&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;create_time&nbsp;</span><span style="color: #0000ff">desc</span><span style="color: #000000">",&nbsp;sql);</span></div>
<br />
<br />
ps: 我记得这样的一篇帖子好像发表过, 奇怪为什么不找不到了??<br />
当时还参考了别人的博客, <br />
迷糊ing.... 唉, 被 google.com搞得心神不宁啊~~~~ 
<img src ="http://www.blogjava.net/kiant/aggbug/284131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2009-06-25 16:27 <a href="http://www.blogjava.net/kiant/articles/284131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 笔记（六）、表的管理（约束、索引、锁定、表分区）</title><link>http://www.blogjava.net/kiant/articles/236263.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Tue, 28 Oct 2008 13:15:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/236263.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/236263.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/236263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/236263.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/236263.html</trackback:ping><description><![CDATA[<br />
<br />
<strong><span style="font-size: 14pt;">一、表完整性与约束</span></strong><br />
<br />
实体完整性：主键约束<br />
域完整性<br />
参照完整性：外键约束<br />
<br />
SELECT constraint_name, constraint_type FROM user_constriants WHERE table_name = 'EMP';<br />
<br />
<br />
<br />
<strong><span style="font-size: 14pt;">二、管理索引</span></strong><br />
&nbsp;&nbsp;&nbsp; 索引是建立在表字段上的一种存储结构，利用索引可以加快表的查询速度。当索引键列用于 SQL 语句的 WHERE 子句时，该索引将直接指向包含这些值得行位置，合理使用索引是减少磁盘 I/O 的主要方法，它只影响执行的速度。<br />
<br />
&nbsp;&nbsp;&nbsp; 创建索引时，Oracle 将获取要创建索引的列，并对其进行排序。然后将 ROWID 连同每一行的索引值存储起来。使用时，Oracle 先通过已排序的索引值执行快速搜索，然后使用相关联的 ROWID 值来定位具有所要查找的记录行。<br />
<br />
&nbsp;&nbsp;&nbsp; 一旦创建索引，Oracle 会自动维护和使用它们。更新行记录时，会自动更新索引，所以为表创建过多的索引会降低表的性能。<br />
<br />
&nbsp; &nbsp; 获得索引信息 user_indexes 视图。<br />
<br />
&nbsp;&nbsp;&nbsp; 重建现有的索引性能要优于删除重建索引。&nbsp; ALTER INDEX item_index REBUILD;<br />
&nbsp; <br />
<strong><br />
2.0、传统的 B树索引：</strong><br />
CREATE INDEX ix_mm ON mm(m1);<br />
<br />
<br />
<strong>2.1、唯一索引：</strong>唯一约束就是唯一索引，但唯一索引未必是唯一约束。<br />
CREATE UNIQUE INDEX myidx ON mm(m2);<br />
<br />
<br />
<strong>2.2、组合索引：</strong>在表中多个列上创建的索引。如果 SELECT 语句中 WHERE 子句引用了组合索引中的所有列或大多数列，则组合索引可以提高数据检索速度。通常创建索引时最频繁访问的列应该放在列表的最前面。<br />
CREATE INDEX comp_index ON itemfile(p_category, itemrate);<br />
<br />
<br />
<strong>2.3、反向键索引：</strong>特殊的索引，在索引含有序数的列时非常有用，反向键索引通过简单的反向被索引中的数据来解决问题。<br />
CREATE INDEX rev_index ON itemfile(itemcode) REVERSE;<br />
<br />
ps.可以使用 NOREVERSE 将反向键索引重建为标准索引，但不能将标准索引重建为反向键索引。<br />
ALTER INDEX rev_index REBUILD NOREVERSE;<br />
<br />
<br />
<strong>2.4、位图索引：</strong>表里数据量大，但表的唯一值少。位图索引使用每个键值的位图，而不是用 ROWID 列表。<br />
CREATE BITMAP INDEX bit_emp ON emp(sex);<br />
<br />
<br />
2.5、索引组织表<br />
<br />
2.6、基于函数的索引<br />
<br />
2.7、索引中的分区<br />
<br />
<br />
<br />
<a name='3' id='3'></a><strong><span style="font-size: 14pt;">三、锁定</span></strong><br />
锁定是数据库用来控制共享资源并发访问的机制。当更新数据的时候，Oracle 会自动将其锁定，其他用户只能查看该数据，直至回滚或提交事务后，锁才会释放，其他用户才能编辑。<br />
<br />
<strong>3.1、行级锁</strong><br />
行级锁只对用户正在访问的行进行锁定。在使用 INSERT、UPDATE、DELETE 和 SELECT ... FOR UPDATE 等语句时，Oracle 会自动应用行锁定。<br />
<blockquote>SELECT * FROM order_master WHERE vencode = 'V002'<br />
&nbsp; FOR UPDATE WAIT 5;<br />
UPDATE .....<br />
COMMIT;<br />
</blockquote><br />
<strong>3.2、表级锁</strong><br />
表级所将保护数据，在事务处理过程中，表级锁会限制对整个表的增、删、改操作。<br />
<blockquote>LOCK TABLE &lt;table_name&gt; IN &lt;look_mode&gt; MODE [NOWAIT];<br />
● 行共享（ROW SHARE, RS）<br />
● 行排他（ROW EXCLUSIVE, RX）<br />
● 共享（SHARE, S）<br />
● 共享行排他（SHARE ROW EXCLUSIVE, SRX）<br />
● 排他（EXCLUSIVE, X）<br />
</blockquote><br />
<strong>3.3、死锁</strong><br />
两个事务相互等待对方完成任务，就会出现死锁。Oracle 将自动检测死锁，并通过终止两个事务处理之一来解决问题。<br />
<br />
<br />
<br />
<a name='4' id='4'></a><strong><span style="font-size: 14pt;">四、表分区</span></strong><br />
&nbsp;&nbsp;&nbsp; Oracle 提供表分区技术，以来改善大型应用系统的性能。表分区允许用户把一个表中所有的行分为几个部分，并将这些部分存储在不同的位置。在大型表中利用表分区，能改善表查询性能、方便管理表，以及备份\恢复、提高数据安全性。<br />
<br />
&nbsp;&nbsp;&nbsp; 表分区对用户使透明的，用户在更新和查询时把分区表当作普通表使用。CREATE TABLE 语句中增加 PARTTION 子句以创建表分区。<br />
<br />
ps.要分区的表不能具有 LONG 和 LONG RAW 数据类型的列。<br />
<br />
<br />
<strong>4.1、范围分区</strong><br />
根据表某一个列或一组列的值范围，决定该数据存储在哪个分区上。<br />
例如：对 sales 表的 sales_cost 列值进行分区<br />
<blockquote>CREATE TABLE sales<br />
(<br />
&nbsp; ...<br />
)<br />
PARTTION BY RANGE (sales_cost)<br />
(<br />
&nbsp; PARTTION P1 VALUES LESS THAN (1000),<br />
&nbsp; PARTTION P2 VALUES LESS THAN (2000),<br />
&nbsp; PARTTION P3 VALUES LESS THAN (3000),<br />
&nbsp; PARTTION P4 VALUES LESS THAN (MAXVALUE)&nbsp;&nbsp;&nbsp; /* 大于3000的其他值都存储于分区 P4 */<br />
);<br />
</blockquote><br />
<strong>4.2、散列分区</strong><br />
散列分区通过在分区键值上执行一个散列函数来决定数据的物理位置。散列分区把记录平均地分布到不同的分区，减少了磁盘 I/O 争用的可能性。<br />
例如：创建 employer 表按照 department 列分区成 4个散列分区<br />
<blockquote>CREATE TABLE employer<br />
(<br />
&nbsp; ...<br />
)<br />
PAERTTION BY HASH (department) PARTTIONS 4;<br />
</blockquote><br />
<strong>4.3、复合分区</strong><br />
复合分区是范围分区和散列分区的结合。在创建复合分区时，先根据范围对数据进行分区，然后再散列分区内创建散列子分区。<br />
例如：创建 sales3 表，分区为复合分区，先根据 sales_date 列创建范围分区，然后再分区内根据 product_id 创建子分区。<br />
<blockquote>CREATE TABLE sales<br />
(<br />
&nbsp; ...<br />
)<br />
PARTTION BY RANGE (sales_date)<br />
SUBPARTTION BY HASH (product_id) SUBPARTTION 5<br />
(<br />
&nbsp; PARTTION P1 VALUES LESS THEN (DATE '2001-04-01'),<br />
&nbsp; PARTTION P2 VALUES LESS THEN (DATE '2001-07-01'),<br />
&nbsp; PARTTION P3 VALUES LESS THEN (DATE '2001-09-01'),<br />
&nbsp; PARTTION P4 VALUES LESS THEN (MAXVALUE)<br />
);<br />
</blockquote><br />
<strong>4.4、列表分区</strong><br />
列表分区允许用户明确地控制行到分区的映射。列表分区允许按自然方式对无序和不相关的数据集进行分组和组织。<br />
例如：根据职员住址 emp_address 列对 employee 表进行分区，并针对不同地区不同存放。<br />
<blockquote>CREATE TABLE employee<br />
(<br />
&nbsp; ...<br />
)<br />
PARTTION BY LIST (emp_address )<br />
(<br />
&nbsp; PARTTION north VALUES ('芝加哥'),<br />
&nbsp; PARTTION west VALUES ('旧金山', '洛杉矶'),<br />
&nbsp; PARTTION south VALUES ('亚特兰大', '达拉斯', '休斯顿'),<br />
&nbsp; PARTTION east VALUES ('纽约' ,'波士顿'),<br />
&nbsp; PARTTION aa VALUES (DEFAULT)&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* 其他的地址存储 aa 分区，不指定则不接受其他地址输入 */<br />
);<br />
</blockquote><br />
<br />
插入数据时 Oracle 会根据分区列的值将记录存储到对应的分区。<br />
查询分区数据：&nbsp;&nbsp;&nbsp; SELECT * FROM sales3 PARTTION (P3);<br />
<br />
<br />
<strong>分区的维护操作：</strong><br />
分区的维护操作时修改分区表的分区，以获得更佳的 I/O 负载平衡。<br />
<br />
<strong>1、添加分区：</strong>在最后一个分区之后添加新的分区。<br />
ALTER TABLE sales ADD PARTTION P4 VALUES LESS THEN (4000);<br />
<br />
<strong>2、删除分区：</strong>删除分区时，分区中数据也随之删除。<br />
ALTER TABLE sales DROP PARTTION P4;<br />
<br />
<strong>3、截断分区：</strong>将删除表分区的所有记录。<br />
ALTER TABLE sales TRUNCATE PARTTION P3;<br />
<br />
<strong>4、合并分区：</strong>可将分范围分区或复合分区表的两个相邻分区连接起来。结果分区将继承两个分区的上界。<br />
ALTER TABLE sales MERGE PARTTIONS P1, P2 INTO PARTTION P2;<br />
<br />
<strong>5、拆分分区：</strong>允许用户将一个分区拆分成两个分区。<br />
/* 以 '2005-01-01' 为分界拆分一个分区数据 */<br />
ALTER TABLE sales SPLIT PARTTION P3 AT (DATE '2005-01-01') <br />
&nbsp; INTO (PARTTION P31, PARTTION P32);<br />
<br />
<br />
<br />
<br />
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/236263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-28 21:15 <a href="http://www.blogjava.net/kiant/articles/236263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 笔记（十）、视图、同义词、序列</title><link>http://www.blogjava.net/kiant/articles/237151.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Tue, 28 Oct 2008 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/237151.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/237151.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/237151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/237151.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/237151.html</trackback:ping><description><![CDATA[<br />
<br />
<a href="#1">一、视图</a><br />
<a href="#2">二、同义词</a><br />
<a href="#3">三、序列</a><br />
<br />
<br />
<br />
<a name='1' id='1'></a><strong><span style="font-size: 14pt;">一、视图</span></strong><br />
&nbsp;&nbsp;&nbsp; 视图是一条存储起来的 SELECT 语句，是数据的显示方式，通过视图可以限制用户访问行、列、或更新表内容。<br />
<br />
<br />
<strong>1.1、基表</strong><br />
组成视图的表称为基表。在 Oracle 中，不能对有多个基表的视图进行更新，此类操作可以利用"替换触发器"完成。<br />
<br />
<br />
<strong>1.2、视图的更新约束</strong><br />
[WITH CHECK OPTION] 选项可以约束 对视图更新值 符合 视图的WHERE条件。<br />
<br />
<br />
<strong>1.3、只读约束</strong><br />
[WITH READ ONLY] 选项和 视图查询语句包含 GROPU BY/SUM 等聚合函数、DISTINCT 关键字时视图不允许更新。<br />
<br />
<br />
<strong>1.4、查看视图内容</strong><br />
DESC user_views;<br />
SELECT text FROM user_views WHERE view_name='V_READ';<br />
<br />
一个视图的例子：<br />
<blockquote>CREATE OR REPLACE VIEW myview<br />
AS<br />
SELECT * FROM books WHERE price&gt;30<br />
WITH CHECK OPTION;<br />
/* 当利用视图插入一个 price&lt;=30 的数据时会报错 */<br />
</blockquote><br />
<br />
<br />
<a name='2' id='2'></a><strong><span style="font-size: 14pt;">二、同义词</span></strong><br />
同义词是一个对象的一个别名，利用同义词，可以方便的操纵不同用户模式下的对象，简化编码。<br />
<br />
使用同义词之前要确保用户拥有访问该对象的权限。<br />
当公有对象（公有同义词）和本地对象具有相同的名称时，本地对象优先。<br />
<blockquote>● 公有同义词：DBA建立，所有用户共同拥有。CREATE PUBLIC SYNONYM ...<br />
● 私有同义词：用户建立，使用与该用户（对象，可被授权）。<br />
<br />
CREATE OR REPLACE SYNONYM dept&nbsp; FOR scott.dept;<br />
SELECT * FROM dept;<br />
<br />
</blockquote>DESC user_synonyms;<br />
SELECT synonym_name, table_name, table_owner FROM user_synonyms;<br />
<br />
<br />
<br />
<a name='3' id='3'></a><strong><span style="font-size: 14pt;">三、序列</span></strong><br />
&nbsp;&nbsp;&nbsp; 序列是用来生成唯一、连续的整数的数据库对象。它通常用来自动生成主键或唯一键。序列可以按升序、降序排列。<br />
序列是一个独立型事务，不受提交或回滚事务影响。<br />
<br />
<br />
<strong>3.1、创建</strong><br />
<blockquote>CREATE SEQUENCE sequence_name<br />
&nbsp; [START WITH integer]&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* 序列起始值，升序默认为最小值，降序默认为最大值 */<br />
&nbsp; [INCREMENT BY integer]&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* 递增量，默认为 1， */<br />
&nbsp; [MAXVALUE integer | NOMAXVALUE]&nbsp;&nbsp;&nbsp; /* 最大值，默认为 NOMAXVALUE */<br />
&nbsp; [MINVALUE integer | NOMINVALUE]&nbsp;&nbsp;&nbsp; /* 最小值，必须小于等于起始值和 小于最大值 */<br />
&nbsp; [CYCLE | NOCYCLE]&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* 序列到达最大值后是否循环，默认为 NOCYCLE 不循环 */<br />
&nbsp; [CACHE integer | NOCACHE];&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* 是否预分配序列号，默认缓存20个序列号 */<br />
</blockquote><br />
<strong>3.2、访问</strong><br />
&nbsp; NEXTVAL 伪列：返回一个新的序列值。<br />
&nbsp; CURRVAL 伪列：内存中最后一次引用 NEXTVAL 的返回值，也就是序列的当前值。<br />
<br />
INSERT INTO t1 VALUES(t1_seq.NEXTVAL, 'aaa');<br />
SELECT t1_seq.CURRVAL FROM dual;<br />
<br />
<br />
<strong>3.3、修改</strong><br />
&nbsp;&nbsp;&nbsp; 序列建立后只能修改 最大/最小值、增量值、序列号缓存大小，不能修改起始值，并且保证序列最大/最小值符合规则。<br />
<br />
<br />
<strong>3.4、查看</strong><br />
DESC user_sequences;<br />
SELECT * FROM user_sequences WHERE SEQUENCE_NAME = 'T1_SEQ';<br />
<br />
<br />
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/237151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-28 16:51 <a href="http://www.blogjava.net/kiant/articles/237151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 笔记（九）、触发器</title><link>http://www.blogjava.net/kiant/articles/236787.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sun, 26 Oct 2008 16:16:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/236787.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/236787.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/236787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/236787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/236787.html</trackback:ping><description><![CDATA[<br />
<br />
<a href="#1">一、行级触发器</a><br />
<a href="#2">二、语句级触发器</a><br />
<a href="#3">三、替换触发器</a><br />
<a href="#4">四、模式级触发器</a><br />
<a href="#5">五、数据库级触发器</a><br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 1、触发器一旦创建就会立刻生效，有时可能需要临时禁用触发器，最常见的原因就是涉及数据加载。<br />
ALTER TRIGGER trigger_name [ENABLE | DISABLE];<br />
<br />
&nbsp;&nbsp;&nbsp; 2、Oracle 触发器里两个重要的内存逻辑表 :old 和 :new。:old 表保存的是在DML语句之前的数据，:new 表保存的是在DML语句创建的数据。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; old&nbsp;&nbsp;&nbsp; new<br />
INSERT&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp; &#8730;<br />
DELETE&nbsp;&nbsp;&nbsp; &#8730;&nbsp;&nbsp;&nbsp; -<br />
UPDATE&nbsp;&nbsp;&nbsp; &#8730;&nbsp;&nbsp;&nbsp; &#8730;<br />
<br />
&nbsp;&nbsp;&nbsp; 3、在触发器语句中不能显式的提交/回滚事务。<br />
<br />
<br />
<br />
<br />
<a name='1' id='1'></a><strong><span style="font-size: 14pt;">一、行级触发器</span></strong><br />
行级触发器对 DML 语句影响的每个行执行一次。主要应用保持数据完整性。<br />
<blockquote>
例：两表级联更新，修改部门表编号的同时也修改员工表的部门编号：<br />
CREATE OR REPLACE TRIGGER update_dept<br />
&nbsp; /* 行级触发器，在更新部门表操作后触发 */<br />
&nbsp; AFTER UPDATE ON deptment<br />
&nbsp; FOR EACH ROW<br />
BEGIN<br />
&nbsp; /* new、old 表的有效利用，把旧表的id列值 更新为 新表的id列值 */<br />
&nbsp; UPDATE emp SET id=:new.id WHERE id=:old.id;<br />
END;<br />
<br />
UPDATE deptment SET id='yy' WHERE id='01';<br />
<br />
SELECT * FROM deptment;<br />
SELECT * FROM emp;<br />
<br />
<br />
插入时利用触发器+序列实现整型字段的自增：<br />
CREATE OR REPLACE TRIGGER set_no<br />
&nbsp; BEFORE INSERT ON auto<br />
&nbsp; FOR EACH ROW<br />
DECLARE <br />
&nbsp; sn number(5);<br />
BEGIN<br />
&nbsp; /* 触发器预处理序列的值 */<br />
&nbsp; SELECT myseq.nextval INTO sn FROM dual;<br />
&nbsp; :NEW.a := sn;<br />
END;<br />
<br />
INSERT INTO auto VALUES(21,'dtt');<br />
SELECT * FROM auto;<br />
/* 插入时表a列由触发器产生的值替代用户的输入 */<br />
</blockquote>
<br />
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="2" id="2"></a>
<strong><span style="font-size: 14pt;">二、语句级触发器</span></strong><br />
只与语句有关，与行无关，不涉及数据完整性问题。<br />
<blockquote>
例如：利用触发器记录，记录某表中用户的操作（日志处理）。<br />
CREATE OR REPLACE TRIGGER dm1_aa<br />
&nbsp; AFTER INSERT OR DELETE OR UPDATE ON aa<br />
BEGIN<br />
&nbsp; IF INSERTING THEN<br />
&nbsp;&nbsp;&nbsp; INSERT INTO mylog VALUES(user,sysdate,'I');<br />
&nbsp; ELSEIF DELETING THEN<br />
&nbsp;&nbsp;&nbsp; INSERT INTO mylog VALUES(user,sysdate,'D');<br />
&nbsp; ELSE<br />
&nbsp;&nbsp;&nbsp; INSERT INTO mylog VALUES(user,sysdate,'U');<br />
&nbsp; END IF;<br />
END;<br />
</blockquote>
ps.能否记录多个表？"after insert or delete or update on t1,t2" 出错。<br />
<br />
<br />
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="3" id="3"></a>
<strong><span style="font-size: 14pt;">三、替换触发器</span></strong><br />
解决Oracle视图中多表更新的限制，只能在视图中使用，属于行级触发器。<br />
<blockquote>
例如：在视图中插入新的部门同时插入其所属的新员工：<br />
CREATE OF REPLACE TRIGGER tr_v_e_d<br />
&nbsp; /* 在视图上创建替换触发器 */<br />
&nbsp; INSTEAD OF INSERT ON v_emp_dept<br />
&nbsp; FOR EACH ROW<br />
BEGIN<br />
&nbsp; /* 替换触发器先插入部门表的信息，然后再插入其所属员工表的信息 */<br />
&nbsp; INSERT INTO deptment VALUES(:new.id, :new.name);<br />
&nbsp; INSERT INTO emp(eid, ename, sex, id) VALUES(:new.eid, :new.ename, :new.sex, :new.d);<br />
END;<br />
<br />
INSERT INTO v_emp_dept VALUES('456', 'test', 'f', '33', 'hg');<br />
SELECT * FROM v_emp_dept;<br />
</blockquote>
<br />
<br />
<strong><span style="font-size: 14pt;"><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="4" id="4"></a>四、模式级触发器</span></strong><br />
可以在模式对象的操作上建立的触发器，如 CREATE、ALTER、DROP、GRANT、REVOKE 和 TRUNCATE 等DDL语句。<br />
[BEFORE | AFTER] trigger_event ON [schema.]SCHEMA<br />
<blockquote>例如：对用户所删除的所有对象进行日志记录<br />
CREATE OR REPLACE TRIGGER log_drop_obj<br />
&nbsp; AFTER DROP ON SCHEMA<br />
BEGIN<br />
&nbsp; /* 记录操作类型、操作对象、操作时间 */<br />
&nbsp; INSERT INTO dropped_obj VALUES(ORA_DICT_OBJ_NAME, ORA_DICT_TYPE, SYSDATE);<br />
END;<br />
<br />
CREATE TABLE for_drop(x char);<br />
DROP TABLE for_drop;<br />
<br />
SELECT * FROM dropped_obj;<br />
</blockquote><br />
<br />
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="5" id="5"></a><strong><span style="font-size: 14pt;">五、数据库级触发器</span></strong><br />
可以创建在数据库事件上的触发器，包括启动、关闭、服务器错误、登录和注销等。这些事件都是实例范围内的，不与特定的表或视图关联。<br />
<blockquote>CREATE OR REPLACE TRIGGER system_startup<br />
&nbsp; AFTER STARTUP ON DATABASE<br />
BEGIN<br />
&nbsp; ...<br />
END;<br />
</blockquote><br />
<br />
<br />
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/236787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-27 00:16 <a href="http://www.blogjava.net/kiant/articles/236787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 笔记（八）、PL/SQL 高级应用（游标、存储过程、函数、程序包）</title><link>http://www.blogjava.net/kiant/articles/236591.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sat, 25 Oct 2008 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/236591.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/236591.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/236591.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/236591.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/236591.html</trackback:ping><description><![CDATA[<br />
<br />
<a href="#1">一、游标</a><br />
<a href="#2">二、存储过程</a><br />
<a href="#3">三、函数</a><br />
&nbsp;&nbsp;&nbsp; <a href="#30">过程与函数的异同</a><br />
<a href="#4">四、程序包</a><br />
<br />
<br />
<br />
<a name='1' id='1'></a><strong><span style="font-size: 14pt;">一、游标</span></strong><br />
&nbsp;&nbsp;&nbsp; 游标是一种 PL/SQL 控制结构，可以对SQL语句的处理进行显式控制，便于对表的数据逐条进行处理。<br />
ps.当表中数据量大的时候，不建议使用游标（效率不高，耗费资源），但是它能逐条取数据方法灵活。<br />
&nbsp;&nbsp;&nbsp; 游标是记录的指针，利用游标对活动集的更新或删除会反馈到表的记录上。<br />
<br />
游标属性：%FOUND、%NOTFOUND、%ROWCOUNT、%ISOPEN<br />
<br />
<br />
<strong>1、显式游标</strong><br />
&nbsp;&nbsp;&nbsp; 显式游标是由用户显式声明的游标。根据在游标中定义的查询，查询返回的行集可以包含零或多行，这些行称为活动集。游标将指向活动集中的当前行。<br />
<br />
显式游标操纵过程：声明、打开、从游标中获取记录、关闭。<br />
<blockquote>SET SERVEROUTPUT ON;<br />
DECLARE<br />
&nbsp; CURSOR cur IS<br />
&nbsp;&nbsp;&nbsp; SELECT * FROM books;<br />
&nbsp; myrecord books%ROWTYPE;<br />
BEGIN<br />
&nbsp; OPEN cur;<br />
&nbsp; LOOP<br />
&nbsp;&nbsp;&nbsp; FETCH cur INTO books;<br />
&nbsp;&nbsp;&nbsp; EXIT WHEN cur%NOTFOUND;<br />
&nbsp;&nbsp;&nbsp; DBMS_OUTPUT.PUT_LINE(books.id || ' ' || books.name);<br />
&nbsp; END LOOP;<br />
&nbsp; CLOSE cur;<br />
END;<br />
</blockquote><br />
1.1、带参数的显式游标：参数不需指定长度或者精度。<br />
1.2、FOR 循环游标：采用遍历方式，自动打开、提取和关闭游标。（能否利用 %ROWCOUNT 获得游标提取的行数？）<br />
<blockquote>DECLARE<br />
&nbsp; /* 定义带参数游标 */<br />
&nbsp; CURSOR cur_para(id varchar2) IS<br />
&nbsp; SELECT books_name FROM books WHERE books_id = id;<br />
BGEIN<br />
&nbsp; /* 调用带参数游标，并以 FOR 循环方式处理 */<br />
&nbsp; FOR cur IN cur_para('0001') LOOP<br />
&nbsp;&nbsp;&nbsp; DBMS_OUTPUT.PUT_LINE(cur.books_id || ' ' || cur.books_id);<br />
&nbsp; END LOOP;<br />
END;<br />
</blockquote>1.3、使用显示游标删除或更新记录<br />
定义时：需使用 SELECT ... FOR UPDATE 语句表示事物的锁定；<br />
执行时：需使用 WHERE CURRENT OF curXXX 子句指定游标的当前行。<br />
<br />
&nbsp; /* 定义部分 */<br />
&nbsp; CURSOR cur IS<br />
&nbsp; SELECT name FROM deptment FOR UPDATE;<br />
....<br />
&nbsp; /* 执行部分 */<br />
&nbsp; UPDATE deptment SET name=name || '_tt' WHERE CURRENT OF cur;<br />
<br />
<br />
<strong>2、隐式游标</strong><br />
不需声明，打开和关闭的游标。PL/SQL 为所有的 SQL 数据操纵语句隐式声明游标，它是不能直接命名和控制。<br />
<blockquote>BEGIN<br />
&nbsp; FROM cur IN (SELECT name FROM deptment) LOOP<br />
&nbsp;&nbsp;&nbsp; DBMS_OUTPUT.PUT_LINE(cur.books_id || ' ' || cur.books_id);<br />
&nbsp; END LOOP;<br />
END;<br />
</blockquote><br />
ps.<br />
匿名块：每次执行时都需要被编译，并且无法存储到数据库中，别的 PL/SQL 块也无法调用它。<br />
命名块：存储在数据库中，属于数据库对象。<br />
<br />
排错：SHOW ERRORS PROCEDURE/FUNCTION/PACKAGE obj_name;<br />
<br />
<br />
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="2" id="2"></a><strong><span style="font-size: 14pt;">二、存储过程</span></strong><br />
<blockquote>CREATE OR REPLACE PROCEDURE test (value IN varchar2, value2 OUT NUMBER)<br />
&nbsp; /* 参数，不需指定长度或精度 */<br />
IS<br />
&nbsp; /* 局部变量，省略 DECLARE 关键字，需有长度 */<br />
&nbsp; identity NUMBER;<br />
BEGIN<br />
&nbsp; SELECT ITEMRATE INTO identity<br />
&nbsp;&nbsp;&nbsp; FROM itemFile<br />
&nbsp;&nbsp;&nbsp; WHERE itemcode = value;<br />
&nbsp; IF identity &lt; 200 THEN<br />
&nbsp;&nbsp;&nbsp; value2 := 200;<br />
&nbsp; ELSE<br />
&nbsp;&nbsp;&nbsp; value2 :=50;<br />
&nbsp; END IF;<br />
END;<br />
</blockquote><br />
● 匿名块执行过程<br />
<blockquote>DECLARE<br />
&nbsp; tvalue2 NUMBER;<br />
BEGIN<br />
&nbsp; test('i202', tvalue2);<br />
&nbsp; DBMS_OUTPUT.PUT_LINE('value2的值为：' || TO_CHAR(value2));<br />
END;<br />
</blockquote>● 单独执行<br />
&nbsp;&nbsp;&nbsp; EXECUTE myproc('0001');<br />
<br />
<br />
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="3" id="3"></a><strong><span style="font-size: 14pt;">三、函数</span></strong><br />
&nbsp;&nbsp;&nbsp; 函数的主要特性是它必须返回一个值。创建函数时通过 RETURN 子句指定函数返回值的数据类型。<br />
函数的一些限制：<br />
&nbsp; ● 函数只能带有 IN 参数，不能带有 IN OUT 或 OUT 参数。<br />
&nbsp; ● 形式参数必须只使用数据库类型，不能使用 PL/SQL 类型。<br />
&nbsp; ● 函数的返回类型必须是数据库类型。<br />
<blockquote>CREATE OR REPLACE FUNCTION item_price_rage (price NUMBER)<br />
&nbsp;&nbsp; /* 参数、指定返回类型 */<br />
&nbsp; RETURN varchar2<br />
AS<br />
&nbsp;&nbsp; /* 定义局部变量 */<br />
&nbsp; min_price NUMBER;<br />
&nbsp; max_price NUMBER;<br />
BEGIN<br />
&nbsp; SELECT MAX(ITEMRATE), MIN(ITEMRATE) INTO max_price, min_price<br />
&nbsp;&nbsp;&nbsp; FROM itemfile;<br />
&nbsp; IF price &gt;= min_price AND price &lt;= max_price THEN<br />
&nbsp;&nbsp;&nbsp; RETURN '输入的单价介于最低价与最高价之间';<br />
&nbsp; ELSE<br />
&nbsp;&nbsp;&nbsp; RETURN '超出范围';<br />
&nbsp; END IF;<br />
END;<br />
</blockquote><br />
● 匿名块执行函数<br />
<blockquote>DECLARE<br />
&nbsp; p NUMBER := 300;<br />
&nbsp; MSG varchar2(200);<br />
BEGIN<br />
&nbsp; MSG := item_price_range(p);<br />
&nbsp; DBMS_OUTPUT.PUT_LINE(MSG);<br />
END;<br />
</blockquote>● SELECT查询调用（因为函数必须有返回值）<br />
&nbsp; &nbsp; SELECT myfunction FROM dual;<br />
<br />
<br />
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="30" id="30"></a><strong><span style="font-size: 14pt;">&nbsp;&nbsp;&nbsp; 过程与函数的异同</span></strong><br />
<strong>过程：</strong><br />
&nbsp;&nbsp;&nbsp; 作为 PL/SQL 语句执行；<br />
&nbsp;&nbsp;&nbsp; 在规范中不包含 RETURN 子句；<br />
&nbsp;&nbsp;&nbsp; 不返回任何值（只有输入/输出参数，结果集）；<br />
&nbsp;&nbsp;&nbsp; 可以包含 RETURN 语句，但是与函数不同，它不能用于返回值。<br />
<strong>函数：</strong><br />
&nbsp;&nbsp;&nbsp; 作为表达式的一部分调用；<br />
&nbsp;&nbsp;&nbsp; 必须在规范中包含 RETURN 子句；<br />
&nbsp;&nbsp;&nbsp; 必须返回单个值；<br />
&nbsp;&nbsp;&nbsp; 必须包含至少一条 RETURN 语句。<br />
<br />
<br />
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="4" id="4"></a><strong><span style="font-size: 14pt;">四、程序包</span></strong><br />
&nbsp;&nbsp;&nbsp; 程序包是一种数据库对象，它是对相关 PL/SQL 类型、子程序、游标、异常、变量和常量的封装。<br />
程序包规范：声明类型、变量、常量、异常、游标和子程序。<br />
程序包主体：用于实现在程序包规范中定义的游标、子程序。<br />
<br />
<br />
<strong>4.1、程序包规范</strong><br />
包含应用程序所需的程序包资源，是与应用程序的接口。<br />
<blockquote>CREATE OR REPLACE PACKAGE pack_me<br />
IS<br />
&nbsp; PROCEDURE order_proc (orno varchar2);<br />
&nbsp; FUNCTION order_fun (ornos varchar2) RETURN varchar2;<br />
END pack_me;<br />
</blockquote>*创建 pack_me 包，并声明了子程序 order_proc 和 order_fun，并交由程序包主体实现。<br />
<br />
<br />
<strong>4.2、程序包主体</strong><br />
当程序包规范中指定了子程序和游标时，必须有程序包主体。<br />
<blockquote>CREATE OR REPLACE PACKAGE BODY pack_me<br />
AS<br />
&nbsp; /* 实现定义的存储过程 */<br />
&nbsp; PROCEDURE order_proc (orno varchar2) <br />
&nbsp; IS<br />
&nbsp;&nbsp;&nbsp; stst CHAR(1);<br />
&nbsp; BEGIN<br />
&nbsp;&nbsp;&nbsp; SELECT ostatus INTO stat FROM order_master<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE orderno = orno;<br />
&nbsp;&nbsp;&nbsp; IF stat = 'p' THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBMS_OUTPUT.PUT_LINE('暂挂的订单');<br />
&nbsp;&nbsp;&nbsp; ELSE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBMS_OUTPUT.PUT_LINE('已完成的订单');<br />
&nbsp;&nbsp;&nbsp; END IF;<br />
&nbsp; END order_proc;<br />
&nbsp; /* 实现定义的函数 */<br />
&nbsp; FUNCTION order_fun(ornos varchar2) RETURN varchar2<br />
&nbsp; IS<br />
&nbsp;&nbsp;&nbsp; icode varchar2(5);<br />
&nbsp;&nbsp;&nbsp; ocode varchar2(5);<br />
&nbsp;&nbsp;&nbsp; qtyord NUMBER;<br />
&nbsp;&nbsp;&nbsp; qtydeld NUMBER;<br />
&nbsp; BEGIN<br />
&nbsp;&nbsp;&nbsp; SELECT qty_ord, qty_deld, itemcode, ordernc INTO qtyord, qtydeld, icode, ocode<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM order_detail<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE orderno = ornos;<br />
&nbsp;&nbsp;&nbsp; IF qtyord &lt; qtydeld THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN ocode;<br />
&nbsp;&nbsp;&nbsp; ELSE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN icode;<br />
&nbsp;&nbsp;&nbsp; END IF;<br />
&nbsp; END order_fun;<br />
END pack_me;<br />
</blockquote><br />
● 要执行 pack_me包中的 order_proc过程，输入<br />
&nbsp;&nbsp;&nbsp; EXECUTE pack_me.order_proc('o002');<br />
<br />
● 要执行包中预定义的函数<br />
<blockquote>DECLARE<br />
&nbsp; msg varchar2(10);<br />
BEGIN<br />
&nbsp; msg := pack_me.order_fun('o002');<br />
&nbsp; DBMS_OUTPUT.PUT_LINE('值是 ' || msg);<br />
END;<br />
</blockquote>&nbsp; <br />
<strong>4.3、程序包的优点</strong><br />
&nbsp;&nbsp;&nbsp; 程序包将相关的功能在逻辑上组织在一起，模块化，信息隐藏和更好的性能。<br />
ps.数据字典视图 USER_SOURCE 包含存储过程的代码文本。<br />
<br />
<br />
<strong>4.4、内置程序包</strong><br />
STANDARD 和 DBMS_STANDARD：定义和扩展 PL/SQL 语言环境<br />
DBMS_LOB：提供对 Oracle LOB 数据类型进行操作的功能<br />
DBMS_LOCK：用户定义的锁<br />
DBMS_OUTPUT：处理 PL/SQL 块和子程序输出调试信息<br />
DBMS_SESSION：提供 ALTER SESSION 命令的 PL/SQL 等效功能<br />
DBMS_ROWID：获得 ROWID 的详细信息<br />
DBMS_RANDOM：提供随机数生成器<br />
DBMS_SQL：允许用户使用动态 SQL，构造和执行任意 DML 或 DDL 语句<br />
DBMS_JOB：提交和管理在数据库中执行的定时任务<br />
DBMS_XMLDOM：用 DOM 模型读写 XML 类型的数据<br />
DBMS_XMLPARSER：XML 解析，处理 XML 文档内容和结构<br />
DBMS_XMLGEN：将 SQL 查询结果转换为规范的 XML 格式<br />
DBMS_XMLQUERY：提供将数据转换为 XML 类型的功能<br />
DBMS_XSLPROCESSOR：提供 XSLT 功能，转换 XML 文档<br />
UTL_FILE：用 PL/SQL 程序来读写操作系统文本文件<br />
<br />
<br />
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/236591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-25 21:08 <a href="http://www.blogjava.net/kiant/articles/236591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 笔记（七）、PL/SQL 基础</title><link>http://www.blogjava.net/kiant/articles/236268.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Thu, 23 Oct 2008 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/236268.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/236268.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/236268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/236268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/236268.html</trackback:ping><description><![CDATA[<br />
<a href="#1">一、概述、PL/SQL 块结构</a><br />
<a href="#2">
二、控制结构（分支、循环、控制）</a><br />
<a href="#3">三、异常</a><br />
<a href="#4">
四、复合变量（记录）</a><br />
<br />
<br />
<br />
<a name='1' id='1'></a><strong><span style="font-size: 14pt;">一、概述、PL/SQL 块结构</span></strong><br />
PL/SQL 是Oracle产品对 SQL 语言的扩展。PL/SQL 块共分为三个部分：声明部分、可执行部分、异常部分。<br />
<blockquote>DECLARE<br />
&nbsp;&nbsp;&nbsp; ...<br />
BEGIN<br />
&nbsp;&nbsp;&nbsp; ...<br />
EXCEPTION<br />
&nbsp;&nbsp;&nbsp; ...<br />
END;<br />
</blockquote>变量声明内容：赋予变量适当的名称、数据类型、定义变量（标准，记录）、控制变量范围。<br />
变量命名规则：变量以字符开头；可包含数字、下划线、$、#；长度范围 1～30；不区分大小写；不能使用系统关键字。<br />
<br />
ps.在 PL/SQL 常用的命令：<br />
1、打开输出开关&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SET SERVEROUTPUT ON ;<br />
2、利用系统包输出信息 &nbsp;&nbsp;&nbsp; DBMS_OUTPUT.PUT_LINE('x 的值是：' || x);<br />
<br />
<br />
<a name='2' id='2'></a><strong><span style="font-size: 14pt;">二、控制结构<br />
<br />
</span></strong><strong>1、分支语句<br />
</strong><strong>a、IF 分支</strong><br />
<blockquote>IF ... THEN <br />
&nbsp;&nbsp;&nbsp; ...<br />
ELSEIF ...THEN<br />
&nbsp;&nbsp;&nbsp; ...<br />
ELSE<br />
&nbsp;&nbsp;&nbsp; ...<br />
END IF;<br />
</blockquote><br />
<strong>b、CASE 分支</strong><br />
<blockquote>CASE <br />
&nbsp;&nbsp;&nbsp; WHEN ... THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; ELSE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
END CASE;<br />
</blockquote><br />
<strong>2、循环语句<br />
a、基本循环（LOOP）</strong><br />
无条件循环，为避免进入无限循环，LOOP 循环的语句必须使用 EXIT 或 EXIT WHEN 语句。<br />
<blockquote>LOOP<br />
&nbsp;&nbsp;&nbsp; ...<br />
END LOOP;<br />
</blockquote><br />
<strong>b、WHILE 循环</strong><br />
<blockquote>WHILE condition LOOP<br />
&nbsp;&nbsp;&nbsp; ...<br />
END LOOP;<br />
</blockquote><br />
<strong>c、FOR 循环</strong><br />
<blockquote>FOR counter IN [REVERSE] start..end <br />
LOOP<br />
&nbsp;&nbsp;&nbsp; ...<br />
END LOOP;<br />
</blockquote><br />
<strong>3、顺序控制</strong><br />
GOTO 语句：无条件的将控制权转到标签指定的语句。<br />
NULL 语句：什么也不做，只是将控制权转到下一条语句，用于语句结构需要，但什么也不需要操作的情况下。<br />
<blockquote>
GOTO xxxx;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&lt;&lt;xxxx&gt;&gt;<br />
NULL;<br />
</blockquote>
<br />
<br />
<a name='3' id='3'></a>
<strong><span style="font-size: 14pt;">三、异常</span></strong><br />
<strong>
系统异常（预定义异常）</strong><br />
<blockquote>
EXCEPTION <br />
&nbsp;&nbsp;&nbsp; WHEN xxxx THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<br />
</blockquote>
<br />
<strong>
自定义异常</strong><br />
<blockquote>
DECLARE<br />
&nbsp;&nbsp;&nbsp; -- 自定义异常<br />
&nbsp;&nbsp;&nbsp; xxxxx EXCEPTION;<br />
BEGIN<br />
&nbsp;&nbsp;&nbsp; -- 显式引发异常<br />
&nbsp;&nbsp;&nbsp; RAISE xxxxx<br />
EXCEPTION<br />
&nbsp;&nbsp;&nbsp; -- 异常处理<br />
&nbsp;&nbsp;&nbsp; WHEN xxxxx THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<br />
END;&nbsp; <br />
</blockquote>
<br />
<br />
<a name='4' id='4'></a>
<strong><span style="font-size: 14pt;">四、复合变量（记录）</span></strong><br />
记录是由几个相关值构成的复合变量，常用于支持 SELECT 语句的返回值。使用记录可以将一行数据并到一个单元进行处理，而不必将每一列单独处理。<br />
<blockquote>DECLARE<br />
&nbsp;&nbsp;&nbsp; TYPE myrecord IS RECORD(id varchar2(10), name varchar2(10));<br />
&nbsp;&nbsp;&nbsp; real_record myrecord;<br />
BEGIN<br />
&nbsp;&nbsp;&nbsp; -- SELECT .. INTO 赋值语句<br />
&nbsp;&nbsp;&nbsp; SELECT emp_id, emp_name INTO real_record FROM emp WHERE emp_id='001';<br />
&nbsp;&nbsp;&nbsp; .....<br />
END;<br />
</blockquote>
<br />
或者 可以利用属性类型来引用变量或者数据库中某列的数据类型。<br />
<br />
&nbsp; ● 声明变量 icode，<strong>引用表中某列</strong> emp.id 的数据类型<br />
&nbsp;&nbsp;&nbsp; icode emp.id%TYPE;<br />
<br />
&nbsp; ● 声明变量 emp_rec <strong>引用表</strong> emp 中所有列记录类型<br />
&nbsp;&nbsp;&nbsp; emp_rec emp%ROWTYPE;<br />
<br />
<br />
<br />
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/236268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-23 22:12 <a href="http://www.blogjava.net/kiant/articles/236268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 笔记（五）、表空间管理</title><link>http://www.blogjava.net/kiant/articles/235277.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sun, 19 Oct 2008 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/235277.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/235277.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/235277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/235277.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/235277.html</trackback:ping><description><![CDATA[<br />
<br />
<strong><span style="font-size: 14pt;">1、创建和设置表空间<br />
<br />
</span></strong>
CREATE TABLESPACE mydb2<br />
&nbsp; DATAFILE 'D:\oracle\product\10.2.0\oradata\test\MYDB4.DBF'<br />
&nbsp; SIZE 30M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED,<br />
&nbsp; 'D:\oracle\product\10.2.0\oradata\test\MYDB5.DBF'<br />
&nbsp; SIZE 20M AUTOEXTEND ON NEXT 5 MAXSIZE 100M;<br />
<br />
ALTER DATABASE DATAFILE 'D:\oracle\product\10.2.0\oradata\test\MYDB4.DBF' RESIZE 40M;<br />
<br />
ALTER DATABASE DATAFILE 'D:\oracle\product\10.2.0\oradata\test\MYDB5.DBF'<br />
&nbsp; AUTOEXTEND ON NEXT 10M <br />
&nbsp; MAXSIZE UNLIMITED;<br />
<br />
ps.<br />
如果文件不存在，则 DATAFILE 需要 SIZE；如果文件存在，则 DATAFILE 需要指定 REUSE 关键字。<br />
<br />
<br />
<br />
<strong><span style="font-size: 14pt;">2、更改用户默认表空间，并授权<br />
<br />
</span></strong>
ALTER USER kiant DEFAULT TABLESPACE mydb2;<br />
<br />
SELECT USERNAME, DEFAULT_TABLESPACE FROM dba_users;<br />
<br />
GRANT UNLIMITED TABLESPACE, DBA TO kiant;<br />
<br />
<br />
<br />
<span style="font-size: 14pt;"><strong><span style="font-size: 14pt;">
3、创建表并插入测试数据<br />
<br />
</span></strong></span>
CREATE TABLE k7 (a1 VARCHAR2(255));<br />
<br />
SELECT * FROM dba_tables WHERE table_name= 'K7';<br />
<br />
INSERT INTO&nbsp; k7 SELECT sys_guid() FROM dual CONNECT BY LEVEL &lt;=10000;<br />
<br />
COMMIT;<br />
<br />
SELECT * FROM k7 WHERE ROWNUM&lt;=5;<br />
<br />
<br />
<br />
<strong><span style="font-size: 14pt;">
4.1、用户级数据导入导出<br />
<br />
</span></strong>
ALTER TABLESPACE mydb2 READ ONLY;<br />
ho $ exp userid=kiant/love2you@test file=d:\123.dmp;<br />
<br />
ALTER TABLESPACE mydb2 READ WRITE;<br />
ho $ imp userid=kiant/love2you@test file=d:\123.dmp full=y ignore=y rows=n;<br />
ho $ imp userid=kiant/love2you@test file=d:\123.dmp full=y ignore=y rows=y buffer=64000;<br />
<br />
ps.<br />
导入时应优先导入所有数据库结构 rows=n；然后才导入结构和数据 rows=y。<br />
<br />
<br />
<strong><span style="font-size: 14pt;">
4.2、表空间数据导入导出<br />
<br />
</span></strong>
ALTER TABLESPACE mydb2 READ ONLY;<br />
ho $ exp userid=kiant/love2you@test file=d:\124.dmp tablespaces=mydb2;<br />
<br />
ho $ imp userid=kiant/love2you@test file=d:\124.dmp tablespaces=mydb2 full=y ignore=y rows=n;<br />
ho $ imp userid=kiant/love2you@test file=d:\124.dmp tablespaces=mydb2 full=y ignore=y rows=y buffer=64000;<br />
<br />
<br />
<strong><span style="font-size: 14pt;">
4.3、表空间迁移<br />
<br />
</span></strong>
ALTER TABLESPACE mydb2 READ ONLY;<br />
ho $ exp userid='sys/love2you as sysdba' file=d:\mydb2.dmp tablespaces=mydb2 transport_tablespace=y;<br />
<br />
DROP TABLESPACE mydb2 INCLUDING CONTENTS;<br />
ho $ imp userid='sys/love2you as sysdba' file=d:\mydb2.dmp tablespaces=mydb2 transport_tablespace=y<br />
&nbsp; datafiles=D:\oracle\product\10.2.0\oradata\test\MYDB4.DBF, D:\oracle\product\10.2.0\oradata\test\MYDB5.DBF;<br />
<br />
ps.<br />
a.必须以 'sysdba' 身份连接，才能进行时间点恢复或可传输的表空间导入。<br />
b.搬移表空间时，源表空间中存放的所有数据对象的所有者在目标数据库中必须存在，如果不存在，则应在导入表空间之前建立相应的用户，然后再导入表空间。<br />
<br />
<br />
<br />
参考文件：<br />
<a target="_blank" href="http://database.ctocio.com.cn/tips/200/8106700.shtml">
数据库迁移几种方式</a><br />
<a target="_blank" href="http://bbs.txwm.com/dispbbs.asp?BoardID=225&amp;ID=772317">
[推荐]移动Oracle的表空间</a><br />
<a target="_blank" href="http://www.diybl.com/course/7_databases/oracle/oraclejs/2008819/136406.html">
使用Oracle 的 imp ,exp 命令实现数据的导入导出</a><br />
<a target="_blank" href="http://www.knowsky.com/395830.html">
Oracle利用传输表空间导出导入数据的步骤</a><br />
<br />
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/235277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-19 11:09 <a href="http://www.blogjava.net/kiant/articles/235277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 笔记（四）、SQL 几个要点</title><link>http://www.blogjava.net/kiant/articles/234781.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Thu, 16 Oct 2008 15:34:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/234781.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/234781.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/234781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/234781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/234781.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 附录：1、SQL 简介2、SQL 操作符3、Oracle 常用数据类型4、Oracle 函数5、[转] Oracle 常用SQL语法字符串函数LENGTH()&nbsp;&nbsp;&nbsp; 字符长度LENTTHB()&nbsp;&nbsp;&nbsp; 字节长度；一个汉字内存中占用 2字节LTRIM、RTRIM、TRIM截串SU...&nbsp;&nbsp;<a href='http://www.blogjava.net/kiant/articles/234781.html'>阅读全文</a><img src ="http://www.blogjava.net/kiant/aggbug/234781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-16 23:34 <a href="http://www.blogjava.net/kiant/articles/234781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 笔记（三）、SQL*PLUS 相关</title><link>http://www.blogjava.net/kiant/articles/234324.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Tue, 14 Oct 2008 15:43:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/234324.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/234324.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/234324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/234324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/234324.html</trackback:ping><description><![CDATA[<br />
<br />
<strong>1、帐户登录</strong><br />
C:\&gt; sqlplus "sys/love2you as sysdba"<br />
<br />
C:\&gt; sqlplus /nolog<br />
SQL&gt; CONNECT sys/love2you as sysdba<br />
<br />
<br />
<strong>2、启动关闭实例</strong><br />
<br />
&nbsp; ● SQL&gt; startup<br />
&nbsp; 启动实例、打开控制文件、打开数据文件<br />
<br />
&nbsp; ● SQL&gt; startup mount<br />
&nbsp; 启动实例、打开控制文件&nbsp; <br />
<br />
&nbsp; ● SQL&gt; startup nomount<br />
&nbsp; 启动实例<br />
<br />
&nbsp; ● SQL&gt; shutdown immediate<br />
&nbsp; 迫使所有用户执行完当前的 SQL 语句后断开连接，并关闭服务器。<br />
<br />
&nbsp; ● SQL&gt; shutdown <br />
&nbsp; 等待所有用户断开连接后关闭服务器。<br />
<br />
<br />
<br />
<strong>3、SQL*PLUS 执行计划</strong><br />
&nbsp;&nbsp;&nbsp; Oracle 以替代变量方式只安排一个查询计划，提高语句执行效率。<br />
<br />
SQL&gt; SELECT * FROM dept WHERE deptno = &amp;tt<br />
Enter value for tt:10<br />
....<br />
<br />
SQL&gt; SELECT * FROM dept WHERE deptno = &amp;tt<br />
Enter value for tt:20<br />
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/234324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-14 23:43 <a href="http://www.blogjava.net/kiant/articles/234324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 笔记（二）、安全管理</title><link>http://www.blogjava.net/kiant/articles/234102.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Mon, 13 Oct 2008 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/234102.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/234102.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/234102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/234102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/234102.html</trackback:ping><description><![CDATA[<a href="#1"></a><br />
<br />
<a href="#1">
一、创建用户</a><br />
<a href="#2">
二、用户授权</a><br />
<a href="#3">
三、角色机制</a><br />
<a href="#4">
四、配置模版及资源限制</a><br />
<a href="#0">
附录</a><br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 数据库安全的作用是控制用户是否能够对数据库及其中的对象执行操作。要连接到 Oracle 数据库，就需要创建一个用户帐户，该用户可以根据需要授予不同的操作权限。<br />
<br />
<br />
<a name='1' id='1'></a><strong><span style="font-size: 14pt;">
一、创建用户</span></strong>&nbsp;&nbsp;&nbsp; CREATE/ALTER/DROP USER xxxx&nbsp;&nbsp;&nbsp; [<a target="_blank" href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_8003.htm#i2065278">帮助文档</a>]<br />
<br />
CREATE USER prod4<br />
&nbsp; IDENTIFIED BY ssss<br />
&nbsp; DEFAULT TABLESPACE users<br />
&nbsp; TEMPORARY TABLESPACE temp;<br />
<br />
&nbsp;&nbsp;&nbsp; 删除一个用户时，会删除该用户所拥有的模式对象。DROP USER prod4 CASCADE;<br />
<br />
<br />
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="2" id="2"></a><strong><span style="font-size: 14pt;">
二、用户授权</span></strong>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GRANT/REVOKE&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [<a target="_blank" href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_9013.htm#i2155015">帮助文档</a>]<br />
&nbsp;&nbsp;&nbsp; 权限（privilege）即执行特定类型 SQL 语句的权利，若无任何权限，新创建用户将无法登陆 Oracle 数据库。<br />
<br />
<strong>
1、系统权限</strong><br />
&nbsp;&nbsp;&nbsp; 系统权限（system privilege）允许用户执行某些数据库操作。<br />
<br />
&nbsp;&nbsp;&nbsp; GRANT CONNECT,RESOURCE,DBA TO prod4<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [WITH ADMIN OPTION];<br />
<br />
&nbsp;&nbsp;&nbsp; CONNECT,RESOURCE,DBA 三个预定义的角色封装了大部分系统权限；<br />
&nbsp;&nbsp;&nbsp; WITH ADMIN OPTION 选项使 被授权的用户 也可以把该权限赋予其他用户。（级联授权，A-&gt;B、B-&gt;C） <br />
<br />
ps.更多的系统权限，请参考帮助文档 GRANT - Table 18-1 System Privileges。<br />
<br />
<br />
<strong>
2、模式对象权限</strong><br />
&nbsp;&nbsp;&nbsp; 模式对象权限（schema object privilege）允许用户对某一特定对象执行特定操作。要授予对象权限，用户必须满足以下条件之一：<br />
&nbsp;&nbsp;&nbsp; ● 用户拥有指定对象；<br />
&nbsp;&nbsp;&nbsp; ● 或者用户已经拥有 GRANT OPTION （级联授权）的能力。<br />
<br />
sys:<br />
&nbsp;&nbsp;&nbsp; GRANT SELECT ON sys.test TO prod<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [WITH GRANT OPTION];<br />
prod:<br />
&nbsp;&nbsp;&nbsp; SELECT * FROM sys.test;<br />
<br />
ps.更多的模式对象权限，请参考帮助文档 GRANT - Table 18-3 Object Privileges Available for Particular Objects。<br />
<br />
<br />
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="3" id="3"></a><strong><span style="font-size: 14pt;">
三、角色机制</span></strong>&nbsp;&nbsp;&nbsp; CREATE/ALTER/DROP ROLE xxx&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [<a target="_blank" href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6012.htm#i2066772">帮助文档</a>]<br />
&nbsp;&nbsp;&nbsp; 角色（role）类似于操作系统中的用户组，它封装了多个权限。用户可以通过角色继承权限，从而简化权限的管理与控制。推荐使用基于角色授权，通过角色控制用户。<br />
<br />
&nbsp;&nbsp;&nbsp; 角色的使用注意：<br />
&nbsp;&nbsp;&nbsp; ● 角色不属于任何模式（schema）。因此，创建角色的用户可以被移除而不会对角色有所影响。<br />
&nbsp;&nbsp;&nbsp; ● 角色可以被授予其他角色。但是角色不能授予其自身，角色间也不能形成闭环。例如，当角色 B 已经被授予角色 A 时，角色 A 就不能再授予角色 B。 <br />
<br />
&nbsp;&nbsp;&nbsp; -- 创建角色 myrole 并赋予权限，然后将该角色赋予用户 prod（继承该角色） --<br />
&nbsp;&nbsp;&nbsp; CREATE ROLE myrole;<br />
&nbsp;&nbsp;&nbsp; GRANT SELECT ON sys.test TO myrole;<br />
&nbsp;&nbsp;&nbsp; GRANT SELECT ON sys.test4 TO myrole;<br />
&nbsp;&nbsp;&nbsp; GRANT myrole TO prod;<br />
<br />
<br />
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="4" id="4"></a><strong><span style="font-size: 14pt;">四、配置模版及资源限制</span></strong>&nbsp;&nbsp;&nbsp; CREATE/ALTER/DROP PROFILE xxx<br />
&nbsp;&nbsp;&nbsp; 每个用户都对应一套配置模版（profile），其中描述了用户使用多种系统资源时的限制，具体包括： <br />
<br />
&nbsp;&nbsp;&nbsp; ● 用户能够建立的并发会话（concurrent session）数 <br />
&nbsp;&nbsp;&nbsp; ● 用户会话及 SQL 语句对 Oracle 进行一次调用时可用的 CPU 处理时间 <br />
&nbsp;&nbsp;&nbsp; ● 用户会话及 SQL 语句对 Oracle 进行一次调用时可用的逻辑 I/O（logical I/O）量 <br />
&nbsp;&nbsp;&nbsp; ● 用户会话的最大空闲时间（idle time） <br />
&nbsp;&nbsp;&nbsp; ● 用户会话的最大连接时间（connect time） <br />
&nbsp;&nbsp;&nbsp; ● 密码限制规则：  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多次尝试登录均失败时对帐户加锁 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 密码过期时间（expiration period）及宽限期（grace period） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 密码重用（reuse）及复杂度（complexity）限制规则 <br />
<br />
<br />
<br />
<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="0" id="0"></a><strong><span style="font-size: 14pt;">附录</span></strong><br />
1、模式（schema）：模式是指用户与其拥有对象的逻辑集合。<br />
<br />
2、[转] <a target="_blank" href="http://hi.baidu.com/lincongsky/blog/item/56b50e1627263b57f2de32f6.html">Oracle 查看用户权限</a><br />
<blockquote>ORACLE中数据字典视图分为3大类，用前缀区别，分别为：USER，ALL 和 DBA，许多数据字典视图包含相似的信息。<br />
<br />
&nbsp;&nbsp;&nbsp; ● USER_*:有关用户所拥有的对象信息，即用户自己创建的对象信息<br />
&nbsp;&nbsp;&nbsp; ● ALL_*：有关用户可以访问的对象的信息，即用户自己创建的对象的信息加上其他用户创建的对象但该用户有权访问的信息<br />
&nbsp;&nbsp;&nbsp; ● DBA_*：有关整个数据库中对象的信息<br />
<br />
（这里的*可以为TABLES， INDEXES， OBJECTS， USERS等）<br />
<br />
1.查看所有用户：<br />
select * from dba_user;<br />
select * from all_users;<br />
select * from user_users;<br />
<br />
2.查看用户系统权限：<br />
select * from dba_sys_privs;<br />
select * from all_sys_privs;<br />
select * from user_sys_privs;<br />
<br />
3.查看用户对象权限：<br />
select * from dba_tab_privs;<br />
select * from all_tab_privs;<br />
select * from user_tab_privs;<br />
<br />
4.查看所有角色：<br />
select * from dba_roles;<br />
<br />
5.查看用户所拥有的角色：<br />
select * from dba_role_privs;<br />
select * from user_role_privs;<br />
<br />
6.查看当前用户的缺省表空间<br />
select username,default_tablespace from user_users;<br />
<br />
7.查看某个角色的具体权限，如grant connect,resource,create session,create view to TEST;<br />
&nbsp; 查看RESOURCE具有那些权限，用SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='RESOURCE';<br />
<br />
</blockquote><br />
3、[转] <a target="_blank" href="http://edu.itbulo.com/200509/52776_4.htm">对象权限</a><br />
<br />
<table border="1" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td align="center" width="13%">模式对象/权限</td>
            <td align="center" width="7%">ALTER</td>
            <td align="center" width="8%">DELETE</td>
            <td align="center" width="10%">EXECUTE</td>
            <td align="center" width="7%">INDEX</td>
            <td align="center" width="8%">INSERT</td>
            <td align="center" width="7%">READ </td>
            <td align="center" width="10%">REFERENCE</td>
            <td align="center" width="12%">SELECT </td>
            <td align="center" width="18%">UPDATE</td>
        </tr>
        <tr>
            <td width="13%">&nbsp;Directory</td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="10%">&nbsp;</td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="7%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="10%">&nbsp;</td>
            <td width="12%">&nbsp;</td>
            <td width="18%">&nbsp;</td>
        </tr>
        <tr>
            <td width="13%">&nbsp;function</td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="10%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="7%">&nbsp;</td>
            <td width="10%">&nbsp;</td>
            <td width="12%">&nbsp;</td>
            <td width="18%">&nbsp;</td>
        </tr>
        <tr>
            <td width="13%">&nbsp;procedure</td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="10%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="7%">&nbsp;</td>
            <td width="10%">&nbsp;</td>
            <td width="12%">&nbsp;</td>
            <td width="18%">&nbsp;</td>
        </tr>
        <tr>
            <td width="13%">&nbsp;package</td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="10%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="7%">&nbsp;</td>
            <td width="10%">&nbsp;</td>
            <td width="12%">&nbsp;</td>
            <td width="18%">&nbsp;</td>
        </tr>
        <tr>
            <td width="13%">&nbsp;DB Object</td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="10%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="7%">&nbsp;</td>
            <td width="10%">&nbsp;</td>
            <td width="12%">&nbsp;</td>
            <td width="18%">&nbsp;</td>
        </tr>
        <tr>
            <td width="13%">&nbsp;Libary </td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="10%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="7%">&nbsp;</td>
            <td width="10%">&nbsp;</td>
            <td width="12%">&nbsp;</td>
            <td width="18%">&nbsp;</td>
        </tr>
        <tr>
            <td width="13%">&nbsp;Operation </td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="10%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="7%">&nbsp;</td>
            <td width="10%">&nbsp;</td>
            <td width="12%">&nbsp;</td>
            <td width="18%">&nbsp;</td>
        </tr>
        <tr>
            <td width="13%">&nbsp;Sequence</td>
            <td width="7%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="8%">&nbsp;</td>
            <td width="10%">&nbsp;</td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="7%">&nbsp;</td>
            <td width="10%">&nbsp;</td>
            <td width="12%">&nbsp;</td>
            <td width="18%">&nbsp;</td>
        </tr>
        <tr>
            <td width="13%">&nbsp;Table </td>
            <td width="7%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="8%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="10%">&nbsp;</td>
            <td width="7%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="8%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="7%">&nbsp;</td>
            <td width="10%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&#8730;</span></span></span></span></span></td>
            <td width="12%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="18%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
        </tr>
        <tr>
            <td width="13%">&nbsp;Type</td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="10%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="7%">&nbsp;</td>
            <td width="8%">&nbsp;</td>
            <td width="7%">&nbsp;</td>
            <td width="10%">&nbsp;</td>
            <td width="12%">&nbsp;</td>
            <td width="18%">&nbsp;</td>
        </tr>
        <tr>
            <td width="13%">&nbsp;View </td>
            <td width="7%">&nbsp;</td>
            <td width="8%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="10%">&nbsp;</td>
            <td width="7%">&nbsp;</td>
            <td width="8%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="7%">&nbsp;</td>
            <td width="10%">&nbsp;</td>
            <td width="12%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
            <td width="18%"><span style="color: #20ff00;"><span style="color: red;"><span style="color: #20ff00;"><span style="color: #25962c;"><span style="color: #25962c;">&nbsp;&#8730;</span></span></span></span></span></td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;&nbsp;&nbsp; 对象由不止一个权限，特殊权限ALL可以被授予或撤销。如TABLE的ALL权限就包括：<br />
&nbsp;&nbsp;&nbsp; SELECT,INSERT,UPDATE和DELETE,还有INDEX,ALTER,和REFERENCE。<br />
<br />
<br />
4、[转] <a target="_blank" href="http://www.3800hk.com/Article/sjk/Oracle/jcjcora/2005-08-06/Article_41929.html">Oracle 9i预定义的角色</a><br />
<br />
<table border="1" cellpadding="0" cellspacing="" height="296" width="1072">
    <tbody>
        <tr>
            <td align="center">&nbsp;角色名称</td>
            <td align="center">&nbsp;说明</td>
        </tr>
        <tr>
            <td>&nbsp;CONNECT <br />
            </td>
            <td>&nbsp;数据库连接角色，用于连接数据库，具有创建簇、数据库链接、序列、同义词、表和视图，以及修改会话的权利 <br />
            </td>
        </tr>
        <tr>
            <td>&nbsp;DBA <br />
            </td>
            <td>&nbsp;数据库管理员角色，具有所有使用ADMIN选项创建的系统权限，可以将系统权限授予其他用户或角色 <br />
            </td>
        </tr>
        <tr>
            <td>&nbsp;DELETE_CATALOG_ROLE <br />
            </td>
            <td>&nbsp;删除目录角色，可以删除或重建数据字典 <br />
            </td>
        </tr>
        <tr>
            <td valign="top">&nbsp;EXECUTE_CATALOG_ROLE <br />
            </td>
            <td valign="top">&nbsp;执行目录角色，能够执行所有系统包 <br />
            </td>
        </tr>
        <tr>
            <td valign="top">&nbsp;EXP_FULL_DATABASE <br />
            </td>
            <td valign="top">&nbsp;能够使用导出程序执行数据库的完全和增量导出 <br />
            </td>
        </tr>
        <tr>
            <td valign="top">&nbsp;IMP_FULL_DATABASE <br />
            </td>
            <td valign="top">&nbsp;能够使用导入程序执行数据库的完全导入 <br />
            </td>
        </tr>
        <tr>
            <td valign="top">&nbsp;RESOURCE <br />
            </td>
            <td valign="top">&nbsp;可以创建簇、表、序列以及PL/SQL编程用方案对象，包括过程、程序包、触发器等 <br />
            </td>
        </tr>
        <tr>
            <td valign="top">&nbsp;SELECT_CATALOG_ROLE <br />
            </td>
            <td valign="top">&nbsp;查询数据字典表或视图 <br />
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
参考文章：<br />
<a target="_blank" href="http://www.zw1840.com/oracle/translation/concepts/html/20.Database%20Security.htm">Oracle Concepts 中文版 (10g R2) -- 第 20 章，数据库安全</a><br />
<br />
<br />
<blockquote>
</blockquote>
 <img src ="http://www.blogjava.net/kiant/aggbug/234102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-13 20:03 <a href="http://www.blogjava.net/kiant/articles/234102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 10g 与 SQL Server 2005 的数据类型</title><link>http://www.blogjava.net/kiant/articles/233923.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sun, 12 Oct 2008 16:29:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/233923.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/233923.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/233923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/233923.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/233923.html</trackback:ping><description><![CDATA[<br />
<br />
<a target="_blank" href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements001.htm#SQLRF0021">Oracle 10g 数据类型</a><br />
<a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/ms187752(SQL.90).aspx">SQL Server 2005 的数据类型</a><br />
<br />
<br />
附录：<br />
<strong>
1、关于 NUMBER(p,s)</strong>
，能表示的有效值为  1.0 x 10<sup>-130</sup> to (but not including) 1.0 x 10<sup>126</sup>。<br />
&nbsp;&nbsp;&nbsp; p：精度值，指有效位数，从左边第一个不为0的数算起，小数点和负号不计入有效位数。取值范围为 0 ～ 38 。<br />
&nbsp;&nbsp;&nbsp; s：标度值，小数点右边最小有效数字位数。取值范围为 -84 ～ 127 。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ● s&gt;0：精确到小数点右边 s 位，并四舍五入。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ● s&lt;0：精确到小数点左边 s 位，并四舍五入。<br />
例如：<br />
&nbsp;&nbsp;&nbsp; NUMBER(5,3)可以存储的数字形式为：pp.sss。<br />
<br />
ps.<br />
&nbsp;&nbsp;&nbsp; Scale can be greater than precision, most commonly when e notation is used. When scale is greater than precision, the precision specifies the maximum number of significant digits to the right of the decimal point. For example, a column defined as NUMBER(4,5) requires a zero for the first digit after the decimal point and rounds all values past the fifth digit after the decimal point.<br />
&nbsp;&nbsp;&nbsp; 当 s &gt; p 时，例如 NUMBER(4,5) ，必须数值为 0.0xxxx 的数字（小数点后 s-p 位加0）。<br />
<br />
示例：<br />
<table border="0" cellpadding="2" cellspacing="2" height="168" width="713">
    <tbody>
        <tr>
            <td>&nbsp;定义格式</td>
            <td>&nbsp;输入数值</td>
            <td>&nbsp;存储状态</td>
        </tr>
        <tr>
            <td>&nbsp;NUMBER</td>
            <td>&nbsp;123.89</td>
            <td>&nbsp;123.89</td>
        </tr>
        <tr>
            <td>&nbsp;NUMBER(5)</td>
            <td>&nbsp;123.89</td>
            <td>&nbsp;124</td>
        </tr>
        <tr>
            <td>&nbsp;NUMBER(5,0)</td>
            <td>&nbsp;123456</td>
            <td>&nbsp;ORA-01438: 值大于为此列指定的允许精度</td>
        </tr>
        <tr align="left" valign="middle">
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr align="left" valign="middle">
            <td>&nbsp;NUMBER(6,2)</td>
            <td>&nbsp;123.89</td>
            <td>&nbsp;123.89</td>
        </tr>
        <tr align="left" valign="middle">
            <td>&nbsp;</td>
            <td>&nbsp;123.8951</td>
            <td>&nbsp;123.9</td>
        </tr>
        <tr align="left" valign="middle">
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr align="left" valign="middle">
            <td>&nbsp;NUMBER(2,5)</td>
            <td>&nbsp;0.000811</td>
            <td>&nbsp;0.00081</td>
        </tr>
        <tr>
            <td valign="top"><br />
            </td>
            <td valign="top">123.89</td>
            <td valign="top">ORA-01438: 值大于为此列指定的允许精度</td>
        </tr>
        <tr>
            <td valign="top"><br />
            </td>
            <td valign="top">1.2e-4</td>
            <td valign="top">0.00012</td>
        </tr>
    </tbody>
</table>
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/233923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-13 00:29 <a href="http://www.blogjava.net/kiant/articles/233923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 笔记（一）、安装及体系结构</title><link>http://www.blogjava.net/kiant/articles/232784.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Mon, 06 Oct 2008 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/232784.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/232784.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/232784.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/232784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/232784.html</trackback:ping><description><![CDATA[<br />
<br />
一、安装<br />
安装过程中的几个关键点：全局数据库名、系统标识符（SID，实例名）、服务器参数文件（SPFILEXXX(实例名).ORA）。<br />
监听器的配置： server\NETWORK\ADMIN 文件夹下的参数文件（listener.ora，tnsnames.ora）。<br />
<br />
<br />
二、Oracle 体系结构<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/2008.10.06/0101.gif" border="0" /><br />
<strong>1、实例</strong><br />
实例是后台进程和内存结构的集合，必须启动实例才能访问数据库中的数据，一个实例只能打开并使用一个数据库。<br />
实例启动时，将分配一个系统全局区（SGA）并启动一系列的后台进程，每个后台进程执行不同的任务。<br />
<br />
<br />
<strong>2、数据库</strong><br />
Oracle 数据库物理上指一组操作系统文件（数据文件），逻辑上指数据库创建后的逻辑关系。<br />
<br />
<br />
<strong>3、会话</strong><br />
会话时用户与 Oracle 服务器的单个连接，建立连接时创建，断开连接时关闭。<br />
当一个数据库用户同时对服务器产生多个连接时，则为该用户创建多个并行会话。<br />
<br />
<br />
<strong>4、内存</strong><br />
Oracle 内存结构包含以下两个内存区：<br />
&nbsp; 系统全局区（SGA）：实例启动时分配该内存区。<br />
&nbsp; 程序全局区（PGA）：服务器进程启动时分配该内存区。<br />
<br />
A、系统全局区（SGA，System Global Area 共享全局区）<br />
用来存储数据库信息，并由服务器进程共享。<br />
按作用可分为：<br />
<br />
&nbsp;&nbsp; ● 共享池（Shared Pool）【操作共享】<br />
共享池包括 库缓存区（Shared SQL &amp; PL/SQL） 和 数据字典缓存。<br />
a.库缓存区：包括最近执行的 SQL 解释版本，PL/SQL 过程、函数等程序单元的编译版本，方便用户共享调用，节省开销及提高进程速度。<br />
b.数据字典缓存：把频繁用到的数据字典（表，列，索引、权限等信息）存储到内存中，能减少 SQL语句引起的性能上冲突。<br />
<br />
&nbsp;&nbsp; ● 数据缓冲区（Data Buffer Cache）【记录共享】<br />
主要作用是将需要读取或者存取的数据块进行一个缓冲，从而减少太过频繁的对磁盘进行读和写的操作。所有同时上线的用户都可以共享这个区域。进程在处理一个查询时，优先查找内存中是否有所需的数据块，提高了读取速度。<br />
<br />
&nbsp;&nbsp; ● 日志缓冲区（Redo Log Buffer）<br />
该区域是将所有记录数据操作的信息都存储在该缓冲中，在适当的时机由LGWR进程将他们写入到磁盘的日志文件中。<br />
<br />
&nbsp;&nbsp; ● 大共享区（Large Pool）<br />
Oracle 可选特征，主要用于多线程。<br />
<br />
B、程序全局区（Program Global Area）<br />
PGA是数据库服务器内存中为单个用户进程分配的专用的内存区域，是用户进程私有的，不能共享。<br />
它由用户连接到数据库并创建一个会话时自动分配，当会话结束后自动释放。<br />
<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/2008.10.06/0102.gif" border="0" height="371" width="409" /><br />
<strong>5、进程</strong><br />
用户进程：数据库用户请求连接 Oracle 服务器时启动。<br />
服务器进程：用户建立会话连接时启用，处理一个或多个用户进程请求。<br />
后台进程：Oracle 实例启动时启动，提高系统效能和协调多用户。<br />
&nbsp;&nbsp;&nbsp; 数据写进程（DBWR）：负责将块缓冲区的数据写入到磁盘中的数据文件里。<br />
&nbsp;&nbsp;&nbsp; 日志写进程（LGWR）：将重做日志缓冲区的信息写入到重做日志文件中。<br />
&nbsp;&nbsp;&nbsp; 系统监控（SMON）：如果数据库遇到不正常关闭的情况，比如突然断电等。那么再次启动数据库时SMON进程进行必要的 数据修复操作。<br />
&nbsp;&nbsp;&nbsp; 进程监控（PMON）：负责在一个Oracle进程失败时清理资源，用于恢复失败的用户进程。<br />
&nbsp;&nbsp;&nbsp; 检查点进程（CKPT）：负责在每当缓冲区中的更改永久地纪录在数据库中时，更新控制文件和数据文件中的数据库状态信息，确保数据库的同步。<br />
&nbsp;&nbsp;&nbsp; 归档进程（ARCH）：在每次日志切换时把已满的日志组进行备份归档，有归档方式和非归档方式（默认）。<br />
<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/2008.10.06/0103.jpg" border="0" height="312" width="548" /><br />
<strong>6、数据库逻辑结构</strong><br />
数据库、表空间（tablespace）、段（segment）、区（extent）、数据块（block）<br />
<br />
<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/2008.10.06/0104.jpg" border="0" height="177" width="549" /><br />
<strong>7、数据库物理结构</strong><br />
&nbsp;&nbsp;&nbsp; 数据文件：用于存放所有的数据（*.DBF），每个数据库有一组数据文件，一个数据文件只能对应一个数据库。<br />
&nbsp;&nbsp;&nbsp; 日志文件：记录了对数据库进行的所有操作（*.LOG），主要用于数据库故障时恢复。 <br />
&nbsp;&nbsp;&nbsp; 控制文件：记录了数据库所有文件的控制信息（*.CTL）。 <br />
<br />
语法查看：<br />
C:\&gt; sqlplus "sys/test1234 as sysdba"<br />
<br />
SQL&gt; DESC v$controlfile<br />
SQL&gt; SELECT status,name FROM v$controlfile<br />
<br />
SQL&gt; DESC v$datafile<br />
SQL&gt; SELECT file#,status,name FROM v$datafile<br />
<br />
SQL&gt; DESC v$logfile<br />
SQL&gt; SELECT member FROM v$controlfile<br />
<br />
<br />
<br />
ps.内容参考：<br />
Oracle.10G.数据库系统教程.中科院培训老师讲授<br />
Oracle学习笔记二，Oracle体系结构&nbsp; <a href="http://www.lurenjia.net/article.asp?id=189" target="_blank">http://www.lurenjia.net/article.asp?id=189</a><br />
Oracle 9i数据库服务器的体系结构 <a href="http://www.it-waibao.com/IToutsourcing/support/database/Oracle/catalogTreeID100_folderID520_infoID10452.html" target="_blank">http://www.it-waibao.com/IToutsourcing/support/database/Oracle/catalogTreeID100_folderID520_infoID10452.html</a><br />
 <img src ="http://www.blogjava.net/kiant/aggbug/232784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-10-06 22:52 <a href="http://www.blogjava.net/kiant/articles/232784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 详细讲解提高数据库查询效率的实用方法</title><link>http://www.blogjava.net/kiant/articles/226717.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Wed, 03 Sep 2008 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/226717.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/226717.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/226717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/226717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/226717.html</trackback:ping><description><![CDATA[原文转自：&nbsp; <a href="http://tech.c114.net/501/a267960.html" target="_blank">http://tech.c114.net/501/a267960.html</a><br />
<br />
<br />
<p>1.对查询进行优化，应尽量避免全表扫描，首先应考虑在 where 及 order by 涉及的列上建立索引。 <br />
</p>
<p><br />
<br />
2.应尽量避免在 where 子句中对字段进行 null 值判断，否则将导致引擎放弃使用索引而进行全表扫描，如： <br />
select id from t where num is null </p>
<p>可以在num上设置默认值0，确保表中num列没有null值，然后这样查询： <br />
select id from t where num=0 </p>
<p><br />
<br />
3.应尽量避免在 where 子句中使用!=或&lt;&gt;操作符，否则将引擎放弃使用索引而进行全表扫描。 </p>
<p><br />
<br />
4.应尽量避免在 where 子句中使用 or 来连接条件，否则将导致引擎放弃使用索引而进行全表扫描，如： <br />
select id from t where num=10 or num=20 </p>
<p>可以这样查询： <br />
select id from t where num=10 <br />
union all <br />
select id from t where num=20 </p>
<p><br />
<br />
5.in 和 not in 也要慎用，否则会导致全表扫描，如： <br />
select id from t where num in(1,2,3) </p>
<p>对于连续的数值，能用 between 就不要用 in 了： <br />
select id from t where num between 1 and 3 </p>
<p><br />
<br />
6.下面的查询也将导致全表扫描： <br />
select id from t where name like '%abc%' </p>
<p>若要提高效率，可以考虑全文检索。 </p>
<p><br />
<br />
7.如果在 where 子句中使用参数，也会导致全表扫描。因为SQL只有在运行时才会解析局部变量，但优化程序不能将访问计划的选择推迟到运行时；它必须在编译时进行选择。然而，如果在编译时建立访问计划，变量的值还是未知的，因而无法作为索引选择的输入项。如下面语句将进行全表扫描： <br />
select id from t where num=@num </p>
<p>可以改为强制查询使用索引： <br />
select id from t with(index(索引名)) where num=@num </p>
<p><br />
<br />
8.应尽量避免在 where 子句中对字段进行表达式操作，这将导致引擎放弃使用索引而进行全表扫描。如： <br />
select id from t where num/2=100 </p>
<p>应改为: <br />
select id from t where num=100*2 </p>
<p><br />
<br />
9.应尽量避免在where子句中对字段进行函数操作，这将导致引擎放弃使用索引而进行全表扫描。如： <br />
select id from t where substring(name,1,3)='abc'--name以abc开头的id <br />
select id from t where datediff(day,createdate,'2005-11-30')=0--&#8216;2005-11-30&#8217;生成的id </p>
<p>应改为: <br />
select id from t where name like 'abc%' <br />
select id from t where createdate&gt;='2005-11-30' and createdate&lt;'2005-12-1' </p>
<p><br />
<br />
10.不要在 where 子句中的&#8220;=&#8221;左边进行函数、算术运算或其他表达式运算，否则系统将可能无法正确使用索引。 </p>
<p><br />
<br />
11.在使用索引字段作为条件时，如果该索引是复合索引，那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引，否则该索引将不会被使用，并且应尽可能的让字段顺序与索引顺序相一致。 </p>
<p><br />
<br />
12.不要写一些没有意义的查询，如需要生成一个空表结构： <br />
select col1,col2 into #t from t where 1=0 </p>
<p>这类代码不会返回任何结果集，但是会消耗系统资源的，应改成这样： <br />
create table #t(...) </p>
<p><br />
<br />
13.很多时候用 exists 代替 in 是一个好的选择： <br />
select num from a where num in(select num from b) </p>
<p>用下面的语句替换： <br />
select num from a where exists(select 1 from b where num=a.num) </p>
<p><br />
<br />
14.并不是所有索引对查询都有效，SQL是根据表中数据来进行查询优化的，当索引列有大量数据重复时，SQL查询可能不会去利用索引，如一表中有字段sex，male、female几乎各一半，那么即使在sex上建了索引也对查询效率起不了作用。 </p>
<p><br />
<br />
15.索引并不是越多越好，索引固然可以提高相应的 select 的效率，但同时也降低了 insert 及 update 的效率，因为 insert 或 update 时有可能会重建索引，所以怎样建索引需要慎重考虑，视具体情况而定。一个表的索引数最好不要超过6个，若太多则应考虑一些不常使用到的列上建的索引是否有必要。 </p>
<p><br />
<br />
16.应尽可能的避免更新 clustered 索引数据列，因为 clustered 索引数据列的顺序就是表记录的物理存储顺序，一旦该列值改变将导致整个表记录的顺序的调整，会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列，那么需要考虑是否应将该索引建为 clustered 索引。 </p>
<p><br />
<br />
17.尽量使用数字型字段，若只含数值信息的字段尽量不要设计为字符型，这会降低查询和连接的性能，并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符，而对于数字型而言只需要比较一次就够了。 </p>
<p><br />
<br />
18.尽可能的使用 varchar/nvarchar 代替 char/nchar ，因为首先变长字段存储空间小，可以节省存储空间，其次对于查询来说，在一个相对较小的字段内搜索效率显然要高些。 </p>
<p><br />
<br />
19.任何地方都不要使用 select * from t ，用具体的字段列表代替&#8220;*&#8221;，不要返回用不到的任何字段。 </p>
<p><br />
<br />
20.尽量使用表变量来代替临时表。如果表变量包含大量数据，请注意索引非常有限（只有主键索引）。 </p>
<p><br />
<br />
21.避免频繁创建和删除临时表，以减少系统表资源的消耗。 </p>
<p><br />
<br />
22.临时表并不是不可使用，适当地使用它们可以使某些例程更有效，例如，当需要重复引用大型表或常用表中的某个数据集时。但是，对于一次性事件，最好使用导出表。 </p>
<p><br />
<br />
23.在新建临时表时，如果一次性插入数据量很大，那么可以使用 select into 代替 create table，避免造成大量 log ，以提高速度；如果数据量不大，为了缓和系统表的资源，应先create table，然后insert。 </p>
<p><br />
<br />
24.如果使用到了临时表，在存储过程的最后务必将所有的临时表显式删除，先 truncate table ，然后 drop table ，这样可以避免系统表的较长时间锁定。 </p>
<p><br />
<br />
25.尽量避免使用游标，因为游标的效率较差，如果游标操作的数据超过1万行，那么就应该考虑改写。 </p>
<p><br />
<br />
26.使用基于游标的方法或临时表方法之前，应先寻找基于集的解决方案来解决问题，基于集的方法通常更有效。 </p>
<p><br />
<br />
27.与临时表一样，游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法，尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括&#8220;合计&#8221;的例程通常要比使用游标执行的速度快。如果开发时间允许，基于游标的方法和基于集的方法都可以尝试一下，看哪一种方法的效果更好。 </p>
<p><br />
<br />
28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ，在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。 </p>
<p><br />
<br />
29.尽量避免大事务操作，提高系统并发能力。 </p>
<p><br />
<br />
30.尽量避免向客户端返回大数据量，若数据量过大，应该考虑相应需求是否合理。 </p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/kiant/aggbug/226717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-03 17:08 <a href="http://www.blogjava.net/kiant/articles/226717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] SQL编码规范(收集) &amp; 数据库设计经验谈(转)</title><link>http://www.blogjava.net/kiant/articles/226459.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Tue, 02 Sep 2008 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/226459.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/226459.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/226459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/226459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/226459.html</trackback:ping><description><![CDATA[原文转自：<br />
<a href="http://www.cnblogs.com/Duiker/archive/2006/12/10/587764.html" target="_blank">数据库设计经验谈(转) <br />
</a>SQL编码规范(收集)&nbsp;&nbsp; <a href="http://hi.baidu.com/rambochow/blog/item/3ebcbb3db3758903bba16743.html" target="_blank">http://hi.baidu.com/rambochow/blog/item/3ebcbb3db3758903bba16743.html</a><br />
<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_175854" onclick="this.style.display='none'; Code_Closed_Text_175854.style.display='none'; Code_Open_Image_175854.style.display='inline'; Code_Open_Text_175854.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_175854" style="display: none" onclick="this.style.display='none'; Code_Open_Text_175854.style.display='none'; Code_Closed_Image_175854.style.display='inline'; Code_Closed_Text_175854.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_175854" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">1.书写格式&nbsp; </span><span id="Code_Open_Text_175854" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">.书写格式　<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;示例代码：　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;存储过程SQL文书写格式例<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;c.dealerCode,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #ff00ff">round</span><span style="color: #000000">(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(c.submitSubletAmountDLR&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;c.submitPartsAmountDLR&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;c.submitLaborAmountDLR)&nbsp;</span><span style="color: #808080">/</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">),&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">avg</span><span style="color: #000000">,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;decode(</span><span style="color: #0000ff">null</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">x</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">xx</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">CNY</span><span style="color: #ff0000">'</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;a.dealerCode,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;a.submitSubletAmountDLR,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;a.submitPartsAmountDLR,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;a.submitLaborAmountDLR<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;SRV_TWC_F&nbsp;a<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;(to_char(a.ORIGSUBMITTIME,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy/mm/dd</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Date&nbsp;Range(start)</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;to_char(a.ORIGSUBMITTIME,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy/mm/dd</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Date&nbsp;Range(end)</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;nvl(a.deleteflag,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">0</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&lt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">1</span><span style="color: #ff0000">'</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">union</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">all</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;b.dealerCode,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;b.submitSubletAmountDLR,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;b.submitPartsAmountDLR,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;b.submitLaborAmountDLR<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;SRV_TWCHistory_F&nbsp;b<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;(to_char(b.ORIGSUBMITTIME,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy/mm/dd</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Date&nbsp;Range(start)</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;to_char(b.ORIGSUBMITTIME,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy/mm/dd</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Date&nbsp;Range(end)</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;nvl(b.deleteflag,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">0</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&lt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">1</span><span style="color: #ff0000">'</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;)&nbsp;c<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;c.dealerCode<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&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;</span><span style="color: #ff00ff">avg</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">desc</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;C#中里的SQL字符串书写格式例<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;strSQL&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"</span><span style="color: #0000ff">insert</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">into</span><span style="color: #000000">&nbsp;Snd_FinanceHistory_Tb&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"(DEALERCODE,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"REQUESTSEQUECE,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"HANDLETIME,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"JOBFLAG,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"FRAMENO,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"INMONEY,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"REMAINMONEY,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"DELETEFLAG,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"UPDATECOUNT,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"CREUSER,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"CREDATE,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"HONORCHECKNO,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"SEQ)&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #0000ff">values</span><span style="color: #000000">&nbsp;(</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;draftInputDetail.dealerCode&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;draftInputDetail.requestsequece&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"sysdate,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">07</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;frameNO&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;requestMoney&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;",&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;remainMoney&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;",&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">0</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;draftStruct.employeeCode&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"sysdate,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;draftInputDetail.honorCheckNo&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">index</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;")";<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">).缩进<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;对于存储过程文件，缩进为8个空格<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;对于C#里的SQL字符串，不可有缩进，即每一行字符串不可以空格开头<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">).换行<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #808080">&gt;</span><span style="color: #000000">.</span><span style="color: #0000ff">Select</span><span style="color: #808080">/</span><span style="color: #0000ff">From</span><span style="color: #808080">/</span><span style="color: #0000ff">Where</span><span style="color: #808080">/</span><span style="color: #0000ff">Order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #808080">/</span><span style="color: #0000ff">Group</span><span style="color: #000000">&nbsp;by等子句必须另其一行写<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #808080">&gt;</span><span style="color: #000000">.Select子句内容如果只有一项，与Select同行写<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #808080">&gt;</span><span style="color: #000000">.Select子句内容如果多于一项，每一项单独占一行，在对应Select的基础上向右缩进8个空格（C#无缩进）<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">4</span><span style="color: #808080">&gt;</span><span style="color: #000000">.From子句内容如果只有一项，与From同行写<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">5</span><span style="color: #808080">&gt;</span><span style="color: #000000">.From子句内容如果多于一项，每一项单独占一行，在对应From的基础上向右缩进8个空格（C#无缩进）<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">6</span><span style="color: #808080">&gt;</span><span style="color: #000000">.Where子句的条件如果有多项，每一个条件占一行，以AND开头，且无缩进<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">7</span><span style="color: #808080">&gt;</span><span style="color: #000000">.(</span><span style="color: #0000ff">Update</span><span style="color: #000000">)Set子句内容每一项单独占一行，无缩进<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">8</span><span style="color: #808080">&gt;</span><span style="color: #000000">.Insert子句内容每个表字段单独占一行，无缩进；values每一项单独占一行，无缩进<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">9</span><span style="color: #808080">&gt;</span><span style="color: #000000">.SQL文中间不允许出现空行<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #808080">&gt;</span><span style="color: #000000">.C#里单引号必须跟所属的SQL子句处在同一行，连接符（"</span><span style="color: #808080">+</span><span style="color: #000000">"）必须在行首<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">).空格<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #808080">&gt;</span><span style="color: #000000">.SQL内算数运算符、逻辑运算符连接的两个元素之间必须用空格分隔<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #808080">&gt;</span><span style="color: #000000">.逗号之后必须接一个空格<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #808080">&gt;</span><span style="color: #000000">.关键字、保留字和左括号之间必须有一个空格</span></span></div>
<br />
<br />
<fieldset>　　 2.不等于统一使用"&lt;&gt;"。虽然 SQLServer认为"!="和"&lt;&gt;"是等价的，都代表不等于的意义。为了统一，不等于一律使用"&lt;&gt;"表示
<p>　　 3.使用表的别名, 数据库查询，必须使用表的别名。</p>
<p>　　 4.SQL文对表字段扩展的兼容性。在C#里使用Select *时，严禁通过getString(1)的形式得到查询结果，必须使用getString("字段名")的形式；使用Insert时，必须指定插入的字段名，严禁不指定字段名直接插入values　　 </p>
<p>　　 5.减少子查询的使用。子查询除了可读性差之外，还在一定程度上影响了SQL运行效率，请尽量减少使用子查询的使用，用其他效率更高、可读性更好的方式替代。　　 </p>
<p>　　 6.适当添加索引以提高查询效率，适当添加索引可以大幅度的提高检索速度，请参看SQLSERVER SQL性能优化系列。<br />
</p>
</fieldset><br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_180053" onclick="this.style.display='none'; Code_Closed_Text_180053.style.display='none'; Code_Open_Image_180053.style.display='inline'; Code_Open_Text_180053.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_180053" style="display: none" onclick="this.style.display='none'; Code_Open_Text_180053.style.display='none'; Code_Closed_Image_180053.style.display='inline'; Code_Closed_Text_180053.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_180053" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">7.对数据库表操作的特殊要求　</span><span id="Code_Open_Text_180053" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="font-weight: bold; color: #800000">7</span><span style="color: #000000">.对数据库表操作的特殊要求　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;本项目对数据库表的操作还有以下特殊要求：　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">).以逻辑删除替代物理删除　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;注意：现在数据库表中数据没有物理删除，只有逻辑删除　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;以deleteflag字段作为删除标志，deleteflag</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">1</span><span style="color: #ff0000">'</span><span style="color: #000000">代表此记录被逻辑删除，因此在查询数据时必须考虑deleteflag的因素，deleteflag的标准查询条件：NVL(deleteflag,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">0</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&lt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">1</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">).增加记录状态字段　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;数据库中的每张表基本都有以下字段：DELETEFLAG、UPDATECOUNT、CREDATE、CREUSER、UPDATETIME、UPDATEUSER　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;要注意在对标进行操作时必须考虑以下字段　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;插入一条记录时要置DELETEFLAG</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">0</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;UPDATECOUNT</span><span style="color: #808080">=</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,&nbsp;CREDATE</span><span style="color: #808080">=</span><span style="color: #000000">sysdate,&nbsp;CREUSER</span><span style="color: #808080">=</span><span style="color: #000000">登录User；查询一条记录时要考虑DELETEFLAG，如果有可能对此记录作更新时还要取得UPDATECOUNT作同步检查　；修改一条记录时要置UPDATETIME</span><span style="color: #808080">=</span><span style="color: #000000">sysdate,&nbsp;UPDATEUSER</span><span style="color: #808080">=</span><span style="color: #000000">登录User,&nbsp;UPDATECOUNT</span><span style="color: #808080">=</span><span style="color: #000000">(UPDATECOUNT</span><span style="color: #808080">+</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">)&nbsp;mod&nbsp;</span><span style="font-weight: bold; color: #800000">1000</span><span style="color: #000000">,　；删除一条记录时要置DELETEFLAG</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">1</span><span style="color: #ff0000">'</span><span style="color: #000000">　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">).历史表　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;数据库里部分表还存在相应的历史表，比如srv_twc_f和srv_twchistory_f，在查询数据时除了检索所在表之外，还必须检索相应的历史表，对二者的结果做Union（或Union&nbsp;</span><span style="color: #808080">All</span><span style="color: #000000">）　　&nbsp;</span></span></div>
<br />
<br />
<fieldset><legend></legend>8.用执行计划分析SQL性能　　 <br />
　　 EXPLAIN PLAN是一个很好的分析SQL语句的工具，它可以在不执行SQL的情况下分析语句。通过分析，我们就可以知道SQLSERVER是怎样连接表，使用什么方式扫描表（索引扫描或全表扫描），以及使用到的索引名称，按照从里到外，从上到下的次序解读分析的结果，EXPLAIN PLAN的分析结果是用缩进的格式排列的，最内部的操作将最先被解读，如果两个操作处于同一层中，带有最小操作号的将首先被执行。目前许多第三方的工具如PLSQL Developer和TOAD等都提供了极其方便的EXPLAIN PLAN工具，PG需要将自己添加的查询SQL文记入log，然后在EXPLAIN PLAN中进行分析，尽量减少全表扫描，</fieldset><br />
<br />
<img src ="http://www.blogjava.net/kiant/aggbug/226459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-02 18:03 <a href="http://www.blogjava.net/kiant/articles/226459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用PowerDesigner构建PDM的心得</title><link>http://www.blogjava.net/kiant/articles/213533.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Wed, 09 Jul 2008 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/213533.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/213533.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/213533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/213533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/213533.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;工欲善其事，必先利其器。&#8221;通过构建PD的物理数据模型，我们可以方便直观的对数据库进行开发和维护。而且在学习过程中，也无疑的对数据库的设计有了更深一层的理解。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;新建并选择好相应类型DBMS后我们就可以着手模型的环境配置了。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、创建业务规则(<span lang="EN-US">Model-&gt;Business Rules</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果建立验证规则与列或域之间的联系，就可以过通过业务验证规则来检查参数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps:&nbsp; 方式(Type)为验证（<span lang="EN-US">Validation</span><span style="font-family: 宋体;">）和约束（</span><span lang="EN-US">Constraint</span><span style="font-family: 宋体;">）类型的业务规则，绑定于PDM对象的Rules属性，能生成相应的数据库代码。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、设定默认值对象(<span lang="EN-US">Model-&gt;Defaults</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认值其实是数据库里面的一种对象，我们可以设定数据库的公共默认值来简化后续的操作。一般来说，默认是对象有数值型默认值、字符串型默认值和日期型默认值三种。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、设定域对象(<span lang="EN-US">Model-&gt;</span>Domain)，并绑定默认值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;域是PDM模型中的信息类型,在数据库里称为别名数据类型。使用域可以方便的使数据类型标准化。绑定了默认值对象的域，用于快速定义各表中列数据类型及默认值等属性。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、设定列对象为非空&nbsp;not null<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;利用绑定默认值的域对象来设置列属性，防止代码读取字段时获得NULL对象，简化后期的工作。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这里对Slash先生表达表达我的谢意，他制作的&#8220;PowerDesigner 中文教程&#8221;对我帮助很大，使我获益非浅。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<img src ="http://www.blogjava.net/kiant/aggbug/213533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-07-09 10:10 <a href="http://www.blogjava.net/kiant/articles/213533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>