﻿<?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-sunny</title><link>http://www.blogjava.net/sunnygu/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:05:26 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:05:26 GMT</pubDate><ttl>60</ttl><item><title>wsad 小技巧----打开特定的wo'r'k's'pace</title><link>http://www.blogjava.net/sunnygu/archive/2007/09/13/144761.html</link><dc:creator>sunny</dc:creator><author>sunny</author><pubDate>Thu, 13 Sep 2007 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/sunnygu/archive/2007/09/13/144761.html</guid><wfw:comment>http://www.blogjava.net/sunnygu/comments/144761.html</wfw:comment><comments>http://www.blogjava.net/sunnygu/archive/2007/09/13/144761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnygu/comments/commentRss/144761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnygu/services/trackbacks/144761.html</trackback:ping><description><![CDATA[再shortcut 的target  后面加上-data  workspace path<br /><br />如"D:\Program Files\IBM\Rational\SDP\6.0\rationalsdp.exe" -data E:\EE-workspace\1600<img src ="http://www.blogjava.net/sunnygu/aggbug/144761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnygu/" target="_blank">sunny</a> 2007-09-13 10:55 <a href="http://www.blogjava.net/sunnygu/archive/2007/09/13/144761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j的配置</title><link>http://www.blogjava.net/sunnygu/archive/2007/06/05/122219.html</link><dc:creator>sunny</dc:creator><author>sunny</author><pubDate>Tue, 05 Jun 2007 11:37:00 GMT</pubDate><guid>http://www.blogjava.net/sunnygu/archive/2007/06/05/122219.html</guid><wfw:comment>http://www.blogjava.net/sunnygu/comments/122219.html</wfw:comment><comments>http://www.blogjava.net/sunnygu/archive/2007/06/05/122219.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnygu/comments/commentRss/122219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnygu/services/trackbacks/122219.html</trackback:ping><description><![CDATA[实际编程时，要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用。
     Log4j支持两种配置文件格式，一种是XML格式的文件，一种是java properties（key=value）【Java特性文件（键=值）】。下面我们介绍使用Java特性文件做为配置文件的方法
    具体如下：
　　
　　1、配置根Logger，其语法为：
　　log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
          level : 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。
　　      appenderName:就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
    例如：log4j.rootLogger＝info,A1,B2,C3
　　
　　2、配置日志信息输出目的地，其语法为：
　　log4j.appender.appenderName = fully.qualified.name.of.appender.class   //
　　   "fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个：
           1.org.apache.log4j.ConsoleAppender（控制台）
           2.org.apache.log4j.FileAppender（文件）
           3.org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）
           4.org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）
           5.org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）
             1.ConsoleAppender选项
                     Threshold=WARN:指定日志消息的输出最低层次。
                     ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
                     Target=System.err：默认情况下是：System.out,指定输出控制台
              2.FileAppender 选项
                     Threshold=WARN:指定日志消息的输出最低层次。
                     ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
                     File=mylog.txt:指定消息输出到mylog.txt文件。
                     Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。
             3.DailyRollingFileAppender 选项
                     Threshold=WARN:指定日志消息的输出最低层次。
                     ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
                     File=mylog.txt:指定消息输出到mylog.txt文件。
                     Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。
                     DatePattern='.'yyyy-ww:每周滚动一次文件，即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下：
                     1)'.'yyyy-MM: 每月
                     2)'.'yyyy-ww: 每周
                     3)'.'yyyy-MM-dd: 每天
                     4)'.'yyyy-MM-dd-a: 每天两次
                     5)'.'yyyy-MM-dd-HH: 每小时
                     6)'.'yyyy-MM-dd-HH-mm: 每分钟
             4.RollingFileAppender 选项
                     Threshold=WARN:指定日志消息的输出最低层次。
                     ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
                     File=mylog.txt:指定消息输出到mylog.txt文件。
                     Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。
                     MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时，将会自动滚动，即将原来的内容移到mylog.log.1文件。
                     MaxBackupIndex=2:指定可以产生的滚动文件的最大数。

实际应用：
　　log4j.appender.A1=org.apache.log4j.ConsoleAppender //这里指定了日志输出的第一个位置A1是控制台ConsoleAppender
　　
　　3、配置日志信息的格式，其语法为：
　　A.log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
               "fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个：
                1.org.apache.log4j.HTMLLayout（以HTML表格形式布局），
　　        2.org.apache.log4j.PatternLayout（可以灵活地指定布局模式），
　　        3.org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），
　　        4.org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）
                    1.HTMLLayout 选项
                       LocationInfo=true:默认值是false,输出java文件名称和行号
                       Title=my app file: 默认值是 Log4J Log Messages.
                    2.PatternLayout 选项
                       ConversionPattern=%m%n :指定怎样格式化指定的消息。
                    3.XMLLayout   选项
                       LocationInfo=true:默认值是false,输出java文件和行号
    实际应用：
    　　log4j.appender.A1.layout=org.apache.log4j.PatternLayout

       B. log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
            这里需要说明的就是日志信息格式中几个符号所代表的含义：
　　          －X号: X信息输出时左对齐；
                    %p: 输出日志信息优先级，即DEBUG，INFO，WARN，ERROR，FATAL,
                    %d: 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921
                    %r: 输出自应用启动到输出该log信息耗费的毫秒数
                    %c: 输出日志信息所属的类目，通常就是所在类的全名
                    %t: 输出产生该日志事件的线程名
                    %l: 输出日志事件的发生位置，相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10)
                    %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
                    %%: 输出一个"%"字符
                    %F: 输出日志消息产生时所在的文件名称
                    %L: 输出代码中的行号
                    %m: 输出代码中指定的消息,产生的日志具体信息
                    %n: 输出一个回车换行符，Windows平台为"\r\n"，Unix平台为"\n"输出日志信息换行
             可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如：
                      1)%20c：指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，默认的情况下右对齐。
                      2)%-20c:指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，"-"号指定左对齐。
                      3)%.30c:指定输出category的名称，最大的宽度是30，如果category的名称大于30的话，就会将左边多出的字符截掉，但小于30的话也不会有空格。
                      4)%20.30c:如果category的名称小于20就补空格，并且右对齐，如果其名称长于30字符，就从左边交远销出的字符截掉。

　　这里上面三个步骤是对前面Log4j组件说明的一个简化；下面给出一个具体配置例子，在程序中可以参照执行：
　　log4j.rootLogger=INFO,A1，B2
　　log4j.appender.A1=org.apache.log4j.ConsoleAppender
　　log4j.appender.A1.layout=org.apache.log4j.PatternLayout
　　log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
　　根据上面的日志格式，某一个程序的输出结果如下：
　　0　　INFO　2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]
          16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'
　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD
　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'
　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP
　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'
　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT

      4. # 当输出信息于回滚文件时

           log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender    //指定以文件的方式输出日志
            log4j.appender.ROLLING_FILE.Threshold=ERROR
            log4j.appender.ROLLING_FILE.File=rolling.log   //文件位置,也可以用变量${java.home}、rolling.log
            log4j.appender.ROLLING_FILE.Append=true
            log4j.appender.ROLLING_FILE.MaxFileSize=10KB   //文件最大尺寸
            log4j.appender.ROLLING_FILE.MaxBackupIndex=1   //备份数
            log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
            log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n   　　

××××××××××××××××××××××××××××××××××××××××××××××××

Log4j比较全面的配置

LOG4J的配置之简单使它遍及于越来越多的应用中了：Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了，

log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true

# 应用于控制台

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n

#应用于文件

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis

# 应用于文件回滚

log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log   //文件位置,也可以用变量${java.home}、rolling.log
log4j.appender.ROLLING_FILE.Append=true        //true:添加   false:覆盖
log4j.appender.ROLLING_FILE.MaxFileSize=10KB    //文件最大尺寸
log4j.appender.ROLLING_FILE.MaxBackupIndex=1   //备份数
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


#应用于socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n


# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

# 发送日志给邮件

log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

# 用于数据库
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout

#自定义Appender

log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender

log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net

log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<img src ="http://www.blogjava.net/sunnygu/aggbug/122219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnygu/" target="_blank">sunny</a> 2007-06-05 19:37 <a href="http://www.blogjava.net/sunnygu/archive/2007/06/05/122219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpFilter</title><link>http://www.blogjava.net/sunnygu/archive/2007/04/06/108969.html</link><dc:creator>sunny</dc:creator><author>sunny</author><pubDate>Fri, 06 Apr 2007 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/sunnygu/archive/2007/04/06/108969.html</guid><wfw:comment>http://www.blogjava.net/sunnygu/comments/108969.html</wfw:comment><comments>http://www.blogjava.net/sunnygu/archive/2007/04/06/108969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnygu/comments/commentRss/108969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnygu/services/trackbacks/108969.html</trackback:ping><description><![CDATA[
		<p>import javax.servlet.*;<br />import javax.servlet.http.*;<br />import java.io.*;</p>
		<p>public abstract class HttpFilter implements Filter<br />{<br />    private FilterConfig config;<br />    <br />    //////////////////////////////////<br />    public void init(FilterConfig config) throws ServletException<br />    {<br />        this.config = config;<br />        init();<br />    }<br />    <br />    public void init() throws ServletException<br />    {<br />    }<br />    ///////////////////////////////<br />    public FilterConfig getFilterConfig()<br />    {<br />        return config;<br />    }<br />    <br />    public String getInitParameter(String name)<br />    {<br />        return config.getInitParameter(name);<br />    }<br />    <br />    public ServletContext getServletContext()<br />    {<br />        return config.getServletContext();<br />    }<br />    <br />    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)<br />                                                throws IOException, ServletException<br />    {<br />        doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);<br />    }<br />    <br />    public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)<br />                                                throws IOException, ServletException;<br />    <br />    public void destroy()<br />    {<br />    }<br />}</p>
<img src ="http://www.blogjava.net/sunnygu/aggbug/108969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnygu/" target="_blank">sunny</a> 2007-04-06 16:31 <a href="http://www.blogjava.net/sunnygu/archive/2007/04/06/108969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jdbc 笔记</title><link>http://www.blogjava.net/sunnygu/archive/2007/03/21/105297.html</link><dc:creator>sunny</dc:creator><author>sunny</author><pubDate>Wed, 21 Mar 2007 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/sunnygu/archive/2007/03/21/105297.html</guid><description><![CDATA[
		<p>上午:</p>
		<p>一.JDBC原理概述</p>
		<p> </p>
		<p>1，JDBC是一套协议，是JAVA开发人员和数据库厂商达成的协议，也就是由Sun定义一组接口，由数据库厂商来实现，并规定了JAVA开发人员访问数据库所使用的方法的调用规范。</p>
		<p> </p>
		<p>2，JDBC的实现是由数据库厂商提供，以驱动程序形式提供。</p>
		<p> </p>
		<p>3，JDBC在使用前要先加载驱动。</p>
		<p>JDBC对于使用者要有一致性，对不同的数据库其使用方法都是相同的。</p>
		<p> </p>
		<p>驱动开发必须要实现Driver接口。</p>
		<p>数据库驱动的实现方式</p>
		<p>JDBC-ODBC桥接式</p>
		<p>JDBC网络驱动，这种方式是通过中间服务器的协议转换来实现的</p>
		<p>JDBC+本地驱动，这种方式的安全性比较差。</p>
		<p>JDBC驱动，由数据库厂商实现。</p>
		<p> </p>
		<p>二.JDBC的API</p>
		<p> </p>
		<p>java.sql包和javax.sql包</p>
		<p>Driver接口(驱动),在加载某一 Driver 类时，它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序 </p>
		<p>Class.forName("oracle.jdbc.driver.OracleDriver")</p>
		<p>DriverManager类（驱动管理器），它可以创建连接，它本身就是一个创建Connection的工厂(Factory)。</p>
		<p>Connection接口，会根据不同的驱动产生不同的连接</p>
		<p>Statement接口，发送sql语句</p>
		<p>ResultSet接口（结果集），是用来接收select语句返回的查询结果的。其实质类似于集合。</p>
		<p> </p>
		<p>下午:</p>
		<p>三.JDBC应用步骤</p>
		<p>1，注册加载一个driver驱动</p>
		<p>2，创建数据库连接（Connection）</p>
		<p>3，创建一个Statement（发送sql）</p>
		<p>4，执行sql语句</p>
		<p>5，处理sql结果（select语句）</p>
		<p>6，关闭Statement</p>
		<p>7，关闭连接Connection。</p>
		<p> </p>
		<p>注意：6，7两个步骤势必须要做的，因为这些资源是不会自动释放的，必须要自己关闭</p>
		<p> </p>
		<p>访问Oracle的数据库的驱动名字叫ojdbc14.jar,要使用这个驱动程序，要先将他加到环境变量CLASSPATH中。</p>
		<p> </p>
		<p>    注册加载驱动driver，也就是强制类加载</p>
		<p>    Class.forName(Driver包名.Driver类名)。</p>
		<p> </p>
		<p>    Driver d=new Driver类();//注意:这个方法不能用参数来构造</p>
		<p>    DriverManager.registerDriver(d);</p>
		<p> </p>
		<p> </p>
		<p>    Oracle的Driver的全名oracle.jdbc.driver.OracleDriver</p>
		<p>    mysql的Driver的全名com.mysql.jdbc.Driver</p>
		<p>    SQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver</p>
		<p> </p>
		<p>    创建连接</p>
		<p>    DriverManager.getConnection(String url,String username,String password);</p>
		<p>    Connection连接是通过DriverManager的静态方法getConnection(.....)来得到的，这个方法的实质是把参数传到实际的Driver中的connect()方法中来获得数据库连接的。</p>
		<p>    Oracle的URL值是由连接数据库的协议和数据库的IP地址及端口号还有要连接的数据库的库名（DatebaseName）</p>
		<p>    Oracle URL的格式</p>
		<p>    jdbc:oracle:thin:（协议）@XXX.XXX.X.XXX:XXXX（IP地址及端口号）:XXXXXXX（所使用的库名）</p>
		<p>    例：jdbc:oracle:thin:@192.168.0.20:1521:tarenadb</p>
		<p>    MySql URL的写法</p>
		<p>    例： jdbc:mysql://localhost:3306/tarena</p>
		<p>    SQLServer URL的写法</p>
		<p>    例：jdbc:microsoft:sqlserver://localhost:1433/test</p>
		<p> </p>
		<p>    java -Djdbc.drivers=驱动的完整类名</p>
		<p> </p>
		<p>    使用虚拟机参数,加载驱动 -D表示为虚拟机参数赋值</p>
		<p>    java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver:com.mysql.jdbc.Driver</p>
		<p>   </p>
		<p>四.JDBC基本方法 </p>
		<p>    DriverManager:如果有多个驱动可用的话,DriverManager会选择其中一个.  </p>
		<p>    </p>
		<p>    Driver:可以选择固定的驱动</p>
		<p>    Driver driver = new oracle.jdbc.driver.OracleDriver();</p>
		<p>    String user = "sd0613";</p>
		<p> String password = "sd0613";</p>
		<p> Properties prop = new Properties();</p>
		<p> prop.setProperty("user",user);</p>
		<p> prop.setProperty("password",password);</p>
		<p>    driver.connect(url,properties); </p>
		<p>    </p>
		<p>    executeQuery(sqlString);//返回结果集</p>
		<p>    executeUpdate(sqlString);//返回值为该次操作影响的记录条数,create table返回0</p>
		<p>    execute(sqlString);</p>
		<p>    //适用于不知道具体的操作是什么,返回值是boolean类型的</p>
		<p>    //如果返回值是true,代表执行查询操作;否则代表执行更新操作.</p>
		<p>    </p>
		<p>    ResultSet</p>
		<p>    next()方法:</p>
		<p>    1.判断是否存在下一条记录</p>
		<p>    2.将游标移向下一条记录   </p>
		<p>    getXXX(字段名或字段序号)//注意:字段序号从1开始</p>
		<p>    </p>
		<p>    关闭问题:</p>
		<p>    使用Connection对象获得一个Statement，Statement中的executeQuery(String sql) 方法可以使用select语句查询，并且返回一个结果集 ResultSet通过遍历这个结果集，可以获得select语句的查询结果，ResultSet的next()方法会操作一个游标从第一条记录的前边开始读取，直到最后一条记录。executeUpdate(String sql) 方法用于执行DDL和DML语句，可以update，delete操作。</p>
		<p>注意：要按先ResultSet结果集，后Statement，最后Connection的顺序关闭资源，因为Statement和ResultSet是需要连接时才可以使用的，所以在使用结束之后有可能其他的Statement还需要连接，所以不能先关闭Connection。<br /><br /><br /><br />1.回忆下昨天的一些JDBC的配置<br /> (1) 驱动：   <br />  ojdbc14.jar (Oracle)                  <br />  mysql-connector-java-3.1.11-bin.jar(MySql)<br /> (2) 实现了Driver接口的驱动类(程序中要加载的类)：<br />  jdbc.oracle.driver.OracleDriver  (Oracle)<br />  com.mysql.jdbc.Driver  (MySql)<br /> (3)连接数据库的URL<br />  jdbc:oracle:thin:@192.168.0.24:1521:tarena   (Oracle)<br />  jdbc:mysql://192.168.0.24:3306/test    (MySql)<br />          <br />2.PreparedStatement概述<br /> SQL语句传到数据库后，数据库会先对其编译再执行。在使用Statement时，如果要执行一组类似的SQL操作时，这样做效率很低，而且把不同类型的数据直接写在SQL语句中是比较麻烦的。这时应该用PreparedStatement来代替Statement，PreparedStatement 接口继承 Statement，并和他在两方面有所不同：<br /> (1)PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句先“准备好”。包含于 PreparedStatement对象中的SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的，该语句为每个 IN 参数保留一个问号（“?”）作为占位符。每个问号的值必须在该语句执行之前，通过适当的setXXX 方法来提供。<br /> (2)由于 PreparedStatement 对象已预编译过，所以其执行速度要快于 Statement 对象。因此，多次执行的 SQL 语句经常创建为 PreparedStatement 对象，以提高效率。<br />  </p>
		<p> 作为 Statement 的子类，PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法，用于设置发送给数据库以取代 IN 参数占位符的值。同时，三种方法 execute()、 executeQuery() 和 executeUpdate() 已被更改以使之不再需要参数。这些方法的 Statement 形式（接受 SQL 语句参数的形式）不应该用于 PreparedStatement 对象。</p>
		<p>3.创建 PreparedStatement 对象<br /> 以下的代码段（其中 con 是 Connection 对象）创建包含带两个 IN 参数占位符的 SQL 语句的 PreparedStatement 对象：<br /> PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");<br /> pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?"，它已发送给DBMS，并编译好为执行作好了准备。</p>
		<p> </p>
		<p>4.传递 IN 参数<br /> 在执行 PreparedStatement 对象之前，必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成，其中 XXX 是与该参数相应的类型。例如，如果参数具有Java 类型 long，则使用的方法就是 setLong。setXXX 方法的第一个参数是要设置的参数的序数位置(从1开始)，第二个参数是设置给该参数的值。例如，以下代码将第一个参数设为 123456789，第二个参数设为 100000000：<br /> pstmt.setLong(1, 123456789);<br /> pstmt.setLong(2, 100000000);</p>
		<p>
				<br />5.ResultSetMetaData<br /> 元数据是用来描述数据的数据，ResultSetMetaData就是来描述结果集的列的类型和属性信息，比如可以通过它得到结果集的列数，列名等。具体可在API中查阅java.sql.ResultSetMetaData。<br /> ResultSetMetaData对象可以通过ResultSet对象的getMetaData()来得到。<br /> ResultSetMetaData对象有以下三个方法比较常用：<br /> getColumnCount()：获得实际列数<br /> getColumnName(int colnum)：获得指定列的列名<br /> getColumnType(int colnum)：获得指定列的数据类型(Types里面的类型,存放的是整数)<br /> <br />6.JDBC是持久层的技术，是JAVA连接数据库目前最通用的手段。其他的持久层技术，比如接下来我们要学的Hibernate，底层也是由JDBC实现的。持久层是与业务无关的，具体的业务由业务层完成，当业务层需要和数据库进行交互时，就需要通过持久层来操作。</p>
		<p>7.BufferedReader in = new BufferedReader(new InputStreamReader(System.in));<br /> 由于System.in是字节流，我们需要把他转成字符流。并用BufferedReader包装后方便我们的操作。<br /> <br />8.为了区分表中不同的数据，我们要给放入表中持久化的每个对象都加上一个唯一的标识，这就是ID，ID是与业务无关的。ID的生成方法有很多，在Oracle数据库中我们一半利用Sequence来生成。</p>
		<p>9.读取配置文件时，我们采用Properties对象。它是HashTable的子类，它有个load(InputStream inStream) 的方法可以直接从输入流中读取属性列表(键值对)。getProperty(String key) 方法用指定的键在此属性列表中搜索值。</p>
		<p>
				<br />1.Registering a driver<br />2.Establishing a connection to the datebase<br />3.Creating a statement<br />4.Executing a SQL<br />5.Processing the results<br />6.Closing down JDBC objects</p>
		<p>
				<br />
				<br />
				<br />JDBC第三天<br />上午:<br />一.事务（Transaction）<br />原子操作:不可再分的操作,一个操作不能再分成比它更细小的操作.<br />事务是针对原子操作的，要求原子操作不可再分，并且必须同时成功同时失败。<br />事务就是把一些非原子操作,变成原子操作,由应用服务器来提出要求,由数据库服务器来执行操作.</p>
		<p>在JDBC中默认是自动提交的,如果要想使用事务,需要按以下步骤执行:<br />1.要调用con.setAutoCommite(false)方法(打开事务边界)，把自动提交（commit）置为false。<br />2.进行正常的数据库操作<br />3.如果操作成功了可以选择con.commit(),或者操作失败时选择con.roolback()------<br />   （回滚：数据恢复到之前的情况）</p>
		<p>  注意:打开事务就要关闭自动提交,当不需要再使用事务的时候调用<br />setAutoCommite(true).</p>
		<p>事务性资源（监控完整性）<br /> <br />二.事务并发产生的问题<br />    三种并发产生的后果:<br />1，脏读:一个事务读取到了另外一个事务没有提交的数据。（Dirty Read）<br />2，重复读:一个事务读取到了另外一个事务提交的数据。它是要保持在同一时间点上读取到的数据相同，希望在一段时间内的数据是不变的。<br />3，幻读:一个事务读取到了另外一个事务提交的数据。用同样的操作读取两次,得到的记录数不相同。</p>
		<p>三.事务隔离级别<br />    五种控制级别:<br />TRANSACTION_NONE不使用事务。<br />TRANSACTION_READ_UNCOMMITTED 允许脏读。<br />TRANSACTION_READ_COMMITTED防止脏读，最常用的隔离级别,并且是大多数数据库的默认隔离级别----------------------<br />TRANSACTION_REPEATABLE_READ可以防止脏读和不可重复读，<br />TRANSACTION_SERIALIZABLE可以防止脏读，不可重复读取和幻读，（事务串行化）会降低数据库的效率 </p>
		<p>以上的五个事务隔离级别都是在Connection类中定义的静态常量，使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。<br />如:con.setTransactionIsolation(Connection.REPEATABLE_READ);</p>
		<p>下午:<br />四.JDBC2.0新特性<br />1.可滚动特性和可更新特性<br />JDBC1.0中是指游标的移动的方向和方式是单向,单步(相对)移动,功能比较简单.<br />JDBC2.0中游标可以双向,相对或者绝对移动.<br />可滚动结果集:这种结果集不但可以双向滚动，相对定位，绝对定位，并且还可以修改数据信息。</p>
		<p>1)滚动特性<br />定位函数:aaa<br />boolean absolute(int row)，定位到指定的记录位置。定位成功返回true，不成功返回false。<br />void afterLast() ，把游标移动到最后一条记录的后面(逻辑位置)。 一定会有的<br />void beforeFirst() ，把游标移动到第一条记录的前面(逻辑位置)。<br />//由于第一条记录的前面和最后一条记录的后面这两个位置肯定存在,所以无需判断是否存在,返回值设为void.</p>
		<p>boolean first()，把游标定位到第一条记录，相对定位；<br />boolean last()，把游标定位到最后一条记录   也是相对的概念。</p>
		<p>//当结果集为空的时候,这两个方法会返回false.<br />boolean next()，此方法是使游标向下一条记录移动。<br />boolean previous() ，此方法可以使游标向上一条记录移动，前提是前面还有记录。</p>
		<p>boolean relative(int rows) ，相对定位方法，参数值可正可负，参数为正，游标从当前位置向后移动指定值条记录，参数为负，游标从当前位置向前移动指定值条记录。</p>
		<p>判断函数:<br />ifBeforeFirst()判断是否在在第一条记录之前.<br />ifAfterLast()判断是否在在最后一条记录之后.<br />ifFirst()判断是否为第一条记录.<br />ifLast()判断是否为最后一条记录.</p>
		<p>要使用可滚动结果集时，需要一次设置更新特性与滚动特性,不能分开.</p>
		<p>1.更新特性常量:<br />CONCUR_READ_ONLY 只读结果集     (默认的)<br />CONCUR_UPDATABLE 可更新结果集</p>
		<p>2.滚动特性常量:<br />TYPE_FORWARD_ONLY ，该常量表示指针只能向前移动的 ResultSet 对象的类型。(默认) <br />双向滚动：<br /> 不敏感：TYPE_SCROLL_INSENSITIVE ，该常量指示可滚动但通常不受其他更改影响的 ResultSet 对象的类型。 <br /> 敏感的：TYPE_SCROLL_SENSITIVE ，该常量指示可滚动并且通常受其他更改影响的 ResultSet 对象的类型。<br />//敏感:数据库改变,结果集改变. <br />语法:         <br />Statement st=null;<br />st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE)<br />在创建Statement的时候就要指定这两个参数,使用Statement,第一个参数代表滚动特性常量,第二个代表更新特性常量</p>
		<p>
				<br />----------------------------------------</p>
		<p>
				<br />2)可更新特性<br />a.moveToInsertRow();记录当前游标位置,将游标移到和结果集结构类似的缓冲区;<br />b.使用updateXxx(int column,columnType value)方法来更新指定列数据;<br />c.使用insertRow() 方法插入记录，加信结果集，更新<br />d.将游标指回原位，moveToCurrentRow() 。</p>
		<p>
				<br /> 2，3步，可循环<br />-----------------------------------------------------<br />能否使用JDBC2.0 ResultSet的新特性，要看使用的数据库驱动是否支持.<br />还有只能用于单表且表中有主键字段（可能会是联合主键），不能够有表连接，会取<br />可更新操作必须满足以下条件:<br />a.查询只能引用一张表.<br />b.不能包含任何连接操作.<br />c.必须把完整的主键查到结果集里面;<br />d.保证所有字段为非空字段并且没有默认值。</p>
		<p>五.数据库元数据:<br />DatabaseMetaData dbmd = con.getMetaData();//得到数据库元数据<br />dbmd.supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY,<br />                    ResultSet.CONCUR_UPDATABLE);//判断是否支持可更新操作</p>
		<p>六.批量更新<br />优势:<br />1.节省传递时间<br />2.并发处理</p>
		<p>PreparedStatement:<br />1.addBatch() 将一组参数添加到 PreparedStatement对象内部<br />2.executeBatch() 将一批参数提交给数据库来执行，如果全部命令执行成功，则返回更新计数组成的数组。</p>
		<p>Statement:<br />addBatch(String sql)方法会在批处理缓存中加入一条sql语句<br />executeBatch()执行批处理缓存中的所有sql语句。</p>
		<p>注意：PreparedStatement中使用批量更新时，要先设置好参数后再使用addBatch()方法加入缓存。<br />批量更新中只能使用更新或插入语句</p>
		<p>//<br />Statement stm=con.createStatement(int resultSetType,int resultSetConcurrency);创建的时候就要指明要什么样的结果集。<br />  先可滚，后可更新</p>
		<p>boolean absolute (int row)绝对定位，</p>
		<p>afterLast()定位到最后一条记录的后面 </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p>
				<br /> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
<img src ="http://www.blogjava.net/sunnygu/aggbug/105297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnygu/" target="_blank">sunny</a> 2007-03-21 16:14 <a href="http://www.blogjava.net/sunnygu/archive/2007/03/21/105297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 3days</title><link>http://www.blogjava.net/sunnygu/archive/2007/03/20/104927.html</link><dc:creator>sunny</dc:creator><author>sunny</author><pubDate>Tue, 20 Mar 2007 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/sunnygu/archive/2007/03/20/104927.html</guid><wfw:comment>http://www.blogjava.net/sunnygu/comments/104927.html</wfw:comment><comments>http://www.blogjava.net/sunnygu/archive/2007/03/20/104927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnygu/comments/commentRss/104927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnygu/services/trackbacks/104927.html</trackback:ping><description><![CDATA[
		<p>*********************************<br />**  oracle 学习笔记第一天      **<br />**  author Ice Xu   (XuBin)    **<br />**  date  2006-10-30           **<br />***********************************<br />初始化表的位置：<br />cd $ORACLE_HOME/rdbms   cd demo     summit2.sql<br />这个角本可以初始化练习用的表<br />set  LANG = AMERICAN_AMERICA.US7ASCII<br />*********************************<br />我们目前使用的是oralce 9i   9201 版本</p>
		<p>恢复练习表命令：<br />sqlplus  openlab/open123 @summit2.sql</p>
		<p>
				<br />登陆oracle的命令：<br />sqlplus   用户名/密码</p>
		<p>show   user        显示当前登陆的身份.<br />set    pause on<br />set    pause off   分页显示.</p>
		<p>oracle中默认日期和字符是左对齐，数字是右对齐<br />table or view does  not  exist ; 表或示图不存在</p>
		<p>edit 命令用于自动打开vi修改刚修执行过的sql的命令。<br />修改方法二：<br />l  3 先定位到行    c   /旧串/新串</p>
		<p>执行出错时，利用错误号来查错误:<br />!oerr ora 942  (装完系统后会装一个oerr工具，用于通过错误号来查看错</p>
		<p>误的具体信息)</p>
		<p>想在sql中执行unix命令时，把所有的命令前加一个!就可以， 或者host( 用</p>
		<p>于从sql从切换至unix环境中去)</p>
		<p>/*** 初次使用时注意  ****<br />运行角本时的命令：<br />先切换到unix环境下，cd $oracle_home   cd sqlplus  cd demo 下面有两</p>
		<p>个角本建表语句。<br />@demobld.sql<br />sqlplus nanjing/nanjing @demobid.sql 直接运行角本，后面跟当前目录或</p>
		<p>者是绝对路径</p>
		<p>保存刚才的sql语句：   save 命令     第二次保存时要替换之前的角本 </p>
		<p>save 文件名   replace<br />把刚才保的sql重新放入  buffer中</p>
		<p>spool  文件名<br />此命令会把所有的操作存在某个文件中去<br />spool off </p>
		<p>练习1：查看s_emp表中员工的年工资<br />select  first_name  , salary*12  salary from s_emp;</p>
		<p>给列起别名的命令：<br />利用关键字  as  或者用空格  "别名"  双引号内大小写敏感保持引号内容</p>
		<p>原样输出，如果不加双引号时，默认为大写</p>
		<p>拼接字段：<br />select   first_name||last_name  "employees"  from   s_emp ;<br />oracle中表达字符串用单引号来表达：<br />select first_name||' '||last_name  from   s_emp;(在两个字段之间拼接</p>
		<p>一个空格)</p>
		<p>查看当前用户所有的表：<br />练习2：(常用于批量更改数据)<br />set  echo off<br />spool  selecttab.sql;<br />select 'select * from ' || table_name ||' ; ' "table name " from </p>
		<p>user_tables;<br />spool off;<br />set  head off(去除第一行)<br />set  feed off(去除最后一行)<br />练习3：(查出s_emp表中所有员工的一年的总收入)<br />select first_name , salary*12*( 1+nvl(commission_pct/100 , 0 ) ) " </p>
		<p>year salary " from s_emp;<br />nvl函数 专用于处理空值的影响.</p>
		<p>*******************************************************************</p>
		<p>***************************************************************</p>
		<p>下午：<br />column  定义格式化输出<br />column last_name  Heading   format a15;<br />column last_name;<br />column salary justify left format $99,999.00  ( 定义工资的显示形式 </p>
		<p>)</p>
		<p>$ echo $LANG<br />zh_CN.hp15CN<br />$ echo $NLS_LANG<br />simplified chinese_china.zhs16cgbk </p>
		<p>ORDER BY 排序  升序和降序   ASC  升序(默认)    DESC 降序<br />select * from s_emp  order by dept_id , salary desc  部门号升序，工</p>
		<p>资降序<br />关键字distinct也会触发排序操作。</p>
		<p>过滤操作：  where 子句<br />select * from s_emp  where dept_id=42;  查看部门号为42的所有员工<br />select * from s_emp  where salary&gt;1000  查看工资高于1000的所有员工<br />select salary from  s_emp where first_name='Geroge'  找出名字为</p>
		<p>Geroge的员工的工资数<br />select  table_name from  user_tables  where table_name='S_EMP';  查</p>
		<p>某个具体表名时，表名的字符串必须要为大写</p>
		<p>日期的默认的格式  DD-MON-RR(天-月-年)<br />BETWEEN  AND   在什么之间            NOT        BETWEEN      AND    </p>
		<p>            注意区间：[  ]是一个闭区间<br />IN( LIST)      在某个集合中          NOT        IN         (list) </p>
		<p>空值会有影响         (等于list其中任何一个就行，为提高效率常把比例</p>
		<p>高的放在前面)<br />LIKE           模糊配置              NOT        LIKE              </p>
		<p>通配比较<br />IS NULL        是空<br />AND <br />OR<br />NOT </p>
		<p>练习4:(找出表名以S_开头的所有表)对于一些特殊字符，要用到escape转义,</p>
		<p>并不是一定要用\，escape后面定义是什么字符为转义字符，那就用哪个字符<br />select  table_name from user_tables where  table_name like   'S\_%' </p>
		<p> escape '\';</p>
		<p>当有多个条件时，要用逻辑运算符：AND OR<br />写对where语句:正确的数据类型判断、逻辑运算符</p>
		<p>sql函数的作用：<br />sql函数的分类：单行函数、多行函数<br />单行函数： (dual   哑表 )<br />字符函数：<br />lower      转小写          select  lower('SQLPLUS')  from dual;--&gt;</p>
		<p>对纯字符串处理的时候<br />upper      转大写          select  upper('sqlplus')  from dual;<br />initcap    首字符大写      select  initcap('tarena') from dual;<br />concat     连接字符串      select  concat(first_name , last_name)   </p>
		<p>from s_emp;等效于||<br />substr     求子串          select  substr('tarenasd0603' ,1,6) from </p>
		<p>dual; (取前六个字符)   select substr('tarenasd0603',-2) from dual; </p>
		<p>(取后两个字符)<br />length     求字符长度      select  length('tarena') from dual;<br />nvl        空值函数    两个参数的类型要匹配，统一的，表示：如果有，</p>
		<p>则返回前面的参数，如果没有就返回后面的参数<br />eg:select first_name,salary from s_emp where lower(first_name)</p>
		<p>='george';<br />select  first_name , substr(first_name , -2 ) from  s_emp;  (查出</p>
		<p>s_emp表中所有用户名字的最后两个字符)<br />默认的是从左向右，如果是-2则表示从右向左数<br />练习5：   select   first_name  , salary  from s_emp   where  lower</p>
		<p>(first_name)='george';</p>
		<p>数值函数：<br />round 函数(四舍五入)   select  round(45.935, 2) from dual;   不带参</p>
		<p>数时默认为0位小数<br />trunc 函数(截取，不管后面的数字)    select  trunc(45.995, 1) from </p>
		<p>dual;<br />日期函数：DD-MON-RR ,默认不显示世纪、时、分、秒       日期格式敏感<br />世纪、年、月、日<br />sysdate 返回当前系统时间       select sysdate from dual;     <br />更改当前会话的设置格式：      <br />alter session set nls_date_format='yyyy mm dd hh24:mi:ss';<br />select  sysdate-1, sysdate+1, sysdate , sysdate+1 from dual;  注意</p>
		<p>单位是以天为单位，也可以得到多少小时、多少分钟之后的时间<br />MONTHS_BETWEEN (DATE1 , DATE2 ) 求两个日期之前相差的月数<br />add_months(date , 4 ) 在 date上再添加4个月<br />select round(last_day(sysdate),'month') from dual;<br />select  next_day(sysdate,'FRIDAY') from dual ; 求这个日期的下一个</p>
		<p>FRIDAY<br />last_day 求月的最后一天</p>
		<p>round 函数:     select   round(sysdate, 'MONTH') from dual;     参</p>
		<p>数可以为：  MONTH YEAR(看上半年还是下半年)   <br />select  trunc(last_day(sysdate)+1)  from  dual;<br />select  add_months(trunc(sysdate, 'MONTH'), 1 )  from  dual ;<br />关于日期的两种形式：</p>
		<p>转换函数：<br />to_char显示日期：<br />从数字转化为char  to_char(date,'格式')<br />从日期转化为char           to_char(date,  'fmt' )             </p>
		<p>select to_char(sysdate, 'yyyy mm dd hh24:mi:ss') from dual;<br />         </p>
		<p>         </p>
		<p>         </p>
		<p>    select to_char(sysdate, 'fmyyyy mm </p>
		<p>dd hh24:mi:ss') from dual;去掉前导名<br />                              select  to_char(sysdate ,'YEAR MONTH </p>
		<p>dy <br />eg:查出三月分入职的员工：select first_name,start_date from s_emp </p>
		<p>where to_char(start_date,'mm')='03';</p>
		<p>to_date表达日期：<br />      字符转日期     select   to_date('2000 11 20', 'yyyy mm dd ')  </p>
		<p>from dual;<br />                               select  round(to_date('10-OCT-06' </p>
		<p>,'dd-mon-RR') ) from   dual;<br />to_number<br />      字符转数字 <br />                            select to_number('10')  from  dual ;<br /><br /></p>
		<p>day2<br /><br /><br />where 条件一定是根据某个字段来进行过滤操作.</p>
		<p>多表连接操作：<br />两表没有任何关联时会产生迪卡尔机：<br />select   first_name , name  from    s_emp , s_dept;<br />等值连接：<br />练习一:查看员工的姓名和员工部门号:(要考虑到表中实际数据中空值的影响）<br />select   first_name ,   name from  s_emp e, s_dept  d where e.dept_id=d.id;同时起了别名<br />select   first_name ,   name from  s_emp e, s_dept  d where e.dept_id=d.id and e.first_name='George';具体到哪个人所在的部门</p>
		<p>练习二：每个员工所在的部门和部门所在的地区<br />select first_name , name   from s_emp, s_dept,  s_region  where  s_emp.dept_id=s_dept.id and s_dept.region_id=s_region.id;<br />eg:select first_name,d.name,r.name <br /> from s_emp e,s_dept d,s_region r <br /> where e.dept_id=d.id and d.region_id=r.id;<br />等值连接：<br />练习三:找出每个员工和每个员工的工资级别<br />  select    a.ename , a.sal, b.grade from emp a , salgrade b  where a.sal between b.losal and b.hisal;<br />  select    a.ename , a.sal, b.grade from  emp a , salgrade b  where a.sal&gt;=b.losal  and  a.sal&lt;=b.hisal;<br />自连接：当一个表的插入行之间有了关系时就发生了(又名：内连接)<br />select   first_name   , manager_id   from  s_emp;<br />查出所有员工的部门领导的名称：( 这种sql会少一条记录，总经理没有被配置上）<br />select  e.first_name , m.first_name   from s_emp e , s_emp m  where   e.manager_id=m.id;<br />外连接：(防止空值时，用（+）的一方会模拟一条记录配置另一方)这就称为外连接,一个记录都不能少；<br />select  e.first_name , m.first_name   from s_emp e , s_emp m  where   e.manager_id=m.id(+);<br />+号放在哪边就表示在哪边补空，来跟对方来匹配，使得数据一个都不会漏掉，这个例子中的领导有可能会没有(最高领导就再没有领导了，所以就<br />方法领导的那边)<br /> 标准写法：select e.deptno,d.name from emp e,dept d where e.deptno(+)=d.depton and e.depton is null;<br />查看员工分部的部门：<br />select  distinct(deptno) from emp ;<br />找出没有员工的部门：(很经典的一个例子,用外连接来解决的标准做法,这是一种方式）<br />第一步： <br />select     e.deptno , d.deptno  from emp e , dept d  where  e.deptno(+)=d.deptno;<br />第二步：<br />select     e.deptno , d.deptno  from emp e , dept d  where  e.deptno(+)=d.deptno   and   e.deptno is null;</p>
		<p>组函数（group function)：<br />group by  分组子句    对分组后的子句进行过滤还可以用having    条件  对分组后的条件进行过滤   where 是对记录进行过滤</p>
		<p>avg(distinct | all )求平均值                             <br />count(distinct | all )统计<br />max(distinct | all ） 求最大值<br />min(distinct | all )求最小值<br />sum(distinct | all )  求和<br />(所有组函数会忽略空值 , avg   sum只能作用于数字类型）<br />求有提成员工的提成的平均值；<br />select    avg(nvl(commission_pct ,0 )  ) from s_emp;<br />有多少人有提成：<br />select  count( commission_pct ) from    s_emp ;<br />count(*)  用于统计记录数：<br />select   sum(commission_pct)/ count(*)   from     s_emp;<br /> 员工分部在多少个不同的部门：count  默认为作all的动作<br /> select   count(dept_id)  from s_emp;<br /> select   count(distinct dept_id) from   s_emp;<br /> 求各个部门的平均工资：group  by  子句也会触发排序<br /> select  dept_id ,  avg(salary) aa    from    s_emp    group by   dept_id   order by  aa ;<br /> select  dept_id ,  avg(salary) aa    from    s_emp    group by   dept_id    ;<br /> 注意：group by 子句后面跟有条件只能是查询的结果中的字段,所以我们会人为在结果要加入一些group by  要用的字段<br />select   region_id , count(*)  from  s_dept 此句会有错<br />select   max(region_id)  , count(*) from       s_dept;  (强制语法上可以正确,但是不能保证结果也会正确）<br />求各个部门不同工种的平均工资：<br />select     dept_id , title,  avg(salary)  from s_emp   group   by dept_id , title  ;<br />哪些部门的平均工资比2000高:<br />select    dept_id,  avg(salary) aa  from s_emp   group by (dept_id)    having      avg(salary)&gt;2000;<br />除了42部门以外的部门的平均工资:<br />select   dept_id  ,  avg(salary)   from  s_emp  group by (dept_id ) having    dept_id!=42;<br />select   dept_id  ,  avg(salary)   from  s_emp   where   dept_id!=42  group by (dept_id ) ;(此种sql效率要高，先过滤再计算）<br />where       单行函数。<br />having      组函数。<br />求各个部门的平均工资:<br />// 这样统计不详细<br />select    max(d.name) ,  avg (s.salary)   from   s_emp  s,  s_dept  d where    s.dept_id=d.id   group by    d.name;  <br />//****这问题很经典，为了过 oracle sql 语法关而写max(d.name)  ***<br />select   max(d.name)  , avg(e.salary)  , max(r.name)  from s_emp e,   s_dept  d ,   s_region  r  where  e.dept_id = d.id  and  d.region_id=r.id group  by   d.id ;</p>
		<p>下午：<br />关于子查询:  Subqueries<br />找出所有员工中，工资最低的那个员工：( 利用子查询 ）<br />select    first_name,  salary    from s_emp   where   salary = (  select  min(salary)  from s_emp)    ;<br />//这样写会出错姓名和工资不一致<br />select max(first_name),  min(salary)  from s_emp;(利用子查询可以解决)<br />子查询运行的顺序： 先运行子查询再运行主查询    子查询一般出现在运算符的右边<br />单值运算符：运算后面只能跟一个值<br />多值运算符：可以对两个以上的值进行操作<br />查询谁跟Smith干一样的活：<br />select   last_name from  s_emp  where last_name='Smith';<br />//下种写法可能还存在bug，没有考虑到数据的全面性,有潜在性问题<br />select  last_name  , title  from s_emp   where title =(  select   title  from s_emp  where  last_name='Smith'  )    and  last_name &lt;&gt; 'Smith'  ;<br />//这种写法才考虑的比较全面<br />select  last_name  , title  from s_emp   where title   in   (  select   title  from s_emp  where  last_name='Smith'  )    and  last_name &lt;&gt; 'Smith'  ;<br />使用子查询时应注意：  单行子查询返回多个结果时会有错误    single-row  subquery returns  more  than one value<br />查出哪些员工的工资比平均工资低：<br />select    *  from s_emp  where     salary   &lt;  ( select  avg(salary)  from   s_emp)  ;<br />哪些部门的平均工资比32部门的平均工资要低：<br />第一步先查出各个部门的平均工资：<br />select  min(avg(salary  )  ) from   s_emp   group by  dept_id;<br />第二步再查出哪个部门的工资是最低的:<br />select    dept_id,  avg(salary)  from  s_emp   group by dept_id   having   avg(salary) =  (select  min(avg(salary)  ) from  s_emp  group by  dept_id ) ;</p>
		<p>哪个部门里没有员工：<br />select   deptno  from    dept    where   deptno   not  in ( select     deptno    from   emp );<br />哪些人是普通员工：（用子查询形式来做）<br />select   *   from  s_emp   where   id  not    in (  select  manager_id   from   s_emp);</p>
		<p>E--R图  实体关系图entity  relation  <br />开发流程先进行需求分析，进行系统设计，建表，再进行开发编码,测试最终产品上线试运行。<br />把软件设计模型转化为数据中的表，设计时要考虑性能的设计</p>
		<p>第一范式：最简单的一种建方式，一张表只有一个主键。<br />第二范式：表的自连接存在原因，一张表，学生表中也有班级的信息。<br />第三范式：表连接存在的原因，两张表，其中一张表引用其它一张表。</p>
		<p>约束：<br />为了保证数据的一致性，<br />primary key   (pk)  主键约束       不允许有重复和空值(唯一且非空）<br />foregin  key   (fk)   外键约束       两张表parent  table      child   table<br />unique  key   (uk)  唯一可以为空<br />not   null <br />数据库设计时的注意：<br />索引： 为了提高效率而设计的一种与业务无关的<br />考虑表点用的物理空间：<br />考虑表之间的关系：<br />一对多关系： 利用FK+PK实现，多的一方引用外键<br />一对一关系： 可以利用FK+UK实现，<br />多对多关系： 通过中间增加一个附加表来实现，附加表利用联合主键来实现，联合起来的主键唯一。</p>
		<p>
				<br />DDL语句：数据库定义语句：<br />table (表）<br />view(示图）<br />sequence(序列号）<br />index(索引）</p>
		<p>创建表语句：<br />create    table    [schema].表名   (  字段名，   字段类型   约束条件);                    schema   默认就是当前用户,严格来访问表名完整的写法是schema.tablename<br />数据类型：<br />表名的命令规则： 首字母为字母，不得超过30个字符<br />char(size)                定长  不管是否达到最大宽度，都会点最大的宽度。<br />varchar2(size)         可变长   按实际的字节占用空间<br />number            所有的数字类型都称为number <br />number(n, m )  n------n位宽度   m-----小数点后的宽度<br />number(2,4)小数点后4 位，有效位2位    values(0.0099) 这样可以   values(0.01)这样出错<br />LONG    2GB   大文本一个表最我只允许定义一个LONG类型(不建议使用）<br />CLOB    大对象形式存放(在表里只存一个指针)<br />BLOB     存二进制大对象(声音，图像之类）</p>
		<p>default   作用演示：<br />create  table   test(c1   number    default  10,     c2    number);</p>
		<p>
				<br />约束的演示：<br />主键约束的定义：<br />create table   test(c   number  primary key  );     列级约束<br />create table  test(c  number , primary key(c) )  ; 表级约束<br />create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1<br />create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表级约束可以实现联合主键</p>
		<p>外键约束的定义：(先定义父表，再定义子表）<br />carete   table     parent(c1 number  primary key );<br />create   table    child  (c  number primary key ,   c2 number  references parent(c1));<br />或表级约束定义:<br />create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));</p>
		<p>或表级约束定义:<br />create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));</p>
		<p>on  delete   cascade  (及联删除，删除父表时子表也跟着删除）<br />on  delete   set   null  (及联删除父表时子表中引用的字段为null）<br /><br /><br />day3<br /><br />不给约束起名字时，系统给约束起名时的规律为：数据库用户名_数字(约束名也不能重名）<br />定义一个约束的两种形式：<br />列级约束      表级约束</p>
		<p>非空约束： <br />  not    null  (利用desc可能看到）primary key  自动具有非空约束的特点</p>
		<p>primary key约束：<br />主键约束的定义：<br />第一种定义形式：<br />create table   test(c   number  primary key  );     列级约束<br />第二种定义形式：<br />create table  test(c  number , primary key(c) )  ; 表级约束<br />create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1<br />create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表级约束可以实现联合主键</p>
		<p>foregin  key   (fk)   外键约束:<br />(先定义父表，再定义子表）<br />create   table     parent(c1 number  primary key );<br />create   table    child  (c  number primary key ,   c2 number  references parent(c1));<br />或表级约束定义:<br />create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));</p>
		<p>check 约束：<br />create   table   test(c1   number  check(c1&gt;1000)); <br />此表中要求c1的值必须要大于1000 才为有效值 .   </p>
		<p>怎么创建一个角本文件： xxx.sql结尾<br /> 执行角本的方法：<br /> 在sqlplus环境中执行：@filename.sql<br /> 在shell环境中执行： sqlplus   nanjing/nanjing   @filename.sql</p>
		<p>创建表的语法： <br /> create    table    表名 (   字段名    字段类型     约束类型（可选））；<br /> 利用已知表建一张新表：注会把非空约束带过来，其它约束要自己添加<br /> create  table s_emp_42    as select   *  from   s_emp     where   dept_id = 42;<br />只取要表结构，不想要表中数据的建表方式：<br />create table  s_emp_copy    as   select  *    from  s_emp   where   1=2; <br />(这是一个小技巧,在JDBC的学习中会用到 where 1=1 的形式,注意体会）</p>
		<p>查看一张表的约束：( 查数据字典示图)<br /> desc  user_constraints;(这个数据字典中会查到相应的信息）<br /> select    constraint_name,  constraint_type    from   user_constraints  where   table_name='S_EMP';<br /> P   pk<br /> R   fk<br /> C   check<br /> U    UK<br /> V    这种只定义在示图中(with check  option 相当于组示图加了一个约束）<br /> O    也是出现在示图中<br /> 非空约束和CHECK都是用C来表示</p>
		<p>查看字段约束的方法：<br /> desc    user_cons_columns;<br /> select   column_name,  position  from    user_cons_columns    where   constraint_name='S_EMP_ID_PK' ;<br /> position 的含义：联合主键，约束名一样。<br /> user_constraints    user_cons_columns   两张表的约束名相等，表名相等，两张表一关联就可以查出所需的信息。</p>
		<p>select  constraint_name , r_constraint_name  from user_constraints where  constraint_type='R'   and table_name='S_EMP' ; <br />数据库建立时，数据字典就会建好。<br />user_constraints; 自己拥有的<br />all_constraints;   你自己拥有的加上你可以访问的<br />dba_constraints  所有的</p>
		<p>查看当前数据库数据字典的字典（这个示图很重要）<br />desc   dict;<br />select table_name form  dict where table_name like   '%cons%;</p>
		<p>示图：<br />user_objects;           user_tables;<br />select  distinct   object_type  from user_objects;   </p>
		<p>介绍事务的概念：<br />commit  提交，此时说明前面所有语句都成功执行<br />rollback　回退操作，此时会恢复至上一次提交时的状态。<br />savepoint 设置保存点</p>
		<p> 注意   insert   into  后面可以跟子查询<br />insert into  s_emp_42   select *   from s_emp  where    dept_id =42; </p>
		<p>UPDATE 修改字段值：<br />update   s_emp  set dept_id =10   where   id =2 ;<br />update  s_emp  set commission_pct =10  ;  没有where条件时说明是改表中所有的值.<br />注意：如有外键引用时常会出现外键引用值没有找到等错误？</p>
		<p>delete  删除记录命令语法：<br />delete from   s_emp  where  dept_id=42;<br />delete form   s_emp ;      没有where条件时说明删除表中所有的值<br />注意：如有外键引用时，删除一张表时常会出现不能删除的情况，<br />原因一   是因为此时正在有人操作表中记录<br />原因二   此表有其他的表引用，没能设及联删除：<br />delete 删除一张大表时空间不释放，非常慢是因为占用大量的系统资源，支持回退操作，空间还被这张表占用着。<br />truncate table 表名  (删除表中记录时释放表空间)</p>
		<p>DML 语句：<br />表级共享锁： 对于操作一张表中的不同记录时，互不影响<br />行级排它锁：对于一行记录，oracle 会只允许只有一个用户对它在同一时间进行修改操作<br />wait()   等到行级锁被释放，才进行数据操作<br />drop一张表时也会对表加锁，DDL排它锁,所以在删除一张表时如果当前还有用户操作表时不能删除表</p>
		<p>
				<br />alter table 命令用于修改表的结构(这些命令不会经常用)：<br />增加约束：<br />alter table  表名 add   constraint 　约束名  primary key  (字段）;<br />解除约束：(删除约束)<br />alter  table 表名  drop  primary  key（对于主键约束可以直接用此方法，因为一张表中只有一个主键约束名, 注意如果主键此时还有其它表引用时删除主键时会出错）<br />alter  tbale   father   drop  primary key    cascade ;  (如果有子表引用主键时，要用此语法来删除主键,这时子表还存在只是子表中的外键约束被及联删除了）<br />alter table  表名 drop  constraint   约束名;<br />(怎样取一个约束名：1、人为的违反约束规定根据错误信息获取!<br />                                 2、查询示图获取约束名!)</p>
		<p>alter  table   表名  disable    from   primary  key ;  (相当于把一个表的主键禁用)<br />alter  table   表名  enable    primary key ;（enable 时会自动去检查表的记录是不是符合要求,如果有脏数据时必须要先删除脏数据才可以 enable）</p>
		<p> </p>
		<p>*******************************************************************</p>
		<p>增加字段：<br /> alter  table 　　表名　　　add(字段字  字段类型)<br />删除字段：<br /> alter table 　　 表名     drop(字段)<br /> alter tbale         表名    drop    column   字段 ; (8i 以后才支持）<br />给列改名:920才支持<br /> alter  table   表名   rename   column   旧字段名    to     新字段名;<br />修改字段<br />(此时应注意的问题，更改时要看具体值情况之间的转达换，　改为字符类型时，必须要为空)<br /> alter  table   　表名     modify( 字段，类型)<br />更改表中的字段：<br /> update 表名   set     字段     ＝      值     where       条件<br />更改表名<br /> rename       旧表名           to 　  　新表名           ；<br />删除表：<br /> trucate   table    表名:(表结构还在，数据全部删除，释放表所占的空间，不支持回退,常用删除大表）</p>
		<p> </p>
		<p>关于oralce中产生序列(sequence):<br />create sequence   序列名alter system  flush   shared_pool;<br />(不带参数时默认为从1 开始每次递增 1，oracle中为了提高产生序列的效率一般一次性产生20个序列放入当前会话的序列池中备用以加快效率，序列会出现不连续的动作回退操作不会影响序列取值）<br />sequence 的参数： <br /> increment by  n 起始值,    start with  n 递增量, maxvalue  n 最大值,  minvalue n  最小值，cycle | no cycle 轮回，  cache n  绶存(第一次取时会一次取多少个id存起来）<br />查看   sequence 示图：<br />desc    user_sequences ;<br />select   sequence_name , cache_size , last_number  from  user_sequences   where   sequence_name  like 's_';<br />select  序列名.currval  from   dual    查看当前的序列数<br />select  序列名.nextval  from   dual    查看下一个序列数，它会自动给当前的序列加１<br />为列：nextval          currval<br />(开另一个session时取当前值不成功时，应该先取下一个值，再取当前值)<br />清空当前会话的内存：<br />alter system  flush   shared_pool;（执行此命令要有DBA权限，一般用户执行出错）<br />修改序列：(此命令不常用，只需了解就行不必深究）<br />alter  sequence  序列名  修改项；<br />删除序列sequence<br />drop  sequence 序列名;</p>
		<p>创建示图： creating      views（属于了解知识）<br />desc  user_views;<br />select   text   from  user_views    where   view_name='TEST1_V1' ;<br />示图就相当于一条select 语句,定义了一个示图就是定义了一个sql语句,示图不占空间,使用view 不会提高性能，但是能简单化sql语句<br />（扩展知识： oracle  8i 以后的新示图）MV   物化视图(占存储空间，把select 结果存在一个空间，会提高查询视图,增强实时性，但是存在刷新问题， 主要应用在数据仓库中用要用于聚合表）<br />使用示图的好处：控制数据访问权限.<br />如何创建一个示图：<br />create   or replace   views   test_vi    as       select       *   from    test1   where c1=1;<br />此时往表test1（base   table  基表）中插入数据时：表中没能变化，示图中的数据发生改变<br />从示图中插数据时相对应的表会发生改变:<br />往示图中插数据时，会直接插进基表中，查看示图中的数据时，相当于就是执行创建时的select语句。<br />简单示图：能进行DML操作。<br />复杂示图：来源于多张表，不能执行DML操作。<br />关于rownum：<br />rownum  有个特点要么等于1 要么小于某个值， 不能直接等于某个值, 不能大于某个值。rownum常用于分页显示。<br />练习：查询出第5条数据和第10条数据之间：<br /> select   first_name , rnum    from   (  select   rownum   rnum    , first_name   from    s_emp  where rownum &lt;=10 )     where rnum  between 5  and  10 ;</p>
		<p>分面显示：<br />SELECT * FROM (SELECT a.*, rownum r FROM   S_EMP  a  WHERE r between 5  AND  10 )；</p>
		<p>
				<br />练习：哪些员工的工资比本部门的平均工资高？<br />select   first_name  , salary   , avgsal     from  s_emp   e , ( select   dept_id  , avg (salary )   avgsal  from   s_emp  group  by dept_id )  a   where   e.dept_id =a.dept_id and e.salary &gt; a.avgsal;<br /> 在示图上加一个 with  check   option 就相当于给示图加上了约束<br />create    view    test_v  as  select   *  from   test  where c =1  with check option ;<br />同义词:相当于别名的作用(***只需了解***）系统自建的同义词：    user_tables<br />create  synonym    asd_s_emp   for    asd_0607.s_emp ;<br />目的就是为了给asd_0607_s_emp表起另一个代替的名称asd.s_emp;注意这个同义词只能自己使用;<br />create  public     synonym  p_s_emp  fro asd_0607.s_emp; 创建公共的同义词，但是要权限.<br />删除同义词：<br />drop  synonym    同义词名称</p>
		<p>创建索引：  Creating    indexes(概念很重要对系统的性能影响非常大）<br />建索引的目的就是为了加快查询速度。<br />索引就相于一本的书的目录。索引点系统空间，属于表的附属物。删除一个表时，相对应的索引也会删除。truncate 表时索引结构在，但是数据不存在。<br />full   table    scan  全表扫描<br />用索引就是为了快速定位数据：(理解时就以字典的目录为例）<br />查看表的rowid：<br />select     rowid  , first_name    from  s_emp;<br />rowid 定义的信息有：  object   block  table<br />每条记录都有自己的rowid <br />索引由谁创建：用户,建索引后会使DML操作效率慢，但是对用户查询会提高效率,这就是我们建索引的最终目的，<br />创建一个索引：<br />create  index     索引名     on   表名 (  字段名）;<br />create   insex testindex  on test(c1, c2);<br />哪些字段应该建索引：<br />经常要用where的子句的地方，所以要用索引.用不用索引，关键要看所查询的数据与所有数据的百分比，表越大，查询的记录越少，索引的效率最高.</p>
		<p>
				<br />替换变量：用&amp;符号来定义替换变量支持交互性提示,对于字符性的数字，一定要写在单引号之间<br />set    verify on<br />set    verify off;<br />相当于开关变量，用于控制是否显示新旧的sql语句<br />select   id ,last_name  ,salary   from s_emp  where  title='&amp;job_title';<br />更改交互的提示信息：<br />accept  p_dname prompt ' 提示信息';<br />定义变量：<br />define     p_dname='abc';</p>
		<p>分页的实现语句：(可以正常运行)<br />  select   *   from  (  select   rownum   rnum  , a.*   from   (select * from s_emp) a  )     where rnum  between 5  and  10 ;<br /><br />-------------------------------------------------------------------------------------------------------------------------<br />1、关于约束的知识：<br />primary key约束：<br />主键约束的定义：<br />第一种定义形式：<br />create table   test(c   number  primary key  );     列级约束<br />第二种定义形式：<br />create table  test(c  number , primary key(c) )  ; 表级约束<br />create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1<br />create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表级约束可以实现联合主键</p>
		<p>foregin  key   (fk)   外键约束:<br />(先定义父表，再定义子表）<br />carete   table     parent(c1 number  primary key );<br />create   table    child  (c  number primary key ,   c2 number  references parent(c1));<br />或表级约束定义:<br />create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));</p>
		<p>check 约束：<br />create   table   test(c1   number  check(c1&gt;1000)); <br />此表中要求c1的值必须要大于1000 才为有效值 .   <br />****************************************************************************<br />2、关于针对表操作的语法知识：<br />  创建表：<br />   create    table  表名   (    字段名1    类型   约束条件，   字段名2    类型    约束条件 ）;<br /> <br /> 插入数据命令：<br /> 方式一：(指定字段名插入数据）<br />  insert  into   表名  ( 字段名 )    values ( 数据）；<br /> 方式二：<br />  insert  into  表名   values(数据1，  数据2）；</p>
		<p> 修改数据：<br /> update   table   表名  set ( 字段名   数据， 字段名  数据）；<br />****************************************************************************<br />3、关于alter table 命令知识:<br />alter table 命令用于修改表的结构(这些命令不会经常用)：<br />增加约束：<br />alter table  表名 add   constraint 　约束名  primary key  (字段）;<br />解除约束：(删除约束)<br />alter  table 表名  drop  primary  key（对于主键约束可以直接用此方法，因为一张表中只有一个主键约束名, 注意如果主键此时还有其它表引用时删除主键时会出错）<br />alter  tbale   father   drop  primary key    cascade ;  (如果有子表引用主键时，要用此语法来删除主键,这时子表还存在只是子表中的外键约束被及联删除了）<br />alter table  表名 drop  constraint   约束名;<br />(怎样取一个约束名：<br />a、人为的违反约束规定根据错误信息获取!<br />b、查询示图获取约束名!)<br />alter  table   表名  disable    from   primary  key ;  (相当于把一个表的主键禁用)<br />alter  table   表名  enable    primary key ;（enable 时会自动去检查表的记录是不是符合要求,如果有脏数据时必须要先删除脏数据才可以 enable）<br />增加字段：<br />alter  table 　　表名　　　add(字段字，字段类型)<br />删除字段：<br />alter table 　　 表名     drop(字段)<br />alter tbale         表名    drop    column   字段 ; (8i 以后才支持）<br />给列改名:920才支持<br />alter  table   表名   rename   column   旧字段名    to     新字段名;<br />修改字段<br />(此时应注意的问题，更改时要看具体值情况之间的转达换，　改为字符类型时，必须要为空)<br />alter  table   　表名     modify( 字段，类型)<br />更改表中的字段：<br />update 表名   set     字段     ＝      值     where       条件<br />更改表名<br />rename       旧表名           to 　  　新表名           ；<br />删除表：<br />trucate   table    表名:(表结构还在，数据全部删除，释放表所占的空间，不支持回退,常用删除大表）<br />****************************************************************************<br />4、关于oralce中产生序列(sequence)<br />create sequence   序列名alter system  flush   shared_pool;<br />(不带参数时默认为从1 开始每次递增 1，oracle中为了提高产生序列的效率一般一次性产生20个序列放入当前会话的序列池中备用以加快效率，序列会出现不连续的动作回退操作不会影响序列取值）<br />sequence 的参数： <br /> increment by  n 起始值,    start with  n 递增量, maxvalue  n 最大值,  minvalue n  最小值，cycle | no cycle 轮回，  cache n  绶存(第一次取时会一次取多少个id存起来）<br />查看   sequence 示图：<br />desc    user_sequences ;<br />select   sequence_name , cache_size , last_number  from  user_sequences   where   sequence_name  like 's_';<br />select  序列名.currval  from   dual    查看当前的序列数<br />select  序列名.nextval  from   dual    查看下一个序列数，它会自动给当前的序列加１<br />为列：nextval          currval<br />(开另一个session时取当前值不成功时，应该先取下一个值，再取当前值)<br />清空当前会话的内存：<br />alter system  flush   shared_pool;（执行此命令要有DBA权限，一般用户执行出错）<br />修改序列：(此命令不常用，只需了解就行不必深究）<br />alter  sequence  序列名  修改项；<br />删除序列sequence<br />drop  sequence 序列名;<br />****************************************************************************<br />5、创建示图： creating      views（属于了解知识）<br />示图就相当于一条select 语句,定义了一个示图就是定义了一个sql语句,示图不占空间,使用view 不会提高性能，但是能简单化sql语句<br />（扩展知识： oracle  8i 以后的新示图）MV   物化视图(占存储空间，把select 结果存在一个空间，会提高查询视图,增强实时性，但是存在刷新问题， 主要应用在数据仓库中用要用于聚合表）<br />使用示图的好处：控制数据访问权限.<br />如何创建一个示图：<br />create   or replace   views   test_vi    as       select       *   from    test1   where c1=1;<br />此时往表test1（base   table  基表）中插入数据时：表中没能变化，示图中的数据发生改变<br />从示图中插数据时相对应的表会发生改变:<br />往示图中插数据时，会直接插进基表中，查看示图中的数据时，相当于就是执行创建时的select语句。<br />简单示图：能进行DML操作。<br />复杂示图：来源于多张表，不能执行DML操作。<br />关于rownum：<br />rownum  有个特点要么等于1 要么小于某个值， 不能直接等于某个值, 不能大于某个值。rownum常用于分页显示。<br />练习：查询出第5条数据和第10条数据之间：<br />select   first_name  , rnum    from   (  select   rownum   rnum    , first_name   from   s_emp    where rownum &lt;=10 )    where rnum  between 5  and  10;<br />练习：哪些员工的工资比本部门的平均工资高？<br />select   first_name  , salary   , avgsal     from  s_emp   e , ( select   dept_id  , avg (salary )   avgsal  from   s_emp  group  by dept_id )  a   where   e.dept_id =a.dept_id and e.salary &gt; a.avgsal;<br /> 关于同义词：<br />同义词:相当于别名的作用(***只需了解***）系统自建的同义词：    user_tables<br />create  synonym    asd_s_emp   for    asd_0607.s_emp ;<br />目的就是为了给asd_0607_s_emp表起另一个代替的名称asd.s_emp;注意这个同义词只能自己使用;<br />create  public     synonym  p_s_emp  fro asd_0607.s_emp; 创建公共的同义词，但是要权限.<br />删除同义词：<br />drop  synonym    同义词名称</p>
		<p>****************************************************************************<br />6、创建索引：  Creating    indexes(概念很重要对系统的性能影响非常大）<br />建索引的目的就是为了加快查询速度。<br />索引就相于一本的书的目录。索引点系统空间，属于表的附属物。删除一个表时，相对应的索引也会删除。truncate 表时索引结构在，但是数据不存在。<br />full   table    scan  全表扫描<br />用索引就是为了快速定位数据：(理解时就以字典的目录为例）<br />查看表的rowid：<br />select     rowid  , first_name    from  s_emp;<br />rowid 定义的信息有：  object   block  table<br />每条记录都有自己的rowid <br />索引由谁创建：用户,建索引后会使DML操作效率慢，但是对用户查询会提高效率,这就是我们建索引的最终目的，<br />创建一个索引：<br />create  index     索引名     on   表名 (  字段名）;<br />create   insex testindex  on test(c1, c2);<br />哪些字段应该建索引：<br />经常要用where的子句的地方，所以要用索引.用不用索引，关键要看所查询的数据与所有数据的百分比，表越大，查询的记录越少，索引的效率最高.</p>
		<p>
				<br />替换变量：用&amp;符号来定义替换变量支持交互性提示,对于字符性的数字，一定要写在单引号之间<br />set    verify on<br />set    verify off;<br />相当于开关变量，用于控制是否显示新旧的sql语句<br />select   id ,last_name  ,salary   from s_emp  where  title='&amp;job_title';<br />更改交互的提示信息：<br />accept  p_dname prompt ' 提示信息';<br />定义变量：<br />define     p_dname='abc';<br /><br /><br /></p>
<img src ="http://www.blogjava.net/sunnygu/aggbug/104927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnygu/" target="_blank">sunny</a> 2007-03-20 12:57 <a href="http://www.blogjava.net/sunnygu/archive/2007/03/20/104927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle </title><link>http://www.blogjava.net/sunnygu/archive/2007/03/20/104924.html</link><dc:creator>sunny</dc:creator><author>sunny</author><pubDate>Tue, 20 Mar 2007 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/sunnygu/archive/2007/03/20/104924.html</guid><wfw:comment>http://www.blogjava.net/sunnygu/comments/104924.html</wfw:comment><comments>http://www.blogjava.net/sunnygu/archive/2007/03/20/104924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnygu/comments/commentRss/104924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnygu/services/trackbacks/104924.html</trackback:ping><description><![CDATA[
		<p>
				<br />两表没有任何关联时会产生迪卡尔机：<br />select   first_name , name  from    s_emp , s_dept;<br />等值连接：<br />练习一:查看员工的姓名和员工部门号:(要考虑到表中实际数据中空值的影响）<br />select   first_name ,   name from  s_emp, s_dept   where s_emp.dept_id=s_dept.id;<br />　<br />练习二：每个员工所在的部门和部门所在的地区<br />select first_name , name   from s_emp, s_dept,  s_region  where  s_emp.dept_id=s_dept.id and s_dept.region_id=s_region.id;<br /><br />非等值连接 <br />练习三:查出每个员工和每个员工的工资级别) <br /> select    a.ename , a.sal, b.grade from emp a , salgrade b  where a.sal between b.losal and b.hisal; <br /> select    a.ename , a.sal, b.grade from  emp a , salgrade b  where a.sal&gt;=b.losal  and  a.sal&lt;=b.hisal;  </p>
		<p>自连接： <br />select   first_name   , manager_id   from  s_emp;<br />练习四:查出所有员工的部门领导的名称：( 这种sql会少一条记录，总经理没有被配置上） <br />select  e.first_name , m.first_name   from s_emp e , s_emp m  where   e.manager_id=m.id;7fg<br /> 　 <br />外连接：(防止空值时，用（+）的一方会模拟一条记录配置另一方)这就称为外连接,一个记录都不能少； <br />select  e.first_name , m.first_name   from s_emp e , s_emp m  where   e.manager_id=m.id(+); <br /><br />练习五：查看员工分部的部门： <br />select  distinct(deptno) from emp ; <br />找出没有员工的部门：(很经典的一个例子,用外连接来解决的标准做法,这是一种方式，用子查询也可以实现） <br />第一步： <br />select     e.deptno , d.deptno  from emp e , dept d  where  e.deptno(+)=d.deptno; <br />第二步：(!L_=N<br />select     e.deptno , d.deptno  from emp e , dept d  where  e.deptno(+)=d.deptno   and   e.deptno is null; <br /><br />练习六：查询员工有多少人有提成： <br />select  count( commission_pct ) from    s_emp ; <br />select   sum(commission_pct)/ count(*)   from     s_emp;<br />　　 <br />练习七：员工分部在多少个不同的部门： <br />select   count(dept_id)  from s_emp; <br />select   count(distinct dept_id) from   s_emp; <br /> 　 <br />练习八：求各个部门的平均工资： <br />select  dept_id ,  avg(salary) aa    from    s_emp    group by   dept_id   order by  aa ; <br />select  dept_id ,  avg(salary) aa    from    s_emp    group by   dept_id    ; <br />//体会下句sql <br />select   region_id , count(*)  from  s_dept ****此句会有错,请多体会******** <br />select   max(region_id)  , count(*) from       s_dept;  (强制语法上可以正确,但是不能保证结果也会正确） </p>
		<p>练习九：求各个部门不同工种的平均工资：<br />select     dept_id , title,  avg(salary)  from s_emp   group   by dept_id , title  ;</p>
		<p>练习十：查询哪些部门的平均工资比2000高:<br />select    dept_id,  avg(salary) aa  from s_emp   group by (dept_id)    having      avg(salary)&gt;2000;</p>
		<p>练习十一：除了42部门以外的部门的平均工资:<br />select   dept_id  ,  avg(salary)   from  s_emp  group by (dept_id ) having    dept_id!=42;<br />select   dept_id  ,  avg(salary)   from  s_emp   where   dept_id!=42  group by (dept_id ) ;(此种sql效率要高，先过滤再计算）</p>
		<p>练习十二：求各个部门的平均工资:<br />//****这问题很经典，为了过 oracle sql 语法关而写max(d.name)  <br />select   max(d.name)  , avg(e.salary)  , max(r.name)  from s_emp e,   s_dept  d ,   s_region  r  where  e.dept_id = d.id  and </p>
		<p> d.region_id=r.id group  by   d.id ;</p>
		<p>关于子查询:  Subqueries<br />练习十三：找出所有员工中，工资最低的那个员工：( 利用子查询 ）<br />select    first_name,  salary    from s_emp   where   salary = (  select  min(salary)  from s_emp)    ;<br />//这样写会出错姓名和工资不一致<br />select max(first_name),  min(salary)  from s_emp;</p>
		<p>练习十四：查询谁跟Smith的工种一样：<br />select   last_name from  s_emp  where last_name='Smith';<br />//下种写法可能还存在bug，没有考虑到数据的全面性,有潜在性问题<br />select  last_name  , title  from s_emp   where title =(  select   title  from s_emp  where  last_name='Smith'  )and  </p>
		<p>last_name &lt;&gt; 'Smith'  ;<br />//这种写法才考虑的比较全面<br />select  last_name  , title  from s_emp   where title   in   (  select   title  from s_emp  where  last_name='Smith'  )    and </p>
		<p> last_name &lt;&gt; 'Smith'  ;<br />使用子查询时应注意：  单行子查询返回多个结果时会有错误    single-row  subquery returns  more  than one value(<br />练习十五：查出哪些员工的工资比平均工资低：<br />select    *  from s_emp  where     salary   &lt;  ( select  avg(salary)  from   s_emp)  ;<br />哪些部门的平均工资比32部门的平均工资要低：<br />第一步先查出各个部门的平均工资：<br />select  min(avg(salary  )  ) from   s_emp   group by  dept_id;<br />第二步再查出哪个部门的工资是最低的:<br />select    dept_id,  avg(salary)  from  s_emp   group by dept_id   having   avg(salary) =  (select  min(avg(salary)  ) from  </p>
		<p>s_emp  group by  dept_id ) ;<br />练习十六：哪个部门里没有员工(用子查询的方式来实现）：<br />select   deptno  from    dept    where   deptno   not  in ( select     deptno    from   emp );<br /></p>
<img src ="http://www.blogjava.net/sunnygu/aggbug/104924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnygu/" target="_blank">sunny</a> 2007-03-20 12:48 <a href="http://www.blogjava.net/sunnygu/archive/2007/03/20/104924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>plsql命令大全</title><link>http://www.blogjava.net/sunnygu/archive/2007/03/20/104892.html</link><dc:creator>sunny</dc:creator><author>sunny</author><pubDate>Tue, 20 Mar 2007 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/sunnygu/archive/2007/03/20/104892.html</guid><description><![CDATA[
		<p>SQL*PLUS命令的使用大全</p>
		<p>                               SQL*PLUS命令的使用大全 <br />    <br />       Oracle的sql*plus是与oracle进行交互的客户端工具。在sql*plus中，可以运行sql*plus命令与sql*plus语句。我们通常所说的DML、DDL、DCL语句都是sql*plus语句，它们执行完后，都可以保存在一个被称为<br />sql buffer的内存区域中，并且只能保存一条最近执行的sql语句，我们可以对保存在sql buffer中的sql 语句进行修改，然后再次执行，sql*plus一般都与数据库打交道。 <br />   除了sql*plus语句，在sql*plus中执行的其它语句我们称之为sql*plus命令。它们执行完后，不保存在sql buffer的内存区域中，它们一般用来对输出的结果进行格式化显示，以便于制作报表。 <br />   下面就介绍一下一些常用的sql*plus命令： <br />  <br />1. 执行一个SQL脚本文件 <br />SQL&gt;start file_name <br />SQL&gt;@ file_name <br />我们可以将多条sql语句保存在一个文本文件中，这样当要执行这个文件中的所有的sql语句时，用上面的任一命令即可，这类似于dos中的批处理。 <br />  <br />2. 对当前的输入进行编辑 <br />SQL&gt;edit <br />  <br />3. 重新运行上一次运行的sql语句 <br />SQL&gt;/ <br />  <br />4. 将显示的内容输出到指定文件 <br />SQL&gt; SPOOL file_name <br />   在屏幕上的所有内容都包含在该文件中，包括你输入的sql语句。 <br />  <br />5. 关闭spool输出 <br />SQL&gt; SPOOL OFF <br />   只有关闭spool输出，才会在输出文件中看到输出的内容。 <br />  <br />6．显示一个表的结构 <br />SQL&gt; desc table_name <br />  <br />7. COL命令： <br />主要格式化列的显示形式。 <br />该命令有许多选项，具体如下： <br />COL[UMN] [{ column|expr} [ option ...]] <br />Option选项可以是如下的子句: <br />ALI[AS] alias <br />CLE[AR] <br />FOLD_A[FTER] <br />FOLD_B[EFORE] <br />FOR[MAT] format <br />HEA[DING] text <br />JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]} <br />LIKE { expr|alias} <br />NEWL[INE] <br />NEW_V[ALUE] variable <br />NOPRI[NT]|PRI[NT] <br />NUL[L] text <br />OLD_V[ALUE] variable <br />ON|OFF <br />WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED] <br />  <br />1). 改变缺省的列标题 <br />COLUMN column_name HEADING column_heading <br />For example: <br />Sql&gt;select * from dept; <br />     DEPTNO DNAME                        LOC <br />---------- ---------------------------- --------- <br />         10 ACCOUNTING                   NEW YORK <br />sql&gt;col  LOC heading location <br />sql&gt;select * from dept; <br />    DEPTNO DNAME                        location <br />--------- ---------------------------- ----------- <br />        10 ACCOUNTING                   NEW YORK <br />  <br />2). 将列名ENAME改为新列名EMPLOYEE NAME并将新列名放在两行上： <br />Sql&gt;select * from emp <br />Department  name           Salary <br />---------- ---------- ---------- <br />         10 aaa                11         <br />SQL&gt; COLUMN ENAME HEADING ’Employee|Name’ <br />Sql&gt;select * from emp <br />            Employee <br />Department  name           Salary <br />---------- ---------- ----------  <br />         10 aaa                11 <br />note: the col heading turn into two lines from one line. <br />  <br />3). 改变列的显示长度： <br />FOR[MAT] format <br />Sql&gt;select empno,ename,job from emp; <br />      EMPNO ENAME      JOB        <br />---------- ----------     --------- <br />       7369 SMITH      CLERK      <br />       7499 ALLEN      SALESMAN   <br />7521 WARD       SALESMAN   <br />Sql&gt; col ename format a40 <br />      EMPNO ENAME                                    JOB <br />----------   ----------------------------------------         --------- <br />       7369 SMITH                                    CLERK <br />       7499 ALLEN                                    SALESMAN <br />       7521 WARD                                    SALESMAN <br />  <br />4). 设置列标题的对齐方式 <br />JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]} <br />SQL&gt; col ename justify center <br />SQL&gt; / <br />      EMPNO           ENAME                   JOB <br />----------   ----------------------------------------       --------- <br />       7369 SMITH                                    CLERK <br />       7499 ALLEN                                    SALESMAN <br />7521 WARD                                     SALESMAN <br />对于NUMBER型的列，列标题缺省在右边，其它类型的列标题缺省在左边 <br />  <br />5). 不让一个列显示在屏幕上 <br />NOPRI[NT]|PRI[NT] <br />SQL&gt; col job noprint <br />SQL&gt; / <br />      EMPNO           ENAME <br />----------     ---------------------------------------- <br />       7369 SMITH <br />       7499 ALLEN <br />7521 WARD <br />  <br />6). 格式化NUMBER类型列的显示： <br />SQL&gt; COLUMN SAL FORMAT $99,990 <br />SQL&gt; / <br />Employee <br />Department Name        Salary    Commission <br />---------- ---------- --------- ---------- <br />30          ALLEN        $1,600    300 <br />  <br />7). 显示列值时，如果列值为NULL值，用text值代替NULL值 <br />COMM NUL[L] text <br />SQL&gt;COL COMM NUL[L] text <br />  <br />8). 设置一个列的回绕方式 <br />WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED] <br />        COL1 <br />-------------------- <br />HOW ARE YOU? <br />  <br />SQL&gt;COL COL1 FORMAT A5 <br />SQL&gt;COL COL1 WRAPPED <br />COL1 <br />----- <br />HOW A <br />RE YO <br />U? <br />  <br />SQL&gt; COL COL1 WORD_WRAPPED <br />COL1 <br />----- <br />HOW <br />ARE <br />YOU? <br />  <br />SQL&gt; COL COL1 WORD_WRAPPED <br />COL1 <br />----- <br />HOW A <br />  <br />9). 显示列的当前的显示属性值 <br />SQL&gt; COLUMN column_name <br />  <br />10). 将所有列的显示属性设为缺省值 <br />SQL&gt; CLEAR COLUMNS <br />  <br />8. 屏蔽掉一个列中显示的相同的值 <br />BREAK ON break_column <br />SQL&gt; BREAK ON DEPTNO <br />SQL&gt; SELECT DEPTNO, ENAME, SAL <br />FROM EMP <br />  WHERE SAL &lt; 2500 <br />  ORDER BY DEPTNO; <br />DEPTNO      ENAME         SAL <br />---------- ----------- --------- <br />10           CLARK        2450 <br />MILLER      1300 <br />20            SMITH       800 <br />ADAMS       1100 <br />  <br />9. 在上面屏蔽掉一个列中显示的相同的值的显示中，每当列值变化时在值变化之前插入n个空行。 <br />BREAK ON break_column SKIP n <br />  <br />SQL&gt; BREAK ON DEPTNO SKIP 1 <br />SQL&gt; / <br />DEPTNO ENAME SAL <br />---------- ----------- --------- <br />10 CLARK 2450 <br />MILLER 1300 <br />  <br />20 SMITH 800 <br />ADAMS 1100 <br />  <br />10. 显示对BREAK的设置 <br />SQL&gt; BREAK <br />  <br />11. 删除6、7的设置 <br />SQL&gt; CLEAR BREAKS <br />  <br />12. Set 命令： <br />该命令包含许多子命令： <br />SET system_variable value <br />system_variable value 可以是如下的子句之一： <br />APPI[NFO]{ON|OFF|text} <br />ARRAY[SIZE] {15|n} <br />AUTO[COMMIT]{ON|OFF|IMM[EDIATE]|n} <br />AUTOP[RINT] {ON|OFF} <br />AUTORECOVERY [ON|OFF] <br />AUTOT[RACE] {ON|OFF|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]] <br />BLO[CKTERMINATOR] {.|c} <br />CMDS[EP] {;|c|ON|OFF} <br />COLSEP {_|text} <br />COM[PATIBILITY]{V7|V8|NATIVE} <br />CON[CAT] {.|c|ON|OFF} <br />COPYC[OMMIT] {0|n} <br />COPYTYPECHECK {ON|OFF} <br />DEF[INE] {&amp;|c|ON|OFF} <br />DESCRIBE [DEPTH {1|n|ALL}][LINENUM {ON|OFF}][INDENT {ON|OFF}] <br />ECHO {ON|OFF} <br />EDITF[ILE] file_name[.ext] <br />EMB[EDDED] {ON|OFF} <br />ESC[APE] {\|c|ON|OFF} <br />FEED[BACK] {6|n|ON|OFF} <br />FLAGGER {OFF|ENTRY |INTERMED[IATE]|FULL} <br />FLU[SH] {ON|OFF} <br />HEA[DING] {ON|OFF} <br />HEADS[EP] {||c|ON|OFF} <br />INSTANCE [instance_path|LOCAL] <br />LIN[ESIZE] {80|n} <br />LOBOF[FSET] {n|1} <br />LOGSOURCE [pathname] <br />LONG {80|n} <br />LONGC[HUNKSIZE] {80|n} <br />MARK[UP] HTML [ON|OFF] [HEAD text] [BODY text] [ENTMAP {ON|OFF}] [SPOOL <br />{ON|OFF}] [PRE[FORMAT] {ON|OFF}] <br />NEWP[AGE] {1|n|NONE} <br />NULL text <br />NUMF[ORMAT] format <br />NUM[WIDTH] {10|n} <br />PAGES[IZE] {24|n} <br />PAU[SE] {ON|OFF|text} <br />RECSEP {WR[APPED]|EA[CH]|OFF} <br />RECSEPCHAR {_|c} <br />SERVEROUT[PUT] {ON|OFF} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_ <br />WRAPPED]|TRU[NCATED]}] <br />SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]} <br />SHOW[MODE] {ON|OFF} <br />SQLBL[ANKLINES] {ON|OFF} <br />SQLC[ASE] {MIX[ED]|LO[WER]|UP[PER]} <br />SQLCO[NTINUE] {&gt; |text} <br />SQLN[UMBER] {ON|OFF} <br />SQLPRE[FIX] {#|c} <br />SQLP[ROMPT] {SQL&gt;|text} <br />SQLT[ERMINATOR] {;|c|ON|OFF} <br />SUF[FIX] {SQL|text} <br />TAB {ON|OFF} <br />TERM[OUT] {ON|OFF} <br />TI[ME] {ON|OFF} <br />TIMI[NG] {ON|OFF} <br />TRIM[OUT] {ON|OFF} <br />TRIMS[POOL] {ON|OFF} <br />UND[ERLINE] {-|c|ON|OFF} <br />VER[IFY] {ON|OFF} <br />WRA[P] {ON|OFF} <br />  <br />1). 设置当前session是否对修改的数据进行自动提交 <br />SQL&gt;SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n} <br />  <br />2)．在用start命令执行一个sql脚本时，是否显示脚本中正在执行的SQL语句 <br />SQL&gt; SET ECHO {ON|OFF} <br />  <br />3).是否显示当前sql语句查询或修改的行数 <br />SQL&gt; SET FEED[BACK] {6|n|ON|OFF} <br />   默认只有结果大于6行时才显示结果的行数。如果set feedback 1 ，则不管查询到多少行都返回。当为off 时，一律不显示查询的行数 <br />  <br />4).是否显示列标题 <br />SQL&gt; SET HEA[DING] {ON|OFF} <br />当set heading off 时，在每页的上面不显示列标题，而是以空白行代替 <br />  <br />5).设置一行可以容纳的字符数 <br />SQL&gt; SET LIN[ESIZE] {80|n} <br />   如果一行的输出内容大于设置的一行可容纳的字符数，则折行显示。 <br />  <br />6).设置页与页之间的分隔 <br />SQL&gt; SET NEWP[AGE] {1|n|NONE} <br />当set newpage 0 时，会在每页的开头有一个小的黑方框。 <br />当set newpage n 时，会在页和页之间隔着n个空行。 <br />当set newpage none 时，会在页和页之间没有任何间隔。 <br />  <br />7).显示时，用text值代替NULL值 <br />SQL&gt; SET NULL text <br />  <br />8).设置一页有多少行数 <br />SQL&gt; SET PAGES[IZE] {24|n} <br />如果设为0，则所有的输出内容为一页并且不显示列标题 <br />  <br />9).是否显示用DBMS_OUTPUT.PUT_LINE包进行输出的信息。 <br />SQL&gt; SET SERVEROUT[PUT] {ON|OFF}  <br />在编写存储过程时，我们有时会用dbms_output.put_line将必要的信息输出，以便对存储过程进行调试，只有将serveroutput变量设为on后，信息才能显示在屏幕上。 <br />  <br />10).当SQL语句的长度大于LINESIZE时，是否在显示时截取SQL语句。 <br />SQL&gt; SET WRA[P] {ON|OFF} <br />   当输出的行的长度大于设置的行的长度时（用set linesize n命令设置），当set wrap on时，输出行的多于的字符会另起一行显示，否则，会将输出行的多于字符切除，不予显示。 <br />  <br />11).是否在屏幕上显示输出的内容，主要用与SPOOL结合使用。 <br />SQL&gt; SET TERM[OUT] {ON|OFF} <br />   在用spool命令将一个大表中的内容输出到一个文件中时，将内容输出在屏幕上会耗费大量的时间，设置set termspool off后，则输出的内容只会保存在输出文件中，不会显示在屏幕上，极大的提高了spool的速度。 <br />  <br />12).将SPOOL输出中每行后面多余的空格去掉 <br />SQL&gt; SET TRIMS[OUT] {ON|OFF}  <br />    <br />13)显示每个sql语句花费的执行时间 <br />set TIMING  {ON|OFF} <br />  <br />14．修改sql buffer中的当前行中，第一个出现的字符串 <br />C[HANGE] /old_value/new_value <br />SQL&gt; l <br />   1* select * from dept <br />SQL&gt; c/dept/emp <br />   1* select * from emp <br />  <br />15．编辑sql buffer中的sql语句 <br />EDI[T] <br />  <br />16．显示sql buffer中的sql语句，list n显示sql buffer中的第n行，并使第n行成为当前行 <br />L[IST] [n] <br />  <br />17．在sql buffer的当前行下面加一行或多行 <br />I[NPUT] <br />  <br />18．将指定的文本加到sql buffer的当前行后面 <br />A[PPEND] <br />SQL&gt; select deptno, <br />   2  dname <br />   3  from dept; <br />     DEPTNO DNAME <br />---------- -------------- <br />         10 ACCOUNTING <br />         20 RESEARCH <br />         30 SALES <br />         40 OPERATIONS <br />  <br />SQL&gt; L 2 <br />   2* dname <br />SQL&gt; a ,loc <br />   2* dname,loc <br />SQL&gt; L <br />   1  select deptno, <br />   2  dname,loc <br />   3* from dept <br />SQL&gt; / <br />  <br />     DEPTNO DNAME          LOC <br />---------- -------------- ------------- <br />         10 ACCOUNTING     NEW YORK <br />         20 RESEARCH       DALLAS <br />         30 SALES          CHICAGO <br />         40 OPERATIONS     BOSTON <br />  <br />19．将sql buffer中的sql语句保存到一个文件中 <br />SAVE file_name <br />  <br />20．将一个文件中的sql语句导入到sql buffer中 <br />GET file_name <br />  <br />21．再次执行刚才已经执行的sql语句 <br />RUN <br />or <br />/ <br />  <br />22．执行一个存储过程 <br />EXECUTE procedure_name <br />  <br />23．在sql*plus中连接到指定的数据库 <br />CONNECT <a href="mailto:user_name/passwd@db_alias">user_name/passwd@db_alias</a><br />  <br />24．设置每个报表的顶部标题 <br />TTITLE <br />  <br />25．设置每个报表的尾部标题 <br />BTITLE <br />  <br />26．写一个注释 <br />REMARK [text] <br />  <br />27．将指定的信息或一个空行输出到屏幕上 <br />PROMPT [text] <br />  <br />28．将执行的过程暂停，等待用户响应后继续执行 <br />PAUSE [text] <br />  <br />Sql&gt;PAUSE Adjust paper and press RETURN to continue. <br />  <br />29．将一个数据库中的一些数据拷贝到另外一个数据库（如将一个表的数据拷贝到另一个数据库） <br />COPY {FROM database | TO database | FROM database TO database} <br />{APPEND|CREATE|INSERT|REPLACE} destination_table <br />[(column, column, column, ...)] USING query <br />  <br />sql&gt;COPY FROM <a href="mailto:SCOTT/TIGER@HQ">SCOTT/TIGER@HQ</a> TO <a href="mailto:JOHN/CHROME@WEST">JOHN/CHROME@WEST</a>  <br />create emp_temp <br />USING SELECT * FROM EMP <br />  <br />30．不退出sql*plus，在sql*plus中执行一个操作系统命令： <br />HOST <br />  <br />Sql&gt; host hostname <br />该命令在windows下可能被支持。 <br />  <br />31．在sql*plus中，切换到操作系统命令提示符下，运行操作系统命令后，可以再次切换回sql*plus： <br />! <br />  <br />sql&gt;! <br />$hostname <br />$exit <br />sql&gt; <br />  <br />该命令在windows下不被支持。 <br />  <br />32．显示sql*plus命令的帮助 <br />HELP <br />如何安装帮助文件： <br />Sql&gt;@ ?\sqlplus\admin\help\hlpbld.sql ?\sqlplus\admin\help\helpus.sql <br />Sql&gt;help index <br />  <br />33．显示sql*plus系统变量的值或sql*plus环境变量的值 <br />Syntax <br />SHO[W] option <br />where option represents one of the following terms or clauses: <br />system_variable <br />ALL <br />BTI[TLE] <br />ERR[ORS] [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY| <br />TRIGGER|VIEW|TYPE|TYPE BODY} [schema.]name] <br />LNO <br />PARAMETERS [parameter_name] <br />PNO <br />REL[EASE] <br />REPF[OOTER] <br />REPH[EADER] <br />SGA <br />SPOO[L] <br />SQLCODE <br />TTI[TLE] <br />USER <br />  <br />1) . 显示当前环境变量的值： <br />Show all <br />  <br />2) . 显示当前在创建函数、存储过程、触发器、包等对象的错误信息 <br />Show error <br />当创建一个函数、存储过程等出错时，变可以用该命令查看在那个地方出错及相应的出错信息，进行修改后再次进行编译。 <br />  <br />3) . 显示初始化参数的值： <br />show PARAMETERS [parameter_name] <br />  <br />4) . 显示数据库的版本： <br />show REL[EASE] <br />  <br />5) . 显示SGA的大小 <br />show SGA <br />  <br />6). 显示当前的用户名 <br />show user</p>
<img src ="http://www.blogjava.net/sunnygu/aggbug/104892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnygu/" target="_blank">sunny</a> 2007-03-20 10:36 <a href="http://www.blogjava.net/sunnygu/archive/2007/03/20/104892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>郁闷!</title><link>http://www.blogjava.net/sunnygu/archive/2007/03/11/103162.html</link><dc:creator>sunny</dc:creator><author>sunny</author><pubDate>Sun, 11 Mar 2007 13:45:00 GMT</pubDate><guid>http://www.blogjava.net/sunnygu/archive/2007/03/11/103162.html</guid><wfw:comment>http://www.blogjava.net/sunnygu/comments/103162.html</wfw:comment><comments>http://www.blogjava.net/sunnygu/archive/2007/03/11/103162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnygu/comments/commentRss/103162.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnygu/services/trackbacks/103162.html</trackback:ping><description><![CDATA[一个寄人篱下的无业游民被人抛弃!<img src ="http://www.blogjava.net/sunnygu/aggbug/103162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnygu/" target="_blank">sunny</a> 2007-03-11 21:45 <a href="http://www.blogjava.net/sunnygu/archive/2007/03/11/103162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>乱码问题！</title><link>http://www.blogjava.net/sunnygu/archive/2007/01/30/96808.html</link><dc:creator>sunny</dc:creator><author>sunny</author><pubDate>Tue, 30 Jan 2007 15:12:00 GMT</pubDate><guid>http://www.blogjava.net/sunnygu/archive/2007/01/30/96808.html</guid><wfw:comment>http://www.blogjava.net/sunnygu/comments/96808.html</wfw:comment><comments>http://www.blogjava.net/sunnygu/archive/2007/01/30/96808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnygu/comments/commentRss/96808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnygu/services/trackbacks/96808.html</trackback:ping><description><![CDATA[
		<p>１）最近做上传文件时遇到了讨厌的乱码问题！<br />现象是上传纯文本文件，显示没有问题，但是word文档中有图表就会出现乱码！<br /><br />原因，是由于我用了clob字段来保存文档！<br /><br />２）在下载时遇到中文文件名乱码．解决方法是把文件名重新编码！<br /> response.setHeader("Content-disposition", "attachment;filename=\"" +new String(bszn.getFileFileName().getBytes("gb2312"),"iso8859-1")+"\"");<br /><br /><strong>mysql 的blob字段只有64k,要有大点的文件要用longBlob</strong><br />                  </p>
<img src ="http://www.blogjava.net/sunnygu/aggbug/96808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnygu/" target="_blank">sunny</a> 2007-01-30 23:12 <a href="http://www.blogjava.net/sunnygu/archive/2007/01/30/96808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速排序不新建临时数组</title><link>http://www.blogjava.net/sunnygu/archive/2007/01/25/96059.html</link><dc:creator>sunny</dc:creator><author>sunny</author><pubDate>Thu, 25 Jan 2007 14:51:00 GMT</pubDate><guid>http://www.blogjava.net/sunnygu/archive/2007/01/25/96059.html</guid><wfw:comment>http://www.blogjava.net/sunnygu/comments/96059.html</wfw:comment><comments>http://www.blogjava.net/sunnygu/archive/2007/01/25/96059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnygu/comments/commentRss/96059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnygu/services/trackbacks/96059.html</trackback:ping><description><![CDATA[#include&lt;iostream&gt;//快速排序不新建临时数组<br />using namespace std;<br />void swap(int &amp;a,int &amp;b){<br />    if(&amp;a==&amp;b)<br />         return;    <br />     a=a^b;<br />     b=a^b;<br />     a=a^b;<br />     }<br />void quick(int *a,int n)<br />{<br />     if(n&lt;=1)<br />         return ;<br />     swap(*a,a[n&gt;&gt;1]);<br />     int*lp=a+1;<br />     int*rp=a+n-1;<br />     while(rp-lp&gt;=0)<br />     {<br />      if(*lp&gt;*a)<br />            {<br />             if(*rp&lt;*a){              <br />               swap(*lp++,*rp--);<br />               } <br />             else<br />               --rp; <br />            }<br />      else<br />         ++lp;            <br />      }<br />  swap(*a,*rp);    <br />              <br />    int left=rp-a;<br />    quick(a,left);<br />    quick(a+left+1,n-left-1) ;   <br /> } <br />int main(){<br />    int a[5]={0 ,5, 9, 8, 7 };<br />    int b[10]={2,5,9,6,3,1,4,7,1 ,5 };<br />    quick(b,10);<br />    for(int i=0;i&lt;10;i++)<br />            cout&lt;&lt;b[i]&lt;&lt;' ';<br />            cout&lt;&lt;endl;<br />    char ch;<br />    cin&gt;&gt;ch;<br />    return 0;<br />    }<br /><img src ="http://www.blogjava.net/sunnygu/aggbug/96059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnygu/" target="_blank">sunny</a> 2007-01-25 22:51 <a href="http://www.blogjava.net/sunnygu/archive/2007/01/25/96059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>