﻿<?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/aczreg/</link><description>先做事情，再看心情……</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:01:46 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:01:46 GMT</pubDate><ttl>60</ttl><item><title>Java Annotation手册 </title><link>http://www.blogjava.net/aczreg/archive/2010/01/19/310084.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Tue, 19 Jan 2010 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2010/01/19/310084.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/310084.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2010/01/19/310084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/310084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/310084.html</trackback:ping><description><![CDATA[作者:cleverpig(作者的Blog:<a href="http://blog.matrix.org.cn/page/cleverpig" target="_new">http://blog.matrix.org.cn/page/cleverpig</a>)<br />
原文:<a href="http://www.matrix.org.cn/resource/article/44/44055_Java+Annotation+Reflect.html" target="_new">http://www.matrix.org.cn/resource/article/44/44055_Java+Annotation+Reflect.html</a><br />
关键字:java,annotation,reflect<br />
<br />
<span style="color: #0000ff;">前言：</span><br />
在上篇文章<a href="http://lansky07.javaeye.com/blog/297911">《Java Annotation入门》</a>中概要性的介绍了Annotation的定义、使用，范围涵盖较广，但是深度不够。所以作者在《Java Annotation入门》后，继续整理了Annotation的概念和知识点，与喜欢research的朋友们共享。<br />
<br />
<span style="color: #ff0000;">阅读提示：文中提到的程序成员或者程序元素是一个概念，指组成程序代码的单元：如类、方法、成员变量。</span><br />
<br />
<span style="color: #0000ff;">一、Annotation究竟是什么？</span><br />
<br />
Annotation
提供了一条与程序元素关联任何信息或者任何元数据（metadata）的途径。从某些方面看，annotation就像修饰符一样被使用，并应用于包、类
型、构造方法、方法、成员变量、参数、本地变量的声明中。这些信息被存储在annotation的&#8220;name=value&#8221;结构对中。
annotation类型是一种接口，能够通过java反射API的方式提供对其信息的访问。<br />
<br />
annotation能被用来为某个程序元
素（类、方法、成员变量等）关联任何的信息。需要注意的是，这里存在着一个基本的潜规则：annotaion不能影响程序代码的执行，无论增加、删除
annotation，代码都始终如一的执行。另外，尽管一些annotation通过java的反射api方法在运行时被访问，而java语言解释器在
工作时忽略了这些annotation。正是由于java虚拟机忽略了annotation，导致了annotation类型在代码中是&#8220;不起作用&#8221;的；
只有通过某种配套的工具才会对annotation类型中的信息进行访问和处理。本文中将涵盖标准的annotation和meta-
annotation类型，陪伴这些annotation类型的工具是java编译器（当然要以某种特殊的方式处理它们）。<br />
<br />
由于上述原
因，annotation在使用时十分简便。一个本地变量可以被一个以NonNull命名的annotation类型所标注，来作为对这个本地变量不能被
赋予null值的断言。而我们可以编写与之配套的一个annotation代码分析工具，使用它来对具有前面变量的代码进行解析，并且尝试验证这个断言。
当然这些代码并不必自己编写。在JDK安装后，在JDK/bin目录中可以找到名为&#8220;apt&#8221;的工具，它提供了处理annotation的框架：它启动后
扫描源代码中的annotation，并调用我们定义好的annotation处理器完成我们所要完成的工作（比如验证前面例子中的断言）。说到这里，
annotation的强大功能似乎可以替代XDoclet这类的工具了，随着我们的深入，大家会更加坚信这一点。<br />
注：详细描述请参看jsr250规范：<br />
<a href="http://www.jcp.org/aboutJava/communityprocess/pfd/jsr250/" target="_new">http://www.jcp.org/aboutJava/communityprocess/pfd/jsr250/</a><br />
<br />
<span style="color: #0000ff;">二、Annotation的定义：</span><br />
<br />
这
段文字开始介绍annotation相关技术。在此大家将看到java5.0的标准annotation类型，这种标准类型就是前文中所说的&#8220;内建&#8221;类
型，它们可以直接被javac支持。可喜的是，在java6.0beta版中的javac已经加入了对自定义annotation的支持。<br />
<br />
<span style="color: #0000ff;">1。Annotation的概念和语法：</span><br />
<br />
首先，关键的概念是理解annotation是与一个程序元素相关联信息或者元数据的标注。它从不影响java程序的执行，但是对例如编译器警告或者像文档生成器等辅助工具产生影响。<br />
下面是常用的annotation列表，我们应该注意在annotation和annotation类型之间的不同：<br />
<br />
<span style="color: #008000;">A.annotation：</span><br />
annotation
使用了在java5.0所带来的新语法，它的行为十分类似public、final这样的修饰符。每个annotation具有一个名字和成员个数
&gt;=0。每个annotation的成员具有被称为name=value对的名字和值（就像javabean一样），name=value装载了
annotation的信息。<br />
<br />
<span style="color: #008000;">B.annotation类型：</span><br />
annotation
类型定义了annotation的名字、类型、成员默认值。一个annotation类型可以说是一个特殊的java接口，它的成员变量是受限制的，而声
明annotation类型时需要使用新语法。当我们通过java反射api访问annotation时，返回值将是一个实现了该annotation类
型接口的对象，通过访问这个对象我们能方便的访问到其annotation成员。后面的章节将提到在java5.0的java.lang包里包含的3个标
准annotation类型。<br />
<br />
<span style="color: #008000;">C.annotation成员：</span><br />
annotation
的成员在annotation类型中以无参数的方法的形式被声明。其方法名和返回值定义了该成员的名字和类型。在此有一个特定的默认语法：允许声明任何
annotation成员的默认值：一个annotation可以将name=value对作为没有定义默认值的annotation成员的值，当然也可
以使用name=value对来覆盖其它成员默认值。这一点有些近似类的继承特性，父类的构造函数可以作为子类的默认构造函数，但是也可以被子类覆盖。<br />
<br />
<span style="color: #008000;">D.marker annotation类型：</span><br />
一个没有成员定义的annotation类型被称为marker annotation。这种annotation类型仅使用自身的存在与否来为我们提供信息。如后面要说的Override。<br />
<br />
<span style="color: #008000;">E.meta-annotation：</span><br />
meta
-annotation也称为元annotation，它是被用来声明annotation类型的annotation。Java5.0提供了一些标准的
元-annotation类型。下面介绍的target、retention就是meta-annotation。<br />
<br />
<span style="color: #008000;">F.target：</span><br />
annotation
的target是一个被标注的程序元素。target说明了annotation所修饰的对象范围：annotation可被用于packages、
types（类、接口、枚举、annotation类型）、类型成员（方法、构造方法、成员变量、枚举值）、方法参数和本地变量（如循环变量、catch
参数）。在annotation类型的声明中使用了target可更加明晰其修饰的目标。<br />
<br />
<span style="color: #008000;">G.retention：</span><br />
annotation
的retention定义了该annotation被保留的时间长短：某些annotation仅出现在源代码中，而被编译器丢弃；而另一些却被编译在
class文件中；编译在class文件中的annotation可能会被虚拟机忽略，而另一些在class被装载时将被读取（请注意并不影响class
的执行，因为annotation与class在使用上是被分离的）。使用这个meta-annotation可以对annotation的&#8220;生命周期&#8221;
限制。<br />
<br />
<span style="color: #008000;">H.metadata：</span><br />
由于metadata被广泛使用于各种计算机开发过程中，所以当我们在这里谈论的metadata即元数据通常指被annotation装载的信息或者annotation本身。<br />
<br />
<span style="color: #0000ff;">2。使用标准Annotation：</span><br />
java5.0在java.lang包中定义了3种标准的annotation类型：<br />
<br />
<span style="color: #008000;">A.Override：</span><br />
java.lang.Override
是一个marker
annotation类型，它被用作标注方法。它说明了被标注的方法重载了父类的方法，起到了断言的作用。如果我们使用了这种annotation在一个
没有覆盖父类方法的方法时，java编译器将以一个编译错误来警示。<br />
这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时发挥威力。<br />
<br />
使用方法极其简单：在使用此annotation时只要在被修饰的方法前面加上@Override。<br />
下面的代码是一个使用@Override修饰一个企图重载父类的toString方法，而又存在拼写错误的sample：<br />
<strong>清单1：</strong><br />
<pre>@Override<br />
<br />
<br />
<br />
public String toSting() {&nbsp;&nbsp; // 注意方法名拼写错了<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;return "[" + super.toString() + "]";<br />
<br />
<br />
<br />
}<br />
<br />
<br />
<br />
</pre>
<br />
<br />
<span style="color: #008000;">B.Deprecated：</span><br />
同样
Deprecated也是一个marker
annotation。当一个类型或者类型成员使用@Deprecated修饰的话，编译器将不鼓励使用这个被标注的程序元素。而且这种修饰具有一定的
&#8220;延续性&#8221;：如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员，虽然继承或者覆盖后的类型或者成员并不是被声明为
@Deprecated，但编译器仍然要报警。<br />
值得注意，@Deprecated这个annotation类型和javadoc中的
@deprecated这个tag是有区别的：前者是java编译器识别的，而后者是被javadoc工具所识别用来生成文档（包含程序成员为什么已经过
时、它应当如何被禁止或者替代的描述）。<br />
在java5.0，java编译器仍然象其从前版本那样寻找@deprecated这个javadoc
tag，并使用它们产生警告信息。但是这种状况将在后续版本中改变，我们应在现在就开始使用@Deprecated来修饰过时的方法而不是
@deprecated javadoc tag。<br />
<strong>清单2：</strong><br />
<pre>下面是一段使用@Deprecated的代码：<br />
<br />
<br />
<br />
/**<br />
<br />
<br />
<br />
* 这里是javadoc的@deprecated声明.<br />
<br />
<br />
<br />
* @deprecated No one has players for this format any more.&nbsp;&nbsp;Use VHS instead.<br />
<br />
<br />
<br />
*/<br />
<br />
<br />
<br />
@Deprecated public class Betamax { ... }<br />
<br />
<br />
<br />
</pre>
<br />
<br />
<span style="color: #008000;">C.SuppressWarnings：</span><br />
@SuppressWarnings
被用于有选择的关闭编译器对类、方法、成员变量、变量初始化的警告。在java5.0，sun提供的javac编译器为我们提供了-Xlint选项来使编
译器对合法的程序代码提出警告，此种警告从某种程度上代表了程序错误。例如当我们使用一个generic
collection类而又没有提供它的类型时，编译器将提示出"unchecked warning"的警告。<br />
<br />
通常当这种情况发生时，我们就需要查找引起警告的代码。如果它真的表示错误，我们就需要纠正它。例如如果警告信息表明我们代码中的switch语句没有覆盖所有可能的case，那么我们就应增加一个默认的case来避免这种警告。<br />
相
仿，有时我们无法避免这种警告，例如，我们使用必须和非generic的旧代码交互的generic
collection类时，我们不能避免这个unchecked
warning。此时@SuppressWarning就要派上用场了，在调用的方法前增加@SuppressWarnings修饰，告诉编译器停止对此
方法的警告。<br />
SuppressWarning不是一个marker
annotation。它有一个类型为String[]的成员，这个成员的值为被禁止的警告名。对于javac编译器来讲，被-Xlint选项有效的警告
名也同样对@SuppressWarings有效，同时编译器忽略掉无法识别的警告名。<br />
<br />
annotation语法允许在annotation名后跟括号，括号中是使用逗号分割的name=value对用于为annotation的成员赋值：<br />
<strong>清单3：</strong><br />
<pre>@SuppressWarnings(value={"unchecked","fallthrough"})<br />
<br />
<br />
<br />
public void lintTrap() { /* sloppy method body omitted */ }<br />
<br />
<br />
<br />
</pre>
<br />
<br />
在这个例子中SuppressWarnings annotation类型只定义了一个单一的成员，所以只有一个简单的value={...}作为name=value对。又由于成员值是一个数组，故使用大括号来声明数组值。<br />
<br />
注意：我们可以在下面的情况中缩写annotation：当annotation只有单一成员，并成员命名为"value="。这时可以省去"value="。比如将上面的SuppressWarnings annotation进行缩写：<br />
<strong>清单4：</strong><br />
<pre>@SuppressWarnings({"unchecked","fallthrough"})<br />
<br />
<br />
<br />
</pre>
<br />
如果SuppressWarnings所声明的被禁止警告个数为一个时，可以省去大括号：<br />
<pre>@SuppressWarnings("unchecked")<br />
<br />
<br />
<br />
</pre>
<br />
<br />
<span style="color: #0000ff;">3。Annotation语法：</span><br />
<br />
在上一个章节中，我们看到书写marker annotation和单一成员annotation的语法。下面本人来介绍一下完整的语法：<br />
<br />
annotation
由&#8220;@+annotation类型名称+(..逗号分割的name-value对...)&#8221;组成。其中成员可以按照任何的顺序。如果annotation
类型定义了某个成员的默认值，则这个成员可以被省略。成员值必须为编译时常量、内嵌的annotation或者数组。<br />
<br />
下面我们将定义一个
annotation类型名为Reviews，它有一个由@Review annotation数组构成的成员。这个@Review
annotation类型有三个成员："reviewer"是一个字符串，"comment"
是一个具有默认值的可选的字符串，"grade"是一个Review.Grade枚举类型值。<br />
<strong>清单5：</strong><br />
<pre>@Reviews({&nbsp;&nbsp;// Single-value annotation, so "value=" is omitted here<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Review(grade=Review.Grade.EXCELLENT,<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reviewer="df"),<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Review(grade=Review.Grade.UNSATISFACTORY,<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reviewer="eg",<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comment="This method needs an @Override annotation")<br />
<br />
<br />
<br />
})<br />
<br />
<br />
<br />
</pre>
<br />
annotation语法的另一个重要规则是没有程序成员可以有多于一个的同一annotation实例。例如在一个类中简单的放置多个@Review annotation。这也是在上面代码中定义@Reviews annotation类型数组的原因。<br />
<br />
<span style="color: #0000ff;">4。Annotation成员类型和值：</span><br />
<br />
annotation成员必须是非空的编译时常量表达式。可用的成员类型为：primitive类型、, String, Class, enumerated类型, annotation类型, 和前面类型的数组。<br />
<br />
下面我们定义了一个名为UncheckedExceptions 的annotation类型，它的成员是一个扩展了RuntimeException类的类数组。<br />
<strong>清单6：</strong><br />
<pre>@UncheckedExceptions({<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;IllegalArgumentException.class, StringIndexOutOfBoundsException.class<br />
<br />
<br />
<br />
})<br />
<br />
<br />
<br />
</pre>
<br />
<br />
<span style="color: #0000ff;">5。Annotation的目标：</span><br />
<br />
annotation通常被放在类型定义和成员定义的前面。然而它也出现在package、方法参数、本地变量的前面。下面，我们来讨论一下这些不大常用的写法：<br />
<br />
package annotation出现在package声明的前面。<br />
下面的例子package-info.java中不包含任何的公共类型定义，却包含一个可选的javadoc注释。<br />
<strong>清单7：</strong><br />
<pre>/**<br />
<br />
<br />
<br />
* This package holds my custom annotation types.<br />
<br />
<br />
<br />
*/<br />
<br />
<br />
<br />
@com.davidflanagan.annotations.Author("David Flanagan")<br />
<br />
<br />
<br />
package com.davidflanagan.annotations;<br />
<br />
<br />
<br />
</pre>
<br />
当package
-info.java文件被编译时，它将产生名为包含annotation（特殊的接口）声明的package-info.class的类。这个接口没有
成员，它的名字package-info不是一个合法的java标识，所以它不能用在java源代码中。这个接口的存在只是简单的被看作一个为
package annotation准备的占位符。<br />
<br />
用于修饰方法参数、catch参数、本地变量的annotation只是简单的出现
在这些程序成员的修饰符位置。java类文件格式没有为本地变量或者catch参数存储annotation作准备，所以这些annotation总是保
留在源代码级别（source retention）；方法参数annotation能够保存在类文件中，也可以在保留到运行时。<br />
<br />
最后，请注意，枚举类型定义中不允许任何的修饰符修饰其枚举值。<br />
<br />
<span style="color: #0000ff;">6。Annotation和默认值：</span><br />
在Annotation
中，没有默认值的成员必须有一个成员值。而如何理解默认值是如何被处理就是一个很重要的细节：annotation类型所定义的成员默认值被存储在
class文件中，不被编译到annotation里面。如果我们修改一个annotation类型使其成员的默认值发生了改变，这个改变对于所有此类型
的annotation中没有明确提供成员值的成员产生影响（即修改了该成员的成员值）。即使在annotation类型使其成员的默认值被改变后
annotation从没被重新编译过，该类型的annotation(改变前已经被编译的)也受到影响。<br />
<br />
<span style="color: #0000ff;">三、Annotation工作原理：</span><br />
<br />
<span style="color: #0000ff;">Annotation与反射</span><br />
在java5.0
中Java.lang.reflect提供的反射API被扩充了读取运行时annotation的能力。让我们回顾一下前面所讲的：一个
annotation类型被定义为runtime
retention后，它才是在运行时可见，当class文件被装载时被保存在class文件中的annotation才会被虚拟机读取。那么
reflect是如何帮助我们访问class中的annotation呢？<br />
<br />
下文将在java.lang.reflect用于
annotation的新特性，其中java.lang.reflect.AnnotatedElement是重要的接口，它代表了提供查询
annotation能力的程序成员。这个接口被java.lang.Package、java.lang.Class实现，并间接地被Method类、
Constructor类、java.lang.reflect的Field类实现。而annotation中的方法参数可以通过Method类、
Constructor类的getParameterAnnotations()方法获得。<br />
<br />
下面的代码使用了AnnotatedElement类的isAnnotationPresent()方法判断某个方法是否具有@Unstable annotation，从而断言此方法是否稳定：<br />
<strong>清单8：</strong><br />
<pre>import java.lang.reflect.*;<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Class c = WhizzBangClass.class;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
<br />
<br />
Method m = c.getMethod("whizzy", int.class, int.class);&nbsp;&nbsp;<br />
<br />
<br />
<br />
boolean unstable = m.isAnnotationPresent(Unstable.class);<br />
<br />
<br />
<br />
</pre>
<br />
isAnnotationPresent ()方法对于检查marker annotation是十分有用的，因为marker
annotation没有成员变量，所以我们只要知道class的方法是否使用了annotation修饰就可以了。而当处理具有成员的
annotation时，我们通过使用getAnnotation()方法来获得annotation的成员信息（成员名称、成员值）。这里我们看到了一
套优美的java
annotation系统：如果annotation存在，那么实现了相应的annotation类型接口的对象将被getAnnotation()方法
返回，接着调用定义在annotation类型中的成员方法可以方便地获得任何成员值。<br />
<br />
回想一下，前面介绍的@Reviews annotation，如果这个annotation类型被声明为runtime retention的话，我们通过下面的代码来访问@Reviews annotation的成员值：<br />
<strong>清单9：</strong><br />
<pre>AnnotatedElement target = WhizzBangClass.class; //获得被查询的AnnotatedElement<br />
<br />
<br />
<br />
// 查询AnnotatedElement的@Reviews annotation信息<br />
<br />
<br />
<br />
Reviews annotation = target.getAnnotation(Reviews.class);<br />
<br />
<br />
<br />
// 因为@Reviews annotation类型的成员为@Review annotation类型的数组，<br />
<br />
<br />
<br />
// 所以下面声明了Review[] reviews保存@Reviews annotation类型的value成员值。<br />
<br />
<br />
<br />
Review[] reviews = annotation.value();<br />
<br />
<br />
<br />
// 查询每个@Review annotation的成员信息<br />
<br />
<br />
<br />
for(Review r : reviews) {<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Review.Grade grade = r.grade();<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;String reviewer = r.reviewer();<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;String comment = r.comment();<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf("%s assigned a grade of %s and comment '%s'%n",<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reviewer, grade, comment);<br />
<br />
<br />
<br />
}<br />
<br />
<br />
<br />
</pre>
<br />
<br />
<span style="color: #0000ff;">四、如何自定义Annotation？</span><br />
<br />
<span style="color: #0000ff;">1．详解annotation与接口的异同：</span><br />
因为annotation类型是一个非凡的接口，所以两者之间存在着某些差异：<br />
<br />
<span style="color: #008000;">A.Annotation类型使用关键字@interface而不是interface。</span><br />
这个关键字声明隐含了一个信息：它是继承了java.lang.annotation.Annotation接口，并非声明了一个interface。<br />
<br />
<span style="color: #008000;">B.Annotation类型、方法定义是独特的、受限制的。</span><br />
Annotation
类型的方法必须声明为无参数、无异常抛出的。这些方法定义了annotation的成员：方法名成为了成员名，而方法返回值成为了成员的类型。而方法返回
值类型必须为primitive类型、Class类型、枚举类型、annotation类型或者由前面类型之一作为元素的一维数组。方法的后面可以使用
default和一个默认数值来声明成员的默认值，null不能作为成员默认值，这与我们在非annotation类型中定义方法有很大不同。<br />
Annotation类型和它的方法不能使用annotation类型的参数、成员不能是generic。只有返回值类型是Class的方法可以在annotation类型中使用generic，因为此方法能够用类转换将各种类型转换为Class。<br />
<br />
<span style="color: #008000;">C.Annotation类型又与接口有着近似之处。</span><br />
它们可以定义常量、静态成员类型（比如枚举类型定义）。Annotation类型也可以如接口一般被实现或者继承。<br />
<br />
<span style="color: #0000ff;">2．实例：</span><br />
下面，我们将看到如何定义annotation类型的example。它展示了annotation类型声明以及@interface与interface之间的不同：<br />
<strong>清单10：</strong><br />
<pre>package com.davidflanagan.annotations;<br />
<br />
<br />
<br />
import java.lang.annotation.*;<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
/**<br />
<br />
<br />
<br />
* 使用annotation来描述那些被标注的成员是不稳定的，需要更改<br />
<br />
<br />
<br />
*/<br />
<br />
<br />
<br />
@Retention(RetentionPolicy.RUNTIME)<br />
<br />
<br />
<br />
public @interface Unstable {}<br />
<br />
<br />
<br />
</pre>
<br />
<br />
下面的另一个example只定义了一个成员。并通过将这个成员命名为value，使我们可以方便的使用这种annotation的快捷声明方式：<br />
<strong>清单11：</strong><br />
<pre>/**<br />
<br />
<br />
<br />
* 使用Author这个annotation定义在程序中指出代码的作者<br />
<br />
<br />
<br />
*/<br />
<br />
<br />
<br />
public @interface Author {<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/** 返回作者名 */<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;String value();<br />
<br />
<br />
<br />
}<br />
<br />
<br />
<br />
</pre>
<br />
<br />
以下的example更加复杂。Reviews annotation类型只有一个成员，但是这个成员的类型是复杂的：由Review
annotation组成的数组。Review
annotation类型有3个成员：枚举类型成员grade、表示Review名称的字符串类型成员Reviewer、具有默认值的字符串类型成员
Comment。<br />
<strong>清单12：</strong><br />
<pre>import java.lang.annotation.*;<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
<br />
/**<br />
<br />
<br />
<br />
* Reviews annotation类型只有一个成员，<br />
<br />
<br />
<br />
* 但是这个成员的类型是复杂的：由Review annotation组成的数组<br />
<br />
<br />
<br />
*/<br />
<br />
<br />
<br />
@Retention(RetentionPolicy.RUNTIME)<br />
<br />
<br />
<br />
public @interface Reviews {<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Review[] value();<br />
<br />
<br />
<br />
}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
/**<br />
<br />
<br />
<br />
* Review annotation类型有3个成员： <br />
<br />
<br />
<br />
* 枚举类型成员grade、<br />
<br />
<br />
<br />
&nbsp;&nbsp;* 表示Review名称的字符串类型成员Reviewer、<br />
<br />
<br />
<br />
&nbsp;&nbsp;* 具有默认值的字符串类型成员Comment。<br />
<br />
<br />
<br />
*/<br />
<br />
<br />
<br />
public @interface Review {<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 内嵌的枚举类型<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static enum Grade { EXCELLENT, SATISFACTORY, UNSATISFACTORY };<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 下面的方法定义了annotation的成员<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Grade grade();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;String reviewer();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;String comment() default "";&nbsp;&nbsp;<br />
<br />
<br />
<br />
}<br />
<br />
<br />
<br />
</pre>
<br />
<br />
最后，我们来定义一个annotation方法用于罗列出类运行中所有的unchecked异常（上文已经提到这种情况不一定是错误）。
这个
annotation类型将一个数组作为了唯一的成员。数组中的每个元素都是异常类。为了加强对未检查的异常（此类异常都是在运行时抛出）进行报告，我们
可以在代码中对异常的类型进行限制：<br />
<strong>清单13：</strong><br />
<pre>public @interface UncheckedExceptions {<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Class&lt;? extends RuntimeException&gt;[] value();<br />
<br />
<br />
<br />
}<br />
<br />
<br />
<br />
</pre>
<br />
<br />
<span style="color: #0000ff;">五、Meta-Annotation</span><br />
<br />
Annotation
类型可以被它们自己所标注。Java5.0定义了4个标准的meta-annotation类型，它们被用来提供对其它annotation类型作说明。
这些类型和它们所支持的类在java.lang.annotation包中可以找到。如果需要更详细的信息可以参考jdk5.0手册。<br />
<br />
<span style="color: #0000ff;">1．再谈Target</span><br />
作
为meta-annotation类型的Target,它描述了annotation所修饰的程序成员的类型。当一个annotation类型没有
Target时，它将被作为普通的annotation看待。当将它修饰一个特定的程序成员时，它将发挥其应用的作用，例如：Override用于修饰方
法时，增加了@Target这个meta-annotation就使编译器对annotation作检查，从而去掉修饰错误类型的Override。<br />
<br />
Target meta-annotation类型有唯一的value作为成员。这个成员的类型是java.lang.annotation.ElementType[]类型的，ElementType类型是可以被标注的程序成员的枚举类型。<br />
<br />
<span style="color: #0000ff;">2．Retention的用法</span><br />
我
们在文章的开头曾经提到过Retention，但是没有详细讲解。Retention描述了annotation是否被编译器丢弃或者保留在class文
件；如果保留在class文件中，是否在class文件被装载时被虚拟机读取。默认情况下，annotation被保存在class文件中，但在运行时并
不能被反射访问。Retention具有三个取值：source、class、runtime，这些取值来自
java.lang.annotation.RetentionPolicy的枚举类型值。<br />
<br />
Retention meta-annotation类型有唯一的value作为成员，它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。<br />
<br />
<span style="color: #0000ff;">3．Documented</span><br />
Documented是一个meta-annotation类型，用于描述其它类型的annotation应该被作为被标注的程序成员的公共API，因此可以被例如javadoc此类的工具文档化。<br />
<br />
Documented是一个marker annotation，没有成员。<br />
<br />
<span style="color: #0000ff;">4．Inherited</span><br />
@Inherited
meta-annotation也是一个marker
annotation，它阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class，
则这个annotation将被用于该class的子类。<br />
<br />
注意：@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation，方法并不从它所重载的方法继承annotation。<br />
<br />
值
得思考的是，当@Inherited
annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME，则反射API增强了这种继
承性。如果我们使用java.lang.reflect去查询一个@Inherited
annotation类型的annotation时，反射代码检查将展开工作：检查class和其父类，直到发现指定的annotation类型被发现，
或者到达类继承结构的顶层。<br />
<br />
<span style="color: #0000ff;">六、总结：</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
本文几乎覆盖了所有的Annotation的概念和知识点，从annotation的定义、语法到工作原理、如何自定义&nbsp;annotation，直至
meta-
annotation。其中也具有一些配套的代码片断可参考，虽然不是很多，但是可谓言简意赅、着其重点，本人认为用好annotation的关键还在于
使用。希望本手册能够帮助大家用好annotation，这也是本人的最大快乐。
<img src ="http://www.blogjava.net/aczreg/aggbug/310084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2010-01-19 15:30 <a href="http://www.blogjava.net/aczreg/archive/2010/01/19/310084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>挣值分析法</title><link>http://www.blogjava.net/aczreg/archive/2010/01/14/309423.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Thu, 14 Jan 2010 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2010/01/14/309423.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/309423.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2010/01/14/309423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/309423.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/309423.html</trackback:ping><description><![CDATA[http://baike.soso.com/v205173.htm<br />
<br />
<div class="con fz14 wordbreak">
<p><strong>挣得值分析法（Earned Value Analysis）</strong> </p>
</div>
<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="1"></a>
<div class="tit">
<h2>什么是挣得值方法？</h2>
</div>
<div class="con fz14 wordbreak">
<p>　　<strong>挣值法</strong>又称为<strong>赢得值法</strong>或<strong>偏差分析法</strong>.挣得值分析法是在工程项目实施中使用较多的一种方法，是对项目进度和费用进行综合控制的一种有效方法。 </p>
<p>　　1967年美国国防部（d0d）开发了挣值法并成功地将其应用于国防工程中。并逐步获得广泛应用。 </p>
<p>　　挣值法的核心是将项目在任一时间的计划指标，完成状况和资源耗费综合度量。将进度转化为货币，或人工时，工程量如：钢材吨数，水泥立方米，管道米数或文件页数。 </p>
<p>　　挣值法的价值在于将项目的进度和费用综合度量，从而能准确描述项目的进展状态。挣值法的另一个重要优点是可以预测项目可能发生的工期滞后量和费用超支量，从而及时采取纠正措施，为项目管理和控制提供了有效手段。 </p>
[编辑]
</div>
<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"></a>
<div class="tit">
<h2>挣得值方法的基本参数</h2>
</div>
<div class="con fz14 wordbreak">
<p>　　<strong>计划工作量的预算费用(BCWS)</strong>，即(Budgeted Cost for Work Scheduled)。 </p>
<p>　　BCWS是指项目实施过程中某阶段计划要求完成的工作量所需的预算费用。计算公式为：BCWS=计划工作量&#215;预算定额。BCWS主要是反映进度计划应当完成的工作量(用费用表示)。 </p>
<ul>
    <li>已完成工作量的实际费用(ACWP)，即(Actual Cost for Work Performed)。ACWP是指项目实施过程中某阶段实际完成的工作量所消耗的费用。ACWP主要是反映项目执行的实际消耗指标。 </li>
</ul>
<p>　　BCWS是与时间相联系的，当考虑资金累计曲线时，是在 项目预算s曲线上的某一点的值。当考虑某一项作业或某一时间段时，例如某一月份，bcws是该作业或该月份包含作业的预算费用。 </p>
<p>　　<strong>已完成工作量的实际费用</strong>（ACWP——Actual Cost for Work Performed），有的资料也称AC（实际值）。 </p>
<p>　　ACWP是指项目实施过程中某阶段实际完成的工作量所消耗的工时（或费用）。ACWP主要反映项目执行的实际消耗指标。 </p>
<p>　　<strong>已完工作量的预算成本</strong>(BCWP)，即(Budgeted Cost for Work Performed)。或称挣值、盈值和挣得值。 </p>
<p>　　BCWP是指项目实施过程中某阶段按实际完成工作量及按预算定额计算出来的费用，即挣得值(Earned Value)。BCWP的计算公式为：ＢＣＷＰ=已完工作量&#215;预算定额。 </p>
<p>　　bcwp的实质内容是将已完成的工作量用预算费用来度量。 </p>
</div>
<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"></a>
<div class="tit">
<h2>挣得值方法的四个评价指标<a href="http://baike.soso.com/Create.e?sp=2&amp;sp=l205173&amp;sp=3" target="_self"><br />
</a></h2>
</div>
<div class="con fz14 wordbreak">
<p>　　<strong>费用偏差</strong>(Cost
Variance-CV)：CV是指检查期间BCWP与ACWP之间的差异，计算公式为CV=BCWP-ACWP。当CV为负值时表示执行效果不佳，即实
际消费费用超过预算值即超支。反之当CV为正值时表示实际消耗费用低于预算值，表示有节余或效率高。若CV=0,表示项目按计划执行。 </p>
<p>　　<strong>进度偏差</strong>(Schedule Variance-SV)：SV是指检查日期BCWP与BCWS之间的差异。其计算公式为SV=BCWP-BCWS。当SV为正值时表示进度提前，SV为负值表示进度延误。若SV=0，表明进度按计划执行。 </p>
<p>　　<strong>费用执行指标</strong>(Cost Performed Index-CPI)：CPI是指挣得值与实际费用值之比。CPI=BCWP／ACWP，当 CPI＞1表示低于预算，CPI＜1表示超出预算，CPI＝1表示实际费用与预算费用吻合。若CPI=1,表明项目费用按计划进行。 </p>
<p>　　<strong>进度执行指标</strong>(Schedule Performed Index-SPI)：SPI是指项目挣得值与计划值之比，即SPI=BCWP／BCWS，当 SPI＞1表示进度提前，SPI＜1表示进度延误，SPI＝1表示实际进度等于计划进度。 </p>
</div>
<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"></a>
<div class="tit">
<h2>挣值法评价曲线<a href="http://baike.soso.com/Create.e?sp=2&amp;sp=l205173&amp;sp=4" target="_self"><br />
</a></h2>
</div>
<div class="con fz14 wordbreak">
<p>
挣值法评价曲线如下图所示，下图的横坐标表示时间，纵坐标则表示费用。BCWS曲线为计划工作量的预算费用曲线，表示项目投入的费用随时间的推移在不断
积累，直至项目结束达到它的最大值，所以曲线呈S形状，也称为S曲线。ACWP已完成工作量的实际费用，同样是进度的时间参数，随项目推进而不断增加的，
也是呈S形的曲线。利用挣值法评价曲线可进行费用进度评价，图中所示的项目，CV&lt;0，SV&lt;0，这表示项目执行效果不佳，即费用超支，进度
延误，应采取相应的补救措施。 </p>
</div>
<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"></a>
<div class="tit">
<h2>挣值度量方法<a href="http://baike.soso.com/Create.e?sp=2&amp;sp=l205173&amp;sp=5" target="_self"><br />
</a></h2>
</div>
<div class="con fz14 wordbreak">
<p>
尽管挣值法的计算关系相对简单，准确度量作业的挣值却是不容易的，并成为成功应用挣值法的关键。这是由于一方面项目的作业内容是多种多样的，挣值的度量
应根据作业的内容精心设计。另一方面，与项目相关的人员已习惯于通常的费用和日程度量概念和方法，改变人们的固有概念需要耐心的培训和讲解。下面是几种度
量挣值的方法： </p>
<p>　　1.线性增长计量：费用按比例平均分配给整个工期，完成量百分比记入挣值。 </p>
<p>　　2.50-50规则：作业开始计入50%费用，作业结束计入剩余的50%。当作业具有多个子作业时采用. </p>
<p>　　3.工程量计量：例如全部桩基300根，150万元。每完成一根，挣值0。5万元。 </p>
<p>　　4.节点计量：将工程分为多个进度节点并赋以挣值，每完成一个节点计入该节点挣值，设备定制可用此方法。 </p>
</div>
<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="6"></a>
<div class="tit">
<h2>挣值分析应用<a href="http://baike.soso.com/Create.e?sp=2&amp;sp=l205173&amp;sp=6" target="_self"><br />
</a></h2>
</div>
<div class="con fz14 wordbreak">
<p>　　<strong>例：某土方工程挣值分析</strong> </p>
<p>　　某土方工程总挖方量为4000立方米。预算单价为45元/立方米。该挖方工程预算总费用为180000元。计划用10天完成，每天400立方米。 </p>
<p>　　开工后第7天早晨刚上班时业主项目管理人员前去测量，取得了两个数据：已完成挖方2000立方米，支付给承包单位的工程进度款累计已达120000元。 </p>
<p>　　项目管理人员先计算已完工作预算费用，得 </p>
<p>　　BCWP =45元/立方米 &#215;2000立方米=90000元 </p>
<p>　　接着，查看项目计划，计划表明，开工后第6天结束时，承包单位应得到的工程进度款累计额为BCWS=108000元。 </p>
<p>　　进一步计算得： </p>
<p>　　费用偏差：BCWP- ACWP=90000-120000=-30000元，表明承包单位已经超支。 </p>
<p>　　进度偏差：BCWP- BCWS=90000-108000=-18000元，表明承包单位进度已经拖延。表示项目进度落后，较预算还有相当于价值18000元的工作量没有做。18000元/（400&#215;45）=1天的工作量，所以承包单位的进度已经落后1天。 </p>
<p>　　另外，还可以使用费用实施指数CPI和进度实施指数SPI测量工作是否按照计划进行。 </p>
<p>　　CPI= BCWP/ACWP = 90000/120000=0.75. </p>
<p>　　SPI= BCWP/BCWS = 90000/108000=0.83. </p>
<p>　　CPI和SPI都小于1，给该项目亮了黄牌。 </p>
</div>
<br />
<img src ="http://www.blogjava.net/aczreg/aggbug/309423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2010-01-14 11:52 <a href="http://www.blogjava.net/aczreg/archive/2010/01/14/309423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet 数据传送</title><link>http://www.blogjava.net/aczreg/archive/2009/12/15/306069.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Tue, 15 Dec 2009 13:58:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2009/12/15/306069.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/306069.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2009/12/15/306069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/306069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/306069.html</trackback:ping><description><![CDATA[<span style="color: rgb(0,128,0)"><span style="color: #000000">Cookie:同一用户点对点<br />
Session:同一用户一条线<br />
ServletContext:不同用户联成面</span><br />
<br />
<br />
//req: 用于获得客户端(浏览器)的信息</span><br style="color: rgb(0,128,0)" />
<span style="color: rgb(0,128,0)">//res: 用于向客户端(浏览器)返回信息</span><br />
1、session的设置：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: rgb(0,128,0)">//得到和req相关联的session,如果没有就创建session</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;HttpSession hs=req.getSession(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: rgb(0,128,0)">//向session中添加一个属性(String 类型的)</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;hs.setAttribute("name","hanzhewei");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: rgb(0,128,0)">//如果不指定时间，那么该session的有效期是30min,在此设定为30秒</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;hs.setMaxInactiveInterval(30);<br />
&nbsp;&nbsp;&nbsp;session的获取：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <span style="color: rgb(0,128,0)">//得到和req相关联的session,如果没有就创建session</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HttpSession hs=req.getSession(true);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; String name=hs.getAttribute("name");<br />
&nbsp;&nbsp;&nbsp;session的删除：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,128,0)">//从session中删除you属性</span><br style="color: rgb(0,128,0)" />
<span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ht.removeAttribute("you");</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ht.setMaxInactiveInterval(0);<br />
2、cookies的设置;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(0,128,0)">//现在服务器端创建一个cookie</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Cookie myCookie=new Cookie("color1","red");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: rgb(0,128,0)">// 该cookie存在的时间</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myCookie.setMaxAge(30);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span style="color: rgb(0,128,0)"> //如果你不设置存在时间,那么该cookie将不会保存</span><br style="color: rgb(0,128,0)" />
<span style="color: rgb(0,128,0)">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //将该cookie写回到客户端</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; res.addCookie(myCookie);<br />
&nbsp;&nbsp;&nbsp;cookies的获取：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; <span style="color: rgb(0,128,0)">//从客户端得到所有cookie信息</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Cookie [] allCookies=req.getCookies();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i=0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: rgb(0,128,0)">//如果allCookies不为空...</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(allCookies!=null){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: rgb(0,128,0)">//从中取出cookie</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(i=0;i&lt;allCookies.length;i++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: rgb(0,128,0)">//依次取出</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Cookie temp=allCookies[i];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;cookies的删除：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; <span style="color: rgb(0,128,0)">//将该cookie删除</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; temp.setMaxAge(0);<br />
3、servletcontext的设置：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: rgb(0,128,0)">//得到servletcontext</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ServletContext sc=this.getServletContext();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <span style="color: rgb(0,128,0)">//添加属性 </span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sc.setAttribute("myInfo","我是顺平");<br />
&nbsp;&nbsp;&nbsp;servletcontext的获取：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: rgb(0,128,0)">//得到servlet context</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ServletContext sc=this.getServletContext();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: rgb(0,128,0)">//得到属性和它对应的值</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String info=(String)sc.getAttribute("myInfo");<br />
 <img src ="http://www.blogjava.net/aczreg/aggbug/306069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2009-12-15 21:58 <a href="http://www.blogjava.net/aczreg/archive/2009/12/15/306069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle小技巧</title><link>http://www.blogjava.net/aczreg/archive/2009/12/12/304026.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Sat, 12 Dec 2009 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2009/12/12/304026.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/304026.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2009/12/12/304026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/304026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/304026.html</trackback:ping><description><![CDATA[<p><strong>更改Oracle http端口(8080改为8081）<br />
</strong>SQL&gt; call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),<br />
&nbsp; 2&nbsp; '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',8081))<br />
&nbsp; 3&nbsp; /<br />
SQL&gt; commit;<br />
Commit complete.<br />
SQL&gt;&nbsp; exec dbms_xdb.cfg_refresh;<br />
<br />
SQL&gt;&nbsp; call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),<br />
&nbsp; 2&nbsp; '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()',2111))<br />
&nbsp; 3&nbsp; /<br />
Call completed.<br />
SQL&gt; commit;<br />
Commit complete.<br />
SQL&gt;&nbsp; exec dbms_xdb.cfg_refresh;<br />
<br />
<br />
<span style="font-family: Lucida Console"><strong><br />
表自复制</strong><br style="font-family: " />
INSERT INTO 表名 （列,...） SELECT * FROM 表名；<br />
如：<br />
INSERT INTO&nbsp;students (sid,sname,sage,...) SELECT * FROM students；<br />
</p>
</span>
<p><span style="font-family: Lucida Console"><br />
<strong>SET命令(常用):</strong> SET 系统变量 值<br />
<table border="0" cellspacing="2" cellpadding="2">
    <tbody>
        <tr>
            <td style="width: 178px; height: 34px">ARRAY[SIZE] </td>
            <td style="font-size: 12pt">{20d|n}</td>
            <td>SQL*PLUS一次从数据库获取的行数,有效值为1至5000. </td>
        </tr>
        <tr>
            <td style="height: 22px">LIN[ESIZE]</td>
            <td>{80d|n}</td>
            <td>SQL*PLUS一行显示的字符总数,它还控制对准中心的文本和右对齐文本.</td>
        </tr>
        <tr>
            <td>PAGES[IZE]</td>
            <td style="width: 135px; height: 26px">{14d|n}</td>
            <td>从顶部标题至页结束之间的行数.</td>
        </tr>
        <tr>
            <td>SQLN[UMBER]</td>
            <td>{OFF|ONd}&nbsp;&nbsp; </td>
            <td>为SQL命令和PL/SQL块的第二行和后继行设置提示.</td>
        </tr>
        <tr>
            <td>TIMI[NG]</td>
            <td>{OFFd|ON}&nbsp;</td>
            <td>显示每一个运行的SQL命令或PL/SQL块的时间统计.</td>
        </tr>
    </tbody>
</table>
</span><br />
</p>
<span style="font-family: Lucida Console">
<p><strong>ORACLE保留关键字</strong><br />
ACCESS ADD ALL ALTER AND ANY AS ASC AUDIT BETWEEN BY CHAR CHECK CLUSTER COLUMN COMMENT<br />
COMPRESS CONNECT CREATE CURRENT DATE DECIMAL DEFAULT DELETE DESC DISTINCT DROP ELSE EXCLUSIVE<br />
EXISTS FILE FLOAT FOR FROM GRANT GROUP HAVING IDENTIFIED IMMEDIATE IN INCREMENT INDEX INITIAL<br />
INSERT INTEGER INTERSECT INTO IS LEVEL LIKE LOCK LONG MAXEXTENTS MINUS MLSLABEL MODE MODIFY<br />
NOAUDIT NOCOMPRESS NOT NOWAIT NULL NUMBER OF OFFLINE ON ONLINE OPTION OR ORDER PCTFREE PRIOR<br />
PRIVILEGES PUBLIC RAW RENAME RESOURCE REVOKE ROW ROWID ROWNUM ROWS SELECT SESSION SET<br />
SHARE SIZE SMALLINT START SUCCESSFUL SYNONYM SYSDATE TABLE THEN TO TRIGGER UID UNION UNIQUE<br />
UPDATE USER VALIDATE VALUES VARCHAR VARCHAR2 VIEW WHENEVER WHERE WITH</p>
<p><strong>TO_DATE与TO_CHAR</strong><br />
1.在使用Oracle的to_date函数来做日期转换时，很多Java程序员也许会和我一样，直觉的采用&#8220;yyyy-MM-dd HH:mm:ss&#8221;的格式作为格式进行转换，但是在Oracle中会引起错误：&#8220;ORA 01810 格式代码出现两次&#8221;。<br />
如：select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;<br />
原因是SQL中不区分大小写，MM和mm被认为是相同的格式代码，所以Oracle的SQL采用了mi代替分钟。<br />
select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;<br />
2.另要以24小时的形式显示出来要用HH24<br />
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分钟<br />
select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm会显示月份</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
JDBC连接Oracle<br />
1.本机连接：控制面板-管理工具-数据源 (ODBC)添加相应的Oracle的DNS服务（DNSname）；<br />
&nbsp; 加载驱动：Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");<br />
&nbsp; 建立连接：DriverManager.getConnection("jdbc:odbc:DNSname","username","password");<br />
2.URL连接：<br />
&nbsp; 加载驱动：Class.forName("oracle.jdbc.driver.OracleDriver");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （此驱动一般在Oracle安装目录内相应server\jdbc\lib目录下能找到）；<br />
&nbsp; 建立连接：DriverManager.getConnection("jdbc:oracle:thin:@url:port:OSname","username","password");<br />
</p>
</span>
<img src ="http://www.blogjava.net/aczreg/aggbug/304026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2009-12-12 15:50 <a href="http://www.blogjava.net/aczreg/archive/2009/12/12/304026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PL/SQL基础</title><link>http://www.blogjava.net/aczreg/archive/2009/12/09/305051.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Wed, 09 Dec 2009 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2009/12/09/305051.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/305051.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2009/12/09/305051.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/305051.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/305051.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;--块（编程）：过程（存储过程）、函数、触发器、包--块结构：DECLEARR定义（可选）、BEGIN执行（必须）、EXCEPTIONN例外（可选）--建立测试表SQL&gt;&nbsp;CREATE&nbsp;TABLE&nbsp;TPT&nbsp;(&nbsp;&nbsp;2&nbsp;&nbsp;tid&nbsp;NUMBER(6)&nbsp;PR...&nbsp;&nbsp;<a href='http://www.blogjava.net/aczreg/archive/2009/12/09/305051.html'>阅读全文</a><img src ="http://www.blogjava.net/aczreg/aggbug/305051.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2009-12-09 14:13 <a href="http://www.blogjava.net/aczreg/archive/2009/12/09/305051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）Oracle集合运算</title><link>http://www.blogjava.net/aczreg/archive/2009/11/30/304275.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Mon, 30 Nov 2009 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2009/11/30/304275.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/304275.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2009/11/30/304275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/304275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/304275.html</trackback:ping><description><![CDATA[<p>DIY部落(<a href="http://www.diybl.com/course/7_databases/oracle/oraclexl/20090825/171870.html">http://www.diybl.com/course/7_databases/oracle/oraclexl/20090825/171870.html</a>)<br />
<br />
■■集合运算(UNION、UNION ALL、INTERSECT、MINUS)<br />
&nbsp;&nbsp; 集合运算组合两个或多个部分查询的结果到一个结果中。包含集合运算的查询称为复合查询。<br />
Operator&nbsp;&nbsp;Returns<br />
UNION(联合)&nbsp;&nbsp;由每个查询选择的所有不同的行(无重复值)<br />
UNION ALL&nbsp;&nbsp;由每个查询选择的所有的行，包括所有重复的行<br />
INTERSECT(交叉)&nbsp;&nbsp;由两个查询选择的所有不同的行<br />
MINUS&nbsp;&nbsp;&nbsp;由第一个查询选择的所有不同的行<br />
所有的集合运算与等号的优先级相同，如果SQL语句包含多个集合运算并且没有圆括号明确地指定另一个顺序，Oracle服务器将以从左到右的顺序计算。你应该使用圆括号来明确地指定带另外的集合运算INTERSECT (相交) 运算查询中的赋值顺序。<br />
&nbsp;&nbsp;&nbsp; INTERSECT (相交) 和MINUS (相减) 运算不是ANSI SQL-99兼容的，他们是Oracle特定的。</p>
<p><br />
■联合(UNION)<br />
UNION(联合)运算<br />
UNION运算返回所有由任一查询选择的行。用UNION运算从多表返回所有行，但除去任何重复的行。<br />
･原则<br />
:: 被选择的列数和列的数据类型必须是与所有用在查询中的SELECT语句一致。列的名字不必相同。<br />
:: 联合运算在所有被选择的列上进行。<br />
:: 在做重复检查的时候不忽略空(NULL)值。<br />
:: IN运算有比UNION运算高的优先级。<br />
:: 在默认情况下，输出以SELECT子句的第一列的升序排序。</p>
<p><br />
■全联合(UNION ALL) <br />
运算从两个查询返回包括所有重复值的结果<br />
原则<br />
:: 和联合不同，重复的行不被过滤，并且默认情况下输出不排序。<br />
:: 不能使用DISTINCT关键字。<br />
&nbsp;&nbsp; 注：除了上面的两点，UNION ALL的原则与UNION相同。</p>
<p><br />
■相交(INTERSECT) <br />
用相交运算返回多个查询中所有的公共行。<br />
原则<br />
:: 在查询中被 SELECT 语句选择的列数和数据类型必须与在查询中所使用的所有的 SELTCT 语句中的&nbsp;&nbsp; 一样，但列的名字不必一样。<br />
:: 颠倒相交的表的排序不改变结果。<br />
:: 相交不忽略空值。</p>
<p><br />
■相减(MINUS) <br />
用相减运算返回由第一个查询返回的行，那些行不出现在第二个查询中 (第一个SELECT语句减第二个SELECT语句)。<br />
原则<br />
:: 在查询中被SELECT语句选择的列数和数据类型必须与在查询中所使用的所有的SELTCT语句中的一样，但列的名字不必一样。<br />
:: 对于MINUS运算，在WHERE子句中所有的列都必须在SELECT子句中。<br />
■<br />
※集合运算的原则<br />
:: 在两个SELECT列表中的表达式必须在数目上和数据类型上相匹配<br />
:: 可以用圆括号改变执行的顺序<br />
:: ORDER BY子句：<br />
&nbsp;&#8211;只能出现在语句的最后<br />
&nbsp;&#8211;从第一个SELECT语句接收列名、别名，或者位置记号<br />
:: 集合运算可以用在子查询中。</p>
<p><br />
■Oracle 服务器和集合运算<br />
:: 除了UNION ALL，重复行自动被清除<br />
:: 在结果中的列名是第一个查询中出现的列名<br />
:: 除了UNION ALL(无排序)，默认情况下按升序顺序输出<br />
在一个复合查询的各查询组成部分的选择列表中相应的表达式必须在数目和类型上匹配。如果查询的组成部分选择字符数据，返回值的数据类型被如下决定：<br />
&nbsp;:: 如果查询选择的数据类型的值为CHAR，那么，返回值的数据类型也为CHAR。<br />
&nbsp;:: 如果查询选择的两者之一或两者的数据类型值为VARCHAR2，那么，返回值的数据类型也是VARCHAR2。</p>
<p><br />
&nbsp; 你可能需要提及，输出以第一个SELECT子句的第一列的升序被排序，然后是第二列，等等。</p>
<p><br />
■匹配SELECT语句&nbsp;//凑数<br />
eg:<br />
SELECT department_id, TO_NUMBER(null) location, hire_date<br />
FROM employees<br />
UNION<br />
SELECT department_id, location_id, TO_DATE(null)<br />
FROM departments;</p>
<p><br />
DEPARTMENT_ID&nbsp;&nbsp; LOCATION HIRE_DATE<br />
------------- ---------- ----------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21-4月 -00<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1700<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-6月 -87<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21-9月 -89<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13-1月 -93<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1700<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16-8月 -94<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-8月 -94<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 28-9月 -97<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30-9月 -97<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 07-3月 -98</p>
<p><br />
匹配SELECT语句<br />
&nbsp;&nbsp;&nbsp; 由于在两个查询的SELECT列表中的表达式必须在数量上匹配，你可以使用虚拟列和转换函数数据类型来满足该规则。在幻灯片中使用了虚拟列，在第一个查询中的TO_NUMBER函数被用以匹配第二个查询中返回的LOCATION_ID列的数字数据类型，同样地，第二个查询中的TO_DATE函数被用于匹配 第一个查询返回的日期数据类型。</p>
<p>DIY部落(<a href="http://www.diybl.com/course/7_databases/oracle/oraclexl/20090825/171870.html">http://www.diybl.com/course/7_databases/oracle/oraclexl/20090825/171870.html</a>)</p>
  <img src ="http://www.blogjava.net/aczreg/aggbug/304275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2009-11-30 16:29 <a href="http://www.blogjava.net/aczreg/archive/2009/11/30/304275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle用户管理 </title><link>http://www.blogjava.net/aczreg/archive/2009/11/30/303962.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Mon, 30 Nov 2009 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2009/11/30/303962.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/303962.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2009/11/30/303962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/303962.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/303962.html</trackback:ping><description><![CDATA[<div class="postbody">
<p>A.用户角色必须要有用户操作权限才可以常见用户（例如sys,system）;<br />
<br />
B.1.创建一个用户：CREATE USER username IDENTIFIED BY password；<br />
&nbsp;&nbsp; 2.删除一个用户：DROP USER username CASCADE；--级联删除此用户相关文件<br />
&nbsp;&nbsp; 3.更改密码：ALTER USER username IDENTIFIED BY password;<br />
&nbsp;&nbsp; 4.锁定用户：ALTER USER username ACCOUNT LOCK; <br />
&nbsp;&nbsp; 5.解锁用户：ALTER USER username ACCOUNT UNLOCK; &nbsp;&nbsp;</p>
<p>C.1.GRANT privilege... ON object... TO {public|group|user}<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 赋予&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 权利&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 操作对象&nbsp;&nbsp;&nbsp;&nbsp; 给&nbsp;&nbsp; 群|用户<br />
&nbsp;&nbsp; &nbsp;&nbsp; GRANT roll. TO user<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 赋予&nbsp;&nbsp;&nbsp; 角色给 用户&nbsp;&nbsp;&nbsp; --角色：connect|resource|dba...&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; 2.REVOKE privilege... ON object... FROM {public|group|user}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取消&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 权利&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 操作对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 于&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 群|用户<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REVOKE roll. FROM user<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 撤销&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 角色&nbsp;&nbsp;&nbsp; 从&nbsp;&nbsp;&nbsp;&nbsp; 用户</p>
<p>D.1.登陆配置文件创建(错误三次锁定两天)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; CREATE　PROFILE　pname LIMIT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2; <br />
&nbsp;&nbsp;&nbsp; 2.给予用户此约束<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;ALTER USER user PROFILE pname; </p>
<br />
E 1.登陆、切换用户CONN[ECT]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用法: CONN[ECT] [logon] [AS {SYSDBA|SYSOPER}]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中 &lt;logon&gt;&nbsp; ::= &lt;username&gt;[/&lt;password&gt;][@&lt;connect_identifier&gt;]&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如：CONN scott\tiger<br />
&nbsp;<br />
F 1.查询Oracle共有多少中角色：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT * FROM DBA_ROLES；<br />
&nbsp;&nbsp; 2.查询一个用户具有何种角色：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE='SCOTT';<br />
&nbsp;&nbsp; 3.a.查询一个角色具有何种系统权限：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='RESOURCE';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.查询一个角色具有何种对象权限：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE='RESOURCE';<br />
<br />
&nbsp; </div>
<img src ="http://www.blogjava.net/aczreg/aggbug/303962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2009-11-30 15:28 <a href="http://www.blogjava.net/aczreg/archive/2009/11/30/303962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）Oracle函数大全</title><link>http://www.blogjava.net/aczreg/archive/2009/11/30/304255.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Mon, 30 Nov 2009 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2009/11/30/304255.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/304255.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2009/11/30/304255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/304255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/304255.html</trackback:ping><description><![CDATA[函数 <br />
1.ASCII <br />
返回与指定的字符对应的十进制数; <br />
SQL&gt; select ascii(&#8217;A&#8217;) A,ascii(&#8217;a&#8217;) a,ascii(&#8217;0&#8217;) zero,ascii(&#8217; &#8217;) space from dual; <br />
A A ZERO SPACE <br />
--------- --------- --------- --------- <br />
65 97 48 32
<p>2.CHR <br />
给出整数,返回对应的字符; <br />
SQL&gt; select chr(54740) zhao,chr(65) chr65 from dual; <br />
ZH C <br />
-- - <br />
赵 A <br />
3.CONCAT <br />
连接两个字符串; <br />
SQL&gt; select concat(&#8217;010-&#8217;,&#8217;88888888&#8217;)||&#8217;转23&#8217; 高乾竞电话 from dual; <br />
高乾竞电话 <br />
---------------- <br />
010-88888888转23 <br />
4.INITCAP <br />
返回字符串并将字符串的第一个字母变为大写; <br />
SQL&gt; select initcap(&#8217;smith&#8217;) upp from dual; <br />
UPP <br />
----- <br />
Smith</p>
<p>5.INSTR(C1,C2,I,J) <br />
在一个字符串中搜索指定的字符,返回发现指定的字符的位置; <br />
C1 被搜索的字符串 <br />
C2 希望搜索的字符串 <br />
I 搜索的开始位置,默认为1 <br />
J 出现的位置,默认为1 <br />
SQL&gt; select instr(&#8217;oracle traning&#8217;,&#8217;ra&#8217;,1,2) instring from dual; <br />
INSTRING <br />
--------- <br />
9</p>
<p>6.LENGTH <br />
返回字符串的长度; <br />
SQL&gt; select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst; <br />
NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL)) <br />
------ ------------ ---------------- ------------ --------- -------------------- <br />
高乾竞 3 北京市海锭区 6 9999.99 7</p>
<p>7.LOWER <br />
返回字符串,并将所有的字符小写 <br />
SQL&gt; select lower(&#8217;AaBbCcDd&#8217;)AaBbCcDd from dual; <br />
AABBCCDD <br />
-------- <br />
aabbccdd</p>
<p>8.UPPER <br />
返回字符串,并将所有的字符大写 <br />
SQL&gt; select upper(&#8217;AaBbCcDd&#8217;) upper from dual; <br />
UPPER <br />
-------- <br />
AABBCCDD</p>
<p>9.RPAD和LPAD(粘贴字符) <br />
RPAD 在列的右边粘贴字符 <br />
LPAD 在列的左边粘贴字符 <br />
SQL&gt; select lpad(rpad(&#8217;gao&#8217;,10,&#8217;*&#8217;),17,&#8217;*&#8217;)from dual; <br />
LPAD(RPAD(&#8217;GAO&#8217;,1 <br />
----------------- <br />
*******gao******* <br />
不够字符则用*来填满</p>
<p>10.LTRIM和RTRIM <br />
LTRIM 删除左边出现的字符串 <br />
RTRIM 删除右边出现的字符串 <br />
SQL&gt; select ltrim(rtrim(&#8217; gao qian jing &#8217;,&#8217; &#8217;),&#8217; &#8217;) from dual; <br />
LTRIM(RTRIM(&#8217; <br />
------------- <br />
gao qian jing</p>
<p>11.SUBSTR(string,start,count) <br />
取子字符串,从start开始,取count个 <br />
SQL&gt; select substr(&#8217;13088888888&#8217;,3,8) from dual; <br />
SUBSTR(&#8217; <br />
-------- <br />
08888888</p>
<p>12.REPLACE(&#8217;string&#8217;,&#8217;s1&#8217;,&#8217;s2&#8217;) <br />
string 希望被替换的字符或变量 <br />
s1 被替换的字符串 <br />
s2 要替换的字符串 <br />
SQL&gt; select replace(&#8217;he love you&#8217;,&#8217;he&#8217;,&#8217;i&#8217;) from dual; <br />
REPLACE(&#8217;H <br />
---------- <br />
i love you</p>
<p>13.SOUNDEX <br />
返回一个与给定的字符串读音相同的字符串 <br />
SQL&gt; create table table1(xm varchar(8)); <br />
SQL&gt; insert into table1 values(&#8217;weather&#8217;); <br />
SQL&gt; insert into table1 values(&#8217;wether&#8217;); <br />
SQL&gt; insert into table1 values(&#8217;gao&#8217;); <br />
SQL&gt; select xm from table1 where soundex(xm)=soundex(&#8217;weather&#8217;); <br />
XM <br />
-------- <br />
weather <br />
wether</p>
<p>14.TRIM(&#8217;s&#8217; from &#8217;string&#8217;) <br />
LEADING 剪掉前面的字符 <br />
TRAILING 剪掉后面的字符 <br />
如果不指定,默认为空格符 <br />
15.ABS <br />
返回指定值的绝对值 <br />
SQL&gt; select abs(100),abs(-100) from dual; <br />
ABS(100) ABS(-100) <br />
--------- --------- <br />
100 100</p>
<p>16.ACOS <br />
给出反余弦的值 <br />
SQL&gt; select acos(-1) from dual; <br />
ACOS(-1) <br />
--------- <br />
3.1415927</p>
<p>17.ASIN <br />
给出反正弦的值 <br />
SQL&gt; select asin(0.5) from dual; <br />
ASIN(0.5) <br />
--------- <br />
.52359878</p>
<p>18.ATAN <br />
返回一个数字的反正切值 <br />
SQL&gt; select atan(1) from dual; <br />
ATAN(1) <br />
--------- <br />
.78539816</p>
<p>19.CEIL <br />
返回大于或等于给出数字的最小整数 <br />
SQL&gt; select ceil(3.1415927) from dual; <br />
CEIL(3.1415927) <br />
--------------- <br />
4</p>
<p>20.COS <br />
返回一个给定数字的余弦 <br />
SQL&gt; select cos(-3.1415927) from dual; <br />
COS(-3.1415927) <br />
--------------- <br />
-1<br />
21.COSH <br />
返回一个数字反余弦值 <br />
SQL&gt; select cosh(20) from dual; <br />
COSH(20) <br />
--------- <br />
242582598</p>
<p>22.EXP <br />
返回一个数字e的n次方根 <br />
SQL&gt; select exp(2),exp(1) from dual; <br />
EXP(2) EXP(1) <br />
--------- --------- <br />
7.3890561 2.7182818</p>
<p>23.FLOOR <br />
对给定的数字取整数 <br />
SQL&gt; select floor(2345.67) from dual; <br />
FLOOR(2345.67) <br />
-------------- <br />
2345</p>
<p>24.LN <br />
返回一个数字的对数值 <br />
SQL&gt; select ln(1),ln(2),ln(2.7182818) from dual; <br />
LN(1) LN(2) LN(2.7182818) <br />
--------- --------- ------------- <br />
0 .69314718 .99999999</p>
<p>25.LOG(n1,n2) <br />
返回一个以n1为底n2的对数 <br />
SQL&gt; select log(2,1),log(2,4) from dual; <br />
LOG(2,1) LOG(2,4) <br />
--------- --------- <br />
0 2</p>
<p>26.MOD(n1,n2) <br />
返回一个n1除以n2的余数 <br />
SQL&gt; select mod(10,3),mod(3,3),mod(2,3) from dual; <br />
MOD(10,3) MOD(3,3) MOD(2,3) <br />
--------- -------- --------- <br />
1 0 2</p>
<p>27.POWER <br />
返回n1的n2次方根 <br />
SQL&gt; select power(2,10),power(3,3) from dual; <br />
POWER(2,10) POWER(3,3) <br />
----------- ---------- <br />
1024 27</p>
<p>28.ROUND和TRUNC <br />
按照指定的精度进行舍入 <br />
SQL&gt; select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual; <br />
ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5) <br />
----------- ------------ ----------- ------------ <br />
56 -55 55 -55</p>
<p>29.SIGN <br />
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0 <br />
SQL&gt; select sign(123),sign(-100),sign(0) from dual; <br />
SIGN(123) SIGN(-100) SIGN(0) <br />
--------- ---------- --------- <br />
1 -1 0</p>
<p>30.SIN <br />
返回一个数字的正弦值 <br />
SQL&gt; select sin(1.57079) from dual; <br />
SIN(1.57079) <br />
------------ <br />
1</p>
<p>31.SIGH <br />
返回双曲正弦的值 <br />
SQL&gt; select sin(20),sinh(20) from dual; <br />
SIN(20) SINH(20) <br />
--------- --------- <br />
.91294525 242582598</p>
<p>32.SQRT <br />
返回数字n的根 <br />
SQL&gt; select sqrt(64),sqrt(10) from dual; <br />
SQRT(64) SQRT(10) <br />
--------- --------- <br />
8 3.1622777</p>
<p>33.TAN <br />
返回数字的正切值 <br />
SQL&gt; select tan(20),tan(10) from dual; <br />
TAN(20) TAN(10) <br />
--------- --------- <br />
2.2371609 .64836083</p>
<p>34.TANH <br />
返回数字n的双曲正切值 <br />
SQL&gt; select tanh(20),tan(20) from dual; <br />
TANH(20) TAN(20) <br />
--------- --------- <br />
1 2.2371609</p>
<p>35.TRUNC <br />
按照指定的精度截取一个数 <br />
SQL&gt; select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual; <br />
TRUNC1 TRUNC(124.16666,2) <br />
--------- ------------------ <br />
100 124.16</p>
<p>36.ADD_MONTHS <br />
增加或减去月份 <br />
SQL&gt; select to_char(add_months(to_date(&#8217;199912&#8217;,&#8217;yyyymm&#8217;),2),&#8217;yyyymm&#8217;) from dual; <br />
TO_CHA <br />
------ <br />
200002 <br />
SQL&gt; select to_char(add_months(to_date(&#8217;199912&#8217;,&#8217;yyyymm&#8217;),-2),&#8217;yyyymm&#8217;) from dual; <br />
TO_CHA <br />
------ <br />
199910</p>
<p>37.LAST_DAY <br />
返回日期的最后一天 <br />
SQL&gt; select to_char(sysdate,&#8217;yyyy.mm.dd&#8217;),to_char((sysdate)+1,&#8217;yyyy.mm.dd&#8217;) from dual; <br />
TO_CHAR(SY TO_CHAR((S <br />
---------- ---------- <br />
2004.05.09 2004.05.10 <br />
SQL&gt; select last_day(sysdate) from dual; <br />
LAST_DAY(S <br />
---------- <br />
31-5月 -04</p>
<p>38.MONTHS_BETWEEN(date2,date1) <br />
给出date2-date1的月份 <br />
SQL&gt; select months_between(&#8217;19-12月-1999&#8217;,&#8217;19-3月-1999&#8217;) mon_between from dual; <br />
MON_BETWEEN <br />
----------- <br />
9 <br />
SQL&gt;selectmonths_between(to_date(&#8217;2000.05.20&#8217;,&#8217;yyyy.mm.dd&#8217;),to_date(&#8217;2005.05.20&#8217;,&#8217;yyyy.mm.dd&#8217;)) mon_betw from dual; <br />
MON_BETW <br />
--------- <br />
-60</p>
<p>39.NEW_TIME(date,&#8217;this&#8217;,&#8217;that&#8217;) <br />
给出在this时区=other时区的日期和时间 <br />
SQL&gt; select to_char(sysdate,&#8217;yyyy.mm.dd hh24:mi:ss&#8217;) bj_time,to_char(new_time <br />
2 (sysdate,&#8217;PDT&#8217;,&#8217;GMT&#8217;),&#8217;yyyy.mm.dd hh24:mi:ss&#8217;) los_angles from dual; <br />
BJ_TIME LOS_ANGLES <br />
------------------- ------------------- <br />
2004.05.09 11:05:32 2004.05.09 18:05:32</p>
<p>40.NEXT_DAY(date,&#8217;day&#8217;) <br />
给出日期date和星期x之后计算下一个星期的日期 <br />
SQL&gt; select next_day(&#8217;18-5月-2001&#8217;,&#8217;星期五&#8217;) next_day from dual; <br />
NEXT_DAY <br />
---------- <br />
25-5月 -01<br />
41.SYSDATE <br />
用来得到系统的当前日期 <br />
SQL&gt; select to_char(sysdate,&#8217;dd-mm-yyyy day&#8217;) from dual; <br />
TO_CHAR(SYSDATE,&#8217; <br />
----------------- <br />
09-05-2004 星期日 <br />
trunc(date,fmt)按照给出的要求将日期截断,如果fmt=&#8217;mi&#8217;表示保留分,截断秒 <br />
SQL&gt; select to_char(trunc(sysdate,&#8217;hh&#8217;),&#8217;yyyy.mm.dd hh24:mi:ss&#8217;) hh, <br />
2 to_char(trunc(sysdate,&#8217;mi&#8217;),&#8217;yyyy.mm.dd hh24:mi:ss&#8217;) hhmm from dual; <br />
HH HHMM <br />
------------------- ------------------- <br />
2004.05.09 11:00:00 2004.05.09 11:17:00</p>
<p>42.CHARTOROWID <br />
将字符数据类型转换为ROWID类型 <br />
SQL&gt; select rowid,rowidtochar(rowid),ename from scott.emp; <br />
ROWID ROWIDTOCHAR(ROWID) ENAME <br />
------------------ ------------------ ---------- <br />
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH <br />
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN <br />
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD <br />
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES</p>
<p>43.CONVERT(c,dset,sset) <br />
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集 <br />
SQL&gt; select convert(&#8217;strutz&#8217;,&#8217;we8hp&#8217;,&#8217;f7dec&#8217;) "conversion" from dual; <br />
conver <br />
------ <br />
strutz</p>
<p>44.HEXTORAW <br />
将一个十六进制构成的字符串转换为二进制</p>
<p>45.RAWTOHEXT <br />
将一个二进制构成的字符串转换为十六进制</p>
<p>46.ROWIDTOCHAR <br />
将ROWID数据类型转换为字符类型</p>
<p>47.TO_CHAR(date,&#8217;format&#8217;) <br />
SQL&gt; select to_char(sysdate,&#8217;yyyy/mm/dd hh24:mi:ss&#8217;) from dual; <br />
TO_CHAR(SYSDATE,&#8217;YY <br />
------------------- <br />
2004/05/09 21:14:41</p>
<p>48.TO_DATE(string,&#8217;format&#8217;) <br />
将字符串转化为ORACLE中的一个日期</p>
<p>49.TO_MULTI_BYTE <br />
将字符串中的单字节字符转化为多字节字符 <br />
SQL&gt; select to_multi_byte(&#8217;高&#8217;) from dual; <br />
TO <br />
-- <br />
高</p>
<p>50.TO_NUMBER <br />
将给出的字符转换为数字 <br />
SQL&gt; select to_number(&#8217;1999&#8217;) year from dual; <br />
YEAR <br />
--------- <br />
1999</p>
<p>51.BFILENAME(dir,file) <br />
指定一个外部二进制文件 <br />
SQL&gt;insert into file_tb1 values(bfilename(&#8217;lob_dir1&#8217;,&#8217;image1.gif&#8217;));</p>
<p>52.CONVERT(&#8217;x&#8217;,&#8217;desc&#8217;,&#8217;source&#8217;) <br />
将x字段或变量的源source转换为desc <br />
SQL&gt; select sid,serial#,username,decode(command, <br />
2 0,&#8217;none&#8217;, <br />
3 2,&#8217;insert&#8217;, <br />
4 3, <br />
5 &#8217;select&#8217;, <br />
6 6,&#8217;update&#8217;, <br />
7 7,&#8217;delete&#8217;, <br />
8 8,&#8217;drop&#8217;, <br />
9 &#8217;other&#8217;) cmd from v$session where type!=&#8217;background&#8217;; <br />
SID SERIAL# USERNAME CMD <br />
--------- --------- ------------------------------ ------ <br />
1 1 none <br />
2 1 none <br />
3 1 none <br />
4 1 none <br />
5 1 none <br />
6 1 none <br />
7 1275 none <br />
8 1275 none <br />
9 20 GAO select <br />
10 40 GAO none</p>
<p>53.DUMP(s,fmt,start,length) <br />
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值 <br />
SQL&gt; col global_name for a30 <br />
SQL&gt; col dump_string for a50 <br />
SQL&gt; set lin 200 <br />
SQL&gt; select global_name,dump(global_name,1017,8,5) dump_string from global_name; <br />
GLOBAL_NAME DUMP_STRING <br />
------------------------------ -------------------------------------------------- <br />
ORACLE.WORLD Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D</p>
<p>54.EMPTY_BLOB()和EMPTY_CLOB() <br />
这两个函数都是用来对大数据类型字段进行初始化操作的函数</p>
<p>55.GREATEST <br />
返回一组表达式中的最大值,即比较字符的编码大小. <br />
SQL&gt; select greatest(&#8217;AA&#8217;,&#8217;AB&#8217;,&#8217;AC&#8217;) from dual; <br />
GR <br />
-- <br />
AC <br />
SQL&gt; select greatest(&#8217;啊&#8217;,&#8217;安&#8217;,&#8217;天&#8217;) from dual; <br />
GR <br />
-- <br />
天</p>
<p>56.LEAST <br />
返回一组表达式中的最小值 <br />
SQL&gt; select least(&#8217;啊&#8217;,&#8217;安&#8217;,&#8217;天&#8217;) from dual; <br />
LE <br />
-- <br />
啊</p>
<p>57.UID <br />
返回标识当前用户的唯一整数 <br />
SQL&gt; show user <br />
USER 为"GAO" <br />
SQL&gt; select username,user_id from dba_users where user_id=uid; <br />
USERNAME USER_ID <br />
------------------------------ --------- <br />
GAO 25</p>
<p>58.USER <br />
返回当前用户的名字 <br />
SQL&gt; select user from dual; <br />
USER <br />
------------------------------ <br />
GAO</p>
<p>59.USEREVN <br />
返回当前用户环境的信息,opt可以是: <br />
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE <br />
ISDBA 查看当前用户是否是DBA如果是则返回true <br />
SQL&gt; select userenv(&#8217;isdba&#8217;) from dual; <br />
USEREN <br />
------ <br />
FALSE <br />
SQL&gt; select userenv(&#8217;isdba&#8217;) from dual; <br />
USEREN <br />
------ <br />
TRUE <br />
SESSION <br />
返回会话标志 <br />
SQL&gt; select userenv(&#8217;sessionid&#8217;) from dual; <br />
USERENV(&#8217;SESSIONID&#8217;) <br />
-------------------- <br />
152 <br />
ENTRYID <br />
返回会话人口标志 <br />
SQL&gt; select userenv(&#8217;entryid&#8217;) from dual; <br />
USERENV(&#8217;ENTRYID&#8217;) <br />
------------------ <br />
0 <br />
INSTANCE <br />
返回当前INSTANCE的标志 <br />
SQL&gt; select userenv(&#8217;instance&#8217;) from dual; <br />
USERENV(&#8217;INSTANCE&#8217;) <br />
------------------- <br />
1 <br />
LANGUAGE <br />
返回当前环境变量 <br />
SQL&gt; select userenv(&#8217;language&#8217;) from dual; <br />
USERENV(&#8217;LANGUAGE&#8217;) <br />
---------------------------------------------------- <br />
SIMPLIFIED CHINESE_CHINA.ZHS16GBK <br />
LANG <br />
返回当前环境的语言的缩写 <br />
SQL&gt; select userenv(&#8217;lang&#8217;) from dual; <br />
USERENV(&#8217;LANG&#8217;) <br />
---------------------------------------------------- <br />
ZHS <br />
TERMINAL <br />
返回用户的终端或机器的标志 <br />
SQL&gt; select userenv(&#8217;terminal&#8217;) from dual; <br />
USERENV(&#8217;TERMINA <br />
---------------- <br />
GAO <br />
VSIZE(X) <br />
返回X的大小(字节)数 <br />
SQL&gt; select vsize(user),user from dual; <br />
VSIZE(USER) USER <br />
----------- ------------------------------ <br />
6 SYSTEM</p>
<p><br />
60.AVG(DISTINCT|ALL) <br />
all表示对所有的值求平均值,distinct只对不同的值求平均值 <br />
SQLWKS&gt; create table table3(xm varchar(8),sal number(7,2)); <br />
语句已处理。 <br />
SQLWKS&gt; insert into table3 values(&#8217;gao&#8217;,1111.11); <br />
SQLWKS&gt; insert into table3 values(&#8217;gao&#8217;,1111.11); <br />
SQLWKS&gt; insert into table3 values(&#8217;zhu&#8217;,5555.55); <br />
SQLWKS&gt; commit; <br />
SQL&gt; select avg(distinct sal) from gao.table3; <br />
AVG(DISTINCTSAL) <br />
---------------- <br />
3333.33 <br />
SQL&gt; select avg(all sal) from gao.table3; <br />
AVG(ALLSAL) <br />
----------- <br />
2592.59</p>
<p>61.MAX(DISTINCT|ALL) <br />
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次 <br />
SQL&gt; select max(distinct sal) from scott.emp; <br />
MAX(DISTINCTSAL) <br />
---------------- <br />
5000</p>
<p>62.MIN(DISTINCT|ALL) <br />
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次 <br />
SQL&gt; select min(all sal) from gao.table3; <br />
MIN(ALLSAL) <br />
----------- <br />
1111.11</p>
<p>63.STDDEV(distinct|all) <br />
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差 <br />
SQL&gt; select stddev(sal) from scott.emp; <br />
STDDEV(SAL) <br />
----------- <br />
1182.5032 <br />
SQL&gt; select stddev(distinct sal) from scott.emp; <br />
STDDEV(DISTINCTSAL) <br />
------------------- <br />
1229.951</p>
<p>64.VARIANCE(DISTINCT|ALL) <br />
求协方差 <br />
SQL&gt; select variance(sal) from scott.emp; <br />
VARIANCE(SAL) <br />
------------- <br />
1398313.9</p>
<p>65.GROUP BY <br />
主要用来对一组数进行统计 <br />
SQL&gt; select deptno,count(*),sum(sal) from scott.emp group by deptno; <br />
DEPTNO COUNT(*) SUM(SAL) <br />
--------- --------- --------- <br />
10 3 8750 <br />
20 5 10875 <br />
30 6 9400</p>
<p>66.HAVING <br />
对分组统计再加限制条件 <br />
SQL&gt; select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)&gt;=5; <br />
DEPTNO COUNT(*) SUM(SAL) <br />
--------- --------- --------- <br />
20 5 10875 <br />
30 6 9400 <br />
SQL&gt; select deptno,count(*),sum(sal) from scott.emp having count(*)&gt;=5 group by deptno ; <br />
DEPTNO COUNT(*) SUM(SAL) <br />
--------- --------- --------- <br />
20 5 10875 <br />
30 6 9400</p>
<p>67.ORDER BY <br />
用于对查询到的结果进行排序输出 <br />
SQL&gt; select deptno,ename,sal from scott.emp order by deptno,sal desc; <br />
DEPTNO ENAME SAL <br />
--------- ---------- --------- <br />
10 KING 5000 <br />
10 CLARK 2450 <br />
10 MILLER 1300 <br />
20 SCOTT 3000 <br />
20 FORD 3000 <br />
20 JONES 2975 <br />
20 ADAMS 1100 <br />
20 SMITH 800 <br />
30 BLAKE 2850 <br />
30 ALLEN 1600 <br />
30 TURNER 1500 <br />
30 WARD 1250 <br />
30 MARTIN 1250 <br />
30 JAMES 950</p>
<img src ="http://www.blogjava.net/aczreg/aggbug/304255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2009-11-30 14:28 <a href="http://www.blogjava.net/aczreg/archive/2009/11/30/304255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle表查询(2)</title><link>http://www.blogjava.net/aczreg/archive/2009/11/30/304239.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Mon, 30 Nov 2009 04:16:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2009/11/30/304239.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/304239.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2009/11/30/304239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/304239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/304239.html</trackback:ping><description><![CDATA[<p><strong>多表查询一般表达式：<br />
</strong>SELECT ...tx.cu,...FROM table1 t1，table2 t2,...tablen tn WHERE conditions;...--(conditions.count&gt;=n-1)<br />
首先确定要查询的字段以及要求条件字段会出现在那些表中，从而甄选出table1到tablen共n张表；<br />
为表起个别名（非必须），表名.字段 方式限定查询字段；<br />
分析归纳出限定条件（重点难点），不会少于n-1个；<br />
最后，有其他要求，如排序，酌情添加。<br />
<br />
<strong>自连接查询：</strong><br />
例表：SQL&gt; desc emp;<br />
Name&nbsp;&nbsp;&nbsp;&nbsp; Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nullable Default Comments <br />
-------- ------------ -------- ------- -------- <br />
EMPNO&nbsp;&nbsp;&nbsp; NUMBER(4)&nbsp;&nbsp;&nbsp;&nbsp;--职员编号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
ENAME&nbsp;&nbsp;&nbsp; VARCHAR2(10) Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
JOB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(9)&nbsp; Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
MGR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(4)&nbsp;&nbsp;&nbsp; Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--上级编号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
HIREDATE DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
SAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(7,2)&nbsp; Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
COMM&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(7,2)&nbsp; Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
DEPTNO&nbsp;&nbsp; NUMBER(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
问题：查询职员姓名，职员编号，职员上级姓名，职员上级编号；</p>
笨办法：利用SELECT造出另一张表<br />
SELECT emp.ename,emp.empno,empx.ename,empx.empno FROM emp,(SELECT empno,ename FROM emp) empx WHERE emp.mgr = empx.empno;<br />
好办法：利用别名造出另一张表<br />
SELECT cl.ename,cl.empno,ld.ename,ld.empno FROM emp cl,emp ld WHERE cl.mgr=ld.empno; <br />
<br />
<strong>分页查询</strong><br />
1.利用ROWID<br />
SELECT * FROM&nbsp;table WHERE ROWID IN <span style="background-color: #ccffff">(SELECT B.rid FROM <span style="background-color: #00ffff">(SELECT ROWNUM rn,A.rid FROM <span style="background-color: #33cccc"><span style="background-color: #008080">(SELECT ROWID rid FROM&nbsp;table ORDER BY tdid) </span></span>A WHERE ROWNUM&lt;=16380) </span>B WHERE B.rn&gt;=16351)</span> ORDER BY tdid;<br />
a-先按照tdid排序从table中选取ROWID表，另命名为A表；<br />
b-从A表补偿增加ROWNUM列，并A表ROWID列建立新表，并加分页行上限值限制选取最高行数，另命名为B表；<br />
c-从B表选择ROWID，并加分页行下限值选取最低行数，获得分页行的ROWID表；<br />
d-比较c步骤的ROWID表，从table选出相应行，排序，分页。<br />
2.利用ROWNUM<br />
SELECT * FROM (<span style="background-color: #ccffff">SELECT table.*,ROWNUM&nbsp;rn FROM table ORDER BY&nbsp;tdid DESC</span>) A WHERE A.rn BETWEEN 16351 AND 16380;<br />
a-选取table所有列，按照tdid排序，并在最后补偿ROWNUM列建立新表，另命名为A表；<br />
b-从A表选取rn在所取行数范围内的行，分页。<br />
<strong>一般</strong>：利用ROWID效率比利用ROWNUM高。<br />
<img src ="http://www.blogjava.net/aczreg/aggbug/304239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2009-11-30 12:16 <a href="http://www.blogjava.net/aczreg/archive/2009/11/30/304239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）Oracle函数列表速查</title><link>http://www.blogjava.net/aczreg/archive/2009/11/30/304217.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Mon, 30 Nov 2009 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2009/11/30/304217.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/304217.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2009/11/30/304217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/304217.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/304217.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt">PL/SQL单行函数和组函数详解<br />
　函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数，这些函数都可被称为SQL或PL/SQL语句，函数主要分为两大类： </span>
<p>&nbsp;</p>
<p><br />
<span style="font-size: 14pt">　　 单行函数</span></p>
<p><br />
<span style="font-size: 14pt">　　 组函数 </span></p>
<p><br />
<span style="font-size: 14pt">　　本文将讨论如何利用单行函数以及使用规则。</span></p>
<p><br />
<span style="font-size: 14pt">　　SQL中的单行函数</span></p>
<p><br />
<span style="font-size: 14pt">　　SQL和PL/SQL中自带很多类型的函数，有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据，因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中，例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。<br />
SELECT ename,TO_CHAR(hiredate,''day,DD-Mon-YYYY'')FROM empWhere UPPER(ename) Like ''AL%''ORDER BY SOUNDEX(ename)</span></p>
<p><br />
<span style="font-size: 14pt">　　单行函数也可以在其他语句中使用，如update的SET子句，INSERT的VALUES子句，DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数，所以我们的注意力也集中在SELECT语句中。</span></p>
<p><br />
<span style="font-size: 14pt">　　NULL和单行函数</span></p>
<p><br />
<span style="font-size: 14pt">　　在如何理解NULL上开始是很困难的，就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值，算术操作符的任何一个操作数为NULL值，结果均为提个NULL值,这个规则也适合很多函数，只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的，因为他能直接处理NULL值，NVL有两个参数：NVL(x1,x2),x1和x2都式表达式，当x1为null时返回X2,否则返回x1。</span></p>
<p><br />
<span style="font-size: 14pt">　　下面我们看看emp数据表它包含了薪水、奖金两项，需要计算总的补偿<br />
column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2</span></p>
<p><br />
<span style="font-size: 14pt">　　不是简单的将薪水和奖金加起来就可以了，如果某一行是null值那么结果就将是null，比如下面的例子：<br />
update empset salary=(salary+bonus)*1.1</span></p>
<p><br />
<span style="font-size: 14pt">　　这个语句中，雇员的工资和奖金都将更新为一个新的值，但是如果没有奖金，即 salary + null,那么就会得出错误的结论，这个时候就要使用nvl函数来排除null值的影响。<br />
所以正确的语句是：<br />
update empset salary=(salary+nvl(bonus,0)*1.1<br />
单行字符串函数</span></p>
<p><br />
<span style="font-size: 14pt">　　单行字符串函数用于操作字符串数据，他们大多数有一个或多个参数，其中绝大多数返回字符串</span></p>
<p><br />
<span style="font-size: 14pt">　　ASCII()<br />
　　c1是一字符串，返回c1第一个字母的ASCII码，他的逆函数是CHR()<br />
SELECT ASCII(''A'') BIG_A,ASCII(''z'') BIG_z FROM empBIG_A BIG_z65 122</span></p>
<p><br />
<span style="font-size: 14pt">　　CHR(＜i＞)[NCHAR_CS]<br />
　　i是一个数字，函数返回十进制表示的字符<br />
select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B</span></p>
<p><br />
<span style="font-size: 14pt">　　CONCAT(,)<br />
　　c1,c2均为字符串，函数将c2连接到c1的后面，如果c1为null,将返回c2.如果c2为null,则返回c1，如果c1、c2都为null，则返回null。他和操作符||返回的结果相同<br />
select concat(''slobo '',''Svoboda'') username from dualusernameslobo Syoboda</span></p>
<p><br />
<span style="font-size: 14pt">　　INITCAP()<br />
　　c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格，控制字符，标点符号限制。<br />
select INITCAP(''veni,vedi,vici'') Ceasar from dualCeasarVeni,Vedi,Vici</span></p>
<p><br />
<span style="font-size: 14pt">　　INSTR(,[,＜i＞[,]])<br />
　　c1,c2均为字符串，i,j为整数。函数返回c2在c1中第j次出现的位置，搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数，那么搜索将从右到左进行，但是位置的计算还是从左到右，i和j的缺省值为1.<br />
select INSTR(''Mississippi'',''i'',3,3) from dualINSTR(''MISSISSIPPI'',''I'',3,3)11select INSTR(''Mississippi'',''i'',-2,3) from dualINSTR(''MISSISSIPPI'',''I'',3,3)2</span></p>
<p><br />
<span style="font-size: 14pt">　　INSTRB(,[,i[,j])<br />
　　与INSTR（）函数一样，只是他返回的是字节，对于单字节INSTRB()等于INSTR()</span></p>
<p><br />
<span style="font-size: 14pt">　　LENGTH()<br />
　　c1为字符串，返回c1的长度，如果c1为null，那么将返回null值。<br />
select LENGTH(''Ipso Facto'') ergo from dualergo10</span></p>
<p><br />
<span style="font-size: 14pt">　　LENGTHb()<br />
　　与LENGTH()一样，返回字节.</span></p>
<p><br />
<span style="font-size: 14pt">　　lower()<br />
　　返回c的小写字符，经常出现在where子串中<br />
select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE ''%white%''COLORNAMEWinterwhite</span></p>
<p><br />
<span style="font-size: 14pt">　　LPAD(,＜i＞[,])<br />
　　c1,c2均为字符串，i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格，参见RPAD。<br />
select LPAD(answer,7,'''') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe</span></p>
<p><br />
<span style="font-size: 14pt">　　LTRIM(,)<br />
　　把c1中最左边的字符去掉，使其第一个字符不在c2中，如果没有c2，那么c1就不会改变。<br />
select LTRIM(''Mississippi'',''Mis'') from dualLTRppi</span></p>
<p><br />
<span style="font-size: 14pt">　　RPAD(,＜i＞[,]) <br />
　　在c1的右侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格,其他与LPAD相似</span></p>
<p><br />
<span style="font-size: 14pt">　　RTRIM(,)<br />
　　把c1中最右边的字符去掉，使其第后一个字符不在c2中，如果没有c2，那么c1就不会改变。</span></p>
<p><br />
<span style="font-size: 14pt">　　REPLACE(,[,])<br />
　　c1,c2,c3都是字符串，函数用c3代替出现在c1中的c2后返回。<br />
select REPLACE(''uptown'',''up'',''down'') from dualREPLACEdowntown</span></p>
<p><br />
<span style="font-size: 14pt">　　STBSTR(,＜i＞[,])<br />
　　c1为一字符串，i,j为整数，从c1的第i位开始返回长度为j的子字符串，如果j为空，则直到串的尾部。<br />
select SUBSTR(''Message'',1,4) from dualSUBSMess</span></p>
<p><br />
<span style="font-size: 14pt">　　SUBSTRB(,＜i＞[,])<br />
　　与SUBSTR大致相同，只是I,J是以字节计算。</span></p>
<p><br />
<span style="font-size: 14pt">　　SOUNDEX()<br />
　　返回与c1发音相似的词<br />
select SOUNDEX(''dawes'') Dawes SOUNDEX(''daws'') Daws, SOUNDEX(''dawson'') from dualDawes Daws DawsonD200 D200 D250</span></p>
<p><br />
<span style="font-size: 14pt">　　TRANSLATE(,,)<br />
　　将c1中与c2相同的字符以c3代替<br />
select TRANSLATE(''fumble'',''uf'',''ar'') test from dualTEXTramble </span></p>
<p><br />
<span style="font-size: 14pt">　　TRIM([[]] from c3)<br />
　　将c3串中的第一个，最后一个，或者都删除。<br />
select TRIM('' space padded '') trim from dual TRIMspace padded</span></p>
<p><br />
<span style="font-size: 14pt">　　UPPER()<br />
　　返回c1的大写，常出现where子串中<br />
select name from dual where UPPER(name) LIKE ''KI%''NAMEKING<br />
单行数字函数</span></p>
<p><br />
<span style="font-size: 14pt">　　单行数字函数操作数字数据，执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作数和值都是弧度而不是角度，oracle没有提供内建的弧度和角度的转换函数。</span></p>
<p><br />
<span style="font-size: 14pt">　　ABS()<br />
　　返回n的绝对值</span></p>
<p><br />
<span style="font-size: 14pt">　　ACOS()<br />
　　反余玄函数，返回-1到1之间的数。n表示弧度<br />
select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0 </span></p>
<p><br />
<span style="font-size: 14pt">　　ASIN()<br />
　　反正玄函数，返回-1到1，n表示弧度</span></p>
<p><br />
<span style="font-size: 14pt">　　ATAN()<br />
　　反正切函数，返回n的反正切值，n表示弧度。</span></p>
<p><br />
<span style="font-size: 14pt">　　CEIL()<br />
　　返回大于或等于n的最小整数。</span></p>
<p><br />
<span style="font-size: 14pt">　　COS()<br />
　　返回n的余玄值，n为弧度</span></p>
<p><br />
<span style="font-size: 14pt">　　COSH()<br />
　　返回n的双曲余玄值，n 为数字。<br />
select COSH(&lt;1.4&gt;) FROM dualCOSH(1.4)2.15089847</span></p>
<p><br />
<span style="font-size: 14pt">　　EXP()<br />
　　返回e的n次幂，e=2.71828183.</span></p>
<p><br />
<span style="font-size: 14pt">　　FLOOR()<br />
　　返回小于等于N的最大整数。</span></p>
<p><br />
<span style="font-size: 14pt">　　LN()<br />
　　返回N的自然对数，N必须大于0</span></p>
<p><br />
<span style="font-size: 14pt">　　LOG(,)<br />
　　返回以n1为底n2的对数</span></p>
<p><br />
<span style="font-size: 14pt">　　MOD()<br />
　　返回n1除以n2的余数，</span></p>
<p><br />
<span style="font-size: 14pt">　　POWER(,)<br />
　　返回n1的n2次方</span></p>
<p><br />
<span style="font-size: 14pt">　　ROUND(,)<br />
　　返回舍入小数点右边n2位的n1的值，n2的缺省值为0，这回将小数点最接近的整数，如果n2为负数就舍入到小数点左边相应的位上，n2必须是整数。<br />
select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54</span></p>
<p><br />
<span style="font-size: 14pt">　　SIGN()<br />
　　如果n为负数，返回-1,如果n为正数，返回1，如果n=0返回0.</span></p>
<p><br />
<span style="font-size: 14pt">　　SIN（)<br />
　　返回n的正玄值,n为弧度。</span></p>
<p><br />
<span style="font-size: 14pt">　　SINH()<br />
　　返回n的双曲正玄值,n为弧度。</span></p>
<p><br />
<span style="font-size: 14pt">　　SQRT()<br />
　　返回n的平方根,n为弧度</span></p>
<p><br />
<span style="font-size: 14pt">　　TAN（)<br />
　　返回n的正切值,n为弧度</span></p>
<p><br />
<span style="font-size: 14pt">　　TANH()<br />
　　返回n的双曲正切值,n为弧度</span></p>
<p><br />
<span style="font-size: 14pt">　　TRUNC(,)<br />
　　返回截尾到n2位小数的n1的值，n2缺省设置为0，当n2为缺省设置时会将n1截尾为整数，如果n2为负值，就截尾在小数点左边相应的位上。</span></p>
<br />
<br />
<br />
<span style="font-size: 14pt">单行日期函数 </span>
<p>&nbsp;</p>
<p><br />
<span style="font-size: 14pt">　　单行日期函数操作DATA数据类型，绝大多数都有DATA数据类型的参数，绝大多数返回的也是DATA数据类型的值。</span></p>
<p><br />
<span style="font-size: 14pt">　　ADD_MONTHS(,＜i＞)<br />
　　返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数，那么数据库将隐式的他转换成整数，将会截去小数点后面的部分。</span></p>
<p><br />
<span style="font-size: 14pt">　　LAST_DAY()<br />
　　函数返回包含日期d的月份的最后一天 </span></p>
<p><br />
<span style="font-size: 14pt">　　MONTHS_BETWEEN(,)<br />
　　返回d1和d2之间月的数目,如果d1和d2的日的日期都相同，或者都使该月的最后一天，那么将返回一个整数，否则会返回的结果将包含一个分数。</span></p>
<p><br />
<span style="font-size: 14pt">　　NEW_TIME(,,)<br />
　　d1是一个日期数据类型，当时区tz1中的日期和时间是d时，返回时区tz2中的日期和时间。tz1和tz2时字符串。</span></p>
<p><br />
<span style="font-size: 14pt">　　NEXT_DAY(,)<br />
　　返回日期d后由dow给出的条件的第一天，dow使用当前会话中给出的语言指定了一周中的某一天，返回的时间分量与d的时间分量相同。<br />
select NEXT_DAY(''01-Jan-2000'',''Monday'') "1st Monday",NEXT_DAY(''01-Nov-2004'',''Tuesday'')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004 </span></p>
<p><br />
<span style="font-size: 14pt">　　ROUND([,])<br />
　　将日期d按照fmt指定的格式舍入，fmt为字符串。</span></p>
<p><br />
<span style="font-size: 14pt">　　SYADATE<br />
　　函数没有参数，返回当前日期和时间。</span></p>
<p><br />
<span style="font-size: 14pt">　　TRUNC([,]) <br />
　　返回由fmt指定的单位的日期d.<br />
单行转换函数</span></p>
<p><br />
<span style="font-size: 14pt">　　单行转换函数用于操作多数据类型，在数据类型之间进行转换。</span></p>
<p><br />
<span style="font-size: 14pt">　　CHARTORWID()<br />
　　c 使一个字符串，函数将c转换为RWID数据类型。<br />
SELECT test_id from test_case where rowid=CHARTORWID(''AAAA0SAACAAAALiAAA'') </span></p>
<p><br />
<span style="font-size: 14pt">　　CONVERT(,[,])<br />
　　c尾字符串，dset、sset是两个字符集，函数将字符串c由sset字符集转换为dset字符集，sset的缺省设置为数据库的字符集。</span></p>
<p><br />
<span style="font-size: 14pt">　　HEXTORAW()<br />
　　x为16进制的字符串，函数将16进制的x转换为RAW数据类型。</span></p>
<p><br />
<span style="font-size: 14pt">　　RAWTOHEX()<br />
　　x是RAW数据类型字符串，函数将RAW数据类转换为16进制的数据类型。</span></p>
<p><br />
<span style="font-size: 14pt">　　ROWIDTOCHAR()<br />
　　函数将ROWID数据类型转换为CHAR数据类型。</span></p>
<p><br />
<span style="font-size: 14pt">　　TO_CHAR([[,)<br />
　　x是一个data或number数据类型，函数将x转换成fmt指定格式的char数据类型，如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符，以及货币符号。<br />
NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"</span></p>
<p><br />
<span style="font-size: 14pt">　　TO_DATE([,[,）<br />
　　c表示字符串，fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。</span></p>
<p><br />
<span style="font-size: 14pt">　　TO_MULTI_BYTE()<br />
　　c表示一个字符串，函数将c的担子截字符转换成多字节字符。</span></p>
<p><br />
<span style="font-size: 14pt">　　TO_NUMBER([,[,)<br />
　　c表示字符串，fmt表示一个特殊格式的字符串，函数返回值按照fmt指定的格式显示。nlsparm表示语言，函数将返回c代表的数字。</span></p>
<p><br />
<span style="font-size: 14pt">　　TO_SINGLE_BYTE()<br />
　　将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用</span></p>
<p><br />
<span style="font-size: 14pt">　　其它单行函数</span></p>
<p><br />
<span style="font-size: 14pt">　　BFILENAME( <br />
,)<br />
　　dir是一个directory类型的对象，file为一文件名。函数返回一个空的BFILE位置值指示符，函数用于初始化BFILE变量或者是BFILE列。</span></p>
<p><br />
<span style="font-size: 14pt">　　DECODE(,,[,,,[])<br />
　　x是一个表达式，m1是一个匹配表达式，x与m1比较，如果m1等于x，那么返回r1,否则,x与m2比较，依次类推m3,m4,m5....直到有返回结果。</span></p>
<p><br />
<span style="font-size: 14pt">　　DUMP(,[,[,[,]]])<br />
　　x是一个表达式或字符，fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。</span></p>
<p><br />
<span style="font-size: 14pt">　　EMPTY_BLOB()<br />
　　该函数没有参数，函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。</span></p>
<p><br />
<span style="font-size: 14pt">　　EMPTY_CLOB()<br />
　　该函数没有参数，函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。</span></p>
<p><br />
<span style="font-size: 14pt">　　GREATEST()<br />
　　exp_list是一列表达式，返回其中最大的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，那么返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。</span></p>
<p><br />
<span style="font-size: 14pt">　　LEAST()<br />
　　exp_list是一列表达式，返回其中最小的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，将返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。</span></p>
<p><br />
<span style="font-size: 14pt">　　UID<br />
　　该函数没有参数，返回唯一标示当前数据库用户的整数。</span></p>
<p><br />
<span style="font-size: 14pt">　　USER<br />
　　返回当前用户的用户名</span></p>
<p><br />
<span style="font-size: 14pt">　　USERENV()<br />
　　基于opt返回包含当前会话信息。opt的可选值为：</span></p>
<p><br />
<span style="font-size: 14pt">　　ISDBA　 　　会话中SYSDBA脚色响应，返回TRUE <br />
　　SESSIONID 　返回审计会话标示符<br />
　　ENTRYID 　　返回可用的审计项标示符 <br />
　　INSTANCE　　在会话连接后，返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。<br />
　　LANGUAGE　　返回语言、地域、数据库设置的字符集。<br />
　　LANG　　　　返回语言名称的ISO缩写。<br />
　　TERMINAL　　为当前会话使用的终端或计算机返回操作系统的标示符。</span></p>
<p><br />
<font size="2"><span style="font-size: 14pt">　　VSIZE()<br />
　　x是一个表达式。返回x内部表示的字节数。<br />
<br />
<br />
<span style="background-color: #00ccff"><span><span style="background-color: #ffffff">SQL中的组函数</span></span></span></span></font></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　组函数也叫集合函数，返回基于多个行的单一结果，行的准确数量无法确定，除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是，在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　组（多行）函数</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　与单行函数相比，oracle提供了丰富的基于组的，多行的函数。这些函数可以在select或select的having子句中使用，当用于select子串时常常都和GROUP BY一起使用。</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　AVG([{DISYINCT|ALL}])<br />
　　返回数值的平均值。缺省设置为ALL.<br />
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　COUNT({*|DISTINCT|ALL} )<br />
　　返回查询中行的数目，缺省设置是ALL,*表示返回所有的行。</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　MAX([{DISTINCT|ALL}])<br />
　　返回选择列表项目的最大值，如果x是字符串数据类型，他返回一个VARCHAR2数据类型，如果X是一个DATA数据类型，返回一个日期，如果X是numeric数据类型，返回一个数字。注意distinct和all不起作用，应为最大值与这两种设置是相同的。</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　MIN([{DISTINCT|ALL}])<br />
　　返回选择列表项目的最小值。</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　STDDEV([{DISTINCT|ALL}])<br />
　　返回选者的列表项目的标准差，所谓标准差是方差的平方根。</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　SUM([{DISTINCT|ALL}])<br />
　　返回选择列表项目的数值的总和。</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　VARIANCE([{DISTINCT|ALL}])<br />
　　返回选择列表项目的统计方差。</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　用GROUP BY给数据分组</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　正如题目暗示的那样组函数就是操作那些已经分好组的数据，我们告诉数据库用GROUP BY怎样给数据分组或者分类，当我们在SELECT语句的SELECT子句中使用组函数时，我们必须把为分组或非常数列放置在GROUP BY子句中，如果没有用group by进行专门处理，那么缺省的分类是将整个结果设为一类。<br />
select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　在这个例子中，我们用state字段分类；如果我们要将结果按照zip_codes排序,可以用ORDER BY语句，ORDER BY子句可以使用列或组函数。<br />
select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　用HAVING子句限制分组数据</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数，组函数只能用于两个子串中，组函数不能用于WHERE子串中，例如下面的查询是错误的：<br />
错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept=''OUTSIDE'' AND SUM(sale_amount)&gt;10000 GROUP BY sales_clerk</span></span></span></span></span></p>
<p><br />
<span style="background-color: #00ccff"><span><span style="font-size: 14pt"><span style="background-color: #ffffff"><span style="color: #003366">　　这个语句中数据库不知道SUM()是什么，当我们需要指示数据库对行分组，然后限制分组后的行的输出时，正确的方法是使用HAVING语句：<br />
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept=''OUTSIDE'' GROUP BY sales_clerkHAVING SUM(sale_amount)&gt;10000;</span></span></span></span></span></p>
<p><br />
<span style="font-size: 14pt">　　嵌套函数</span></p>
<p><br />
<span style="font-size: 14pt">　　函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置，函数遵循由内到外，由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。</span></p>
<p><br />
<span style="font-size: 14pt">　　嵌套函数可以包括在组函数中嵌套单行函数，或者组函数嵌套入单行函数或组函数中。比如下面的例子：<br />
SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,COUNT(DISTINCT job) jobs,COUNT(DISTINCT mgr) mgrsFROM empGROUP BY deptno;DEPTNO CNT JOBS MGRS------ --- ---- ----10 4 4 220 4 3 430 3 3 2 </span></p>
<img src ="http://www.blogjava.net/aczreg/aggbug/304217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2009-11-30 10:19 <a href="http://www.blogjava.net/aczreg/archive/2009/11/30/304217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle表查询</title><link>http://www.blogjava.net/aczreg/archive/2009/11/28/304029.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Sat, 28 Nov 2009 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2009/11/28/304029.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/304029.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2009/11/28/304029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/304029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/304029.html</trackback:ping><description><![CDATA[<p><strong>查询时过滤重复行DISTINCT关键字<br />
</strong>如：<br />
SELECT DISTINCT deptno,job FROM emp;<br />
<br />
<strong>NULL运算处理：</strong><br />
NVL判断<br />
如：<br />
SELECT ename,(sal+comm)*12 "annsal" FROM emp;--当comm为null时整个算式为空<br />
SELECT ename,(sal+NVL(comm,0))*12 "annsal" FROM emp;--当comm为null时替换为0<br />
<br />
<strong>LIKE匹配：</strong><br />
%任意个数字符；-单个字符<br />
如：<br />
SELECT * FROM emp WHERE ename LIKE 'S%';<br />
SELECT * FROM emp WHERE ename LIKE 'S__T_';<br />
<br />
<strong>排序ORDER BY 和 ASC 与 DESC</strong><br />
ASC与升序，可省缺；DESC降序<br />
如：<br />
SELECT * FROM emp ORDER BY sal <span style="color: #ffcc00">ASC</span>;<br />
SELECT * FROM emp ORDER BY sal <span style="color: #ff0000">DESC</span>;<br />
--C先按照deptno升序，同deptno里按sal降序<br />
SELECT * FROM emp ORDER BY deptno ASC,sal DESC;<br />
<br />
<strong>排序GROUP BY 与 HAVING<br />
</strong>GROUP BY分组排列，与ORDER BY一样，其后跟字段次序，也就是分组优先次序；&nbsp;<br />
SELECT AVG(sal),MAX(sal),deptno,job FROM emp GROUP BY deptno,job;<br />
HAVING与GROUP BY联合使用，HAVING 后跟条件，下面两句效果是等同的：<br />
SELECT * FROM (SELECT AVG(sal) asal,deptno FROM emp GROUP BY deptno) A WHERE A.asal&gt;2000;<br />
SELECT AVG(sal),DEPTNO FROM emp GROUP BY deptno HAVING AVG(sal)&gt;2000;<br />
<br />
<strong>注：</strong>组函数只能出现在选择列表、HAVING、ORDER BY子句中；<br />
SELECT语句中出现以下三者，其出现顺序限定为GROUP BY、HAVING、ORDER BY；<br />
<br />
</p>
<img src ="http://www.blogjava.net/aczreg/aggbug/304029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2009-11-28 16:59 <a href="http://www.blogjava.net/aczreg/archive/2009/11/28/304029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle表操作</title><link>http://www.blogjava.net/aczreg/archive/2009/11/27/303961.html</link><dc:creator>咖啡企鹅</dc:creator><author>咖啡企鹅</author><pubDate>Fri, 27 Nov 2009 10:34:00 GMT</pubDate><guid>http://www.blogjava.net/aczreg/archive/2009/11/27/303961.html</guid><wfw:comment>http://www.blogjava.net/aczreg/comments/303961.html</wfw:comment><comments>http://www.blogjava.net/aczreg/archive/2009/11/27/303961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aczreg/comments/commentRss/303961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aczreg/services/trackbacks/303961.html</trackback:ping><description><![CDATA[<div class="postbody">
<p><font color="#ff0000"><span style="color: #000000"><span style="font-family: Lucida Console"><strong>增加一个列：</strong><br />
ALTER TABLE 表名 ADD(列名 数据类型);<br />
如：<br />
ALTER TABLE emp ADD(weight NUMBER(5,0));</span></span></font></p>
<font color="#000000">
<p><font color="#ff0000"><span style="color: #000000"><span style="font-family: Lucida Console"><strong>修改一个列的数据类型(一般限于修改长度，修改为一个不同类型时有诸多限制):<br />
</strong>ALTER TABLE 表名 MODIFY(列名 数据类型);<br />
如：<br />
ALTER TABLE emp MODIFY(weight NUMBER(3,0) NOT NULL);<br />
</span></span></font></p>
<p><font color="#ff0000"><span style="color: #000000"><strong><br />
<span style="font-family: Lucida Console">给列改名：</span></strong><br />
<span style="font-family: Lucida Console">ALTER TABLE 表名 RENAME COLUMN 当前列名 TO 新列名;<br />
如：<br />
ALTER TABLE emp RENAME COLUMN weight TO weight_new;</span></span></font></p>
<p><font color="#ff0000"><span style="color: #000000"><span style="font-family: Lucida Console"><strong>删除一个列：</strong><br />
ALTER TABLE 表名 DROP COLUMN 列名;<br />
如：<br />
ALTER TABLE emp DROP COLUMN weight_new;</span></span></font></p>
<p><font color="#ff0000"><span style="color: #000000"><span style="font-family: Lucida Console"><strong>将一个表改名：<br />
</strong>ALTER TABLE 当前表名 RENAME TO 新表名;<br />
如：<br />
ALTER TABLE&nbsp;emp RENAME TO emp_new;<br />
<br />
<strong>删除一个表：</strong><br />
DROP TABLE 表名；<br />
如：<br />
DROP TABLE emp;<br />
<br />
<strong>删除一个表的数据：</strong><br />
DELETE&nbsp;TABLE 表名；<br />
如：<br />
DELETE&nbsp;TABLE emp;<br />
</span></span></font></p>
<br />
<span style="font-family: Lucida Console"><strong>格式化日期在一个SESSIONN中<br />
</strong>ORACLE默认日期格式如:'23-10<span style="color: #ff0000">月</span>-2008'(日-月-年)<br />
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';<br />
<strong><br />
查询空值NULL<br />
</strong>SELECT * FROM&nbsp;表名 WHERE&nbsp;列名 <span style="color: #ff0000">IS</span> NULL;<br />
如：<br />
SELECT * FROM emp WHERE weight <span style="color: #ff0000">IS</span> NULL;<br />
<br />
<strong>更新列值(改字段）<br />
</strong>UPDATE 表名 SET 列名=值 WHERE 条件；<br />
如：<br />
UPDATE emp SET salary=salary+100 WHERE weight &lt;= 80;<br />
</span><br />
<strong>一个SESSION中的SAVEPOINT与ROLLBACK;<br />
</strong>创建SAVEPOINT点：SAVEPOINT 名；<br />
如：<br />
SAVEPOINT a;<br />
<span style="color: #ffcc00">中间进行无COMMIT(提交)动作操作&#8230;&#8230;<br />
</span>回滚到SAVEPOINT: ROLLBACK&nbsp; TO 名;<br />
如：<br />
ROLLBACK TO a;<br />
<br />
</font></div>
<img src ="http://www.blogjava.net/aczreg/aggbug/303961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aczreg/" target="_blank">咖啡企鹅</a> 2009-11-27 18:34 <a href="http://www.blogjava.net/aczreg/archive/2009/11/27/303961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>