﻿<?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-可以调素琴,阅金经,无丝竹之乱耳,无案垛之劳形-文章分类-数据库</title><link>http://www.blogjava.net/aojilee/category/10019.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 20:21:19 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 20:21:19 GMT</pubDate><ttl>60</ttl><item><title>ORACLE数据库命名编码规范 </title><link>http://www.blogjava.net/aojilee/articles/59047.html</link><dc:creator>奥吉</dc:creator><author>奥吉</author><pubDate>Wed, 19 Jul 2006 09:59:00 GMT</pubDate><guid>http://www.blogjava.net/aojilee/articles/59047.html</guid><wfw:comment>http://www.blogjava.net/aojilee/comments/59047.html</wfw:comment><comments>http://www.blogjava.net/aojilee/articles/59047.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aojilee/comments/commentRss/59047.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aojilee/services/trackbacks/59047.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td valign="bottom" bgcolor="#072d38">
										<span class="estilo2">
												<font color="#9acd32">ORACLE数据库命名编码规范</font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<table style="TABLE-LAYOUT: fixed" cellspacing="2" cellpadding="3" width="100%" bgcolor="#093240" border="0">
				<tbody>
						<tr>
								<td class="estilo3">
										<font color="#9acd32">ORACLE数据库命名编码规范<br />版本记录：<br />当前版本：<br />作 者： <br />完成日期：<br />签 收 人：<br />文件状态：<br />[ ] 草稿<br />[√] 正式发布<br />[ ] 正在修改<br />签收日期：<br />1、 编写目的<br />使用统一的命名和编码规范，使数据库命名及编码风格标准化，以便于阅读、理解和<br />继承。<br />2、 适用范围<br />本规范适用于公司范围内所有以ORACLE作为后台数据库的应用系统和项目开发工作。<br />3、 对象命名规范<br />3.1 数据库和SID<br />数据库名定义为系统名+模块名<br />Ø 全局数据库名和例程SID 名要求一致<br />Ø 因SID 名只能包含字符和数字，所以全局数据库名和SID 名中不能含有“_”等字符<br />3.2 表相关<br />3.2.1 表空间<br />Ø 面向用户的专用数据表空间以用户名+_+data命名 ，如Aud 用户专用数据表空间可命<br />名为Aud_data<br />Ø 面向用户的专用索引表空间以用户名+_+idx命名<br />第2/9页<br />Ø 面向用户的专用临时表空间以用户名+_+tmp命名<br />Ø 面向用户的专用回滚段表空间以用户名+_+rbs 命名<br />Ø 面向应用的表空间以应用名+_data/应用名+_idx/应用名+_tmp/应用名+_rbs 命名<br />Ø LOB 段数据专用表空间以其数据表空间+_+lobs 命名，如上例中数据表空间为<br />Aud_data，则LOB 段表空间可命名为Aud_data_lobs<br />3.2.2 表空间文件<br />表空间文件命名以表空间名+两位数序号(序号从01开始)组成，如Aud_data01 等<br />3.2.3 表<br />表命名要遵循以下原则：<br />Ø 一般表采用“系统名+t_+模块名+_+表义名” 格式构成<br />Ø 若数据库中只含有单个模块，命名可采用“系统名+t_+表义名”格式构成<br />Ø 模块名或表义名均以其汉语拼音的首字符命名，表义名中汉语拼音均采用小写，且<br />字符间不加分割符；<br />Ø 表别名命名规则：取表义名的前3 个字符加最后一个字符。如果存在冲突，适当增<br />加字符（如取表义名的前4 个字符加最后一个字符等）<br />Ø 临时表采用“系统名+t_tmp_+表义名” 格式构成<br />Ø 表的命名如<br />dft_gy_cbap：系统名（电费 df）+t_+模块名（高压 gy）+_+表义名（抄表安排 cbap）<br />dft_cbbj: 系统名（电费 df）+t_+表义名（抄表标记 cbbj）<br />dft_tmp_hj: 系统名（电费 df）+tmp+表义名（合计hj）(此处为临时表)<br />Ø 关联表命名为Re_表A_表B,Re 是Relative的缩写，表A 和表B均采用其表义名或<br />缩写形式。<br />3.2.4 属性（列或字段）<br />属性命名遵循以下原则：<br />Ø 采用有意义的列名，为实际含义的汉语拼音的首字符，且字符间不加任何分割符<br />Ø 属性名前不要加表名等作为前缀<br />Ø 属性后不加任何类型标识作为后缀<br />Ø 不要使用“ID”作为列名<br />Ø 关联字段命名以 “cd+_+关联表的表义名（或缩写）+_+字段名”进行<br />第3/9页<br />3.2.5 主键<br />Ø 任何表都必须定义主键<br />Ø 表主键命名为：“pk+_+表名(或缩写)+_+主键标识”<br />如“pk_YHXX_IDKH”等<br />3.2.6 外键<br />表外键命名为： “fk+_+表名(或缩写)+_主表名(或缩写)+_+主键标识”<br />如“fk_YHLX_YHXX_SFZH”等<br />3.2.7 CHECK约束<br />CHECK 约束命名为： “chk+_+CHECK约束的列名（或缩写）”<br />3.2.8 UNIQUE约束<br />UNIQUE 约束命名为： “unq+_+UNIQUE约束的列名（或缩写）”<br />3.2.9 索引<br />索引的命名为：“表名（或缩写）+_+列名+_idx”。<br />其中多单词组成的属性列列名取前几个单词首字符再加末单词首字符组成<br />如yd_kh 表khid 上的index: yd_kh_khid_idx<br />3.2.10 触发器<br />Ø AFTER型触发器<br />系统名+tr_+&lt;表名&gt;_+&lt;i,u,d的任意组合&gt; +[_row]<br />Ø BEFORE型触发器<br />系统名+tr_+&lt;表名&gt;_+bef_&lt;i,u,d的任意组合&gt;+[_row]<br />Ø INSTEAD OF型触发器<br />系统名+ti_+&lt;表名&gt;+_+&lt;i,u,d的任意组合&gt;+[_row]<br />Ø 各种类型的触发器中<br />i，u，d 分别表示insert、update 和delete<br />行级触发器，后加_row 标识，语句级触发器不加，如 yddftr_CSH_i_row<br />3.2.11 簇<br />第4/9页<br />簇以簇中要存储的各个表（或表别名）及表间加and的组成 命名，即表“A+And+表B…”,<br />如存储GR(工人)和GRJN（工人技能）表的簇命名为GRAndGRJN<br />3.3 视图<br />视图命名以系统名v_+模块名作为前缀，其他命名规则和表的命名类似<br />3.4 序列<br />序列命名以seq_+含义名组成<br />3.5 同义词<br />同义词命名与其基础对象的名称一致，但要去除其用户前缀或含有远程数据库链接的后缀<br />3.6 存储对象相关<br />3.6.1 存储过程<br />存储过程命名由“系统名+sp+_+存储过程标识(缩写)”组成<br />存储过程标识要以实际含义的汉语拼音的首字符构成，并用下划线分割各个组成部分。<br />如增加代理商的帐户的存储过程为“sfsp_ZJDLSZH”。<br />3.6.2 函数<br />函数命名由“系统名+f+_+函数标识”组成<br />3.6.3 包<br />包命名由“系统名+pkg+_+包标识”组成<br />3.6.4 函数文本中的变量采用下列格式命名：<br />Ø 参数变量命名采用“i (o或io)+_+名称”形式，前缀i 或o 表输入还是输出参数<br />Ø 过程变量命名采用“l+_+名称”形式<br />Ø 全局包变量命名采用“g+_+名称”形式<br />Ø 游标变量命名采用“名称+_+cur”形式<br />Ø 常量型变量命名采用“c+_+名称”形式<br />Ø 变量名采用小写，若属于词组形式，用下划线分隔每个单词<br />Ø 变量用来存放表中的列或行数据值时，使用%TYPE、%ROWTYPE 方式声明变量，使变量声<br />第5/9页<br />明的类型与表中的保持同步，随表的变化而变化<br />3.7 用户及角色<br />Ø 用户命名由“系统名称+_+user+_+名词(或缩写)或名词短语(或缩写)”组成<br />Ø 角色命名由“系统名称+_+role+_+名词(或缩写)或名词短语(或缩写)”组成<br />3.8 数据库链接<br />Ø 数据库链接命名由“远程服务器名+_+数据库名+_+link”组成<br />Ø 若远程服务器名和数据库名一致，上式“_+数据库名”部分省去<br />3.9 命名中的其它注意事项<br />Ø 命名都不得超过30个字符。<br />Ø 不要在对象名的字符之间留空格<br />Ø 小心保留词，要保证你的命名没有和保留词、数据库系统或者常用访问方法冲突<br />4、 编码规范<br />4.1 一般性注释<br />4.1.1 注释尽可能简洁、详细而全面<br />4.1.2 创建每一数据库对象时都要加上COMMENT ON注释，以说明该对象的功能和用途；建表时，<br />对某些数据列也要加上COMMENT ON注释，以说明该列和/或列取值的含义。<br />如：XX 表中有CZZT列属性为NUMBER(10, 0)可加COMMENT ON 注释如下<br />COMMENT ON COLUMN XX.CZZT IS '0 = 正常, 1 = 等待, 2 = 超时, 3 = 登出'<br />4.1.3 注释语法包含两种情况：单行注释、多行注释<br />单行注释：注释前有两个连字符（--），一般对变量、条件子句可以采用该类注释。<br />多行注释：符号/*和*/之间的内容为注释内容。对某项完整的操作建议使用该类注释。<br />4.2 函数文本注释<br />4.2.1 在每一个块和过程（存储过程、函数、包、触发器、视图等）的开头放置注释<br />/************************************************************************<br />第6/9页<br />*name : --函数名<br />*function : --函数功能<br />*input : --输入参数<br />*output : --输出参数<br />*author : --作者<br />*CreateDate : --创建时间<br />*UpdateDate : --函数更改信息（包括作者、时间、更改内容等）<br />*************************************************************************/<br />CREATE [OR REPLACE] PROCEDURE dfsp_xxx<br />…<br />4.2.2 传入参数的含义应该有所说明。如果取值范围确定，也应该一并说明。取值有特定含义<br />的变量（如boolean类型变量），应给出每个值的含义。<br />4.2.3 在每一个变量声明的旁边添加注释。说明该变量要用作什么<br />通常，简单使用单行注释就行了，例如<br />l_sfzh CHAR(11) --身份证号码<br />4.2.4 在块的每个主要部分之前添加注释<br />在块的每个主要部分之前增加注释，解释下—组语句目的，最好是说明该段语句及算<br />法的目的以及要得到的结果，但不要对其细节进行过多的描述<br />4.2.5 在块和过程的开头注释中还可以增加要访问的数据库等信息<br />4.3 常用SQL 语句的编写规范<br />4.3.1 CREATE语句<br />CREATE TABLE dft_dksz(<br />YHBS VARCHAR2(20) NOT NULL,<br />ZHGX DATE,<br />DKKHD VARCHAR2(24),<br />CONSTRAINT pk_dksz_yhbs PRIMARY KEY (YHBS)<br />)<br />4.3.2 SELECT语句<br />查询语句采用以下原则编写（可最大化重用共享池中的SQL 语句，提高应用程序性能）：<br />Ø 将SELECT 语句分为5部分:<br />（1） 由SELECT 开头，后跟一个显示查询结果的列表；<br />第7/9页<br />（2） 由FROM 开头，后跟一个或多个获取数据所涉及的表；<br />（3） 由WHERE 开头，后跟一个或多个确定所需值的条件；<br />（4） 由GROUP BY开头，后跟一个或多个表列名，通过这些列以对查询结果进行汇总；<br />（5） 由ORDER BY开头，后跟一个或多个表列名，通过这些列以对查询结果进行排序。<br />Ø 每个部分分行编写，将每一行的第一个关键字与第一行的SELECT尾部对齐，如<br />SELECT col1, col2, col3<br />FROM table1<br />WHERE col1 &gt; col2<br />GROUP BY col1, col2<br />ORDER BY col1;<br />Ø 关键字用大写，列名和表名采用小写<br />Ø 语句中嵌入逗号时，在逗号后面加一空格，当逗号是最后一个字符时，把它放在本行<br />Ø 当语句的同一部分要延续到下一行时，按下列格式排列：<br />SELECT col1, col2, col3, col4, col5, col6,<br />col7, col8, col9, col10<br />Ø 将语句中WHERE 和AND 部分格式化，书写布局类似于<br />WHERE<br />AND<br />AND<br />Ø 当语句中出现括号时，括号的两边不留空格<br />Ø 在SQL 语句使用运算符时，操作两边应各留一个空格，如<br />WHERE X = Y<br />AND A = B<br />AND C = D<br />4.3.3 INSERT语句<br />INSERT INTO &lt;要插入的表名&gt;<br />(&lt;列1&gt;, &lt;列2&gt;, .., &lt;列n-1&gt;, &lt;列n&gt;)<br />VALUES (&lt;列1值&gt;, &lt;列2值&gt;, .., &lt;列n-1值&gt;, &lt;列n值&gt;)<br />4.3.4 UPDATE语句<br />UPDATE &lt;要更新的表名&gt;<br />SET &lt;要更新的列&gt; = &lt;列值&gt;<br />4.3.5 DELETE语句<br />DELETE FROM table1<br />WHERE col1 = '???'<br />第8/9页<br />4.4 条件执行语句(IF)编写规范<br />条件执行语句IF…ELSE 按以下格式编写<br />IF &lt;条件表达式&gt;<br />THEN<br />&lt;一条或多条语句&gt;<br />[ELSE (或ELSIF&lt;条件表达式&gt;)<br />THEN<br />&lt;一条或多条语句&gt;<br />END IF;<br />注:<br />（1） 在IF…THEN和ELSE(或ELSIF)及ELSE…THEN和END IF间可包含一条或多条PL/SQL<br />语句，而不需要加BEGIN 和END<br />（2） IF…ELSE…ENDIF 语句可以嵌套<br />（3） 注意ELSIF的写法<br />4.5 循环语句编写规范<br />4.5.1 简单循环语句<br />LOOP<br />&lt;零条或多条语句&gt;<br />EXIT WHEN &lt;条件表达式&gt;<br />&lt;零条或多条语句&gt;<br />END LOOP;<br />4.5.2 FOR循环语句<br />FOR 变量 IN [变量取值范围]<br />LOOP<br />&lt;一条或多条语句&gt;<br />END LOOP;<br />4.5.3 WHILE循环语句<br />WHILE &lt;条件表达式&gt;<br />LOOP<br />&lt;一条或多条语句&gt;<br />END LOOP;<br />4.6 函数文本（存储过程、函数和包等）<br />第9/9页<br />Ø 对于存储过程、函数等程序块都要有异常处理部分，在异常部分的最后都要设置OTHERS<br />异常情态处理器，以提高程序的自检能力，格式如下：<br />BEGIN<br />…<br />EXCEPTION<br />WHEN excep—name1 THEN<br />…<br />WHEN excep—name2 THEN<br />…<br />WHEN OTHERS THEN<br />…<br />END;<br />Ø 对于子程序、触发器、包等带名的程序块，要使用结束标识，如<br />CREATE OR REPLACE PROCEDURE XXXsp_XXX IS<br />…<br />BEGIN<br />…<br />END XXXsp_XXX;/* 此处的过程名XXXsp_XXX是可选的，规范要求写上，与块开始的CREATE相对应 */ </font>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/aojilee/aggbug/59047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aojilee/" target="_blank">奥吉</a> 2006-07-19 17:59 <a href="http://www.blogjava.net/aojilee/articles/59047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE之常用FAQ V1.0</title><link>http://www.blogjava.net/aojilee/articles/48992.html</link><dc:creator>奥吉</dc:creator><author>奥吉</author><pubDate>Tue, 30 May 2006 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/aojilee/articles/48992.html</guid><wfw:comment>http://www.blogjava.net/aojilee/comments/48992.html</wfw:comment><comments>http://www.blogjava.net/aojilee/articles/48992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aojilee/comments/commentRss/48992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aojilee/services/trackbacks/48992.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ORACLE之常用FAQ V1.0，已经停止更新，准备出chm版本 为便于大家阅读．此帖置顶．请不要在后面跟上一些"好"，"顶"之类的帖子,如果真的要感谢Piner，请多多提交FAQ．谢谢合作 --by Fenng---------------------------------------------------------------------------------------------...&nbsp;&nbsp;<a href='http://www.blogjava.net/aojilee/articles/48992.html'>阅读全文</a><img src ="http://www.blogjava.net/aojilee/aggbug/48992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aojilee/" target="_blank">奥吉</a> 2006-05-30 14:56 <a href="http://www.blogjava.net/aojilee/articles/48992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 分析函数的使用</title><link>http://www.blogjava.net/aojilee/articles/46581.html</link><dc:creator>奥吉</dc:creator><author>奥吉</author><pubDate>Wed, 17 May 2006 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/aojilee/articles/46581.html</guid><wfw:comment>http://www.blogjava.net/aojilee/comments/46581.html</wfw:comment><comments>http://www.blogjava.net/aojilee/articles/46581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aojilee/comments/commentRss/46581.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aojilee/services/trackbacks/46581.html</trackback:ping><description><![CDATA[
		<span class="bold">
				<span class="smalltxt">
						<strong>
								<font face="Arial">Oracle 分析函数的使用<br /><br /></font>
						</strong>
				</span>
		</span>Oracle <u><b><font color="#ff0000">分析函数</font></b></u>使用介绍<br />   <u><b><font color="#ff0000">分析函数</font></b></u>是oracle816引入的一个全新的概念,为我们分析数据提供了一种简单高效的处理方式.在<u><b><font color="#ff0000">分析函数</font></b></u>出现以前,我们必须使用自联查询,子查询或者内联视图,甚至复杂的存储过程实现的语句,现在只要一条简单的sql语句就可以实现了,而且在执行效率方面也有相当大的提高.下面我将针对<u><b><font color="#ff0000">分析函数</font></b></u>做一些具体的说明.<br /><br />今天我主要给大家介绍一下以下几个函数的使用方法<br />1.  自动汇总函数rollup,cube,<br />2.  rank 函数, rank,dense_rank,row_number<br />3.        lag,lead函数<br />4.        sum,avg,的移动增加,移动平均数<br />5.        ratio_to_report报表处理函数<br />6.        first,last取基数的<u><b><font color="#ff0000">分析函数</font></b></u><br /><br /><br /><strong><font face="Arial"><span class="bold"><span class="smalltxt">基础数据<br /><br /></span></span><br /><br /></font></strong><center><table cellspacing="0" cellpadding="0" width="90%" border="0"><tbody><tr><td class="smalltxt">  Code:</td><td align="right"><a class="smalltxt" onclick="copycode(findobj('code0'));" href="http://www.oracle.com.cn/viewthread.php?tid=31313&amp;highlight=%B7%D6%CE%F6%BA%AF%CA%FD#"><font face="Arial" color="#003366">[Copy to clipboard]</font></a>  </td></tr><tr><td colspan="2"><table cellspacing="1" cellpadding="10" width="100%" bgcolor="#efefcf" border="0"><tbody><tr><td id="code0" width="100%" bgcolor="#ffffff">06:34:23 SQL&gt; select * from t;<br /><br />BILL_MONTH      AREA_CODE  NET_TYPE       LOCAL_FARE<br />--------------- ---------- ---------- --------------<br />200405          5761       G              7393344.04<br />200405          5761       J              5667089.85<br />200405          5762       G              6315075.96<br />200405          5762       J              6328716.15<br />200405          5763       G              8861742.59<br />200405          5763       J              7788036.32<br />200405          5764       G              6028670.45<br />200405          5764       J              6459121.49<br />200405          5765       G             13156065.77<br />200405          5765       J             11901671.70<br />200406          5761       G              7614587.96<br />200406          5761       J              5704343.05<br />200406          5762       G              6556992.60<br />200406          5762       J              6238068.05<br />200406          5763       G              9130055.46<br />200406          5763       J              7990460.25<br />200406          5764       G              6387706.01<br />200406          5764       J              6907481.66<br />200406          5765       G             13562968.81<br />200406          5765       J             12495492.50<br />200407          5761       G              7987050.65<br />200407          5761       J              5723215.28<br />200407          5762       G              6833096.68<br />200407          5762       J              6391201.44<br />200407          5763       G              9410815.91<br />200407          5763       J              8076677.41<br />200407          5764       G              6456433.23<br />200407          5764       J              6987660.53<br />200407          5765       G             14000101.20<br />200407          5765       J             12301780.20<br />200408          5761       G              8085170.84<br />200408          5761       J              6050611.37<br />200408          5762       G              6854584.22<br />200408          5762       J              6521884.50<br />200408          5763       G              9468707.65<br />200408          5763       J              8460049.43<br />200408          5764       G              6587559.23<br /><br />BILL_MONTH      AREA_CODE  NET_TYPE       LOCAL_FARE<br />--------------- ---------- ---------- --------------<br />200408          5764       J              7342135.86<br />200408          5765       G             14450586.63<br />200408          5765       J             12680052.38<br /><br />40 rows selected.<br /><br />Elapsed: 00:00:00.00</td></tr></tbody></table></td></tr></tbody></table></center><br /><br /><strong><font face="Arial"><span class="bold"><span class="smalltxt">1. 使用rollup函数的介绍<br /><br /></span></span><br /><br /></font></strong><center><table cellspacing="0" cellpadding="0" width="90%" border="0"><tbody><tr><td>  Quote:</td></tr><tr><td><table cellspacing="1" cellpadding="10" width="100%" bgcolor="#efefcf" border="0"><tbody><tr><td width="100%" bgcolor="#ffffff"><font color="blue">下面是直接使用普通sql语句求出各地区的汇总数据的例子</font><br />06:41:36 SQL&gt; set autot on<br />06:43:36 SQL&gt; select area_code,sum(local_fare) local_fare<br />06:43:50   2  from t<br />06:43:51   3  group by area_code<br />06:43:57   4  union all<br />06:44:00   5  select '合计' area_code,sum(local_fare) local_fare<br />06:44:06   6  from t<br />06:44:08   7  /<br /><br />AREA_CODE      LOCAL_FARE<br />---------- --------------<br />5761          54225413.04<br />5762          52039619.60<br />5763          69186545.02<br />5764          53156768.46<br />5765         104548719.19<br />合计         333157065.31<br /><br />6 rows selected.<br /><br />Elapsed: 00:00:00.03<br /><br />Execution Plan<br />----------------------------------------------------------<br />   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=1310 Bytes=<br />          24884)<br /><br />   1    0   UNION-ALL<br />   2    1     SORT (GROUP BY) (Cost=5 Card=1309 Bytes=24871)<br />   3    2       TABLE ACCESS (FULL) OF 'T' (Cost=2 Card=1309 Bytes=248<br />          71)<br /><br />   4    1     SORT (AGGREGATE)<br />   5    4       TABLE ACCESS (FULL) OF 'T' (Cost=2 Card=1309 Bytes=170<br />          17)<br /><br /><br /><br /><br /><br />Statistics<br />----------------------------------------------------------<br />          0  recursive calls<br />          0  db block gets<br /><font color="red">          6  consistent gets</font><br />          0  physical reads<br />          0  redo size<br />        561  bytes sent via SQL*Net to client<br />        503  bytes received via SQL*Net from client<br />          2  SQL*Net roundtrips to/from client<br />          1  sorts (memory)<br />          0  sorts (disk)<br />          6  rows processed<br /><br /><br /><font color="blue">下面是使用分析函数rollup得出的汇总数据的例子</font><br />06:44:09 SQL&gt; select nvl(area_code,'合计') area_code,sum(local_fare) local_fare<br />06:45:26   2  from t<br />06:45:30   3  group by rollup(nvl(area_code,'合计'))<br />06:45:50   4  /<br /><br />AREA_CODE      LOCAL_FARE<br />---------- --------------<br />5761          54225413.04<br />5762          52039619.60<br />5763          69186545.02<br />5764          53156768.46<br />5765         104548719.19<br />             333157065.31<br /><br />6 rows selected.<br /><br />Elapsed: 00:00:00.00<br /><br />Execution Plan<br />----------------------------------------------------------<br />   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5 Card=1309 Bytes=<br />          24871)<br /><br />   1    0   SORT (GROUP BY ROLLUP) (Cost=5 Card=1309 Bytes=24871)<br />   2    1     TABLE ACCESS (FULL) OF 'T' (Cost=2 Card=1309 Bytes=24871<br />          )<br /><br /><br /><br /><br /><br />Statistics<br />----------------------------------------------------------<br />          0  recursive calls<br />          0  db block gets<br /><font color="red">          4  consistent gets</font><br />          0  physical reads<br />          0  redo size<br />        557  bytes sent via SQL*Net to client<br />        503  bytes received via SQL*Net from client<br />          2  SQL*Net roundtrips to/from client<br />          1  sorts (memory)<br />          0  sorts (disk)<br />          6  rows processed<br /><br /><br /><b>从上面的例子我们不难看出使用rollup函数,系统的sql语句更加简单,耗用的资源更少,从6个consistent gets降到4个consistent gets,如果基表很大的话,结果就可想而知了.</b></td></tr></tbody></table></td></tr></tbody></table></center><br /><br /><table style="TABLE-LAYOUT: fixed" height="100%" cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td valign="top"><strong><font face="Arial"><span class="bold"><span class="smalltxt">1. 使用cube函数的介绍<br /><br /></span></span><br /><br /></font></strong><center><table cellspacing="0" cellpadding="0" width="90%" border="0"><tbody><tr><td>  Quote:</td></tr><tr><td><table cellspacing="1" cellpadding="10" width="100%" bgcolor="#efefcf" border="0"><tbody><tr><td width="100%" bgcolor="#ffffff"><b>为了介绍cube函数我们再来看看另外一个使用rollup的例子</b><br />06:53:00 SQL&gt; select area_code,bill_month,sum(local_fare) local_fare<br />06:53:37   2  from t<br />06:53:38   3  group by rollup(area_code,bill_month)<br />06:53:49   4  /<br /><br />AREA_CODE  BILL_MONTH          LOCAL_FARE<br />---------- --------------- --------------<br />5761       200405             13060433.89<br />5761       200406             13318931.01<br />5761       200407             13710265.93<br />5761       200408             14135782.21<br />5761                          54225413.04<br />5762       200405             12643792.11<br />5762       200406             12795060.65<br />5762       200407             13224298.12<br />5762       200408             13376468.72<br />5762                          52039619.60<br />5763       200405             16649778.91<br />5763       200406             17120515.71<br />5763       200407             17487493.32<br />5763       200408             17928757.08<br />5763                          69186545.02<br />5764       200405             12487791.94<br />5764       200406             13295187.67<br />5764       200407             13444093.76<br />5764       200408             13929695.09<br />5764                          53156768.46<br />5765       200405             25057737.47<br />5765       200406             26058461.31<br />5765       200407             26301881.40<br />5765       200408             27130639.01<br />5765                         104548719.19<br />                             333157065.31<br /><br />26 rows selected.<br /><br />Elapsed: 00:00:00.00<br /><br /><b>系统只是根据rollup的第一个参数area_code对结果集的数据做了汇总处理,而没有对bill_month做汇总分析处理,cube函数就是为了这个而设计的.<br />下面,让我们看看使用cube函数的结果</b><br /><br />06:58:02 SQL&gt; select area_code,bill_month,sum(local_fare) local_fare<br />06:58:30   2  from t<br />06:58:32   3  group by cube(area_code,bill_month)<br />06:58:42   4  order by area_code,bill_month nulls last<br />06:58:57   5  /<br /><br />AREA_CODE  BILL_MONTH          LOCAL_FARE<br />---------- --------------- --------------<br />5761       200405                13060.43<br />5761       200406                13318.93<br />5761       200407                13710.27<br />5761       200408                14135.78<br />5761                             54225.41<br />5762       200405                12643.79<br />5762       200406                12795.06<br />5762       200407                13224.30<br />5762       200408                13376.47<br />5762                             52039.62<br />5763       200405                16649.78<br />5763       200406                17120.52<br />5763       200407                17487.49<br />5763       200408                17928.76<br />5763                             69186.54<br />5764       200405                12487.79<br />5764       200406                13295.19<br />5764       200407                13444.09<br />5764       200408                13929.69<br />5764                             53156.77<br />5765       200405                25057.74<br />5765       200406                26058.46<br />5765       200407                26301.88<br />5765       200408                27130.64<br />5765                            104548.72<br /><font color="red"><b>           200405                79899.53<br />           200406                82588.15<br />           200407                84168.03<br />           200408                86501.34</b></font><br />                                333157.05<br /><br />30 rows selected.<br /><br />Elapsed: 00:00:00.01<br /><br /><b>可以看到,在cube函数的输出结果比使用rollup多出了几行统计数据.这就是cube函数根据bill_month做的汇总统计结果</b></td></tr></tbody></table></td></tr></tbody></table></center><br /></td></tr></tbody></table><strong><font face="Arial"><span class="bold"><span class="smalltxt">1 rollup 和 cube函数的再深入<br /><br /></span></span><br /><br /></font></strong><center><table cellspacing="0" cellpadding="0" width="90%" border="0"><tbody><tr><td>  Quote:</td></tr><tr><td><table cellspacing="1" cellpadding="10" width="100%" bgcolor="#efefcf" border="0"><tbody><tr><td width="100%" bgcolor="#ffffff"><b>从上面的结果中我们很容易发现,每个统计数据所对应的行都会出现null,<br />我们如何来区分到底是根据那个字段做的汇总呢,<br />这时候,oracle的grouping函数就粉墨登场了.<br />如果当前的汇总记录是利用该字段得出的,grouping函数就会返回1,否则返回0<br /></b><br /><br />  1  select decode(grouping(area_code),1,'all area',to_char(area_code)) area_code,<br />  2         decode(grouping(bill_month),1,'all month',bill_month) bill_month,<br />  3         sum(local_fare) local_fare<br />  4  from t<br />  5  group by cube(area_code,bill_month)<br />  6* order by area_code,bill_month nulls last<br />07:07:29 SQL&gt; /<br /><br />AREA_CODE  BILL_MONTH          LOCAL_FARE<br />---------- --------------- --------------<br />5761       200405                13060.43<br />5761       200406                13318.93<br />5761       200407                13710.27<br />5761       200408                14135.78<br />5761       all month             54225.41<br />5762       200405                12643.79<br />5762       200406                12795.06<br />5762       200407                13224.30<br />5762       200408                13376.47<br />5762       all month             52039.62<br />5763       200405                16649.78<br />5763       200406                17120.52<br />5763       200407                17487.49<br />5763       200408                17928.76<br />5763       all month             69186.54<br />5764       200405                12487.79<br />5764       200406                13295.19<br />5764       200407                13444.09<br />5764       200408                13929.69<br />5764       all month             53156.77<br />5765       200405                25057.74<br />5765       200406                26058.46<br />5765       200407                26301.88<br />5765       200408                27130.64<br />5765       all month            104548.72<br /><font color="red"><b>all area   200405                79899.53<br />all area   200406                82588.15<br />all area   200407                84168.03<br />all area   200408                86501.34<br />all area   all month            333157.05<br /></b></font><br />30 rows selected.<br /><br />Elapsed: 00:00:00.01<br />07:07:31 SQL&gt;<br /><br /><b><br />可以看到,所有的空值现在都根据grouping函数做出了很好的区分,这样利用rollup,cube和grouping函数,我们做数据统计的时候就可以轻松很多了.</b></td></tr></tbody></table></td></tr></tbody></table></center><br /><br /><br /><table style="TABLE-LAYOUT: fixed" height="100%" cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td valign="top"><strong><span class="bold"><span class="smalltxt"><font face="Arial">2. rank函数的介绍<br /><br /></font></span></span>介绍完rollup和cube函数的使用,下面我们来看看rank系列函数的使用方法.</strong><br /><br /><b>问题2.</b>我想查出这几个月份中各个地区的总话费的排名.<br /><br /><center><table cellspacing="0" cellpadding="0" width="90%" border="0"><tbody><tr><td>  Quote:</td></tr><tr><td><table cellspacing="1" cellpadding="10" width="100%" bgcolor="#efefcf" border="0"><tbody><tr><td width="100%" bgcolor="#ffffff"><b>为了将rank,dense_rank,row_number函数的差别显示出来,我们对已有的基础数据做一些修改,将5763的数据改成与5761的数据相同.</b><br />  1  update t t1 set local_fare = (<br />  2    select local_fare from t t2<br />  3     where t1.bill_month = t2.bill_month<br />  4     and t1.net_type = t2.net_type<br />  5     and t2.area_code = '5761'<br />  6* ) where area_code = '5763'<br />07:19:18 SQL&gt; /<br /><br />8 rows updated.<br /><br />Elapsed: 00:00:00.01<br /><br />我们先使用rank函数来计算各个地区的话费排名.<br />07:34:19 SQL&gt; select area_code,sum(local_fare) local_fare,<br />07:35:25   2    rank() over (order by sum(local_fare) desc) fare_rank<br />07:35:44   3  from t<br />07:35:45   4  group by area_codee<br />07:35:50   5<br />07:35:52 SQL&gt; select area_code,sum(local_fare) local_fare,<br />07:36:02   2    rank() over (order by sum(local_fare) desc) fare_rank<br />07:36:20   3  from t<br />07:36:21   4  group by area_code<br />07:36:25   5  /<br /><br />AREA_CODE      LOCAL_FARE  FARE_RANK<br />---------- -------------- ----------<br />5765            104548.72          1<br />5761             54225.41          2<br />5763             54225.41          <font color="red">2 </font><br />5764             53156.77          <font color="red">4 </font><br />5762             52039.62          5<br /><br />Elapsed: 00:00:00.01<br /><br /><b>我们可以看到红色标注的地方出现了,跳位,排名3没有出现<br />下面我们再看看dense_rank查询的结果.<br /></b><br /><br />07:36:26 SQL&gt; select area_code,sum(local_fare) local_fare,<br />07:39:16   2    dense_rank() over (order by sum(local_fare) desc ) fare_rank<br />07:39:39   3  from t<br />07:39:42   4  group by area_code<br />07:39:46   5  /<br /><br />AREA_CODE      LOCAL_FARE  FARE_RANK<br />---------- -------------- ----------<br />5765            104548.72          1<br />5761             54225.41          2<br />5763             54225.41          2<br />5764             53156.77          3  <font color="red">这是这里出现了第三名</font><br />5762             52039.62          4<br /><br />Elapsed: 00:00:00.00<br /><br /><b><br />在这个例子中,出现了一个第三名,这就是rank和dense_rank的差别,<br />rank如果出现两个相同的数据,那么后面的数据就会<font color="blue">直接跳过</font>这个排名,而dense_rank则不会,<br />差别更大的是,row_number哪怕是两个数据完全相同,排名也会不一样,这个特性在我们想找出对应没个条件的唯一记录的时候又很大用处<br /></b><br /><br />  1  select area_code,sum(local_fare) local_fare,<br />  2     row_number() over (order by sum(local_fare) desc ) fare_rank<br />  3  from t<br />  4* group by area_code<br />07:44:50 SQL&gt; /<br /><br />AREA_CODE      LOCAL_FARE  FARE_RANK<br />---------- -------------- ----------<br />5765            104548.72          1<br /><font color="red">5761             54225.41          2</font><br /><font color="red">5763             54225.41          3</font><br />5764             53156.77          4<br />5762             52039.62          5<br /><br /><b>在row_nubmer函数中,我们发现,哪怕sum(local_fare)完全相同,我们还是得到了不一样排名,我们可以利用这个特性剔除数据库中的重复记录.<br /><br />这个帖子中的几个例子是为了说明这三个函数的基本用法的. 下个帖子我们将详细介绍他们的一些用法.<br /></b></td></tr></tbody></table></td></tr></tbody></table></center><br /></td></tr></tbody></table><span class="bold"><span class="smalltxt"><strong><font face="Arial">2. rank函数的介绍<br /><br /></font></strong></span></span>a. 取出数据库中最后入网的n个用户<br />select user_id,tele_num,user_name,user_status,create_date <br />from (<br />   select user_id,tele_num,user_name,user_status,create_date,<br />      rank() over (order by create_date desc) add_rank<br />   from user_info<br />)<br />where add_rank &lt;= :n;<br /><br />b.根据object_name删除数据库中的重复记录<br />create table t as select obj#,name from sys.obj$;<br />再insert into t1 select * from t1 数次.<br />delete from t1 where rowid in (<br />   select row_id from (<br />      select rowid row_id,row_number() over (partition by obj# order by rowid ) rn<br />   ) where rn &lt;&gt; 1<br />);<br /><br />c. 取出各地区的话费收入在各个月份排名.<br />SQL&gt; select bill_month,area_code,sum(local_fare) local_fare,<br />  2     rank() over (partition by bill_month order by sum(local_fare) desc) area_rank<br />  3  from t<br />  4  group by bill_month,area_code<br />  5  /<br /><br />BILL_MONTH      AREA_CODE           LOCAL_FARE  AREA_RANK<br />--------------- --------------- -------------- ----------<br />200405          5765                  25057.74          1<br />200405          5761                  13060.43          2<br />200405          5763                  13060.43          2<br />200405          5762                  12643.79          4<br />200405          5764                  12487.79          5<br />200406          5765                  26058.46          1<br />200406          5761                  13318.93          2<br />200406          5763                  13318.93          2<br />200406          5764                  13295.19          4<br />200406          5762                  12795.06          5<br />200407          5765                  26301.88          1<br />200407          5761                  13710.27          2<br />200407          5763                  13710.27          2<br />200407          5764                  13444.09          4<br />200407          5762                  13224.30          5<br />200408          5765                  27130.64          1<br />200408          5761                  14135.78          2<br />200408          5763                  14135.78          2<br />200408          5764                  13929.69          4<br />200408          5762                  13376.47          5<br /><br />20 rows selected.<br />SQL&gt;<br /><br /><br /><strong><span class="bold"><span class="smalltxt"><font face="Arial">3. lag和lead函数介绍<br /><br /></font></span></span>取出每个月的上个月和下个月的话费总额</strong><br />  1  select area_code,bill_month, local_fare cur_local_fare,<br />  2     lag(local_fare,2,0) over (partition by area_code order by bill_month ) pre_local_fare,<br />  3     lag(local_fare,1,0) over (partition by area_code order by bill_month ) last_local_fare,<br />  4     lead(local_fare,1,0) over (partition by area_code order by bill_month ) next_local_fare,<br />  5     lead(local_fare,2,0) over (partition by area_code order by bill_month ) post_local_fare<br />  6  from (<br />  7     select area_code,bill_month,sum(local_fare) local_fare<br />  8     from t<br />  9     group by area_code,bill_month<br />10* )<br />SQL&gt; /<br />AREA_CODE BILL_MONTH CUR_LOCAL_FARE PRE_LOCAL_FARE LAST_LOCAL_FARE NEXT_LOCAL_FARE POST_LOCAL_FARE<br />--------- ---------- -------------- -------------- --------------- --------------- ---------------<br />5761      200405          13060.433              0               0        13318.93       13710.265<br />5761      200406           13318.93              0       13060.433       13710.265       14135.781<br />5761      200407          13710.265      13060.433        13318.93       14135.781               0<br />5761      200408          14135.781       13318.93       13710.265               0               0<br />5762      200405          12643.791              0               0        12795.06       13224.297<br />5762      200406           12795.06              0       12643.791       13224.297       13376.468<br />5762      200407          13224.297      12643.791        12795.06       13376.468               0<br />5762      200408          13376.468       12795.06       13224.297               0               0<br />5763      200405          13060.433              0               0        13318.93       13710.265<br />5763      200406           13318.93              0       13060.433       13710.265       14135.781<br />5763      200407          13710.265      13060.433        13318.93       14135.781               0<br />5763      200408          14135.781       13318.93       13710.265               0               0<br />5764      200405          12487.791              0               0       13295.187       13444.093<br />5764      200406          13295.187              0       12487.791       13444.093       13929.694<br />5764      200407          13444.093      12487.791       13295.187       13929.694               0<br />5764      200408          13929.694      13295.187       13444.093               0               0<br />5765      200405          25057.736              0               0        26058.46       26301.881<br />5765      200406           26058.46              0       25057.736       26301.881       27130.638<br />5765      200407          26301.881      25057.736        26058.46       27130.638               0<br />5765      200408          27130.638       26058.46       26301.881               0               0<br />20 rows selected.<br /><br /><b>利用lag和lead函数,我们可以在同一行中显示前n行的数据,也可以显示后n行的数据.</b><br /><br /><br /><span class="bold"><span class="smalltxt"><strong><font face="Arial">4. sum,avg,max,min移动计算数据介绍<br /><br /></font></strong></span></span>计算出各个连续3个月的通话费用的平均数<br />  1  select area_code,bill_month, local_fare,<br />  2     sum(local_fare)<br />  3             over (  partition by area_code<br />  4                     order by to_number(bill_month)<br />  5                     range between 1 preceding and 1 following ) "3month_sum",<br />  6     avg(local_fare)<br />  7             over (  partition by area_code<br />  8                     order by to_number(bill_month)<br />  9                     range between 1 preceding and 1 following ) "3month_avg",<br />10     max(local_fare)<br />11             over (  partition by area_code<br />12                     order by to_number(bill_month)<br />13                     range between 1 preceding and 1 following ) "3month_max",<br />14     min(local_fare)<br />15             over (  partition by area_code<br />16                     order by to_number(bill_month)<br />17                     range between 1 preceding and 1 following ) "3month_min"<br />18  from (<br />19     select area_code,bill_month,sum(local_fare) local_fare<br />20     from t<br />21     group by area_code,bill_month<br />22* )<br />SQL&gt; /<br /><br />AREA_CODE BILL_MONTH       LOCAL_FARE 3month_sum 3month_avg 3month_max 3month_min<br />--------- ---------- ---------------- ---------- ---------- ---------- ----------<br />5761      200405            <font color="blue">13060.433</font>  26379.363 13189.6815   13318.93  13060.433<br />5761      200406            <font color="blue">13318.930</font>  40089.628 13363.2093  13710.265  13060.433<br />5761      200407            <font color="blue">13710.265</font>  41164.976 13721.6587  14135.781   13318.93<br /><b>40089.628 = 13060.433 + 13318.930 + 13710.265<br />13363.2093 = (13060.433 + 13318.930 + 13710.265) / 3<br />13710.265 = max(13060.433 + 13318.930 + 13710.265)<br />13060.433 = min(13060.433 + 13318.930 + 13710.265)</b><br />5761      200408            14135.781  27846.046  13923.023  14135.781  13710.265<br />5762      200405            12643.791  25438.851 12719.4255   12795.06  12643.791<br />5762      200406            12795.060  38663.148  12887.716  13224.297  12643.791<br />5762      200407            13224.297  39395.825 13131.9417  13376.468   12795.06<br />5762      200408            13376.468  26600.765 13300.3825  13376.468  13224.297<br />5763      200405            13060.433  26379.363 13189.6815   13318.93  13060.433<br />5763      200406            13318.930  40089.628 13363.2093  13710.265  13060.433<br />5763      200407            13710.265  41164.976 13721.6587  14135.781   13318.93<br />5763      200408            14135.781  27846.046  13923.023  14135.781  13710.265<br />5764      200405            12487.791  25782.978  12891.489  13295.187  12487.791<br />5764      200406            13295.187  39227.071 13075.6903  13444.093  12487.791<br />5764      200407            13444.093  40668.974 13556.3247  13929.694  13295.187<br />5764      200408            13929.694  27373.787 13686.8935  13929.694  13444.093<br />5765      200405            25057.736  51116.196  25558.098   26058.46  25057.736<br />5765      200406            26058.460  77418.077 25806.0257  26301.881  25057.736<br />5765      200407            26301.881  79490.979  26496.993  27130.638   26058.46<br />5765      200408            27130.638  53432.519 26716.2595  27130.638  26301.881<br /><br />20 rows selected.<br /><br /><strong><font face="Arial"><span class="bold"><span class="smalltxt">5. ratio_to_report函数的介绍<br /><br /></span></span><br /><br /></font></strong><center><table cellspacing="0" cellpadding="0" width="90%" border="0"><tbody><tr><td>  Quote:</td></tr><tr><td><table cellspacing="1" cellpadding="10" width="100%" bgcolor="#efefcf" border="0"><tbody><tr><td width="100%" bgcolor="#ffffff">  1  select bill_month,area_code,sum(local_fare) local_fare,<br />  2     ratio_to_report(sum(local_fare)) over<br />  3       ( partition by bill_month ) area_pct<br />  4  from t<br />  5* group by bill_month,area_code<br />SQL&gt; break on bill_month skip 1<br />SQL&gt; compute sum of local_fare on bill_month<br />SQL&gt; compute sum of area_pct on bill_month<br />SQL&gt; /<br /><br />BILL_MONTH AREA_CODE       LOCAL_FARE   AREA_PCT<br />---------- --------- ---------------- ----------<br />200405     5761             13060.433 .171149279<br />           5762             12643.791 .165689431<br />           5763             13060.433 .171149279<br />           5764             12487.791 .163645143<br />           5765             25057.736 .328366866<br />**********           ---------------- ----------<br />sum                         76310.184          1<br /><br />200406     5761             13318.930 .169050772<br />           5762             12795.060 .162401542<br />           5763             13318.930 .169050772<br />           5764             13295.187 .168749414<br />           5765             26058.460 .330747499<br />**********           ---------------- ----------<br />sum                         78786.567          1<br /><br />200407     5761             13710.265 .170545197<br />           5762             13224.297 .164500127<br />           5763             13710.265 .170545197<br />           5764             13444.093 .167234221<br />           5765             26301.881 .327175257<br />**********           ---------------- ----------<br />sum                         80390.801          1<br /><br />200408     5761             14135.781 .170911147<br />           5762             13376.468 .161730539<br />           5763             14135.781 .170911147<br />           5764             13929.694 .168419416<br />           5765             27130.638 .328027751<br />**********           ---------------- ----------<br />sum                         82708.362          1<br /><br /><br />20 rows selected.</td></tr></tbody></table></td></tr></tbody></table></center><br /><strong><font face="Arial"><span class="bold"><span class="smalltxt">6 first,last函数使用介绍<br /><br /></span></span><br /><br /></font></strong><center><table cellspacing="0" cellpadding="0" width="90%" border="0"><tbody><tr><td>  Quote:</td></tr><tr><td><table cellspacing="1" cellpadding="10" width="100%" bgcolor="#efefcf" border="0"><tbody><tr><td width="100%" bgcolor="#ffffff"><b>取出每月通话费最高和最低的两个用户.</b><br />1  select bill_month,area_code,sum(local_fare) local_fare,<br />  2     first_value(area_code)<br />  3             over (order by sum(local_fare) desc<br />  4                     rows unbounded preceding) firstval,<br />  5     first_value(area_code)<br />  6             over (order by sum(local_fare) asc<br />  7                     rows unbounded preceding) lastval<br />  8  from t<br />  9  group by bill_month,area_code<br />10* order by bill_month<br />SQL&gt; /<br /><br />BILL_MONTH AREA_CODE       LOCAL_FARE FIRSTVAL        LASTVAL<br />---------- --------- ---------------- --------------- ---------------<br />200405     5764             12487.791 5765            5764<br />200405     5762             12643.791 5765            5764<br />200405     5761             13060.433 5765            5764<br />200405     5765             25057.736 5765            5764<br />200405     5763             13060.433 5765            5764<br />200406     5762             12795.060 5765            5764<br />200406     5763             13318.930 5765            5764<br />200406     5764             13295.187 5765            5764<br />200406     5765             26058.460 5765            5764<br />200406     5761             13318.930 5765            5764<br />200407     5762             13224.297 5765            5764<br />200407     5765             26301.881 5765            5764<br />200407     5761             13710.265 5765            5764<br />200407     5763             13710.265 5765            5764<br />200407     5764             13444.093 5765            5764<br />200408     5762             13376.468 5765            5764<br />200408     5764             13929.694 5765            5764<br />200408     5761             14135.781 5765            5764<br />200408     5765             27130.638 5765            5764<br />200408     5763             14135.781 5765            5764<br /><br />20 rows selected.</td></tr></tbody></table></td></tr></tbody></table></center><br /><img src ="http://www.blogjava.net/aojilee/aggbug/46581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aojilee/" target="_blank">奥吉</a> 2006-05-17 11:10 <a href="http://www.blogjava.net/aojilee/articles/46581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样在查询记录时给记录加锁？</title><link>http://www.blogjava.net/aojilee/articles/43301.html</link><dc:creator>奥吉</dc:creator><author>奥吉</author><pubDate>Wed, 26 Apr 2006 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/aojilee/articles/43301.html</guid><wfw:comment>http://www.blogjava.net/aojilee/comments/43301.html</wfw:comment><comments>http://www.blogjava.net/aojilee/articles/43301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aojilee/comments/commentRss/43301.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aojilee/services/trackbacks/43301.html</trackback:ping><description><![CDATA[
		<table bordercolor="#000000" cellspacing="0" bordercolordark="#ffffff" cellpadding="0" width="100%" align="center" bordercolorlight="#000000" border="0">
				<tbody>
						<tr align="middle">
								<td bgcolor="#efffe0">怎样在查询记录时给记录加锁？</td>
						</tr>
						<tr>
								<td>
										<br />
								</td>
						</tr>
						<tr>
								<td>
										<ul>
												<li>系统环境： 
<ul>1、操作系统：Windows 2000<br />2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版<br />3、安装路径：C:\ORACLE<br /></ul></li>
										</ul>
										<ul>
												<li>实现方法： <pre><ul><b>利用SELECT的FOR UPDATE子句实现</b><xmp>conn system/manager

--创建实验用户
grant connect,resource to test identified by test;

conn test/test

--创建实验表1
create table a(a number);
insert into a values(1);
commit;

select * from a for update;
或
select * from a for update of a.a;（a表的a列）

--新打开一个SQL*Plus窗口
conn test/test（test用户上的第二个会话）
delete from a;

此时，系统停顿状态，等待解锁，
只要在第一个窗口发出roll;或commit;命令，即可解除锁定状态。

</xmp></ul></pre></li>
										</ul>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/aojilee/aggbug/43301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aojilee/" target="_blank">奥吉</a> 2006-04-26 15:17 <a href="http://www.blogjava.net/aojilee/articles/43301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对于oracle进行简单树查询(递归查询)</title><link>http://www.blogjava.net/aojilee/articles/41107.html</link><dc:creator>奥吉</dc:creator><author>奥吉</author><pubDate>Fri, 14 Apr 2006 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/aojilee/articles/41107.html</guid><wfw:comment>http://www.blogjava.net/aojilee/comments/41107.html</wfw:comment><comments>http://www.blogjava.net/aojilee/articles/41107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aojilee/comments/commentRss/41107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aojilee/services/trackbacks/41107.html</trackback:ping><description><![CDATA[
		<h2>对于oracle进行简单树查询(递归查询)</h2>
		<table border="1">
				<tbody>
						<tr>
								<td>DEPTID</td>
								<td>PAREDEPTID</td>
								<td>NAME</td>
						</tr>
						<tr>
								<td>NUMBER</td>
								<td>NUMBER</td>
								<td>CHAR (40 Byte)</td>
						</tr>
						<tr>
								<td>部门id</td>
								<td>父部门id(所属部门id)</td>
								<td>部门名称</td>
						</tr>
				</tbody>
		</table>
		<table>
				<tbody>
						<tr>
								<td>通过子节点向根节点追朔.<br />select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid <br />通过根节点遍历子节点.<br />select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid <br />可通过level 关键字查询所在层次.<br />select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid <br />再次复习一下:start with ...connect by 的用法， start with 后面所跟的就是就是递归的种子。 <br />递归的种子也就是递归开始的地方 <br />connect by 后面的"prior" 如果缺省：则只能查询到符合条件的起始行，并不进行递归查询； <br />connect by prior 后面所放的字段是有关系的，它指明了查询的方向。 </td>
						</tr>
				</tbody>
		</table>
		<br />练习： 通过子节点获得顶节点<br />select FIRST_VALUE(deptid)<br />  OVER (ORDER BY LEVEL DESC ROWS UNBOUNDED PRECEDING) AS firstdeptid from  persons.dept   start with deptid=76 connect by prior paredeptid=deptid <br /><img src ="http://www.blogjava.net/aojilee/aggbug/41107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aojilee/" target="_blank">奥吉</a> 2006-04-14 15:10 <a href="http://www.blogjava.net/aojilee/articles/41107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>