??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av成人片在线观看,久久久久亚洲AV无码专区首JN,伊伊人成亚洲综合人网7777http://www.tkk7.com/sunnygu/zh-cnSun, 11 May 2025 01:48:43 GMTSun, 11 May 2025 01:48:43 GMT60wsad 技?---打开特定的wo'r'k's'pacehttp://www.tkk7.com/sunnygu/archive/2007/09/13/144761.htmlsunnysunnyThu, 13 Sep 2007 02:55:00 GMThttp://www.tkk7.com/sunnygu/archive/2007/09/13/144761.htmlhttp://www.tkk7.com/sunnygu/comments/144761.htmlhttp://www.tkk7.com/sunnygu/archive/2007/09/13/144761.html#Feedback0http://www.tkk7.com/sunnygu/comments/commentRss/144761.htmlhttp://www.tkk7.com/sunnygu/services/trackbacks/144761.html
?D:\Program Files\IBM\Rational\SDP\6.0\rationalsdp.exe" -data E:\EE-workspace\1600

sunny 2007-09-13 10:55 发表评论
]]>
log4j的配|?/title><link>http://www.tkk7.com/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.tkk7.com/sunnygu/archive/2007/06/05/122219.html</guid><wfw:comment>http://www.tkk7.com/sunnygu/comments/122219.html</wfw:comment><comments>http://www.tkk7.com/sunnygu/archive/2007/06/05/122219.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/sunnygu/comments/commentRss/122219.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/sunnygu/services/trackbacks/122219.html</trackback:ping><description><![CDATA[实际~程Ӟ要Log4j真正在系l中q行事先q要寚w|文件进行定义。定义步骤就是对Logger、Appender及Layout的分别用? Log4j支持两种配置文g格式Q一U是XML格式的文Ӟ一U是java propertiesQkey=valueQ【JavaҎ文Ӟ?|】。下面我们介l用JavaҎ文件做为配|文件的Ҏ 具体如下Q?      1、配|根LoggerQ其语法为:   log4j.rootLogger = [ level ] , appenderName1, appenderName2, ? level : 是日志记录的优先U,分ؓOFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的别。Log4j只用四个别,优先U从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q您可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里定义了INFOU别Q则应用E序中所有DEBUGU别的日志信息将不被打印出来?    appenderName:是指定日志信息输出到哪个地斏V您可以同时指定多个输出目的地? 例如Qlog4j.rootLoggerQinfo,A1,B2,C3      2、配|日志信息输出目的地Q其语法为:   log4j.appender.appenderName = fully.qualified.name.of.appender.class //    "fully.qualified.name.of.appender.class" 可以指定下面五个目的C的一个: 1.org.apache.log4j.ConsoleAppenderQ控制台Q? 2.org.apache.log4j.FileAppenderQ文Ӟ 3.org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文Ӟ 4.org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文Ӟ 5.org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方) 1.ConsoleAppender选项 Threshold=WARN:指定日志消息的输出最低层ơ? ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出? Target=System.errQ默认情况下是:System.out,指定输出控制? 2.FileAppender 选项 Threshold=WARN:指定日志消息的输出最低层ơ? ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出? File=mylog.txt:指定消息输出到mylog.txt文g? Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V? 3.DailyRollingFileAppender 选项 Threshold=WARN:指定日志消息的输出最低层ơ? ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出? File=mylog.txt:指定消息输出到mylog.txt文g? Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V? DatePattern='.'yyyy-ww:每周滚动一ơ文Ӟx周生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下: 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文g? Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V? MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小Ӟ会自动滚动Q即原来的内容Udmylog.log.1文g? MaxBackupIndex=2:指定可以产生的滚动文件的最大数? 实际应用Q?   log4j.appender.A1=org.apache.log4j.ConsoleAppender //q里指定了日志输出的W一个位|A1是控制台ConsoleAppender      3、配|日志信息的格式Q其语法为:   A.log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class "fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个: 1.org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,    2.org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,    3.org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,    4.org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息) 1.HTMLLayout 选项 LocationInfo=true:默认值是false,输出java文g名称和行? Title=my app file: 默认值是 Log4J Log Messages. 2.PatternLayout 选项 ConversionPattern=%m%n :指定怎样格式化指定的消息? 3.XMLLayout 选项 LocationInfo=true:默认值是false,输出java文g和行? 实际应用Q?   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 q里需要说明的是日志信息格式中几个符h代表的含义:    QX? X信息输出时左寚wQ? %p: 输出日志信息优先U,即DEBUGQINFOQWARNQERRORQFATAL, %d: 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21 %r: 输出自应用启动到输出该log信息耗费的毫U数 %c: 输出日志信息所属的cȝQ通常是所在类的全? %t: 输出产生该日志事件的U程? %l: 输出日志事g的发生位|,相当?C.%M(%F:%L)的组?包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main(TestLog4.java:10) %x: 输出和当前线E相兌的NDC(嵌套诊断环境),其用到像java servletsq样的多客户多线E的应用中? %%: 输出一?%"字符 %F: 输出日志消息产生时所在的文g名称 %L: 输出代码中的行号 %m: 输出代码中指定的消息,产生的日志具体信? %n: 输出一个回车换行符QWindowsq_?\r\n"QUnixq_?\n"输出日志信息换行 可以?与模式字W之间加上修饰符来控制其最宽度、最大宽度、和文本的对齐方式。如Q? 1)%20cQ指定输出category的名Uͼ最的宽度?0Q如果category的名U小?0的话Q默认的情况下右寚w? 2)%-20c:指定输出category的名Uͼ最的宽度?0Q如果category的名U小?0的话Q?-"h定左寚w? 3)%.30c:指定输出category的名Uͼ最大的宽度?0Q如果category的名U大?0的话Q就会将左边多出的字W截掉,但小?0的话也不会有I格? 4)%20.30c:如果category的名U小?0pI格Qƈ且右寚wQ如果其名称长于30字符Q就从左边交q销出的字符截掉?   q里上面三个步骤是对前面Log4jlg说明的一个简化;下面l出一个具体配|例子,在程序中可以参照执行Q?   log4j.rootLogger=INFO,A1QB2   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   Ҏ上面的日志格式,某一个程序的输出l果如下Q?   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. # 当输Z息于回滚文g? log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender //指定以文件的方式输出日志 log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log //文g位置,也可以用变量${java.home}、rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文g最大尺? 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配置文g实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签{全套功能。择其一二用就够用了, 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 //文g位置,也可以用变量${java.home}、rolling.log log4j.appender.ROLLING_FILE.Append=true //true:d false:覆盖 log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文g最大尺? 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 # 发送日志给邮g 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.tkk7.com/sunnygu/aggbug/122219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/sunnygu/" target="_blank">sunny</a> 2007-06-05 19:37 <a href="http://www.tkk7.com/sunnygu/archive/2007/06/05/122219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpFilterhttp://www.tkk7.com/sunnygu/archive/2007/04/06/108969.htmlsunnysunnyFri, 06 Apr 2007 08:31:00 GMThttp://www.tkk7.com/sunnygu/archive/2007/04/06/108969.htmlhttp://www.tkk7.com/sunnygu/comments/108969.htmlhttp://www.tkk7.com/sunnygu/archive/2007/04/06/108969.html#Feedback0http://www.tkk7.com/sunnygu/comments/commentRss/108969.htmlhttp://www.tkk7.com/sunnygu/services/trackbacks/108969.htmlimport javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public abstract class HttpFilter implements Filter
{
    private FilterConfig config;
   
    //////////////////////////////////
    public void init(FilterConfig config) throws ServletException
    {
        this.config = config;
        init();
    }
   
    public void init() throws ServletException
    {
    }
    ///////////////////////////////
    public FilterConfig getFilterConfig()
    {
        return config;
    }
   
    public String getInitParameter(String name)
    {
        return config.getInitParameter(name);
    }
   
    public ServletContext getServletContext()
    {
        return config.getServletContext();
    }
   
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                                                throws IOException, ServletException
    {
        doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);
    }
   
    public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
                                                throws IOException, ServletException;
   
    public void destroy()
    {
    }
}



sunny 2007-04-06 16:31 发表评论
]]>
jdbc W记http://www.tkk7.com/sunnygu/archive/2007/03/21/105297.htmlsunnysunnyWed, 21 Mar 2007 08:14:00 GMThttp://www.tkk7.com/sunnygu/archive/2007/03/21/105297.html上午:

一.JDBC原理概述

 

1QJDBC是一套协议,是JAVA开发h员和数据库厂商达成的协议Q也是由Sun定义一l接口,由数据库厂商来实玎ͼq规定了JAVA开发h员访问数据库所使用的方法的调用规范?/p>

 

2QJDBC的实现是由数据库厂商提供Q以驱动E序形式提供?/p>

 

3QJDBC在用前要先加蝲驱动?/p>

JDBC对于使用者要有一致性,对不同的数据库其使用Ҏ都是相同的?/p>

 

驱动开发必要实现Driver接口?/p>

数据库驱动的实现方式

JDBC-ODBC桥接?/p>

JDBC|络驱动Q这U方式是通过中间服务器的协议转换来实现的

JDBC+本地驱动Q这U方式的安全性比较差?/p>

JDBC驱动Q由数据库厂商实现?/p>

 

?JDBC的API

 

java.sql包和javax.sql?/p>

Driver接口(驱动),在加载某一 Driver cLQ它应该创徏自己的实例ƈ?DriverManager 注册该实例。这意味着用户可以通过调用以下E序加蝲和注册一个驱动程?

Class.forName("oracle.jdbc.driver.OracleDriver")

DriverManagerc(驱动理器)Q它可以创徏q接Q它本n是一个创建Connection的工?Factory)?/p>

Connection接口Q会Ҏ不同的驱动生不同的q接

Statement接口Q发送sql语句

ResultSet接口Q结果集Q,是用来接收select语句q回的查询结果的。其实质cM于集合?/p>

 

下午:

?JDBC应用步骤

1Q注册加载一个driver驱动

2Q创建数据库q接QConnectionQ?/p>

3Q创Z个StatementQ发送sqlQ?/p>

4Q执行sql语句

5Q处理sqll果Qselect语句Q?/p>

6Q关闭Statement

7Q关闭连接Connection?/p>

 

注意Q?Q?两个步骤势必要做的Q因些资源是不会自动释放的,必须要自己关?/p>

 

讉KOracle的数据库的驱动名字叫ojdbc14.jar,要用这个驱动程序,要先他加到环境变量CLASSPATH中?/p>

 

    注册加蝲驱动driverQ也是强制cd?/p>

    Class.forName(Driver包名.Drivercd)?/p>

 

    Driver d=new Driverc?);//注意:q个Ҏ不能用参数来构?/p>

    DriverManager.registerDriver(d);

 

 

    Oracle的Driver的全名oracle.jdbc.driver.OracleDriver

    mysql的Driver的全名com.mysql.jdbc.Driver

    SQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver

 

    创徏q接

    DriverManager.getConnection(String url,String username,String password);

    Connectionq接是通过DriverManager的静态方法getConnection(.....)来得到的Q这个方法的实质是把参数传到实际的Driver中的connect()Ҏ中来获得数据库连接的?/p>

    Oracle的URL值是p接数据库的协议和数据库的IP地址及端口号q有要连接的数据库的库名QDatebaseNameQ?/p>

    Oracle URL的格?/p>

    jdbc:oracle:thin:Q协议)@XXX.XXX.X.XXX:XXXXQIP地址及端口号Q?XXXXXXXQ所使用的库名)

    例:jdbc:oracle:thin:@192.168.0.20:1521:tarenadb

    MySql URL的写?/p>

    例: jdbc:mysql://localhost:3306/tarena

    SQLServer URL的写?/p>

    例:jdbc:microsoft:sqlserver://localhost:1433/test

 

    java -Djdbc.drivers=驱动的完整类?/p>

 

    使用虚拟机参?加蝲驱动 -D表示拟机参数赋?/p>

    java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver:com.mysql.jdbc.Driver

  

?JDBC基本Ҏ

    DriverManager:如果有多个驱动可用的?DriverManager会选择其中一? 

   

    Driver:可以选择固定的驱?/p>

    Driver driver = new oracle.jdbc.driver.OracleDriver();

    String user = "sd0613";

 String password = "sd0613";

 Properties prop = new Properties();

 prop.setProperty("user",user);

 prop.setProperty("password",password);

    driver.connect(url,properties);

   

    executeQuery(sqlString);//q回l果?/p>

    executeUpdate(sqlString);//q回gؓ该次操作影响的记录条?create tableq回0

    execute(sqlString);

    //适用于不知道具体的操作是什?q回值是booleancd?/p>

    //如果q回值是true,代表执行查询操作;否则代表执行更新操作.

   

    ResultSet

    next()Ҏ:

    1.判断是否存在下一条记?/p>

    2.游标移向下一条记录 ?

    getXXX(字段名或字段序号)//注意:字段序号?开?/p>

   

    关闭问题:

    使用Connection对象获得一个StatementQStatement中的executeQuery(String sql) Ҏ可以使用select语句查询Qƈ且返回一个结果集 ResultSet通过遍历q个l果集,可以获得select语句的查询结果,ResultSet的next()Ҏ会操作一个游标从W一条记录的前边开始读取,直到最后一条记录。executeUpdate(String sql) Ҏ用于执行DDL和DML语句Q可以updateQdelete操作?/p>

注意Q要按先ResultSetl果集,后StatementQ最后Connection的顺序关闭资源,因ؓStatement和ResultSet是需要连接时才可以用的Q所以在使用l束之后有可能其他的Statementq需要连接,所以不能先关闭Connection?br />


1.回忆下昨天的一些JDBC的配|?br /> (1) 驱动Q ?
  ojdbc14.jar (Oracle)                 
  mysql-connector-java-3.1.11-bin.jar(MySql)
 (2) 实现了Driver接口的驱动类(E序中要加蝲的类)Q?br />  jdbc.oracle.driver.OracleDriver  (Oracle)
  com.mysql.jdbc.Driver  (MySql)
 (3)q接数据库的URL
  jdbc:oracle:thin:@192.168.0.24:1521:tarena   (Oracle)
  jdbc:mysql://192.168.0.24:3306/test    (MySql)
         
2.PreparedStatement概述
 SQL语句传到数据库后Q数据库会先对其~译再执行。在使用StatementӞ如果要执行一l类似的SQL操作Ӟq样做效率很低,而且把不同类型的数据直接写在SQL语句中是比较ȝ的。这时应该用PreparedStatement来代替StatementQPreparedStatement 接口l承 StatementQƈ和他在两斚w有所不同Q?br /> (1)PreparedStatement 实例包含已编译的 SQL 语句。这是使语句先“准备好”。包含于 PreparedStatement对象中的SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创徏时未被指定。相反的Q该语句为每?IN 参数保留一个问P?”)作ؓ占位W。每个问L值必d该语句执行之前,通过适当的setXXX Ҏ来提供?br /> (2)׃ PreparedStatement 对象已预~译q,所以其执行速度要快?Statement 对象。因此,多次执行?SQL 语句l常创徏?PreparedStatement 对象Q以提高效率?br />  

 作ؓ Statement 的子c,PreparedStatement l承?Statement 的所有功能。另外它q添加了一整套ҎQ用于设|发送给数据库以取代 IN 参数占位W的倹{同Ӟ三种Ҏ execute()?executeQuery() ?executeUpdate() 已被更改以之不再需要参数。这些方法的 Statement 形式Q接?SQL 语句参数的Ş式)不应该用?PreparedStatement 对象?/p>

3.创徏 PreparedStatement 对象
 以下的代码段Q其?con ?Connection 对象Q创建包含带两个 IN 参数占位W的 SQL 语句?PreparedStatement 对象Q?br /> PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
 pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?"Q它已发送给DBMSQƈ~译好ؓ执行作好了准备?/p>

 

4.传?IN 参数
 在执?PreparedStatement 对象之前Q必设|每?? 参数的倹{这可通过调用 setXXX Ҏ来完成,其中 XXX 是与该参数相应的cd。例如,如果参数hJava cd longQ则使用的方法就?setLong。setXXX Ҏ的第一个参数是要设|的参数的序C|??开?Q第二个参数是设|给该参数的倹{例如,以下代码第一个参数设?123456789Q第二个参数设ؓ 100000000Q?br /> pstmt.setLong(1, 123456789);
 pstmt.setLong(2, 100000000);


5.ResultSetMetaData
 元数据是用来描述数据的数据,ResultSetMetaData是来描q结果集的列的类型和属性信息,比如可以通过它得到结果集的列敎ͼ列名{。具体可在API中查阅java.sql.ResultSetMetaData?br /> ResultSetMetaData对象可以通过ResultSet对象的getMetaData()来得到?br /> ResultSetMetaData对象有以下三个方法比较常用:
 getColumnCount()Q获得实际列?br /> getColumnName(int colnum)Q获得指定列的列?br /> getColumnType(int colnum)Q获得指定列的数据类?Types里面的类?存放的是整数)
 
6.JDBC是持久层的技术,是JAVAq接数据库目前最通用的手Dc其他的持久层技术,比如接下来我们要学的HibernateQ底层也是由JDBC实现的。持久层是与业务无关的,具体的业务由业务层完成,当业务层需要和数据库进行交互时Q就需要通过持久层来操作?/p>

7.BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 ׃System.in是字节流Q我们需要把他{成字W流。ƈ用BufferedReader包装后方便我们的操作?br /> 
8.Z区分表中不同的数据,我们要给攑օ表中持久化的每个对象都加上一个唯一的标识,q就是IDQID是与业务无关的。ID的生成方法有很多Q在Oracle数据库中我们一半利用Sequence来生成?/p>

9.d配置文gӞ我们采用Properties对象。它是HashTable的子c,它有个load(InputStream inStream) 的方法可以直接从输入中d属性列?键值对)。getProperty(String key) Ҏ用指定的键在此属性列表中搜烦倹{?/p>


1.Registering a driver
2.Establishing a connection to the datebase
3.Creating a statement
4.Executing a SQL
5.Processing the results
6.Closing down JDBC objects




JDBCW三?br />上午:
一.事务QTransactionQ?br />原子操作:不可再分的操?一个操作不能再分成比它更细的操作.
事务是针对原子操作的Q要求原子操作不可再分,q且必须同时成功同时p|?br />事务是把一些非原子操作,变成原子操作,由应用服务器来提?由数据库服务器来执行操作.

在JDBC中默认是自动提交?如果要想使用事务,需要按以下步骤执行:
1.要调用con.setAutoCommite(false)Ҏ(打开事务边界)Q把自动提交QcommitQ置为false?br />2.q行正常的数据库操作
3.如果操作成功了可以选择con.commit(),或者操作失败时选择con.roolback()------
   Q回滚:数据恢复C前的情况Q?/p>

  注意:打开事务p关闭自动提交,当不需要再使用事务的时候调?br />setAutoCommite(true).

事务性资源(监控完整性)
 
?事务q发产生的问?br />    三种q发产生的后?
1Q脏?一个事务读取到了另外一个事务没有提交的数据。(Dirty ReadQ?br />2Q重复读:一个事务读取到了另外一个事务提交的数据。它是要保持在同一旉点上d到的数据相同Q希望在一D|间内的数据是不变的?br />3Q?一个事务读取到了另外一个事务提交的数据。用同样的操作读取两?得到的记录数不相同?/p>

?事务隔离U别
    五种控制U别:
TRANSACTION_NONE不用事务?br />TRANSACTION_READ_UNCOMMITTED 允许脏读?br />TRANSACTION_READ_COMMITTED防止脏读Q最常用的隔ȝ?q且是大多数数据库的默认隔离U别----------------------
TRANSACTION_REPEATABLE_READ可以防止脏读和不可重复读Q?br />TRANSACTION_SERIALIZABLE可以防止脏读Q不可重复读取和q读Q(事务串行化)会降低数据库的效?

以上的五个事务隔ȝ别都是在ConnectioncM定义的静态常量,使用setTransactionIsolation(int level) Ҏ可以讄事务隔离U别?br />?con.setTransactionIsolation(Connection.REPEATABLE_READ);

下午:
?JDBC2.0新特?br />1.可滚动特性和可更新特?br />JDBC1.0中是指游标的Ud的方向和方式是单?单步(相对)Ud,功能比较?
JDBC2.0中游标可以双?相对或者绝对移?
可滚动结果集:q种l果集不但可以双向滚动,相对定位Q绝对定位,q且q可以修Ҏ据信息?/p>

1)滚动Ҏ?br />定位函数:aaa
boolean absolute(int row)Q定位到指定的记录位|。定位成功返回trueQ不成功q回false?br />void afterLast() Q把游标Ud到最后一条记录的后面(逻辑位置)?一定会有的
void beforeFirst() Q把游标Ud到第一条记录的前面(逻辑位置)?br />//׃W一条记录的前面和最后一条记录的后面q两个位|肯定存?所以无需判断是否存在,q回D为void.

boolean first()Q把游标定位到第一条记录,相对定位Q?br />boolean last()Q把游标定位到最后一条记录 ?也是相对的概c?/p>

//当结果集为空的时?q两个方法会q回false.
boolean next()Q此Ҏ是游标向下一条记录移动?br />boolean previous() Q此Ҏ可以使游标向上一条记录移动,前提是前面还有记录?/p>

boolean relative(int rows) Q相对定位方法,参数值可正可负,参数为正Q游标从当前位置向后Ud指定值条记录Q参Cؓ负,游标从当前位|向前移动指定值条记录?/p>

判断函数:
ifBeforeFirst()判断是否在在W一条记录之?
ifAfterLast()判断是否在在最后一条记录之?
ifFirst()判断是否为第一条记?
ifLast()判断是否为最后一条记?

要用可滚动l果集时Q需要一ơ设|更新特性与滚动Ҏ?不能分开.

1.更新Ҏ常?
CONCUR_READ_ONLY 只读l果集   ?(默认?
CONCUR_UPDATABLE 可更新结果集

2.滚动Ҏ常?
TYPE_FORWARD_ONLY Q该帔R表示指针只能向前Ud?ResultSet 对象的类型?默认)
双向滚动Q?br /> 不敏感:TYPE_SCROLL_INSENSITIVE Q该帔R指示可滚动但通常不受其他更改影响?ResultSet 对象的类型?
 敏感的:TYPE_SCROLL_SENSITIVE Q该帔R指示可滚动ƈ且通常受其他更改媄响的 ResultSet 对象的类型?br />//敏感:数据库改?l果集改?
语法:        
Statement st=null;
st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE)
在创建Statement的时候就要指定这两个参数,使用Statement,W一个参C表滚动特性常?W二个代表更新特性常?/p>


----------------------------------------


2)可更新特?br />a.moveToInsertRow();记录当前游标位置,游标移到和l果集结构类似的~冲?
b.使用updateXxx(int column,columnType value)Ҏ来更新指定列数据;
c.使用insertRow() Ҏ插入记录Q加信结果集Q更?br />d.游标指回原位,moveToCurrentRow() ?/p>


 2Q?步,可@?br />-----------------------------------------------------
能否使用JDBC2.0 ResultSet的新Ҏ,要看使用的数据库驱动是否支持.
q有只能用于单表且表中有主键字段Q可能会是联合主键)Q不能够有表q接Q会?br />可更新操作必L以下条?
a.查询只能引用一张表.
b.不能包含Mq接操作.
c.必须把完整的主键查到l果集里?
d.保证所有字Dؓ非空字段q且没有默认倹{?/p>

?数据库元数据:
DatabaseMetaData dbmd = con.getMetaData();//得到数据库元数据
dbmd.supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY,
                    ResultSet.CONCUR_UPDATABLE);//判断是否支持可更新操?/p>

?扚w更新
优势:
1.节省传递时?br />2.q发处理

PreparedStatement:
1.addBatch() 一l参数添加到 PreparedStatement对象内部
2.executeBatch() 一批参数提交给数据库来执行Q如果全部命令执行成功,则返回更新计数组成的数组?/p>

Statement:
addBatch(String sql)Ҏ会在批处理缓存中加入一条sql语句
executeBatch()执行批处理缓存中的所有sql语句?/p>

注意QPreparedStatement中用批量更新时Q要先设|好参数后再使用addBatch()Ҏ加入~存?br />扚w更新中只能用更新或插入语句

//
Statement stm=con.createStatement(int resultSetType,int resultSetConcurrency);创徏的时候就要指明要什么样的结果集?br />  先可滚,后可更新

boolean absolute (int row)l对定位Q?/p>

afterLast()定位到最后一条记录的后面

 

 

 

 

 

 

 


 

 

 

 

 



sunny 2007-03-21 16:14 发表评论
]]>
oracle 3dayshttp://www.tkk7.com/sunnygu/archive/2007/03/20/104927.htmlsunnysunnyTue, 20 Mar 2007 04:57:00 GMThttp://www.tkk7.com/sunnygu/archive/2007/03/20/104927.htmlhttp://www.tkk7.com/sunnygu/comments/104927.htmlhttp://www.tkk7.com/sunnygu/archive/2007/03/20/104927.html#Feedback0http://www.tkk7.com/sunnygu/comments/commentRss/104927.htmlhttp://www.tkk7.com/sunnygu/services/trackbacks/104927.html*********************************
**  oracle 学习W记W一天    ?**
**  author Ice Xu   (XuBin)    **
**  date  2006-10-30           **
***********************************
初始化表的位|:
cd $ORACLE_HOME/rdbms   cd demo     summit2.sql
q个角本可以初始化练习用的表
set  LANG = AMERICAN_AMERICA.US7ASCII
*********************************
我们目前使用的是oralce 9i   9201 版本

恢复l习表命令:
sqlplus  openlab/open123 @summit2.sql


登陆oracle的命令:
sqlplus   用户?密码

show   user        昄当前登陆的n?
set    pause on
set    pause off   分页昄.

oracle中默认日期和字符是左寚wQ数字是叛_?br />table or view does  not  exist ; 表或C图不存?/p>

edit 命o用于自动打开vi修改刚修执行q的sql的命令?br />修改Ҏ二:
l  3 先定位到行  ?c   /旧串/C

执行出错Ӟ利用错误h查错?
!oerr ora 942  (装完pȝ后会装一个oerr工具Q用于通过错误h查看?/p>

误的具体信息)

惛_sql中执行unix命oӞ把所有的命o前加一?可以, 或者host( ?/p>

于从sql从切换至unix环境中去)

/*** 初次使用时注意?****
q行角本时的命oQ?br />先切换到unix环境下,cd $oracle_home   cd sqlplus  cd demo 下面有两

个角本徏表语句?br />@demobld.sql
sqlplus nanjing/nanjing @demobid.sql 直接q行角本Q后面跟当前目录?/p>

者是l对路径

保存刚才的sql语句Q ?save 命o     W二ơ保存时要替换之前的角本

save 文g名 ?replace
把刚才保的sql重新攑օ  buffer?/p>

spool  文g?br />此命令会把所有的操作存在某个文g中去
spool off

l习1Q查看s_emp表中员工的年工资
select  first_name  , salary*12  salary from s_emp;

l列起别名的命oQ?br />利用关键字?as  或者用I格  "别名"  双引号内大小写敏感保持引号内?/p>

原样输出Q如果不加双引号Ӟ默认为大?/p>

拼接字段Q?br />select   first_name||last_name  "employees"  from   s_emp ;
oracle中表辑֭W串用单引号来表达:
select first_name||' '||last_name  from   s_emp;(在两个字D之间拼?/p>

一个空?

查看当前用户所有的表:
l习2Q?常用于批量更Ҏ?
set  echo off
spool  selecttab.sql;
select 'select * from ' || table_name ||' ; ' "table name " from

user_tables;
spool off;
set  head off(去除W一?
set  feed off(去除最后一?
l习3Q?查出s_emp表中所有员工的一q的L?
select first_name , salary*12*( 1+nvl(commission_pct/100 , 0 ) ) "

year salary " from s_emp;
nvl函数 专用于处理空值的影响.

*******************************************************************

***************************************************************

下午Q?br />column  定义格式化输?br />column last_name  Heading   format a15;
column last_name;
column salary justify left format $99,999.00  ( 定义工资的显CŞ?

)

$ echo $LANG
zh_CN.hp15CN
$ echo $NLS_LANG
simplified chinese_china.zhs16cgbk

ORDER BY 排序  升序和降序 ?ASC  升序(默认)    DESC 降序
select * from s_emp  order by dept_id , salary desc  部门号升序,?/p>

资降?br />关键字distinct也会触发排序操作?/p>

qo操作Q?where 子句
select * from s_emp  where dept_id=42;  查看部门号ؓ42的所有员?br />select * from s_emp  where salary>1000  查看工资高于1000的所有员?br />select salary from  s_emp where first_name='Geroge'  扑և名字?/p>

Geroge的员工的工资?br />select  table_name from  user_tables  where table_name='S_EMP';  ?/p>

某个具体表名Ӟ表名的字W串必须要ؓ大写

日期的默认的格式  DD-MON-RR(??q?
BETWEEN  AND   在什么之闾b         ?NOT        BETWEEN      AND   

            注意区间Q[  ]是一个闭区间
IN( LIST)      在某个集合中          NOT        IN         (list)

Ig有媄响       ?({于list其中M一个就行,为提高效率常把比?/p>

高的攑֜前面)
LIKE           模糊配置              NOT        LIKE             

通配比较
IS NULL        是空
AND
OR
NOT

l习4:(扑և表名以S_开头的所有表)对于一些特D字W,要用到escape转义,

q不是一定要用\Qescape后面定义是什么字Wؓ转义字符Q那q哪个字符
select  table_name from user_tables where  table_name like   'S\_%'

 escape '\';

当有多个条gӞ要用逻辑q算W:AND OR
写对where语句:正确的数据类型判断、逻辑q算W?/p>

sql函数的作用:
sql函数的分c:单行函数、多行函?br />单行函数Q?(dual   哑表 )
字符函数Q?br />lower      转小写        ?select  lower('SQLPLUS')  from dual;-->

对纯字符串处理的时?br />upper      转大写        ?select  upper('sqlplus')  from dual;
initcap    首字W大写    ?select  initcap('tarena') from dual;
concat     q接字符串    ?select  concat(first_name , last_name)  

from s_emp;{效于||
substr     求子串        ?select  substr('tarenasd0603' ,1,6) from

dual; (取前六个字符)   select substr('tarenasd0603',-2) from dual;

(取后两个字符)
length     求字W长度    ?select  length('tarena') from dual;
nvl        I值函敊W ?两个参数的类型要匚wQ统一的,表示Q如果有Q?/p>

则返回前面的参数Q如果没有就q回后面的参?br />eg:select first_name,salary from s_emp where lower(first_name)

='george';
select  first_name , substr(first_name , -2 ) from  s_emp;  (查出

s_emp表中所有用户名字的最后两个字W?
默认的是从左向右Q如果是-2则表CZ叛_左数
l习5Q ?select   first_name  , salary  from s_emp   where  lower

(first_name)='george';

数值函敎ͼ
round 函数(四舍五入)   select  round(45.935, 2) from dual;   不带?/p>

数时默认?位小?br />trunc 函数(截取Q不后面的数字)    select  trunc(45.995, 1) from

dual;
日期函数QDD-MON-RR ,默认不显CZU、时、分、秒       日期格式敏感
世纪、年、月、日
sysdate q回当前pȝ旉       select sysdate from dual;    
更改当前会话的设|格式:     
alter session set nls_date_format='yyyy mm dd hh24:mi:ss';
select  sysdate-1, sysdate+1, sysdate , sysdate+1 from dual;  注意

单位是以天ؓ单位Q也可以得到多少时、多分钟之后的旉
MONTHS_BETWEEN (DATE1 , DATE2 ) 求两个日期之前相差的月数
add_months(date , 4 ) ?date上再d4个月
select round(last_day(sysdate),'month') from dual;
select  next_day(sysdate,'FRIDAY') from dual ; 求这个日期的下一?/p>

FRIDAY
last_day 求月的最后一?/p>

round 函数:     select   round(sysdate, 'MONTH') from dual;     ?/p>

数可以ؓQ?MONTH YEAR(看上半年q是下半q?  
select  trunc(last_day(sysdate)+1)  from  dual;
select  add_months(trunc(sysdate, 'MONTH'), 1 )  from  dual ;
关于日期的两UŞ式:

转换函数Q?br />to_char昄日期Q?br />从数字{化ؓchar  to_char(date,'格式')
从日期{化ؓchar           to_char(date,  'fmt' )            

select to_char(sysdate, 'yyyy mm dd hh24:mi:ss') from dual;
         

         

         

    select to_char(sysdate, 'fmyyyy mm

dd hh24:mi:ss') from dual;L前导?br />                              select  to_char(sysdate ,'YEAR MONTH

dy
eg:查出三月分入职的员工Qselect first_name,start_date from s_emp

where to_char(start_date,'mm')='03';

to_date表达日期Q?br />      字符转日期   ?select   to_date('2000 11 20', 'yyyy mm dd ') 

from dual;
                               select  round(to_date('10-OCT-06'

,'dd-mon-RR') ) from   dual;
to_number
      字符转数?
                            select to_number('10')  from  dual ;

day2


where 条g一定是Ҏ某个字段来进行过滤操?

多表q接操作Q?br />两表没有M兌时会产生q卡机Q?br />select   first_name , name  from    s_emp , s_dept;
{D接:
l习一:查看员工的姓名和员工部门?(要考虑到表中实际数据中I值的影响Q?br />select   first_name ,   name from  s_emp e, s_dept  d where e.dept_id=d.id;同时起了别名
select   first_name ,   name from  s_emp e, s_dept  d where e.dept_id=d.id and e.first_name='George';具体到哪个h所在的部门

l习二:每个员工所在的部门和部门所在的地区
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;
eg:select first_name,d.name,r.name
 from s_emp e,s_dept d,s_region r
 where e.dept_id=d.id and d.region_id=r.id;
{D接:
l习?扑և每个员工和每个员工的工资U别
  select    a.ename , a.sal, b.grade from emp a , salgrade b  where a.sal between b.losal and b.hisal;
  select    a.ename , a.sal, b.grade from  emp a , salgrade b  where a.sal>=b.losal  and  a.sal<=b.hisal;
自连接:当一个表的插入行之间有了关系时就发生?又名Q内q接)
select   first_name   , manager_id   from  s_emp;
查出所有员工的部门领导的名Uͼ( q种sql会少一条记录,ȝ理没有被配置上)
select  e.first_name , m.first_name   from s_emp e , s_emp m  where   e.manager_id=m.id;
外连接:(防止I值时Q用Q?Q的一方会模拟一条记录配|另一?q就UCؓ外连?一个记录都不能;
select  e.first_name , m.first_name   from s_emp e , s_emp m  where   e.manager_id=m.id(+);
+h在哪边就表示在哪边补I,来跟Ҏ来匹配,使得数据一个都不会漏掉Q这个例子中的领导有可能会没?最高领导就再没有领gQ所以就
Ҏ领导的那?
 标准写法Qselect e.deptno,d.name from emp e,dept d where e.deptno(+)=d.depton and e.depton is null;
查看员工分部的部门:
select  distinct(deptno) from emp ;
扑և没有员工的部门:(很经典的一个例?用外q接来解决的标准做法,q是一U方式)
W一步:
select     e.deptno , d.deptno  from emp e , dept d  where  e.deptno(+)=d.deptno;
W二步:
select     e.deptno , d.deptno  from emp e , dept d  where  e.deptno(+)=d.deptno   and   e.deptno is null;

l函敎ͼgroup function)Q?br />group by  分组子句    对分l后的子句进行过滤还可以用having    条g  对分l后的条件进行过滤 ?where 是对记录q行qo

avg(distinct | all )求^均值                           ?
count(distinct | all )l计
max(distinct | all Q?求最大?br />min(distinct | all )求最?br />sum(distinct | all )  求和
(所有组函数会忽略空?, avg   sum只能作用于数字类型)
求有提成员工的提成的q_|
select    avg(nvl(commission_pct ,0 )  ) from s_emp;
有多h有提成:
select  count( commission_pct ) from    s_emp ;
count(*)  用于l计记录敎ͼ
select   sum(commission_pct)/ count(*)   from     s_emp;
 员工分部在多个不同的部门:count  默认Zall的动?br /> select   count(dept_id)  from s_emp;
 select   count(distinct dept_id) from   s_emp;
 求各个部门的q_工资Qgroup  by  子句也会触发排序
 select  dept_id ,  avg(salary) aa    from    s_emp    group by   dept_id   order by  aa ;
 select  dept_id ,  avg(salary) aa    from    s_emp    group by   dept_id    ;
 注意Qgroup by 子句后面跟有条g只能是查询的l果中的字段,所以我们会Zؓ在结果要加入一些group by  要用的字D?br />select   region_id , count(*)  from  s_dept 此句会有?br />select   max(region_id)  , count(*) from       s_dept;  (强制语法上可以正?但是不能保证l果也会正确Q?br />求各个部门不同工U的q_工资Q?br />select     dept_id , title,  avg(salary)  from s_emp   group   by dept_id , title  ;
哪些部门的^均工资比2000?
select    dept_id,  avg(salary) aa  from s_emp   group by (dept_id)    having      avg(salary)>2000;
除了42部门以外的部门的q_工资:
select   dept_id  ,  avg(salary)   from  s_emp  group by (dept_id ) having    dept_id!=42;
select   dept_id  ,  avg(salary)   from  s_emp   where   dept_id!=42  group by (dept_id ) ;(此种sql效率要高Q先qo再计)
where       单行函数?br />having      l函数?br />求各个部门的q_工资:
// q样l计不详l?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; 
//****q问题很l典Qؓ了过 oracle sql 语法兌写max(d.name)  ***
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 ;

下午Q?br />关于子查?  Subqueries
扑և所有员工中Q工资最低的那个员工Q? 利用子查?Q?br />select    first_name,  salary    from s_emp   where   salary = (  select  min(salary)  from s_emp)    ;
//q样写会出错姓名和工资不一?br />select max(first_name),  min(salary)  from s_emp;(利用子查询可以解?
子查询运行的序Q?先运行子查询再运行主查询    子查询一般出现在q算W的双
单D符Q运后面只能跟一个?br />多D符Q可以对两个以上的D行操?br />查询谁跟Smithq一Lz:
select   last_name from  s_emp  where last_name='Smith';
//下种写法可能q存在bugQ没有考虑到数据的全面?有潜在性问?br />select  last_name  , title  from s_emp   where title =(  select   title  from s_emp  where  last_name='Smith'  )    and  last_name <> 'Smith'  ;
//q种写法才考虑的比较全?br />select  last_name  , title  from s_emp   where title   in   (  select   title  from s_emp  where  last_name='Smith'  )    and  last_name <> 'Smith'  ;
使用子查询时应注意:  单行子查询返回多个结果时会有错误    single-row  subquery returns  more  than one value
查出哪些员工的工资比q_工资低:
select    *  from s_emp  where     salary   <  ( select  avg(salary)  from   s_emp)  ;
哪些部门的^均工资比32部门的^均工资要低:
W一步先查出各个部门的^均工资:
select  min(avg(salary  )  ) from   s_emp   group by  dept_id;
W二步再查出哪个部门的工资是最低的:
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 ) ;

哪个部门里没有员工:
select   deptno  from    dept    where   deptno   not  in ( select     deptno    from   emp );
哪些人是普通员工:Q用子查询Ş式来做)
select   *   from  s_emp   where   id  not    in (  select  manager_id   from   s_emp);

E--R图?实体关系图entity  relation 
开发流E先q行需求分析,q行pȝ设计Q徏表,再进行开发编?试最l品上U试q行?br />把Y件设计模型{化ؓ数据中的表,设计时要考虑性能的设?/p>

W一范式Q最单的一U徏方式Q一张表只有一个主键?br />W二范式Q表的自q接存在原因Q一张表Q学生表中也有班U的信息?br />W三范式Q表q接存在的原因,两张表,其中一张表引用其它一张表?/p>

U束Q?br />Z保证数据的一致性,
primary key   (pk)  主键U束       不允许有重复和空?唯一且非I)
foregin  key   (fk)   外键U束       两张表parent  table      child   table
unique  key   (uk)  唯一可以为空
not   null
数据库设计时的注意:
索引Q?Z提高效率而设计的一U与业务无关?br />考虑表点用的物理I间Q?br />考虑表之间的关系Q?br />一对多关系Q?利用FK+PK实现Q多的一方引用外?br />一对一关系Q?可以利用FK+UK实现Q?br />多对多关p: 通过中间增加一个附加表来实玎ͼ附加表利用联合主键来实现Q联合v来的主键唯一?/p>


DDL语句Q数据库定义语句Q?br />table (表)
view(C图Q?br />sequence(序列P
index(索引Q?/p>

创徏表语句:
create    table    [schema].表名   (  字段名,   字段cd   U束条g);                    schema   默认是当前用户,严格来访问表名完整的写法是schema.tablename
数据cdQ?br />表名的命令规则: 首字母ؓ字母Q不得超q?0个字W?br />char(size)                定长  不管是否辑ֈ最大宽度,都会Ҏ大的宽度?br />varchar2(size)         可变长 ?按实际的字节占用I间
number            所有的数字cd都称为number
number(n, m )  n------n位宽度 ?m-----数点后的宽?br />number(2,4)数点后4 位,有效?位  ?values(0.0099) q样可以   values(0.01)q样出错
LONG    2GB   大文本一个表最我只允许定义一个LONGcd(不徏议用)
CLOB    大对象Ş式存?在表里只存一个指?
BLOB     存二q制大对?声音Q图像之c)

default   作用演示Q?br />create  table   test(c1   number    default  10,     c2    number);


U束的演C:
主键U束的定义:
create table   test(c   number  primary key  );     列U束
create table  test(c  number , primary key(c) )  ; 表U束
create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1
create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表U约束可以实现联合主?/p>

外键U束的定义:(先定义父表,再定义子表)
carete   table     parent(c1 number  primary key );
create   table    child  (c  number primary key ,   c2 number  references parent(c1));
或表U约束定?
create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));

或表U约束定?
create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));

on  delete   cascade  (及联删除Q删除父表时子表也跟着删除Q?br />on  delete   set   null  (及联删除父表时子表中引用的字DؓnullQ?br />

day3

不给U束起名字时Q系l给U束起名时的规律为:数据库用户名_数字(U束名也不能重名Q?br />定义一个约束的两种形式Q?br />列U束      表U束

非空U束Q?
  not    null  (利用desc可能看到Qprimary key  自动h非空U束的特?/p>

primary keyU束Q?br />主键U束的定义:
W一U定义Ş式:
create table   test(c   number  primary key  );     列U束
W二U定义Ş式:
create table  test(c  number , primary key(c) )  ; 表U束
create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1
create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表U约束可以实现联合主?/p>

foregin  key   (fk)   外键U束:
(先定义父表,再定义子表)
create   table     parent(c1 number  primary key );
create   table    child  (c  number primary key ,   c2 number  references parent(c1));
或表U约束定?
create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));

check U束Q?br />create   table   test(c1   number  check(c1>1000));
此表中要求c1的值必要大于1000 才ؓ有效?.  

怎么创徏一个角本文Ӟ xxx.sqll尾
 执行角本的方法:
 在sqlplus环境中执行:@filename.sql
 在shell环境中执行: sqlplus   nanjing/nanjing   @filename.sql

创徏表的语法Q?
 create    table    表名 (   字段名  ?字段cd     U束cdQ可选)Q;
 利用已知表徏一张新表:注会把非I约束带q来Q其它约束要自己d
 create  table s_emp_42    as select   *  from   s_emp     where   dept_id = 42;
只取要表l构Q不惌表中数据的徏表方式:
create table  s_emp_copy    as   select  *    from  s_emp   where   1=2;
(q是一个小技?在JDBC的学习中会用?where 1=1 的Ş?注意体会Q?/p>

查看一张表的约束:( 查数据字典示?
 desc  user_constraints;(q个数据字典中会查到相应的信息)
 select    constraint_name,  constraint_type    from   user_constraints  where   table_name='S_EMP';
 P   pk
 R   fk
 C   check
 U    UK
 V    q种只定义在C图?with check  option 相当于组C图加了一个约束)
 O    也是出现在示图中
 非空U束和CHECK都是用C来表C?/p>

查看字段U束的方法:
 desc    user_cons_columns;
 select   column_name,  position  from    user_cons_columns    where   constraint_name='S_EMP_ID_PK' ;
 position 的含义:联合主键Q约束名一栗?br /> user_constraints    user_cons_columns   两张表的U束名相{,表名相等Q两张表一兌可以查出所需的信息?/p>

select  constraint_name , r_constraint_name  from user_constraints where  constraint_type='R'   and table_name='S_EMP' ;
数据库徏立时Q数据字典就会徏好?br />user_constraints; 自己拥有?br />all_constraints;   你自己拥有的加上你可以访问的
dba_constraints  所有的

查看当前数据库数据字典的字典Q这个示囑־重要Q?br />desc   dict;
select table_name form  dict where table_name like   '%cons%;

C图Q?br />user_objects;           user_tables;
select  distinct   object_type  from user_objects;  

介绍事务的概念:
commit  提交Q此时说明前面所有语句都成功执行
rollback 回退操作Q此时会恢复至上一ơ提交时的状态?br />savepoint 讄保存?/p>

 注意   insert   into  后面可以跟子查询
insert into  s_emp_42   select *   from s_emp  where    dept_id =42;

UPDATE 修改字段|
update   s_emp  set dept_id =10   where   id =2 ;
update  s_emp  set commission_pct =10  ;  没有where条g时说明是改表中所有的?
注意Q如有外键引用时怼出现外键引用值没有找到等错误Q?/p>

delete  删除记录命o语法Q?br />delete from   s_emp  where  dept_id=42;
delete form   s_emp ;      没有where条g时说明删除表中所有的?br />注意Q如有外键引用时Q删除一张表时常会出C能删除的情况Q?br />原因一   是因为此时正在有人操作表中记?br />原因二 ?此表有其他的表引用,没能讑֏联删除:
delete 删除一张大表时I间不释放,非常慢是因ؓ占用大量的系l资源,支持回退操作Q空间还被这张表占用着?br />truncate table 表名  (删除表中记录旉放表I间)

DML 语句Q?br />表׃n锁: 对于操作一张表中的不同记录Ӟ互不影响
行排它锁:对于一行记录,oracle 会只允许只有一个用户对它在同一旉q行修改操作
wait()   {到行锁被释放Q才q行数据操作
drop一张表时也会对表加锁,DDL排它?所以在删除一张表时如果当前还有用h作表时不能删除表


alter table 命o用于修改表的l构(q些命o不会l常?Q?br />增加U束Q?br />alter table  表名 add   constraint  U束名?primary key  (字段Q?
解除U束Q?删除U束)
alter  table 表名  drop  primary  keyQ对于主键约束可以直接用此方法,因ؓ一张表中只有一个主键约束名, 注意如果主键此时q有其它表引用时删除主键时会出错Q?br />alter  tbale   father   drop  primary key    cascade ;  (如果有子表引用主键时Q要用此语法来删除主?q时子表q存在只是子表中的外键约束被及联删除了)
alter table  表名 drop  constraint   U束?
(怎样取一个约束名Q?、h为的q反U束规定Ҏ错误信息获取!
                                 2、查询示图获取约束名!)

alter  table   表名  disable    from   primary  key ;  (相当于把一个表的主键禁?
alter  table   表名  enable    primary key ;Qenable 时会自动L查表的记录是不是W合要求,如果有脏数据时必要先删除脏数据才可?enableQ?/p>

 

*******************************************************************

增加字段Q?br /> alter  table   表名   add(字段字?字段cd)
删除字段Q?br /> alter table    表名     drop(字段)
 alter tbale         表名    drop    column   字段 ; (8i 以后才支持)
l列改名:920才支?br /> alter  table   表名   rename   column   旧字D名    to     新字D名;
修改字段
(此时应注意的问题Q更Ҏ要看具体值情况之间的转达换, 改ؓ字符cdӞ必须要ؓI?
 alter  table    表名     modify( 字段Q类?
更改表中的字D:
 update 表名   set     字段     Q    ?值   ?where       条g
更改表名
 rename       旧表名         ?to     新表名         ?Q?br />删除表:
 trucate   table    表名:(表结构还在,数据全部删除Q释放表所占的I间Q不支持回退,常用删除大表Q?/p>

 

关于oralce中生序?sequence):
create sequence   序列名alter system  flush   shared_pool;
(不带参数旉认ؓ? 开始每ơ递增 1Qoracle中ؓ了提高生序列的效率一般一ơ性?0个序列放入当前会话的序列池中备用以加快效率,序列会出Cq箋的动作回退操作不会影响序列取|
sequence 的参敎ͼ
 increment by  n 起始?    start with  n 递增? maxvalue  n 最大?  minvalue n  最|cycle | no cycle 轮回Q?cache n  l存(W一ơ取时会一ơ取多少个id存v来)
查看   sequence C图Q?br />desc    user_sequences ;
select   sequence_name , cache_size , last_number  from  user_sequences   where   sequence_name  like 's_';
select  序列?currval  from   dual    查看当前的序列数
select  序列?nextval  from   dual    查看下一个序列数Q它会自动给当前的序列加Q?br />为列Qnextval          currval
(开另一个session时取当前g成功Ӟ应该先取下一个|再取当前?
清空当前会话的内存:
alter system  flush   shared_pool;Q执行此命o要有DBA权限Q一般用h行出错)
修改序列Q?此命令不常用Q只需了解p不必qQ?br />alter  sequence  序列名?修改;
删除序列sequence
drop  sequence 序列?

创徏C图Q?creating      viewsQ属于了解知识)
desc  user_views;
select   text   from  user_views    where   view_name='TEST1_V1' ;
C图q当于一条select 语句,定义了一个示囑ְ是定义了一个sql语句,C图不占I间,使用view 不会提高性能Q但是能单化sql语句
Q扩展知识: oracle  8i 以后的新C图QMV   物化视图(占存储空_把select l果存在一个空_会提高查询视?增强实时性,但是存在h问题Q?主要应用在数据仓库中用要用于聚合表)
使用C图的好处:控制数据讉K权限.
如何创徏一个示图:
create   or replace   views   test_vi    as       select       *   from    test1   where c1=1;
此时往表test1Qbase   table  Q中插入数据Ӟ表中没能变化Q示图中的数据发生改?br />从示图中插数据时相对应的表会发生改变:
往C图中插数据Ӟ会直接插q基表中Q查看示图中的数据时Q相当于是执行创徏时的select语句?br />单示图:能进行DML操作?br />复杂C图Q来源于多张表,不能执行DML操作?br />关于rownumQ?br />rownum  有个特点要么{于1 要么于某个| 不能直接{于某个? 不能大于某个倹{rownum常用于分|C?br />l习Q查询出W?条数据和W?0条数据之_
 select   first_name , rnum    from   (  select   rownum   rnum    , first_name   from    s_emp  where rownum <=10 )     where rnum  between 5  and  10 ;

分面昄Q?br />SELECT * FROM (SELECT a.*, rownum r FROM   S_EMP  a  WHERE r between 5  AND  10 )Q?/p>


l习Q哪些员工的工资比本部门的^均工资高Q?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 > a.avgsal;
 在示图上加一?with  check   option q当于l示囑֊上了U束
create    view    test_v  as  select   *  from   test  where c =1  with check option ;
同义?相当于别名的作用(***只需了解***Q系l自建的同义词:    user_tables
create  synonym    asd_s_emp   for    asd_0607.s_emp ;
目的是Zlasd_0607_s_emp表v另一个代替的名称asd.s_emp;注意q个同义词只能自׃?
create  public     synonym  p_s_emp  fro asd_0607.s_emp; 创徏公共的同义词Q但是要权限.
删除同义词:
drop  synonym    同义词名U?/p>

创徏索引Q?Creating    indexes(概念很重要对pȝ的性能影响非常大)
建烦引的目的是Z加快查询速度?br />索引q于一本的书的目录。烦引点pȝI间Q属于表的附属物。删除一个表Ӟ相对应的索引也会删除。truncate 表时索引l构在,但是数据不存在?br />full   table    scan  全表扫描
用烦引就是ؓ了快速定位数据:(理解时就以字典的目录ZQ?br />查看表的rowidQ?br />select     rowid  , first_name    from  s_emp;
rowid 定义的信息有Q?object   block  table
每条记录都有自己的rowid
索引p创徏Q用?建烦引后会DML操作效率慢,但是对用h询会提高效率,q就是我们徏索引的最l目的,
创徏一个烦引:
create  index     索引名   ?on   表名 (  字段名);
create   insex testindex  on test(c1, c2);
哪些字段应该建烦引:
l常要用where的子句的地方Q所以要用烦?用不用烦引,关键要看所查询的数据与所有数据的癑ֈ比,表越大,查询的记录越,索引的效率最?


替换变量Q用&W号来定义替换变量支持交互性提C?对于字符性的数字Q一定要写在单引号之?br />set    verify on
set    verify off;
相当于开兛_量,用于控制是否昄新旧的sql语句
select   id ,last_name  ,salary   from s_emp  where  title='&job_title';
更改交互的提CZ息:
accept  p_dname prompt ' 提示信息';
定义变量Q?br />define     p_dname='abc';

分页的实现语句:(可以正常q行)
  select   *   from  (  select   rownum   rnum  , a.*   from   (select * from s_emp) a  )     where rnum  between 5  and  10 ;

-------------------------------------------------------------------------------------------------------------------------
1、关于约束的知识Q?br />primary keyU束Q?br />主键U束的定义:
W一U定义Ş式:
create table   test(c   number  primary key  );     列U束
W二U定义Ş式:
create table  test(c  number , primary key(c) )  ; 表U束
create table   test( c1  number  constraints   pkc1  primary key );   此约束有名字:  pkc1
create table   test(c number , c2  number ,  primary key (c ,c1) )  ; 用表U约束可以实现联合主?/p>

foregin  key   (fk)   外键U束:
(先定义父表,再定义子表)
carete   table     parent(c1 number  primary key );
create   table    child  (c  number primary key ,   c2 number  references parent(c1));
或表U约束定?
create   table  child( c number primary key ,  c2  number  , foreign key(c2)  references  parent(c1));

check U束Q?br />create   table   test(c1   number  check(c1>1000));
此表中要求c1的值必要大于1000 才ؓ有效?.  
****************************************************************************
2、关于针对表操作的语法知识:
  创徏表:
   create    table  表名   (    字段?    cd   U束条gQ ?字段?    cd    U束条g Q?
 
 插入数据命oQ?br /> 方式一Q?指定字段名插入数据)
  insert  into   表名  ( 字段?)    values ( 数据Q;
 方式二:
  insert  into  表名   values(数据1Q?数据2Q;

 修改数据Q?br /> update   table   表名  set ( 字段名 ?数据Q?字段名?数据Q;
****************************************************************************
3、关于alter table 命o知识:
alter table 命o用于修改表的l构(q些命o不会l常?Q?br />增加U束Q?br />alter table  表名 add   constraint  U束名?primary key  (字段Q?
解除U束Q?删除U束)
alter  table 表名  drop  primary  keyQ对于主键约束可以直接用此方法,因ؓ一张表中只有一个主键约束名, 注意如果主键此时q有其它表引用时删除主键时会出错Q?br />alter  tbale   father   drop  primary key    cascade ;  (如果有子表引用主键时Q要用此语法来删除主?q时子表q存在只是子表中的外键约束被及联删除了)
alter table  表名 drop  constraint   U束?
(怎样取一个约束名Q?br />a、h为的q反U束规定Ҏ错误信息获取!
b、查询示图获取约束名!)
alter  table   表名  disable    from   primary  key ;  (相当于把一个表的主键禁?
alter  table   表名  enable    primary key ;Qenable 时会自动L查表的记录是不是W合要求,如果有脏数据时必要先删除脏数据才可?enableQ?br />增加字段Q?br />alter  table   表名   add(字段字,字段cd)
删除字段Q?br />alter table    表名     drop(字段)
alter tbale         表名    drop    column   字段 ; (8i 以后才支持)
l列改名:920才支?br />alter  table   表名   rename   column   旧字D名    to     新字D名;
修改字段
(此时应注意的问题Q更Ҏ要看具体值情况之间的转达换, 改ؓ字符cdӞ必须要ؓI?
alter  table    表名     modify( 字段Q类?
更改表中的字D:
update 表名   set     字段     Q    ?值   ?where       条g
更改表名
rename       旧表名         ?to     新表名         ?Q?br />删除表:
trucate   table    表名:(表结构还在,数据全部删除Q释放表所占的I间Q不支持回退,常用删除大表Q?br />****************************************************************************
4、关于oralce中生序?sequence)
create sequence   序列名alter system  flush   shared_pool;
(不带参数旉认ؓ? 开始每ơ递增 1Qoracle中ؓ了提高生序列的效率一般一ơ性?0个序列放入当前会话的序列池中备用以加快效率,序列会出Cq箋的动作回退操作不会影响序列取|
sequence 的参敎ͼ
 increment by  n 起始?    start with  n 递增? maxvalue  n 最大?  minvalue n  最|cycle | no cycle 轮回Q?cache n  l存(W一ơ取时会一ơ取多少个id存v来)
查看   sequence C图Q?br />desc    user_sequences ;
select   sequence_name , cache_size , last_number  from  user_sequences   where   sequence_name  like 's_';
select  序列?currval  from   dual    查看当前的序列数
select  序列?nextval  from   dual    查看下一个序列数Q它会自动给当前的序列加Q?br />为列Qnextval          currval
(开另一个session时取当前g成功Ӟ应该先取下一个|再取当前?
清空当前会话的内存:
alter system  flush   shared_pool;Q执行此命o要有DBA权限Q一般用h行出错)
修改序列Q?此命令不常用Q只需了解p不必qQ?br />alter  sequence  序列名?修改;
删除序列sequence
drop  sequence 序列?
****************************************************************************
5、创建示图: creating      viewsQ属于了解知识)
C图q当于一条select 语句,定义了一个示囑ְ是定义了一个sql语句,C图不占I间,使用view 不会提高性能Q但是能单化sql语句
Q扩展知识: oracle  8i 以后的新C图QMV   物化视图(占存储空_把select l果存在一个空_会提高查询视?增强实时性,但是存在h问题Q?主要应用在数据仓库中用要用于聚合表)
使用C图的好处:控制数据讉K权限.
如何创徏一个示图:
create   or replace   views   test_vi    as       select       *   from    test1   where c1=1;
此时往表test1Qbase   table  Q中插入数据Ӟ表中没能变化Q示图中的数据发生改?br />从示图中插数据时相对应的表会发生改变:
往C图中插数据Ӟ会直接插q基表中Q查看示图中的数据时Q相当于是执行创徏时的select语句?br />单示图:能进行DML操作?br />复杂C图Q来源于多张表,不能执行DML操作?br />关于rownumQ?br />rownum  有个特点要么{于1 要么于某个| 不能直接{于某个? 不能大于某个倹{rownum常用于分|C?br />l习Q查询出W?条数据和W?0条数据之_
select   first_name  , rnum    from   (  select   rownum   rnum    , first_name   from   s_emp    where rownum <=10 )    where rnum  between 5  and  10;
l习Q哪些员工的工资比本部门的^均工资高Q?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 > a.avgsal;
 关于同义词:
同义?相当于别名的作用(***只需了解***Q系l自建的同义词:    user_tables
create  synonym    asd_s_emp   for    asd_0607.s_emp ;
目的是Zlasd_0607_s_emp表v另一个代替的名称asd.s_emp;注意q个同义词只能自׃?
create  public     synonym  p_s_emp  fro asd_0607.s_emp; 创徏公共的同义词Q但是要权限.
删除同义词:
drop  synonym    同义词名U?/p>

****************************************************************************
6、创建烦引:  Creating    indexes(概念很重要对pȝ的性能影响非常大)
建烦引的目的是Z加快查询速度?br />索引q于一本的书的目录。烦引点pȝI间Q属于表的附属物。删除一个表Ӟ相对应的索引也会删除。truncate 表时索引l构在,但是数据不存在?br />full   table    scan  全表扫描
用烦引就是ؓ了快速定位数据:(理解时就以字典的目录ZQ?br />查看表的rowidQ?br />select     rowid  , first_name    from  s_emp;
rowid 定义的信息有Q?object   block  table
每条记录都有自己的rowid
索引p创徏Q用?建烦引后会DML操作效率慢,但是对用h询会提高效率,q就是我们徏索引的最l目的,
创徏一个烦引:
create  index     索引名   ?on   表名 (  字段名);
create   insex testindex  on test(c1, c2);
哪些字段应该建烦引:
l常要用where的子句的地方Q所以要用烦?用不用烦引,关键要看所查询的数据与所有数据的癑ֈ比,表越大,查询的记录越,索引的效率最?


替换变量Q用&W号来定义替换变量支持交互性提C?对于字符性的数字Q一定要写在单引号之?br />set    verify on
set    verify off;
相当于开兛_量,用于控制是否昄新旧的sql语句
select   id ,last_name  ,salary   from s_emp  where  title='&job_title';
更改交互的提CZ息:
accept  p_dname prompt ' 提示信息';
定义变量Q?br />define     p_dname='abc';




sunny 2007-03-20 12:57 发表评论
]]>
oracle http://www.tkk7.com/sunnygu/archive/2007/03/20/104924.htmlsunnysunnyTue, 20 Mar 2007 04:48:00 GMThttp://www.tkk7.com/sunnygu/archive/2007/03/20/104924.htmlhttp://www.tkk7.com/sunnygu/comments/104924.htmlhttp://www.tkk7.com/sunnygu/archive/2007/03/20/104924.html#Feedback0http://www.tkk7.com/sunnygu/comments/commentRss/104924.htmlhttp://www.tkk7.com/sunnygu/services/trackbacks/104924.html
两表没有M兌时会产生q卡机Q?br />select first_name , name from s_emp , s_dept;
{D接:
l习一:查看员工的姓名和员工部门?(要考虑到表中实际数据中I值的影响Q?br />select first_name , name from s_emp, s_dept where s_emp.dept_id=s_dept.id;
 
l习二:每个员工所在的部门和部门所在的地区
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;

非等D?
l习?查出每个员工和每个员工的工资U别)
select a.ename , a.sal, b.grade from emp a , salgrade b where a.sal between b.losal and b.hisal;
select a.ename , a.sal, b.grade from emp a , salgrade b where a.sal>=b.losal and a.sal<=b.hisal;

自连接:
select first_name , manager_id from s_emp;
l习?查出所有员工的部门领导的名Uͼ( q种sql会少一条记录,ȝ理没有被配置上)
select e.first_name , m.first_name from s_emp e , s_emp m where e.manager_id=m.id;7fg
 
外连接:(防止I值时Q用Q?Q的一方会模拟一条记录配|另一?q就UCؓ外连?一个记录都不能;
select e.first_name , m.first_name from s_emp e , s_emp m where e.manager_id=m.id(+);

l习五:查看员工分部的部门:
select distinct(deptno) from emp ;
扑և没有员工的部门:(很经典的一个例?用外q接来解决的标准做法,q是一U方式,用子查询也可以实玎ͼ
W一步:
select e.deptno , d.deptno from emp e , dept d where e.deptno(+)=d.deptno;
W二步:(!L_=N
select e.deptno , d.deptno from emp e , dept d where e.deptno(+)=d.deptno and e.deptno is null;

l习六:查询员工有多h有提成:
select count( commission_pct ) from s_emp ;
select sum(commission_pct)/ count(*) from s_emp;
  
l习七:员工分部在多个不同的部门:
select count(dept_id) from s_emp;
select count(distinct dept_id) from s_emp;
 
l习八:求各个部门的q_工资Q?
select dept_id , avg(salary) aa from s_emp group by dept_id order by aa ;
select dept_id , avg(salary) aa from s_emp group by dept_id ;
//体会下句sql
select region_id , count(*) from s_dept ****此句会有?请多体会********
select max(region_id) , count(*) from s_dept; (强制语法上可以正?但是不能保证l果也会正确Q?

l习九:求各个部门不同工U的q_工资Q?br />select dept_id , title, avg(salary) from s_emp group by dept_id , title ;

l习十:查询哪些部门的^均工资比2000?
select dept_id, avg(salary) aa from s_emp group by (dept_id) having avg(salary)>2000;

l习十一Q除?2部门以外的部门的q_工资:
select dept_id , avg(salary) from s_emp group by (dept_id ) having dept_id!=42;
select dept_id , avg(salary) from s_emp where dept_id!=42 group by (dept_id ) ;(此种sql效率要高Q先qo再计)

l习十二Q求各个部门的^均工?
//****q问题很l典Qؓ了过 oracle sql 语法兌写max(d.name)
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 ;

关于子查? Subqueries
l习十三Q找出所有员工中Q工资最低的那个员工Q? 利用子查?Q?br />select first_name, salary from s_emp where salary = ( select min(salary) from s_emp) ;
//q样写会出错姓名和工资不一?br />select max(first_name), min(salary) from s_emp;

l习十四Q查询谁跟Smith的工U一P
select last_name from s_emp where last_name='Smith';
//下种写法可能q存在bugQ没有考虑到数据的全面?有潜在性问?br />select last_name , title from s_emp where title =( select title from s_emp where last_name='Smith' )and

last_name <> 'Smith' ;
//q种写法才考虑的比较全?br />select last_name , title from s_emp where title in ( select title from s_emp where last_name='Smith' ) and

last_name <> 'Smith' ;
使用子查询时应注意: 单行子查询返回多个结果时会有错误 single-row subquery returns more than one value(
l习十五Q查出哪些员工的工资比^均工资低Q?br />select * from s_emp where salary < ( select avg(salary) from s_emp) ;
哪些部门的^均工资比32部门的^均工资要低:
W一步先查出各个部门的^均工资:
select min(avg(salary ) ) from s_emp group by dept_id;
W二步再查出哪个部门的工资是最低的:
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 ) ;
l习十六Q哪个部门里没有员工(用子查询的方式来实现Q:
select deptno from dept where deptno not in ( select deptno from emp );



sunny 2007-03-20 12:48 发表评论
]]>
plsql命o大全http://www.tkk7.com/sunnygu/archive/2007/03/20/104892.htmlsunnysunnyTue, 20 Mar 2007 02:36:00 GMThttp://www.tkk7.com/sunnygu/archive/2007/03/20/104892.htmlSQL*PLUS命o的用大?/p>

                               SQL*PLUS命o的用大?
   
       Oracle的sql*plus是与oracleq行交互的客L工具。在sql*plus中,可以q行sql*plus命o与sql*plus语句。我们通常所说的DML、DDL、DCL语句都是sql*plus语句Q它们执行完后,都可以保存在一个被UCؓ
sql buffer的内存区域中Qƈ且只能保存一条最q执行的sql语句Q我们可以对保存在sql buffer中的sql 语句q行修改Q然后再ơ执行,sql*plus一般都与数据库打交道?
   除了sql*plus语句Q在sql*plus中执行的其它语句我们UC为sql*plus命o。它们执行完后,不保存在sql buffer的内存区域中Q它们一般用来对输出的结果进行格式化昄Q以便于制作报表?
   下面׃l一下一些常用的sql*plus命oQ?
 
1. 执行一个SQL脚本文g
SQL>start file_name
SQL>@ file_name
我们可以多条sql语句保存在一个文本文件中Q这样当要执行这个文件中的所有的sql语句Ӟ用上面的M命o卛_Q这cM于dos中的批处理?
 
2. 对当前的输入q行~辑
SQL>edit
 
3. 重新q行上一ơ运行的sql语句
SQL>/
 
4. 显C的内容输出到指定文?
SQL> SPOOL file_name
   在屏q上的所有内定w包含在该文g中,包括你输入的sql语句?
 
5. 关闭spool输出
SQL> SPOOL OFF
   只有关闭spool输出Q才会在输出文g中看到输出的内容?
 
6Q显CZ个表的结?
SQL> desc table_name
 
7. COL命oQ?
主要格式化列的显CŞ式?
该命令有许多选项Q具体如下:
COL[UMN] [{ column|expr} [ option ...]]
Option选项可以是如下的子句:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
LIKE { expr|alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]|PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
 
1). 改变~省的列标题
COLUMN column_name HEADING column_heading
For example:
Sql>select * from dept;
     DEPTNO DNAME                        LOC
---------- ---------------------------- ---------
         10 ACCOUNTING                   NEW YORK
sql>col  LOC heading location
sql>select * from dept;
    DEPTNO DNAME                        location
--------- ---------------------------- -----------
        10 ACCOUNTING                   NEW YORK
 
2). 列名ENAME改ؓ新列名EMPLOYEE NAMEq将新列名放在两行上Q?
Sql>select * from emp
Department  name           Salary
---------- ---------- ----------
         10 aaa                11        
SQL> COLUMN ENAME HEADING ’Employee|Name?
Sql>select * from emp
            Employee
Department  name           Salary
---------- ---------- ---------- 
         10 aaa                11
note: the col heading turn into two lines from one line.
 
3). 改变列的昄长度Q?
FOR[MAT] format
Sql>select empno,ename,job from emp;
      EMPNO ENAME      JOB       
---------- ----------     ---------
       7369 SMITH      CLERK     
       7499 ALLEN      SALESMAN  
7521 WARD       SALESMAN  
Sql> col ename format a40
      EMPNO ENAME                                    JOB
----------   ----------------------------------------         ---------
       7369 SMITH                                    CLERK
       7499 ALLEN                                    SALESMAN
       7521 WARD                                    SALESMAN
 
4). 讄列标题的寚w方式
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
SQL> col ename justify center
SQL> /
      EMPNO           ENAME                   JOB
----------   ----------------------------------------       ---------
       7369 SMITH                                    CLERK
       7499 ALLEN                                    SALESMAN
7521 WARD                                     SALESMAN
对于NUMBER型的列,列标题缺省在双Q其它类型的列标题缺省在左边
 
5). 不让一个列昄在屏q上
NOPRI[NT]|PRI[NT]
SQL> col job noprint
SQL> /
      EMPNO           ENAME
----------     ----------------------------------------
       7369 SMITH
       7499 ALLEN
7521 WARD
 
6). 格式化NUMBERcd列的昄Q?
SQL> COLUMN SAL FORMAT $99,990
SQL> /
Employee
Department Name        Salary    Commission
---------- ---------- --------- ----------
30          ALLEN        $1,600    300
 
7). 昄列值时Q如果列gؓNULL|用textg替NULL?
COMM NUL[L] text
SQL>COL COMM NUL[L] text
 
8). 讄一个列的回l方?
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
        COL1
--------------------
HOW ARE YOU?
 
SQL>COL COL1 FORMAT A5
SQL>COL COL1 WRAPPED
COL1
-----
HOW A
RE YO
U?
 
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW
ARE
YOU?
 
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW A
 
9). 昄列的当前的显C属性?
SQL> COLUMN column_name
 
10). 所有列的显C属性设为缺省?
SQL> CLEAR COLUMNS
 
8. 屏蔽掉一个列中显C的相同的?
BREAK ON break_column
SQL> BREAK ON DEPTNO
SQL> SELECT DEPTNO, ENAME, SAL
FROM EMP
  WHERE SAL < 2500
  ORDER BY DEPTNO;
DEPTNO      ENAME         SAL
---------- ----------- ---------
10           CLARK        2450
MILLER      1300
20            SMITH       800
ADAMS       1100
 
9. 在上面屏蔽掉一个列中显C的相同的值的昄中,每当列值变化时在值变化之前插入n个空行?
BREAK ON break_column SKIP n
 
SQL> BREAK ON DEPTNO SKIP 1
SQL> /
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
 
20 SMITH 800
ADAMS 1100
 
10. 昄对BREAK的设|?
SQL> BREAK
 
11. 删除6?的设|?
SQL> CLEAR BREAKS
 
12. Set 命oQ?
该命令包含许多子命oQ?
SET system_variable value
system_variable value 可以是如下的子句之一Q?
APPI[NFO]{ON|OFF|text}
ARRAY[SIZE] {15|n}
AUTO[COMMIT]{ON|OFF|IMM[EDIATE]|n}
AUTOP[RINT] {ON|OFF}
AUTORECOVERY [ON|OFF]
AUTOT[RACE] {ON|OFF|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
BLO[CKTERMINATOR] {.|c}
CMDS[EP] {;|c|ON|OFF}
COLSEP {_|text}
COM[PATIBILITY]{V7|V8|NATIVE}
CON[CAT] {.|c|ON|OFF}
COPYC[OMMIT] {0|n}
COPYTYPECHECK {ON|OFF}
DEF[INE] {&|c|ON|OFF}
DESCRIBE [DEPTH {1|n|ALL}][LINENUM {ON|OFF}][INDENT {ON|OFF}]
ECHO {ON|OFF}
EDITF[ILE] file_name[.ext]
EMB[EDDED] {ON|OFF}
ESC[APE] {\|c|ON|OFF}
FEED[BACK] {6|n|ON|OFF}
FLAGGER {OFF|ENTRY |INTERMED[IATE]|FULL}
FLU[SH] {ON|OFF}
HEA[DING] {ON|OFF}
HEADS[EP] {||c|ON|OFF}
INSTANCE [instance_path|LOCAL]
LIN[ESIZE] {80|n}
LOBOF[FSET] {n|1}
LOGSOURCE [pathname]
LONG {80|n}
LONGC[HUNKSIZE] {80|n}
MARK[UP] HTML [ON|OFF] [HEAD text] [BODY text] [ENTMAP {ON|OFF}] [SPOOL
{ON|OFF}] [PRE[FORMAT] {ON|OFF}]
NEWP[AGE] {1|n|NONE}
NULL text
NUMF[ORMAT] format
NUM[WIDTH] {10|n}
PAGES[IZE] {24|n}
PAU[SE] {ON|OFF|text}
RECSEP {WR[APPED]|EA[CH]|OFF}
RECSEPCHAR {_|c}
SERVEROUT[PUT] {ON|OFF} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_
WRAPPED]|TRU[NCATED]}]
SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}
SHOW[MODE] {ON|OFF}
SQLBL[ANKLINES] {ON|OFF}
SQLC[ASE] {MIX[ED]|LO[WER]|UP[PER]}
SQLCO[NTINUE] {> |text}
SQLN[UMBER] {ON|OFF}
SQLPRE[FIX] {#|c}
SQLP[ROMPT] {SQL>|text}
SQLT[ERMINATOR] {;|c|ON|OFF}
SUF[FIX] {SQL|text}
TAB {ON|OFF}
TERM[OUT] {ON|OFF}
TI[ME] {ON|OFF}
TIMI[NG] {ON|OFF}
TRIM[OUT] {ON|OFF}
TRIMS[POOL] {ON|OFF}
UND[ERLINE] {-|c|ON|OFF}
VER[IFY] {ON|OFF}
WRA[P] {ON|OFF}
 
1). 讄当前session是否对修改的数据q行自动提交
SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
 
2)Q在用start命o执行一个sql脚本Ӟ是否昄脚本中正在执行的SQL语句
SQL> SET ECHO {ON|OFF}
 
3).是否昄当前sql语句查询或修改的行数
SQL> SET FEED[BACK] {6|n|ON|OFF}
   默认只有l果大于6行时才显C结果的行数。如果set feedback 1 Q则不管查询到多行都返回。当为off Ӟ一律不昄查询的行?
 
4).是否昄列标?
SQL> SET HEA[DING] {ON|OFF}
当set heading off Ӟ在每늚上面不显C列标题Q而是以空白行代替
 
5).讄一行可以容U的字符?
SQL> SET LIN[ESIZE] {80|n}
   如果一行的输出内容大于讄的一行可容纳的字W数Q则折行昄?
 
6).讄与之间的分隔
SQL> SET NEWP[AGE] {1|n|NONE}
当set newpage 0 Ӟ会在每页的开头有一个小的黑Ҏ?
当set newpage n Ӟ会在和之间隔着n个空行?
当set newpage none Ӟ会在和之间没有Q何间隔?
 
7).昄Ӟ用textg替NULL?
SQL> SET NULL text
 
8).讄一|多少行数
SQL> SET PAGES[IZE] {24|n}
如果设ؓ0Q则所有的输出内容Zƈ且不昄列标?
 
9).是否昄用DBMS_OUTPUT.PUT_LINE包进行输出的信息?
SQL> SET SERVEROUT[PUT] {ON|OFF} 
在编写存储过E时Q我们有时会用dbms_output.put_line必要的信息输出Q以便对存储q程q行调试Q只有将serveroutput变量设ؓon后,信息才能昄在屏q上?
 
10).当SQL语句的长度大于LINESIZEӞ是否在显C时截取SQL语句?
SQL> SET WRA[P] {ON|OFF}
   当输出的行的长度大于讄的行的长度时Q用set linesize n命o讄Q,当set wrap onӞ输出行的多于的字W会另v一行显C,否则Q会输的多于字W切除,不予昄?
 
11).是否在屏q上昄输出的内容,主要用与SPOOLl合使用?
SQL> SET TERM[OUT] {ON|OFF}
   在用spool命o一个大表中的内容输出到一个文件中Ӟ内容输出在屏幕上会耗费大量的时_讄set termspool off后,则输出的内容只会保存在输出文件中Q不会显C在屏幕上,极大的提高了spool的速度?
 
12).SPOOL输出中每行后面多余的I格L
SQL> SET TRIMS[OUT] {ON|OFF} 
   
13)昄每个sql语句p的执行时?
set TIMING  {ON|OFF}
 
14Q修改sql buffer中的当前行中Q第一个出现的字符?
C[HANGE] /old_value/new_value
SQL> l
   1* select * from dept
SQL> c/dept/emp
   1* select * from emp
 
15Q编辑sql buffer中的sql语句
EDI[T]
 
16Q显Csql buffer中的sql语句Qlist n昄sql buffer中的Wn行,qɽWn行成为当前行
L[IST] [n]
 
17Q在sql buffer的当前行下面加一行或多行
I[NPUT]
 
18Q将指定的文本加到sql buffer的当前行后面
A[PPEND]
SQL> select deptno,
   2  dname
   3  from dept;
     DEPTNO DNAME
---------- --------------
         10 ACCOUNTING
         20 RESEARCH
         30 SALES
         40 OPERATIONS
 
SQL> L 2
   2* dname
SQL> a ,loc
   2* dname,loc
SQL> L
   1  select deptno,
   2  dname,loc
   3* from dept
SQL> /
 
     DEPTNO DNAME          LOC
---------- -------------- -------------
         10 ACCOUNTING     NEW YORK
         20 RESEARCH       DALLAS
         30 SALES          CHICAGO
         40 OPERATIONS     BOSTON
 
19Q将sql buffer中的sql语句保存C个文件中
SAVE file_name
 
20Q将一个文件中的sql语句导入到sql buffer?
GET file_name
 
21Q再ơ执行刚才已l执行的sql语句
RUN
or
/
 
22Q执行一个存储过E?
EXECUTE procedure_name
 
23Q在sql*plus中连接到指定的数据库
CONNECT user_name/passwd@db_alias
 
24Q设|每个报表的剙标题
TTITLE
 
25Q设|每个报表的N标题
BTITLE
 
26Q写一个注?
REMARK [text]
 
27Q将指定的信息或一个空行输出到屏幕?
PROMPT [text]
 
28Q将执行的过E暂停,{待用户响应后l执?
PAUSE [text]
 
Sql>PAUSE Adjust paper and press RETURN to continue.
 
29Q将一个数据库中的一些数据拷贝到另外一个数据库Q如一个表的数据拷贝到另一个数据库Q?
COPY {FROM database | TO database | FROM database TO database}
{APPEND|CREATE|INSERT|REPLACE} destination_table
[(column, column, column, ...)] USING query
 
sql>COPY FROM SCOTT/TIGER@HQ TO JOHN/CHROME@WEST 
create emp_temp
USING SELECT * FROM EMP
 
30Q不退出sql*plusQ在sql*plus中执行一个操作系l命令:
HOST
 
Sql> host hostname
该命令在windows下可能被支持?
 
31Q在sql*plus中,切换到操作系l命令提C符下,q行操作pȝ命o后,可以再次切换回sql*plusQ?
!
 
sql>!
$hostname
$exit
sql>
 
该命令在windows下不被支持?
 
32Q显Csql*plus命o的帮?
HELP
如何安装帮助文gQ?
Sql>@ ?\sqlplus\admin\help\hlpbld.sql ?\sqlplus\admin\help\helpus.sql
Sql>help index
 
33Q显Csql*pluspȝ变量的值或sql*plus环境变量的?
Syntax
SHO[W] option
where option represents one of the following terms or clauses:
system_variable
ALL
BTI[TLE]
ERR[ORS] [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY|
TRIGGER|VIEW|TYPE|TYPE BODY} [schema.]name]
LNO
PARAMETERS [parameter_name]
PNO
REL[EASE]
REPF[OOTER]
REPH[EADER]
SGA
SPOO[L]
SQLCODE
TTI[TLE]
USER
 
1) . 昄当前环境变量的|
Show all
 
2) . 昄当前在创建函数、存储过E、触发器、包{对象的错误信息
Show error
当创Z个函数、存储过E等出错Ӟ变可以用该命令查看在那个地方出错及相应的出错信息Q进行修改后再次q行~译?
 
3) . 昄初始化参数的|
show PARAMETERS [parameter_name]
 
4) . 昄数据库的版本Q?
show REL[EASE]
 
5) . 昄SGA的大?
show SGA
 
6). 昄当前的用户名
show user



sunny 2007-03-20 10:36 发表评论
]]>
郁闷!http://www.tkk7.com/sunnygu/archive/2007/03/11/103162.htmlsunnysunnySun, 11 Mar 2007 13:45:00 GMThttp://www.tkk7.com/sunnygu/archive/2007/03/11/103162.htmlhttp://www.tkk7.com/sunnygu/comments/103162.htmlhttp://www.tkk7.com/sunnygu/archive/2007/03/11/103162.html#Feedback0http://www.tkk7.com/sunnygu/comments/commentRss/103162.htmlhttp://www.tkk7.com/sunnygu/services/trackbacks/103162.html

sunny 2007-03-11 21:45 发表评论
]]>
q问题Q?/title><link>http://www.tkk7.com/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.tkk7.com/sunnygu/archive/2007/01/30/96808.html</guid><wfw:comment>http://www.tkk7.com/sunnygu/comments/96808.html</wfw:comment><comments>http://www.tkk7.com/sunnygu/archive/2007/01/30/96808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/sunnygu/comments/commentRss/96808.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/sunnygu/services/trackbacks/96808.html</trackback:ping><description><![CDATA[ <p>Q)最q做上传文g旉C讨厌的ؕ码问题!<br />现象是上传纯文本文gQ显C没有问题,但是word文档中有图表׃出现qQ?br /><br />原因Q是׃我用了clob字段来保存文档!<br /><br />Q)在下载时遇到中文文g名ؕ码.解决Ҏ是把文g名重新编码!<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.tkk7.com/sunnygu/aggbug/96808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/sunnygu/" target="_blank">sunny</a> 2007-01-30 23:12 <a href="http://www.tkk7.com/sunnygu/archive/2007/01/30/96808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速排序不新徏临时数组http://www.tkk7.com/sunnygu/archive/2007/01/25/96059.htmlsunnysunnyThu, 25 Jan 2007 14:51:00 GMThttp://www.tkk7.com/sunnygu/archive/2007/01/25/96059.htmlhttp://www.tkk7.com/sunnygu/comments/96059.htmlhttp://www.tkk7.com/sunnygu/archive/2007/01/25/96059.html#Feedback0http://www.tkk7.com/sunnygu/comments/commentRss/96059.htmlhttp://www.tkk7.com/sunnygu/services/trackbacks/96059.htmlusing namespace std;
void swap(int &a,int &b){
    if(&a==&b)
         return;   
     a=a^b;
     b=a^b;
     a=a^b;
     }
void quick(int *a,int n)
{
     if(n<=1)
         return ;
     swap(*a,a[n>>1]);
     int*lp=a+1;
     int*rp=a+n-1;
     while(rp-lp>=0)
     {
      if(*lp>*a)
            {
             if(*rp<*a){             
               swap(*lp++,*rp--);
               }
             else
               --rp;
            }
      else
         ++lp;           
      }
  swap(*a,*rp);   
             
    int left=rp-a;
    quick(a,left);
    quick(a+left+1,n-left-1) ;  
 }
int main(){
    int a[5]={0 ,5, 9, 8, 7 };
    int b[10]={2,5,9,6,3,1,4,7,1 ,5 };
    quick(b,10);
    for(int i=0;i<10;i++)
            cout<<b[i]<<' ';
            cout<<endl;
    char ch;
    cin>>ch;
    return 0;
    }


sunny 2007-01-25 22:51 发表评论
]]>
վ֩ģ壺 Ʒվ| gvվ| ձvaĻþ| þþþþaŷa| þþþ޹AV鶹 | AVպAV߳ר| ˴ֳսŮ2021ƷƵ | պ߹ۿ| ޸Ʒһ| ձһձ| ޳av߹ۿվ| η츾AAAAƬѿ| 337pձŷ޴| רר| Ů˱ŮˬƵ| ߹ۿAVպA| ձXXXѿ| Ļ뾫ƷԴþ| պŷëƬƵ| ŷ߹ۿ| þùһ| ޾Ʒ| ò߹ۿƵ| ձۺϸ| ѿAVëƬһ| avպav߹ۿ| ޾Ʒһ| ĻѾþ9һ9| ɫóվ߹ۿ | ޹һӰ | һaëƬƵ| ޹ģƷһ| ĻƷַ| ۺһƷþ| Ʒ| Ʒѿþþ| ޹Ʒ۲ӰԺ| AVۺ߹ۿ| ҹʱ| þѹƵ| ޾ƷŮ|