<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 18,  comments - 1,  trackbacks - 0
      2006年7月14日
    再shortcut 的target? 后面加上-data? workspace path

    如"D:\Program Files\IBM\Rational\SDP\6.0\rationalsdp.exe" -data E:\EE-workspace\1600
    posted @ 2007-09-13 10:55 sunny 閱讀(234) | 評(píng)論 (0)編輯 收藏
    實(shí)際編程時(shí),要使Log4j真正在系統(tǒng)中運(yùn)行事先還要對(duì)配置文件進(jìn)行定義。定義步驟就是對(duì)Logger、Appender及Layout的分別使用。 Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是java properties(key=value)【Java特性文件(鍵=值)】。下面我們介紹使用Java特性文件做為配置文件的方法 具體如下:      1、配置根Logger,其語法為:   log4j.rootLogger = [ level ] , appenderName1, appenderName2, … level : 是日志記錄的優(yōu)先級(jí),分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級(jí)別。Log4j建議只使用四個(gè)級(jí)別,優(yōu)先級(jí)從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級(jí)別,您可以控制到應(yīng)用程序中相應(yīng)級(jí)別的日志信息的開關(guān)。比如在這里定義了INFO級(jí)別,則應(yīng)用程序中所有DEBUG級(jí)別的日志信息將不被打印出來。    appenderName:就是指定日志信息輸出到哪個(gè)地方。您可以同時(shí)指定多個(gè)輸出目的地。 例如:log4j.rootLogger=info,A1,B2,C3      2、配置日志信息輸出目的地,其語法為:   log4j.appender.appenderName = fully.qualified.name.of.appender.class //    "fully.qualified.name.of.appender.class" 可以指定下面五個(gè)目的地中的一個(gè): 1.org.apache.log4j.ConsoleAppender(控制臺(tái)) 2.org.apache.log4j.FileAppender(文件) 3.org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件) 4.org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件) 5.org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方) 1.ConsoleAppender選項(xiàng) Threshold=WARN:指定日志消息的輸出最低層次。 ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。 Target=System.err:默認(rèn)情況下是:System.out,指定輸出控制臺(tái) 2.FileAppender 選項(xiàng) Threshold=WARN:指定日志消息的輸出最低層次。 ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。 File=mylog.txt:指定消息輸出到mylog.txt文件。 Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。 3.DailyRollingFileAppender 選項(xiàng) Threshold=WARN:指定日志消息的輸出最低層次。 ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。 File=mylog.txt:指定消息輸出到mylog.txt文件。 Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。 DatePattern='.'yyyy-ww:每周滾動(dòng)一次文件,即每周產(chǎn)生一個(gè)新的文件。當(dāng)然也可以指定按月、周、天、時(shí)和分。即對(duì)應(yīng)的格式如下: 1)'.'yyyy-MM: 每月 2)'.'yyyy-ww: 每周 3)'.'yyyy-MM-dd: 每天 4)'.'yyyy-MM-dd-a: 每天兩次 5)'.'yyyy-MM-dd-HH: 每小時(shí) 6)'.'yyyy-MM-dd-HH-mm: 每分鐘 4.RollingFileAppender 選項(xiàng) Threshold=WARN:指定日志消息的輸出最低層次。 ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。 File=mylog.txt:指定消息輸出到mylog.txt文件。 Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。 MaxFileSize=100KB: 后綴可以是KB, MB 或者是 GB. 在日志文件到達(dá)該大小時(shí),將會(huì)自動(dòng)滾動(dòng),即將原來的內(nèi)容移到mylog.log.1文件。 MaxBackupIndex=2:指定可以產(chǎn)生的滾動(dòng)文件的最大數(shù)。 實(shí)際應(yīng)用:   log4j.appender.A1=org.apache.log4j.ConsoleAppender //這里指定了日志輸出的第一個(gè)位置A1是控制臺(tái)ConsoleAppender      3、配置日志信息的格式,其語法為:   A.log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class "fully.qualified.name.of.layout.class" 可以指定下面4個(gè)格式中的一個(gè): 1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),    2.org.apache.log4j.PatternLayout(可以靈活地指定布局模式),    3.org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),    4.org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息) 1.HTMLLayout 選項(xiàng) LocationInfo=true:默認(rèn)值是false,輸出java文件名稱和行號(hào) Title=my app file: 默認(rèn)值是 Log4J Log Messages. 2.PatternLayout 選項(xiàng) ConversionPattern=%m%n :指定怎樣格式化指定的消息。 3.XMLLayout 選項(xiàng) LocationInfo=true:默認(rèn)值是false,輸出java文件和行號(hào) 實(shí)際應(yīng)用:   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 這里需要說明的就是日志信息格式中幾個(gè)符號(hào)所代表的含義:    -X號(hào): X信息輸出時(shí)左對(duì)齊; %p: 輸出日志信息優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL, %d: 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921 %r: 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù) %c: 輸出日志信息所屬的類目,通常就是所在類的全名 %t: 輸出產(chǎn)生該日志事件的線程名 %l: 輸出日志事件的發(fā)生位置,相當(dāng)于%C.%M(%F:%L)的組合,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java:10) %x: 輸出和當(dāng)前線程相關(guān)聯(lián)的NDC(嵌套診斷環(huán)境),尤其用到像java servlets這樣的多客戶多線程的應(yīng)用中。 %%: 輸出一個(gè)"%"字符 %F: 輸出日志消息產(chǎn)生時(shí)所在的文件名稱 %L: 輸出代碼中的行號(hào) %m: 輸出代碼中指定的消息,產(chǎn)生的日志具體信息 %n: 輸出一個(gè)回車換行符,Windows平臺(tái)為"\r\n",Unix平臺(tái)為"\n"輸出日志信息換行 可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對(duì)齊方式。如: 1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,默認(rèn)的情況下右對(duì)齊。 2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,"-"號(hào)指定左對(duì)齊。 3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大于30的話,就會(huì)將左邊多出的字符截掉,但小于30的話也不會(huì)有空格。 4)%20.30c:如果category的名稱小于20就補(bǔ)空格,并且右對(duì)齊,如果其名稱長于30字符,就從左邊交遠(yuǎn)銷出的字符截掉。   這里上面三個(gè)步驟是對(duì)前面Log4j組件說明的一個(gè)簡化;下面給出一個(gè)具體配置例子,在程序中可以參照?qǐng)?zhí)行:   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   根據(jù)上面的日志格式,某一個(gè)程序的輸出結(jié)果如下:   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. # 當(dāng)輸出信息于回滾文件時(shí) 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 //備份數(shù) 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的配置之簡單使它遍及于越來越多的應(yīng)用中了:Log4J配置文件實(shí)現(xiàn)了輸出到控制臺(tái)、文件、回滾文件、發(fā)送日志郵件、輸出到數(shù)據(jù)庫日志表、自定義標(biāo)簽等全套功能。擇其一二使用就夠用了, log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true # 應(yīng)用于控制臺(tái) 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 #應(yīng)用于文件 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 # 應(yīng)用于文件回滾 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 //備份數(shù) 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 #應(yīng)用于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 # 發(fā)送日志給郵件 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 # 用于數(shù)據(jù)庫 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
    posted @ 2007-06-05 19:37 sunny 閱讀(491) | 評(píng)論 (1)編輯 收藏


    <%@page contentType="text/html;charset=gbk" %>
    <%@taglib uri="

    <h3 align="center">Dispatch Action</h3>
    <hr>
    <pre>
    ??? 根據(jù)請(qǐng)求中的某個(gè)(1)參數(shù)的值來調(diào)用Action的方法(2)。
    ??? (1)參數(shù)名字在&lt;action parameter="method" /&gt;
    ??? (2)方法名字為 method 參數(shù)的值。
    </pre>
    <center>
    <a href="${pageContext.request.contextPath}/dispatch.do?method=login">login</a>&nbsp;&nbsp;&nbsp;
    <a href="${pageContext.request.contextPath}/dispatch.do?method=find">find</a>&nbsp;&nbsp;&nbsp;
    <a href="${pageContext.request.contextPath}/dispatch.do?method=findById">findById</a>&nbsp;&nbsp;&nbsp;
    <a href="${pageContext.request.contextPath}/dispatch.do?method=register">register</a>&nbsp;&nbsp;&nbsp;
    <a href="${pageContext.request.contextPath}/dispatch.do?method=remove">remove</a>&nbsp;&nbsp;&nbsp;
    <a href="${pageContext.request.contextPath}/dispatch.do?method=modify">modify</a>
    </center>
    <hr>
    <h3 align="center">LookupDispatch Action</h3>
    <hr>
    <pre>???
    </pre>
    <center>
    <form method="post" action="${pageContext.request.contextPath}/lookup.do">
    ??? <input type="submit" value="<bean:message key="submit.login"/>" name="method">
    ??? <input type="submit" value="<bean:message key="submit.find"/>" name="method">
    ??? <input type="submit" value="<bean:message key="submit.findById"/>" name="method">
    ??? <input type="submit" value="<bean:message key="submit.register"/>" name="method">
    ??? <input type="submit" value="<bean:message key="submit.remove"/>" name="method">
    ??? <input type="submit" value="<bean:message key="submit.modify"/>" name="method">
    </form>
    </center>
    <!--
    <h3 align="center">LookupDispatch Action</h3>
    <hr>
    <pre>???
    </pre>
    <center>
    <form method="post" action="${pageContext.request.contextPath}/lookup.do">
    ???
    ??? <input type="hidden" name="method" value="login">
    ???
    ??? <input type="submit" value="login" name="m" onclick="this.form.method.value='login'">
    ??? <input type="submit" value="find" name="m" onclick="this.form.method.value='find'">
    ??? <input type="submit" value="findById" name="m" onclick="this.form.method.value='findById'">
    ??? <input type="submit" value="register" name="m" onclick="this.form.method.value='register'">
    ??? <input type="submit" value="remove" name="m" onclick="this.form.method.value='remove'">
    ??? <input type="submit" value="modify" name="m" onclick="this.form.method.value='modify'">
    </form>
    </center>
    -->
    <hr>
    <h3 align="center">MappingDispatch Action</h3>
    <hr>
    <pre>
    ??? 根據(jù)<action>標(biāo)記的parameter屬性的值來調(diào)用Action的方法(1)。
    ??? (1)方法名字為 parameter屬性的值。
    </pre>
    <center>
    <a href="${pageContext.request.contextPath}/mapping/login.do">login</a>&nbsp;&nbsp;&nbsp;
    <a href="${pageContext.request.contextPath}/mapping/find.do">find</a>&nbsp;&nbsp;&nbsp;
    <a href="${pageContext.request.contextPath}/mapping/findById.do?id=1">findById</a>&nbsp;&nbsp;&nbsp;
    <a href="${pageContext.request.contextPath}/mapping/register.do">register</a>&nbsp;&nbsp;&nbsp;
    <a href="${pageContext.request.contextPath}/mapping/remove.do?id=2">remove</a>&nbsp;&nbsp;&nbsp;
    <a href="${pageContext.request.contextPath}/mapping/modify.do">modify</a>
    </center>







    =====================================================

    <?xml version="1.0" encoding="gb2312" ?>

    <!DOCTYPE struts-config PUBLIC
    ????????? "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
    ????????? "

    <struts-config>

    ??? <form-beans>
    ??????? <form-bean name="loginForm" type="com.allanlxf.action.LoginForm"/>
    ??????? <form-bean name="userForm" type="org.apache.struts.action.DynaActionForm">
    ??????????? <form-property name="userName" type="java.lang.String" />
    ??????????? <form-property name="password" type="java.lang.String" />
    ??????? </form-bean>
    ??? </form-beans>
    ???
    ??? <action-mappings>
    ???
    ??????? <action?? path="/core/login"? type="com.allanlxf.action.LoginAction"
    ?????????????????? name="loginForm" input="/core/login.jsp" validate="true" scope="request">
    ????????? <exception key="errors.root"
    ?????????????????????? path="/core/error.jsp"
    ?????????????????????? type="com.allanlxf.biz.IllegalUserException" />
    ????????? <forward name="success" path="/core/success.jsp" redirect="true"/>
    ????????? <forward name="fail" path="/core/fail.jsp" />
    ??????? </action>
    ???????
    ??????? <action?? path="/dispatch"? type="com.allanlxf.struts.actions.UserAction" parameter="method">
    ????????? <forward name="login" path="/actions/pages/login_next.jsp" />
    ????????? <forward name="find" path="/actions/pages/find_next.jsp" />
    ????????? <forward name="findById" path="/actions/pages/findById_next.jsp" />
    ????????? <forward name="remove" path="/actions/pages/remove_next.jsp" />
    ????????? <forward name="modify" path="/actions/pages/modify_next.jsp" />
    ????????? <forward name="register" path="/actions/pages/register_next.jsp" />
    ??????? </action>
    ???????
    ??????? <action?? path="/mapping/login"? type="com.allanlxf.struts.actions.UserMappingAction" parameter="login">
    ????????? <forward name="next" path="/actions/pages/login_next.jsp" />
    ??????? </action>
    ???????
    ??????? <action?? path="/mapping/find"? type="com.allanlxf.struts.actions.UserMappingAction"? parameter="find">
    ????????? <forward name="next" path="/actions/pages/find_next.jsp" />
    ??????? </action>
    ???????
    ??????? <action?? path="/mapping/findById"? type="com.allanlxf.struts.actions.UserMappingAction"? parameter="findById">
    ????????? <forward name="next" path="/actions/pages/findById_next.jsp" />
    ??????? </action>
    ???????
    ??????? <action?? path="/mapping/remove"? type="com.allanlxf.struts.actions.UserMappingAction"? parameter="remove">
    ????????? <forward name="next" path="/actions/pages/remove_next.jsp" />
    ??????? </action>
    ???????
    ??????? <action?? path="/mapping/modify"? type="com.allanlxf.struts.actions.UserMappingAction"? parameter="modify">
    ????????? <forward name="next" path="/actions/pages/modify_next.jsp" />
    ??????? </action>
    ???????
    ??????? <action?? path="/mapping/register"? type="com.allanlxf.struts.actions.UserMappingAction"? parameter="register">
    ????????? <forward name="next" path="/actions/pages/register_next.jsp" />
    ??????? </action>
    ???????
    ??????? <action?? path="/lookup"? type="com.allanlxf.struts.actions.UserLookupAction" parameter="method">
    ????????? <forward name="login" path="/actions/pages/login_next.jsp" />
    ????????? <forward name="find" path="/actions/pages/find_next.jsp" />
    ????????? <forward name="findById" path="/actions/pages/findById_next.jsp" />
    ????????? <forward name="remove" path="/actions/pages/remove_next.jsp" />
    ????????? <forward name="modify" path="/actions/pages/modify_next.jsp" />
    ????????? <forward name="register" path="/actions/pages/register_next.jsp" />
    ??????? </action>
    ???????
    ??????? <action?? path="/dyna/register"? type="com.allanlxf.action.RegisterAction"
    ?????????????????? name="userForm">
    ????????? <forward name="success" path="/dyna/success.jsp"/>
    ??????? </action>
    ???????
    ??? </action-mappings>
    ???
    ??? <message-resources parameter="com.allanlxf.MessageResources" />
    ?????????????????
    </struts-config>


    import 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()
    ??? {
    ??? }
    }

    posted @ 2007-04-06 16:31 sunny 閱讀(304) | 評(píng)論 (0)編輯 收藏

    import java.io.*;
    import java.util.*;
    import java.sql.*;
    import javax.naming.*;
    import javax.sql.*;
    public class ConnectionFactory
    {

    /**

    oracle?? 分頁

    select * from (
    select a.*, ROWNUM rn from ( select * from user_info )? a
    where ROWNUM<=40 )
    where rn >=21

    ?


    */
    ??? private static Properties config = new Properties();
    ???
    ??? static
    ??? {
    ??????? try
    ??????? {
    ??????????? InputStream in = ConnectionFactory.class.getClassLoader().getResourceAsStream("dbconfig.properties");
    ??????????? config.load(in);
    ??????????? in.close();
    ??????? }catch(IOException e)
    ??????? {
    ??????????? e.printStackTrace();
    ??????????? throw new ExceptionInInitializerError(e.getMessage());
    ??????? }
    ??? }
    ???
    ??? public static Connection getConnection()
    ??? {
    ??????? if(config.getProperty("jndi-name") != null)
    ??????? {
    ??????????? return getJndiConnection();
    ??????? }
    ???????
    ??????? return getDirectConnection();
    ??? }
    ???
    ??? public static Connection getJndiConnection()
    ??? {
    ??????? Connection con = null;
    ??????? try
    ??????? {
    /**context.xml

    數(shù)據(jù)源的配置
    <Context>
    ????? <Resource name="jdbc/oracle" auth="Container" type="javax.sql.DataSource" maxActive="2" maxIdle="1" maxWait="-1"
    ????? username="openlab" password="open123" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@192.168.0.20:1521:tarena"/>
    </Context?
    */
    ??????????? Context ctx = new InitialContext();
    ??????????? DataSource ds = (DataSource)ctx.lookup("java:comp/env/" + config.getProperty("jndi-name"));
    ??????????? con = ds.getConnection();
    ??????? }catch(Exception e)
    ??????? {
    ??????????? e.printStackTrace();
    ??????? }
    ??????? return con;
    ??? }
    ???
    ??? public static Connection getDirectConnection()
    ??? {
    ??????? Connection con = null;
    ??????? try
    ??????? {
    ??????????? Class.forName(config.getProperty("driver"));
    ??????????? con = DriverManager.getConnection(config.getProperty("dburl") ,config.getProperty("user"), config.getProperty("password"));
    ??????? }catch(ClassNotFoundException cne)
    ??????? {
    ??????????? cne.printStackTrace();
    ??????? }catch(SQLException sqle)
    ??????? {
    ??????????? sqle.printStackTrace();
    ??????? }
    ???????
    ??????? return con;
    ??? }
    ???
    ??? public static void close(ResultSet rs, Statement st, Connection con)
    ??? {
    ??????? try
    ??????? {
    ??????????? rs.close();
    ??????? }catch(Exception e)
    ??????? {
    ??????? }
    ???????
    ??????? try
    ??????? {
    ??????????? st.close();
    ??????? }catch(Exception e)
    ??????? {
    ??????? }
    ???????
    ??????? try
    ??????? {
    ??????????? con.close();
    ??????? }catch(Exception e)
    ??????? {
    ??????? }
    ??? }
    ???
    ??? public static void main(String[] args) throws Exception
    ??? {
    ??????? Connection con = ConnectionFactory.getConnection();
    ??????? System.out.println(con);
    ??????? con.close();
    ??? }
    }

    posted @ 2007-04-05 15:30 sunny 閱讀(151) | 評(píng)論 (0)編輯 收藏

    上午:

    一.JDBC原理概述

    ?

    1,JDBC是一套協(xié)議,是JAVA開發(fā)人員和數(shù)據(jù)庫廠商達(dá)成的協(xié)議,也就是由Sun定義一組接口,由數(shù)據(jù)庫廠商來實(shí)現(xiàn),并規(guī)定了JAVA開發(fā)人員訪問數(shù)據(jù)庫所使用的方法的調(diào)用規(guī)范。

    ?

    2,JDBC的實(shí)現(xiàn)是由數(shù)據(jù)庫廠商提供,以驅(qū)動(dòng)程序形式提供。

    ?

    3,JDBC在使用前要先加載驅(qū)動(dòng)。

    JDBC對(duì)于使用者要有一致性,對(duì)不同的數(shù)據(jù)庫其使用方法都是相同的。

    ?

    驅(qū)動(dòng)開發(fā)必須要實(shí)現(xiàn)Driver接口。

    數(shù)據(jù)庫驅(qū)動(dòng)的實(shí)現(xiàn)方式

    JDBC-ODBC橋接式

    JDBC網(wǎng)絡(luò)驅(qū)動(dòng),這種方式是通過中間服務(wù)器的協(xié)議轉(zhuǎn)換來實(shí)現(xiàn)的

    JDBC+本地驅(qū)動(dòng),這種方式的安全性比較差。

    JDBC驅(qū)動(dòng),由數(shù)據(jù)庫廠商實(shí)現(xiàn)。

    ?

    二.JDBC的API

    ?

    java.sql包和javax.sql包

    Driver接口(驅(qū)動(dòng)),在加載某一 Driver 類時(shí),它應(yīng)該創(chuàng)建自己的實(shí)例并向 DriverManager 注冊該實(shí)例。這意味著用戶可以通過調(diào)用以下程序加載和注冊一個(gè)驅(qū)動(dòng)程序

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

    DriverManager類(驅(qū)動(dòng)管理器),它可以創(chuàng)建連接,它本身就是一個(gè)創(chuàng)建Connection的工廠(Factory)。

    Connection接口,會(huì)根據(jù)不同的驅(qū)動(dòng)產(chǎn)生不同的連接

    Statement接口,發(fā)送sql語句

    ResultSet接口(結(jié)果集),是用來接收select語句返回的查詢結(jié)果的。其實(shí)質(zhì)類似于集合。

    ?

    下午:

    三.JDBC應(yīng)用步驟

    1,注冊加載一個(gè)driver驅(qū)動(dòng)

    2,創(chuàng)建數(shù)據(jù)庫連接(Connection)

    3,創(chuàng)建一個(gè)Statement(發(fā)送sql)

    4,執(zhí)行sql語句

    5,處理sql結(jié)果(select語句)

    6,關(guān)閉Statement

    7,關(guān)閉連接Connection。

    ?

    注意:6,7兩個(gè)步驟勢必須要做的,因?yàn)檫@些資源是不會(huì)自動(dòng)釋放的,必須要自己關(guān)閉

    ?

    訪問Oracle的數(shù)據(jù)庫的驅(qū)動(dòng)名字叫ojdbc14.jar,要使用這個(gè)驅(qū)動(dòng)程序,要先將他加到環(huán)境變量CLASSPATH中。

    ?

    ??? 注冊加載驅(qū)動(dòng)driver,也就是強(qiáng)制類加載

    ??? Class.forName(Driver包名.Driver類名)。

    ?

    ??? Driver d=new Driver類();//注意:這個(gè)方法不能用參數(shù)來構(gòu)造

    ??? DriverManager.registerDriver(d);

    ?

    ?

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

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

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

    ?

    ??? 創(chuàng)建連接

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

    ??? Connection連接是通過DriverManager的靜態(tài)方法getConnection(.....)來得到的,這個(gè)方法的實(shí)質(zhì)是把參數(shù)傳到實(shí)際的Driver中的connect()方法中來獲得數(shù)據(jù)庫連接的。

    ??? Oracle的URL值是由連接數(shù)據(jù)庫的協(xié)議和數(shù)據(jù)庫的IP地址及端口號(hào)還有要連接的數(shù)據(jù)庫的庫名(DatebaseName)

    ??? Oracle URL的格式

    ??? jdbc:oracle:thin:(協(xié)議)@XXX.XXX.X.XXX:XXXX(IP地址及端口號(hào)):XXXXXXX(所使用的庫名)

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

    ??? MySql URL的寫法

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

    ??? SQLServer URL的寫法

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

    ?

    ??? java -Djdbc.drivers=驅(qū)動(dòng)的完整類名

    ?

    ??? 使用虛擬機(jī)參數(shù),加載驅(qū)動(dòng) -D表示為虛擬機(jī)參數(shù)賦值

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

    ??

    四.JDBC基本方法

    ??? DriverManager:如果有多個(gè)驅(qū)動(dòng)可用的話,DriverManager會(huì)選擇其中一個(gè).?

    ???

    ??? Driver:可以選擇固定的驅(qū)動(dòng)

    ??? 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);//返回結(jié)果集

    ??? executeUpdate(sqlString);//返回值為該次操作影響的記錄條數(shù),create table返回0

    ??? execute(sqlString);

    ??? //適用于不知道具體的操作是什么,返回值是boolean類型的

    ??? //如果返回值是true,代表執(zhí)行查詢操作;否則代表執(zhí)行更新操作.

    ???

    ??? ResultSet

    ??? next()方法:

    ??? 1.判斷是否存在下一條記錄

    ??? 2.將游標(biāo)移向下一條記錄??

    ??? getXXX(字段名或字段序號(hào))//注意:字段序號(hào)從1開始

    ???

    ??? 關(guān)閉問題:

    ??? 使用Connection對(duì)象獲得一個(gè)Statement,Statement中的executeQuery(String sql) 方法可以使用select語句查詢,并且返回一個(gè)結(jié)果集 ResultSet通過遍歷這個(gè)結(jié)果集,可以獲得select語句的查詢結(jié)果,ResultSet的next()方法會(huì)操作一個(gè)游標(biāo)從第一條記錄的前邊開始讀取,直到最后一條記錄。executeUpdate(String sql) 方法用于執(zhí)行DDL和DML語句,可以u(píng)pdate,delete操作。

    注意:要按先ResultSet結(jié)果集,后Statement,最后Connection的順序關(guān)閉資源,因?yàn)镾tatement和ResultSet是需要連接時(shí)才可以使用的,所以在使用結(jié)束之后有可能其他的Statement還需要連接,所以不能先關(guān)閉Connection。



    1.回憶下昨天的一些JDBC的配置
    ?(1) 驅(qū)動(dòng):??
    ??ojdbc14.jar (Oracle)?????????????????
    ??mysql-connector-java-3.1.11-bin.jar(MySql)
    ?(2) 實(shí)現(xiàn)了Driver接口的驅(qū)動(dòng)類(程序中要加載的類):
    ??jdbc.oracle.driver.OracleDriver? (Oracle)
    ??com.mysql.jdbc.Driver? (MySql)
    ?(3)連接數(shù)據(jù)庫的URL
    ??jdbc:oracle:thin:@192.168.0.24:1521:tarena?? (Oracle)
    ??jdbc:mysql://192.168.0.24:3306/test??? (MySql)
    ?????????
    2.PreparedStatement概述
    ?SQL語句傳到數(shù)據(jù)庫后,數(shù)據(jù)庫會(huì)先對(duì)其編譯再執(zhí)行。在使用Statement時(shí),如果要執(zhí)行一組類似的SQL操作時(shí),這樣做效率很低,而且把不同類型的數(shù)據(jù)直接寫在SQL語句中是比較麻煩的。這時(shí)應(yīng)該用PreparedStatement來代替Statement,PreparedStatement 接口繼承 Statement,并和他在兩方面有所不同:
    ?(1)PreparedStatement 實(shí)例包含已編譯的 SQL 語句。這就是使語句先“準(zhǔn)備好”。包含于 PreparedStatement對(duì)象中的SQL 語句可具有一個(gè)或多個(gè) IN 參數(shù)。IN參數(shù)的值在 SQL 語句創(chuàng)建時(shí)未被指定。相反的,該語句為每個(gè) IN 參數(shù)保留一個(gè)問號(hào)(“?”)作為占位符。每個(gè)問號(hào)的值必須在該語句執(zhí)行之前,通過適當(dāng)?shù)膕etXXX 方法來提供。
    ?(2)由于 PreparedStatement 對(duì)象已預(yù)編譯過,所以其執(zhí)行速度要快于 Statement 對(duì)象。因此,多次執(zhí)行的 SQL 語句經(jīng)常創(chuàng)建為 PreparedStatement 對(duì)象,以提高效率。
    ??

    ?作為 Statement 的子類,PreparedStatement 繼承了 Statement 的所有功能。另外它還添加了一整套方法,用于設(shè)置發(fā)送給數(shù)據(jù)庫以取代 IN 參數(shù)占位符的值。同時(shí),三種方法 execute()、 executeQuery() 和 executeUpdate() 已被更改以使之不再需要參數(shù)。這些方法的 Statement 形式(接受 SQL 語句參數(shù)的形式)不應(yīng)該用于 PreparedStatement 對(duì)象。

    3.創(chuàng)建 PreparedStatement 對(duì)象
    ?以下的代碼段(其中 con 是 Connection 對(duì)象)創(chuàng)建包含帶兩個(gè) IN 參數(shù)占位符的 SQL 語句的 PreparedStatement 對(duì)象:
    ?PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
    ?pstmt 對(duì)象包含語句 "UPDATE table4 SET m = ? WHERE x = ?",它已發(fā)送給DBMS,并編譯好為執(zhí)行作好了準(zhǔn)備。

    ?

    4.傳遞 IN 參數(shù)
    ?在執(zhí)行 PreparedStatement 對(duì)象之前,必須設(shè)置每個(gè) ? 參數(shù)的值。這可通過調(diào)用 setXXX 方法來完成,其中 XXX 是與該參數(shù)相應(yīng)的類型。例如,如果參數(shù)具有Java 類型 long,則使用的方法就是 setLong。setXXX 方法的第一個(gè)參數(shù)是要設(shè)置的參數(shù)的序數(shù)位置(從1開始),第二個(gè)參數(shù)是設(shè)置給該參數(shù)的值。例如,以下代碼將第一個(gè)參數(shù)設(shè)為 123456789,第二個(gè)參數(shù)設(shè)為 100000000:
    ?pstmt.setLong(1, 123456789);
    ?pstmt.setLong(2, 100000000);


    5.ResultSetMetaData
    ?元數(shù)據(jù)是用來描述數(shù)據(jù)的數(shù)據(jù),ResultSetMetaData就是來描述結(jié)果集的列的類型和屬性信息,比如可以通過它得到結(jié)果集的列數(shù),列名等。具體可在API中查閱java.sql.ResultSetMetaData。
    ?ResultSetMetaData對(duì)象可以通過ResultSet對(duì)象的getMetaData()來得到。
    ?ResultSetMetaData對(duì)象有以下三個(gè)方法比較常用:
    ?getColumnCount():獲得實(shí)際列數(shù)
    ?getColumnName(int colnum):獲得指定列的列名
    ?getColumnType(int colnum):獲得指定列的數(shù)據(jù)類型(Types里面的類型,存放的是整數(shù))
    ?
    6.JDBC是持久層的技術(shù),是JAVA連接數(shù)據(jù)庫目前最通用的手段。其他的持久層技術(shù),比如接下來我們要學(xué)的Hibernate,底層也是由JDBC實(shí)現(xiàn)的。持久層是與業(yè)務(wù)無關(guān)的,具體的業(yè)務(wù)由業(yè)務(wù)層完成,當(dāng)業(yè)務(wù)層需要和數(shù)據(jù)庫進(jìn)行交互時(shí),就需要通過持久層來操作。

    7.BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    ?由于System.in是字節(jié)流,我們需要把他轉(zhuǎn)成字符流。并用BufferedReader包裝后方便我們的操作。
    ?
    8.為了區(qū)分表中不同的數(shù)據(jù),我們要給放入表中持久化的每個(gè)對(duì)象都加上一個(gè)唯一的標(biāo)識(shí),這就是ID,ID是與業(yè)務(wù)無關(guān)的。ID的生成方法有很多,在Oracle數(shù)據(jù)庫中我們一半利用Sequence來生成。

    9.讀取配置文件時(shí),我們采用Properties對(duì)象。它是HashTable的子類,它有個(gè)load(InputStream inStream) 的方法可以直接從輸入流中讀取屬性列表(鍵值對(duì))。getProperty(String key) 方法用指定的鍵在此屬性列表中搜索值。


    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




    JDBC第三天
    上午:
    一.事務(wù)(Transaction)
    原子操作:不可再分的操作,一個(gè)操作不能再分成比它更細(xì)小的操作.
    事務(wù)是針對(duì)原子操作的,要求原子操作不可再分,并且必須同時(shí)成功同時(shí)失敗。
    事務(wù)就是把一些非原子操作,變成原子操作,由應(yīng)用服務(wù)器來提出要求,由數(shù)據(jù)庫服務(wù)器來執(zhí)行操作.

    在JDBC中默認(rèn)是自動(dòng)提交的,如果要想使用事務(wù),需要按以下步驟執(zhí)行:
    1.要調(diào)用con.setAutoCommite(false)方法(打開事務(wù)邊界),把自動(dòng)提交(commit)置為false。
    2.進(jìn)行正常的數(shù)據(jù)庫操作
    3.如果操作成功了可以選擇con.commit(),或者操作失敗時(shí)選擇con.roolback()------
    ?? (回滾:數(shù)據(jù)恢復(fù)到之前的情況)

    ? 注意:打開事務(wù)就要關(guān)閉自動(dòng)提交,當(dāng)不需要再使用事務(wù)的時(shí)候調(diào)用
    setAutoCommite(true).

    事務(wù)性資源(監(jiān)控完整性)
    ?
    二.事務(wù)并發(fā)產(chǎn)生的問題
    ??? 三種并發(fā)產(chǎn)生的后果:
    1,臟讀:一個(gè)事務(wù)讀取到了另外一個(gè)事務(wù)沒有提交的數(shù)據(jù)。(Dirty Read)
    2,重復(fù)讀:一個(gè)事務(wù)讀取到了另外一個(gè)事務(wù)提交的數(shù)據(jù)。它是要保持在同一時(shí)間點(diǎn)上讀取到的數(shù)據(jù)相同,希望在一段時(shí)間內(nèi)的數(shù)據(jù)是不變的。
    3,幻讀:一個(gè)事務(wù)讀取到了另外一個(gè)事務(wù)提交的數(shù)據(jù)。用同樣的操作讀取兩次,得到的記錄數(shù)不相同。

    三.事務(wù)隔離級(jí)別
    ??? 五種控制級(jí)別:
    TRANSACTION_NONE不使用事務(wù)。
    TRANSACTION_READ_UNCOMMITTED 允許臟讀。
    TRANSACTION_READ_COMMITTED防止臟讀,最常用的隔離級(jí)別,并且是大多數(shù)數(shù)據(jù)庫的默認(rèn)隔離級(jí)別----------------------
    TRANSACTION_REPEATABLE_READ可以防止臟讀和不可重復(fù)讀,
    TRANSACTION_SERIALIZABLE可以防止臟讀,不可重復(fù)讀取和幻讀,(事務(wù)串行化)會(huì)降低數(shù)據(jù)庫的效率

    以上的五個(gè)事務(wù)隔離級(jí)別都是在Connection類中定義的靜態(tài)常量,使用setTransactionIsolation(int level) 方法可以設(shè)置事務(wù)隔離級(jí)別。
    如:con.setTransactionIsolation(Connection.REPEATABLE_READ);

    下午:
    四.JDBC2.0新特性
    1.可滾動(dòng)特性和可更新特性
    JDBC1.0中是指游標(biāo)的移動(dòng)的方向和方式是單向,單步(相對(duì))移動(dòng),功能比較簡單.
    JDBC2.0中游標(biāo)可以雙向,相對(duì)或者絕對(duì)移動(dòng).
    可滾動(dòng)結(jié)果集:這種結(jié)果集不但可以雙向滾動(dòng),相對(duì)定位,絕對(duì)定位,并且還可以修改數(shù)據(jù)信息。

    1)滾動(dòng)特性
    定位函數(shù):aaa
    boolean absolute(int row),定位到指定的記錄位置。定位成功返回true,不成功返回false。
    void afterLast() ,把游標(biāo)移動(dòng)到最后一條記錄的后面(邏輯位置)。 一定會(huì)有的
    void beforeFirst() ,把游標(biāo)移動(dòng)到第一條記錄的前面(邏輯位置)。
    //由于第一條記錄的前面和最后一條記錄的后面這兩個(gè)位置肯定存在,所以無需判斷是否存在,返回值設(shè)為void.

    boolean first(),把游標(biāo)定位到第一條記錄,相對(duì)定位;
    boolean last(),把游標(biāo)定位到最后一條記錄?? 也是相對(duì)的概念。

    //當(dāng)結(jié)果集為空的時(shí)候,這兩個(gè)方法會(huì)返回false.
    boolean next(),此方法是使游標(biāo)向下一條記錄移動(dòng)。
    boolean previous() ,此方法可以使游標(biāo)向上一條記錄移動(dòng),前提是前面還有記錄。

    boolean relative(int rows) ,相對(duì)定位方法,參數(shù)值可正可負(fù),參數(shù)為正,游標(biāo)從當(dāng)前位置向后移動(dòng)指定值條記錄,參數(shù)為負(fù),游標(biāo)從當(dāng)前位置向前移動(dòng)指定值條記錄。

    判斷函數(shù):
    ifBeforeFirst()判斷是否在在第一條記錄之前.
    ifAfterLast()判斷是否在在最后一條記錄之后.
    ifFirst()判斷是否為第一條記錄.
    ifLast()判斷是否為最后一條記錄.

    要使用可滾動(dòng)結(jié)果集時(shí),需要一次設(shè)置更新特性與滾動(dòng)特性,不能分開.

    1.更新特性常量:
    CONCUR_READ_ONLY 只讀結(jié)果集???? (默認(rèn)的)
    CONCUR_UPDATABLE 可更新結(jié)果集

    2.滾動(dòng)特性常量:
    TYPE_FORWARD_ONLY ,該常量表示指針只能向前移動(dòng)的 ResultSet 對(duì)象的類型。(默認(rèn))
    雙向滾動(dòng):
    ?不敏感:TYPE_SCROLL_INSENSITIVE ,該常量指示可滾動(dòng)但通常不受其他更改影響的 ResultSet 對(duì)象的類型。
    ?敏感的:TYPE_SCROLL_SENSITIVE ,該常量指示可滾動(dòng)并且通常受其他更改影響的 ResultSet 對(duì)象的類型。
    //敏感:數(shù)據(jù)庫改變,結(jié)果集改變.
    語法:????????
    Statement st=null;
    st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE)
    在創(chuàng)建Statement的時(shí)候就要指定這兩個(gè)參數(shù),使用Statement,第一個(gè)參數(shù)代表滾動(dòng)特性常量,第二個(gè)代表更新特性常量


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


    2)可更新特性
    a.moveToInsertRow();記錄當(dāng)前游標(biāo)位置,將游標(biāo)移到和結(jié)果集結(jié)構(gòu)類似的緩沖區(qū);
    b.使用updateXxx(int column,columnType value)方法來更新指定列數(shù)據(jù);
    c.使用insertRow() 方法插入記錄,加信結(jié)果集,更新
    d.將游標(biāo)指回原位,moveToCurrentRow() 。


    ?2,3步,可循環(huán)
    -----------------------------------------------------
    能否使用JDBC2.0 ResultSet的新特性,要看使用的數(shù)據(jù)庫驅(qū)動(dòng)是否支持.
    還有只能用于單表且表中有主鍵字段(可能會(huì)是聯(lián)合主鍵),不能夠有表連接,會(huì)取
    可更新操作必須滿足以下條件:
    a.查詢只能引用一張表.
    b.不能包含任何連接操作.
    c.必須把完整的主鍵查到結(jié)果集里面;
    d.保證所有字段為非空字段并且沒有默認(rèn)值。

    五.數(shù)據(jù)庫元數(shù)據(jù):
    DatabaseMetaData dbmd = con.getMetaData();//得到數(shù)據(jù)庫元數(shù)據(jù)
    dbmd.supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY,
    ??????????????????? ResultSet.CONCUR_UPDATABLE);//判斷是否支持可更新操作

    六.批量更新
    優(yōu)勢:
    1.節(jié)省傳遞時(shí)間
    2.并發(fā)處理

    PreparedStatement:
    1.addBatch() 將一組參數(shù)添加到 PreparedStatement對(duì)象內(nèi)部
    2.executeBatch() 將一批參數(shù)提交給數(shù)據(jù)庫來執(zhí)行,如果全部命令執(zhí)行成功,則返回更新計(jì)數(shù)組成的數(shù)組。

    Statement:
    addBatch(String sql)方法會(huì)在批處理緩存中加入一條sql語句
    executeBatch()執(zhí)行批處理緩存中的所有sql語句。

    注意:PreparedStatement中使用批量更新時(shí),要先設(shè)置好參數(shù)后再使用addBatch()方法加入緩存。
    批量更新中只能使用更新或插入語句

    //
    Statement stm=con.createStatement(int resultSetType,int resultSetConcurrency);創(chuàng)建的時(shí)候就要指明要什么樣的結(jié)果集。
    ??先可滾,后可更新

    boolean absolute (int row)絕對(duì)定位,

    afterLast()定位到最后一條記錄的后面

    ?

    ?

    ?

    ?

    ?

    ?

    ?


    ?

    ?

    ?

    ?

    ?

    posted @ 2007-03-21 16:14 sunny| 編輯 收藏

    *********************************
    **? oracle 學(xué)習(xí)筆記第一天????? **
    **? author Ice Xu?? (XuBin)??? **
    **? date? 2006-10-30?????????? **
    ***********************************
    初始化表的位置:
    cd $ORACLE_HOME/rdbms?? cd demo???? summit2.sql
    這個(gè)角本可以初始化練習(xí)用的表
    set? LANG = AMERICAN_AMERICA.US7ASCII
    *********************************
    我們目前使用的是oralce 9i?? 9201 版本

    恢復(fù)練習(xí)表命令:
    sqlplus? openlab/open123 @summit2.sql


    登陸oracle的命令:
    sqlplus?? 用戶名/密碼

    show?? user??????? 顯示當(dāng)前登陸的身份.
    set??? pause on
    set??? pause off?? 分頁顯示.

    oracle中默認(rèn)日期和字符是左對(duì)齊,數(shù)字是右對(duì)齊
    table or view does? not? exist ; 表或示圖不存在

    edit 命令用于自動(dòng)打開vi修改剛修執(zhí)行過的sql的命令。
    修改方法二:
    l? 3 先定位到行??? c?? /舊串/新串

    執(zhí)行出錯(cuò)時(shí),利用錯(cuò)誤號(hào)來查錯(cuò)誤:
    !oerr ora 942? (裝完系統(tǒng)后會(huì)裝一個(gè)oerr工具,用于通過錯(cuò)誤號(hào)來查看錯(cuò)

    誤的具體信息)

    想在sql中執(zhí)行unix命令時(shí),把所有的命令前加一個(gè)!就可以, 或者h(yuǎn)ost( 用

    于從sql從切換至unix環(huán)境中去)

    /*** 初次使用時(shí)注意? ****
    運(yùn)行角本時(shí)的命令:
    先切換到unix環(huán)境下,cd $oracle_home?? cd sqlplus? cd demo 下面有兩

    個(gè)角本建表語句。
    @demobld.sql
    sqlplus nanjing/nanjing @demobid.sql 直接運(yùn)行角本,后面跟當(dāng)前目錄或

    者是絕對(duì)路徑

    保存剛才的sql語句:?? save 命令???? 第二次保存時(shí)要替換之前的角本

    save 文件名?? replace
    把剛才保的sql重新放入? buffer中

    spool? 文件名
    此命令會(huì)把所有的操作存在某個(gè)文件中去
    spool off

    練習(xí)1:查看s_emp表中員工的年工資
    select? first_name? , salary*12? salary from s_emp;

    給列起別名的命令:
    利用關(guān)鍵字? as? 或者用空格? "別名"? 雙引號(hào)內(nèi)大小寫敏感保持引號(hào)內(nèi)容

    原樣輸出,如果不加雙引號(hào)時(shí),默認(rèn)為大寫

    拼接字段:
    select?? first_name||last_name? "employees"? from?? s_emp ;
    oracle中表達(dá)字符串用單引號(hào)來表達(dá):
    select first_name||' '||last_name? from?? s_emp;(在兩個(gè)字段之間拼接

    一個(gè)空格)

    查看當(dāng)前用戶所有的表:
    練習(xí)2:(常用于批量更改數(shù)據(jù))
    set? echo off
    spool? selecttab.sql;
    select 'select * from ' || table_name ||' ; ' "table name " from

    user_tables;
    spool off;
    set? head off(去除第一行)
    set? feed off(去除最后一行)
    練習(xí)3:(查出s_emp表中所有員工的一年的總收入)
    select first_name , salary*12*( 1+nvl(commission_pct/100 , 0 ) ) "

    year salary " from s_emp;
    nvl函數(shù) 專用于處理空值的影響.

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

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

    下午:
    column? 定義格式化輸出
    column last_name? Heading?? format a15;
    column last_name;
    column salary justify left format $99,999.00? ( 定義工資的顯示形式

    )

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

    ORDER BY 排序? 升序和降序?? ASC? 升序(默認(rèn))??? DESC 降序
    select * from s_emp? order by dept_id , salary desc? 部門號(hào)升序,工

    資降序
    關(guān)鍵字distinct也會(huì)觸發(fā)排序操作。

    過濾操作:? where 子句
    select * from s_emp? where dept_id=42;? 查看部門號(hào)為42的所有員工
    select * from s_emp? where salary>1000? 查看工資高于1000的所有員工
    select salary from? s_emp where first_name='Geroge'? 找出名字為

    Geroge的員工的工資數(shù)
    select? table_name from? user_tables? where table_name='S_EMP';? 查

    某個(gè)具體表名時(shí),表名的字符串必須要為大寫

    日期的默認(rèn)的格式? DD-MON-RR(天-月-年)
    BETWEEN? AND?? 在什么之間??????????? NOT??????? BETWEEN????? AND???

    ??????????? 注意區(qū)間:[? ]是一個(gè)閉區(qū)間
    IN( LIST)????? 在某個(gè)集合中????????? NOT??????? IN???????? (list)

    空值會(huì)有影響???????? (等于list其中任何一個(gè)就行,為提高效率常把比例

    高的放在前面)
    LIKE?????????? 模糊配置????????????? NOT??????? LIKE?????????????

    通配比較
    IS NULL??????? 是空
    AND
    OR
    NOT

    練習(xí)4:(找出表名以S_開頭的所有表)對(duì)于一些特殊字符,要用到escape轉(zhuǎn)義,

    并不是一定要用\,escape后面定義是什么字符為轉(zhuǎn)義字符,那就用哪個(gè)字符
    select? table_name from user_tables where? table_name like?? 'S\_%'

    ?escape '\';

    當(dāng)有多個(gè)條件時(shí),要用邏輯運(yùn)算符:AND OR
    寫對(duì)where語句:正確的數(shù)據(jù)類型判斷、邏輯運(yùn)算符

    sql函數(shù)的作用:
    sql函數(shù)的分類:單行函數(shù)、多行函數(shù)
    單行函數(shù): (dual?? 啞表 )
    字符函數(shù):
    lower????? 轉(zhuǎn)小寫????????? select? lower('SQLPLUS')? from dual;-->

    對(duì)純字符串處理的時(shí)候
    upper????? 轉(zhuǎn)大寫????????? select? upper('sqlplus')? from dual;
    initcap??? 首字符大寫????? select? initcap('tarena') from dual;
    concat???? 連接字符串????? select? concat(first_name , last_name)??

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

    dual; (取前六個(gè)字符)?? select substr('tarenasd0603',-2) from dual;

    (取后兩個(gè)字符)
    length???? 求字符長度????? select? length('tarena') from dual;
    nvl??????? 空值函數(shù)??? 兩個(gè)參數(shù)的類型要匹配,統(tǒng)一的,表示:如果有,

    則返回前面的參數(shù),如果沒有就返回后面的參數(shù)
    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表中所有用戶名字的最后兩個(gè)字符)
    默認(rèn)的是從左向右,如果是-2則表示從右向左數(shù)
    練習(xí)5:?? select?? first_name? , salary? from s_emp?? where? lower

    (first_name)='george';

    數(shù)值函數(shù):
    round 函數(shù)(四舍五入)?? select? round(45.935, 2) from dual;?? 不帶參

    數(shù)時(shí)默認(rèn)為0位小數(shù)
    trunc 函數(shù)(截取,不管后面的數(shù)字)??? select? trunc(45.995, 1) from

    dual;
    日期函數(shù):DD-MON-RR ,默認(rèn)不顯示世紀(jì)、時(shí)、分、秒?????? 日期格式敏感
    世紀(jì)、年、月、日
    sysdate 返回當(dāng)前系統(tǒng)時(shí)間?????? select sysdate from dual;????
    更改當(dāng)前會(huì)話的設(shè)置格式:?????
    alter session set nls_date_format='yyyy mm dd hh24:mi:ss';
    select? sysdate-1, sysdate+1, sysdate , sysdate+1 from dual;? 注意

    單位是以天為單位,也可以得到多少小時(shí)、多少分鐘之后的時(shí)間
    MONTHS_BETWEEN (DATE1 , DATE2 ) 求兩個(gè)日期之前相差的月數(shù)
    add_months(date , 4 ) 在 date上再添加4個(gè)月
    select round(last_day(sysdate),'month') from dual;
    select? next_day(sysdate,'FRIDAY') from dual ; 求這個(gè)日期的下一個(gè)

    FRIDAY
    last_day 求月的最后一天

    round 函數(shù):???? select?? round(sysdate, 'MONTH') from dual;???? 參

    數(shù)可以為:? MONTH YEAR(看上半年還是下半年)??
    select? trunc(last_day(sysdate)+1)? from? dual;
    select? add_months(trunc(sysdate, 'MONTH'), 1 )? from? dual ;
    關(guān)于日期的兩種形式:

    轉(zhuǎn)換函數(shù):
    to_char顯示日期:
    從數(shù)字轉(zhuǎn)化為char? to_char(date,'格式')
    從日期轉(zhuǎn)化為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;去掉前導(dǎo)名
    ????????????????????????????? select? to_char(sysdate ,'YEAR MONTH

    dy
    eg:查出三月分入職的員工:select first_name,start_date from s_emp

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

    to_date表達(dá)日期:
    ????? 字符轉(zhuǎn)日期???? 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
    ????? 字符轉(zhuǎn)數(shù)字
    ??????????????????????????? select to_number('10')? from? dual ;

    day2


    where 條件一定是根據(jù)某個(gè)字段來進(jìn)行過濾操作.

    多表連接操作:
    兩表沒有任何關(guān)聯(lián)時(shí)會(huì)產(chǎn)生迪卡爾機(jī):
    select?? first_name , name? from??? s_emp , s_dept;
    等值連接:
    練習(xí)一:查看員工的姓名和員工部門號(hào):(要考慮到表中實(shí)際數(shù)據(jù)中空值的影響)
    select?? first_name ,?? name from? s_emp e, s_dept? d where e.dept_id=d.id;同時(shí)起了別名
    select?? first_name ,?? name from? s_emp e, s_dept? d where e.dept_id=d.id and e.first_name='George';具體到哪個(gè)人所在的部門

    練習(xí)二:每個(gè)員工所在的部門和部門所在的地區(qū)
    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;
    等值連接:
    練習(xí)三:找出每個(gè)員工和每個(gè)員工的工資級(jí)別
    ? 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;
    自連接:當(dāng)一個(gè)表的插入行之間有了關(guān)系時(shí)就發(fā)生了(又名:內(nèi)連接)
    select?? first_name?? , manager_id?? from? s_emp;
    查出所有員工的部門領(lǐng)導(dǎo)的名稱:( 這種sql會(huì)少一條記錄,總經(jīng)理沒有被配置上)
    select? e.first_name , m.first_name?? from s_emp e , s_emp m? where?? e.manager_id=m.id;
    外連接:(防止空值時(shí),用(+)的一方會(huì)模擬一條記錄配置另一方)這就稱為外連接,一個(gè)記錄都不能少;
    select? e.first_name , m.first_name?? from s_emp e , s_emp m? where?? e.manager_id=m.id(+);
    +號(hào)放在哪邊就表示在哪邊補(bǔ)空,來跟對(duì)方來匹配,使得數(shù)據(jù)一個(gè)都不會(huì)漏掉,這個(gè)例子中的領(lǐng)導(dǎo)有可能會(huì)沒有(最高領(lǐng)導(dǎo)就再?zèng)]有領(lǐng)導(dǎo)了,所以就
    方法領(lǐng)導(dǎo)的那邊)
    ?標(biāo)準(zhǔn)寫法:select e.deptno,d.name from emp e,dept d where e.deptno(+)=d.depton and e.depton is null;
    查看員工分部的部門:
    select? distinct(deptno) from emp ;
    找出沒有員工的部門:(很經(jīng)典的一個(gè)例子,用外連接來解決的標(biāo)準(zhǔn)做法,這是一種方式)
    第一步:
    select???? e.deptno , d.deptno? from emp e , dept d? where? e.deptno(+)=d.deptno;
    第二步:
    select???? e.deptno , d.deptno? from emp e , dept d? where? e.deptno(+)=d.deptno?? and?? e.deptno is null;

    組函數(shù)(group function):
    group by? 分組子句??? 對(duì)分組后的子句進(jìn)行過濾還可以用having??? 條件? 對(duì)分組后的條件進(jìn)行過濾?? where 是對(duì)記錄進(jìn)行過濾

    avg(distinct | all )求平均值????????????????????????????
    count(distinct | all )統(tǒng)計(jì)
    max(distinct | all ) 求最大值
    min(distinct | all )求最小值
    sum(distinct | all )? 求和
    (所有組函數(shù)會(huì)忽略空值 , avg?? sum只能作用于數(shù)字類型)
    求有提成員工的提成的平均值;
    select??? avg(nvl(commission_pct ,0 )? ) from s_emp;
    有多少人有提成:
    select? count( commission_pct ) from??? s_emp ;
    count(*)? 用于統(tǒng)計(jì)記錄數(shù):
    select?? sum(commission_pct)/ count(*)?? from???? s_emp;
    ?員工分部在多少個(gè)不同的部門:count? 默認(rèn)為作all的動(dòng)作
    ?select?? count(dept_id)? from s_emp;
    ?select?? count(distinct dept_id) from?? s_emp;
    ?求各個(gè)部門的平均工資:group? by? 子句也會(huì)觸發(fā)排序
    ?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??? ;
    ?注意:group by 子句后面跟有條件只能是查詢的結(jié)果中的字段,所以我們會(huì)人為在結(jié)果要加入一些group by? 要用的字段
    select?? region_id , count(*)? from? s_dept 此句會(huì)有錯(cuò)
    select?? max(region_id)? , count(*) from?????? s_dept;? (強(qiáng)制語法上可以正確,但是不能保證結(jié)果也會(huì)正確)
    求各個(gè)部門不同工種的平均工資:
    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部門以外的部門的平均工資:
    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效率要高,先過濾再計(jì)算)
    where?????? 單行函數(shù)。
    having????? 組函數(shù)。
    求各個(gè)部門的平均工資:
    // 這樣統(tǒng)計(jì)不詳細(xì)
    select??? max(d.name) ,? avg (s.salary)?? from?? s_emp? s,? s_dept? d where??? s.dept_id=d.id?? group by??? d.name;?
    //****這問題很經(jīng)典,為了過 oracle sql 語法關(guān)而寫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 ;

    下午:
    關(guān)于子查詢:? Subqueries
    找出所有員工中,工資最低的那個(gè)員工:( 利用子查詢 )
    select??? first_name,? salary??? from s_emp?? where?? salary = (? select? min(salary)? from s_emp)??? ;
    //這樣寫會(huì)出錯(cuò)姓名和工資不一致
    select max(first_name),? min(salary)? from s_emp;(利用子查詢可以解決)
    子查詢運(yùn)行的順序: 先運(yùn)行子查詢再運(yùn)行主查詢??? 子查詢一般出現(xiàn)在運(yùn)算符的右邊
    單值運(yùn)算符:運(yùn)算后面只能跟一個(gè)值
    多值運(yùn)算符:可以對(duì)兩個(gè)以上的值進(jìn)行操作
    查詢誰跟Smith干一樣的活:
    select?? last_name from? s_emp? where last_name='Smith';
    //下種寫法可能還存在bug,沒有考慮到數(shù)據(jù)的全面性,有潛在性問題
    select? last_name? , title? from s_emp?? where title =(? select?? title? from s_emp? where? last_name='Smith'? )??? and? last_name <> 'Smith'? ;
    //這種寫法才考慮的比較全面
    select? last_name? , title? from s_emp?? where title?? in?? (? select?? title? from s_emp? where? last_name='Smith'? )??? and? last_name <> 'Smith'? ;
    使用子查詢時(shí)應(yīng)注意:? 單行子查詢返回多個(gè)結(jié)果時(shí)會(huì)有錯(cuò)誤??? single-row? subquery returns? more? than one value
    查出哪些員工的工資比平均工資低:
    select??? *? from s_emp? where???? salary?? <? ( select? avg(salary)? from?? s_emp)? ;
    哪些部門的平均工資比32部門的平均工資要低:
    第一步先查出各個(gè)部門的平均工資:
    select? min(avg(salary? )? ) from?? s_emp?? group by? dept_id;
    第二步再查出哪個(gè)部門的工資是最低的:
    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 ) ;

    哪個(gè)部門里沒有員工:
    select?? deptno? from??? dept??? where?? deptno?? not? in ( select???? deptno??? from?? emp );
    哪些人是普通員工:(用子查詢形式來做)
    select?? *?? from? s_emp?? where?? id? not??? in (? select? manager_id?? from?? s_emp);

    E--R圖? 實(shí)體關(guān)系圖entity? relation?
    開發(fā)流程先進(jìn)行需求分析,進(jìn)行系統(tǒng)設(shè)計(jì),建表,再進(jìn)行開發(fā)編碼,測試最終產(chǎn)品上線試運(yùn)行。
    把軟件設(shè)計(jì)模型轉(zhuǎn)化為數(shù)據(jù)中的表,設(shè)計(jì)時(shí)要考慮性能的設(shè)計(jì)

    第一范式:最簡單的一種建方式,一張表只有一個(gè)主鍵。
    第二范式:表的自連接存在原因,一張表,學(xué)生表中也有班級(jí)的信息。
    第三范式:表連接存在的原因,兩張表,其中一張表引用其它一張表。

    約束:
    為了保證數(shù)據(jù)的一致性,
    primary key?? (pk)? 主鍵約束?????? 不允許有重復(fù)和空值(唯一且非空)
    foregin? key?? (fk)?? 外鍵約束?????? 兩張表parent? table????? child?? table
    unique? key?? (uk)? 唯一可以為空
    not?? null
    數(shù)據(jù)庫設(shè)計(jì)時(shí)的注意:
    索引: 為了提高效率而設(shè)計(jì)的一種與業(yè)務(wù)無關(guān)的
    考慮表點(diǎn)用的物理空間:
    考慮表之間的關(guān)系:
    一對(duì)多關(guān)系: 利用FK+PK實(shí)現(xiàn),多的一方引用外鍵
    一對(duì)一關(guān)系: 可以利用FK+UK實(shí)現(xiàn),
    多對(duì)多關(guān)系: 通過中間增加一個(gè)附加表來實(shí)現(xiàn),附加表利用聯(lián)合主鍵來實(shí)現(xiàn),聯(lián)合起來的主鍵唯一。


    DDL語句:數(shù)據(jù)庫定義語句:
    table (表)
    view(示圖)
    sequence(序列號(hào))
    index(索引)

    創(chuàng)建表語句:
    create??? table??? [schema].表名?? (? 字段名,?? 字段類型?? 約束條件);??????????????????? schema?? 默認(rèn)就是當(dāng)前用戶,嚴(yán)格來訪問表名完整的寫法是schema.tablename
    數(shù)據(jù)類型:
    表名的命令規(guī)則: 首字母為字母,不得超過30個(gè)字符
    char(size)??????????????? 定長? 不管是否達(dá)到最大寬度,都會(huì)點(diǎn)最大的寬度。
    varchar2(size)???????? 可變長?? 按實(shí)際的字節(jié)占用空間
    number??????????? 所有的數(shù)字類型都稱為number
    number(n, m )? n------n位寬度?? m-----小數(shù)點(diǎn)后的寬度
    number(2,4)小數(shù)點(diǎn)后4 位,有效位2位??? values(0.0099) 這樣可以?? values(0.01)這樣出錯(cuò)
    LONG??? 2GB?? 大文本一個(gè)表最我只允許定義一個(gè)LONG類型(不建議使用)
    CLOB??? 大對(duì)象形式存放(在表里只存一個(gè)指針)
    BLOB???? 存二進(jìn)制大對(duì)象(聲音,圖像之類)

    default?? 作用演示:
    create? table?? test(c1?? number??? default? 10,???? c2??? number);


    約束的演示:
    主鍵約束的定義:
    create table?? test(c?? number? primary key? );???? 列級(jí)約束
    create table? test(c? number , primary key(c) )? ; 表級(jí)約束
    create table?? test( c1? number? constraints?? pkc1? primary key );?? 此約束有名字:? pkc1
    create table?? test(c number , c2? number ,? primary key (c ,c1) )? ; 用表級(jí)約束可以實(shí)現(xiàn)聯(lián)合主鍵

    外鍵約束的定義:(先定義父表,再定義子表)
    carete?? table???? parent(c1 number? primary key );
    create?? table??? child? (c? number primary key ,?? c2 number? references parent(c1));
    或表級(jí)約束定義:
    create?? table? child( c number primary key ,? c2? number? , foreign key(c2)? references? parent(c1));

    或表級(jí)約束定義:
    create?? table? child( c number primary key ,? c2? number? , foreign key(c2)? references? parent(c1));

    on? delete?? cascade? (及聯(lián)刪除,刪除父表時(shí)子表也跟著刪除)
    on? delete?? set?? null? (及聯(lián)刪除父表時(shí)子表中引用的字段為null)


    day3

    不給約束起名字時(shí),系統(tǒng)給約束起名時(shí)的規(guī)律為:數(shù)據(jù)庫用戶名_數(shù)字(約束名也不能重名)
    定義一個(gè)約束的兩種形式:
    列級(jí)約束????? 表級(jí)約束

    非空約束:
    ??not??? null? (利用desc可能看到)primary key? 自動(dòng)具有非空約束的特點(diǎn)

    primary key約束:
    主鍵約束的定義:
    第一種定義形式:
    create table?? test(c?? number? primary key? );???? 列級(jí)約束
    第二種定義形式:
    create table? test(c? number , primary key(c) )? ; 表級(jí)約束
    create table?? test( c1? number? constraints?? pkc1? primary key );?? 此約束有名字:? pkc1
    create table?? test(c number , c2? number ,? primary key (c ,c1) )? ; 用表級(jí)約束可以實(shí)現(xiàn)聯(lián)合主鍵

    foregin? key?? (fk)?? 外鍵約束:
    (先定義父表,再定義子表)
    create?? table???? parent(c1 number? primary key );
    create?? table??? child? (c? number primary key ,?? c2 number? references parent(c1));
    或表級(jí)約束定義:
    create?? table? child( c number primary key ,? c2? number? , foreign key(c2)? references? parent(c1));

    check 約束:
    create?? table?? test(c1?? number? check(c1>1000));
    此表中要求c1的值必須要大于1000 才為有效值 .??

    怎么創(chuàng)建一個(gè)角本文件: xxx.sql結(jié)尾
    ?執(zhí)行角本的方法:
    ?在sqlplus環(huán)境中執(zhí)行:@filename.sql
    ?在shell環(huán)境中執(zhí)行: sqlplus?? nanjing/nanjing?? @filename.sql

    創(chuàng)建表的語法:
    ?create??? table??? 表名 (?? 字段名??? 字段類型???? 約束類型(可選));
    ?利用已知表建一張新表:注會(huì)把非空約束帶過來,其它約束要自己添加
    ?create? table s_emp_42??? as select?? *? from?? s_emp???? where?? dept_id = 42;
    只取要表結(jié)構(gòu),不想要表中數(shù)據(jù)的建表方式:
    create table? s_emp_copy??? as?? select? *??? from? s_emp?? where?? 1=2;
    (這是一個(gè)小技巧,在JDBC的學(xué)習(xí)中會(huì)用到 where 1=1 的形式,注意體會(huì))

    查看一張表的約束:( 查數(shù)據(jù)字典示圖)
    ?desc? user_constraints;(這個(gè)數(shù)據(jù)字典中會(huì)查到相應(yīng)的信息)
    ?select??? constraint_name,? constraint_type??? from?? user_constraints? where?? table_name='S_EMP';
    ?P?? pk
    ?R?? fk
    ?C?? check
    ?U??? UK
    ?V??? 這種只定義在示圖中(with check? option 相當(dāng)于組示圖加了一個(gè)約束)
    ?O??? 也是出現(xiàn)在示圖中
    ?非空約束和CHECK都是用C來表示

    查看字段約束的方法:
    ?desc??? user_cons_columns;
    ?select?? column_name,? position? from??? user_cons_columns??? where?? constraint_name='S_EMP_ID_PK' ;
    ?position 的含義:聯(lián)合主鍵,約束名一樣。
    ?user_constraints??? user_cons_columns?? 兩張表的約束名相等,表名相等,兩張表一關(guān)聯(lián)就可以查出所需的信息。

    select? constraint_name , r_constraint_name? from user_constraints where? constraint_type='R'?? and table_name='S_EMP' ;
    數(shù)據(jù)庫建立時(shí),數(shù)據(jù)字典就會(huì)建好。
    user_constraints; 自己擁有的
    all_constraints;?? 你自己擁有的加上你可以訪問的
    dba_constraints? 所有的

    查看當(dāng)前數(shù)據(jù)庫數(shù)據(jù)字典的字典(這個(gè)示圖很重要)
    desc?? dict;
    select table_name form? dict where table_name like?? '%cons%;

    示圖:
    user_objects;?????????? user_tables;
    select? distinct?? object_type? from user_objects;??

    介紹事務(wù)的概念:
    commit? 提交,此時(shí)說明前面所有語句都成功執(zhí)行
    rollback 回退操作,此時(shí)會(huì)恢復(fù)至上一次提交時(shí)的狀態(tài)。
    savepoint 設(shè)置保存點(diǎn)

    ?注意?? 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條件時(shí)說明是改表中所有的值.
    注意:如有外鍵引用時(shí)常會(huì)出現(xiàn)外鍵引用值沒有找到等錯(cuò)誤?

    delete? 刪除記錄命令語法:
    delete from?? s_emp? where? dept_id=42;
    delete form?? s_emp ;????? 沒有where條件時(shí)說明刪除表中所有的值
    注意:如有外鍵引用時(shí),刪除一張表時(shí)常會(huì)出現(xiàn)不能刪除的情況,
    原因一?? 是因?yàn)榇藭r(shí)正在有人操作表中記錄
    原因二?? 此表有其他的表引用,沒能設(shè)及聯(lián)刪除:
    delete 刪除一張大表時(shí)空間不釋放,非常慢是因?yàn)檎加么罅康南到y(tǒng)資源,支持回退操作,空間還被這張表占用著。
    truncate table 表名? (刪除表中記錄時(shí)釋放表空間)

    DML 語句:
    表級(jí)共享鎖: 對(duì)于操作一張表中的不同記錄時(shí),互不影響
    行級(jí)排它鎖:對(duì)于一行記錄,oracle 會(huì)只允許只有一個(gè)用戶對(duì)它在同一時(shí)間進(jìn)行修改操作
    wait()?? 等到行級(jí)鎖被釋放,才進(jìn)行數(shù)據(jù)操作
    drop一張表時(shí)也會(huì)對(duì)表加鎖,DDL排它鎖,所以在刪除一張表時(shí)如果當(dāng)前還有用戶操作表時(shí)不能刪除表


    alter table 命令用于修改表的結(jié)構(gòu)(這些命令不會(huì)經(jīng)常用):
    增加約束:
    alter table? 表名 add?? constraint  約束名? primary key? (字段);
    解除約束:(刪除約束)
    alter? table 表名? drop? primary? key(對(duì)于主鍵約束可以直接用此方法,因?yàn)橐粡埍碇兄挥幸粋€(gè)主鍵約束名, 注意如果主鍵此時(shí)還有其它表引用時(shí)刪除主鍵時(shí)會(huì)出錯(cuò))
    alter? tbale?? father?? drop? primary key??? cascade ;? (如果有子表引用主鍵時(shí),要用此語法來刪除主鍵,這時(shí)子表還存在只是子表中的外鍵約束被及聯(lián)刪除了)
    alter table? 表名 drop? constraint?? 約束名;
    (怎樣取一個(gè)約束名:1、人為的違反約束規(guī)定根據(jù)錯(cuò)誤信息獲取!
    ???????????????????????????????? 2、查詢示圖獲取約束名!)

    alter? table?? 表名? disable??? from?? primary? key ;? (相當(dāng)于把一個(gè)表的主鍵禁用)
    alter? table?? 表名? enable??? primary key ;(enable 時(shí)會(huì)自動(dòng)去檢查表的記錄是不是符合要求,如果有臟數(shù)據(jù)時(shí)必須要先刪除臟數(shù)據(jù)才可以 enable)

    ?

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

    增加字段:
    ?alter? table   表名   add(字段字? 字段類型)
    刪除字段:
    ?alter table    表名???? drop(字段)
    ?alter tbale???????? 表名??? drop??? column?? 字段 ; (8i 以后才支持)
    給列改名:920才支持
    ?alter? table?? 表名?? rename?? column?? 舊字段名??? to???? 新字段名;
    修改字段
    (此時(shí)應(yīng)注意的問題,更改時(shí)要看具體值情況之間的轉(zhuǎn)達(dá)換, 改為字符類型時(shí),必須要為空)
    ?alter? table??  表名???? modify( 字段,類型)
    更改表中的字段:
    ?update 表名?? set???? 字段???? =????? 值???? where?????? 條件
    更改表名
    ?rename?????? 舊表名?????????? to  ?  新表名?????????? ;
    刪除表:
    ?trucate?? table??? 表名:(表結(jié)構(gòu)還在,數(shù)據(jù)全部刪除,釋放表所占的空間,不支持回退,常用刪除大表)

    ?

    關(guān)于oralce中產(chǎn)生序列(sequence):
    create sequence?? 序列名alter system? flush?? shared_pool;
    (不帶參數(shù)時(shí)默認(rèn)為從1 開始每次遞增 1,oracle中為了提高產(chǎn)生序列的效率一般一次性產(chǎn)生20個(gè)序列放入當(dāng)前會(huì)話的序列池中備用以加快效率,序列會(huì)出現(xiàn)不連續(xù)的動(dòng)作回退操作不會(huì)影響序列取值)
    sequence 的參數(shù):
    ?increment by? n 起始值,??? start with? n 遞增量, maxvalue? n 最大值,? minvalue n? 最小值,cycle | no cycle 輪回,? cache n? 綬存(第一次取時(shí)會(huì)一次取多少個(gè)id存起來)
    查看?? sequence 示圖:
    desc??? user_sequences ;
    select?? sequence_name , cache_size , last_number? from? user_sequences?? where?? sequence_name? like 's_';
    select? 序列名.currval? from?? dual??? 查看當(dāng)前的序列數(shù)
    select? 序列名.nextval? from?? dual??? 查看下一個(gè)序列數(shù),它會(huì)自動(dòng)給當(dāng)前的序列加1
    為列:nextval????????? currval
    (開另一個(gè)session時(shí)取當(dāng)前值不成功時(shí),應(yīng)該先取下一個(gè)值,再取當(dāng)前值)
    清空當(dāng)前會(huì)話的內(nèi)存:
    alter system? flush?? shared_pool;(執(zhí)行此命令要有DBA權(quán)限,一般用戶執(zhí)行出錯(cuò))
    修改序列:(此命令不常用,只需了解就行不必深究)
    alter? sequence? 序列名? 修改項(xiàng);
    刪除序列sequence
    drop? sequence 序列名;

    創(chuàng)建示圖: creating????? views(屬于了解知識(shí))
    desc? user_views;
    select?? text?? from? user_views??? where?? view_name='TEST1_V1' ;
    示圖就相當(dāng)于一條select 語句,定義了一個(gè)示圖就是定義了一個(gè)sql語句,示圖不占空間,使用view 不會(huì)提高性能,但是能簡單化sql語句
    (擴(kuò)展知識(shí): oracle? 8i 以后的新示圖)MV?? 物化視圖(占存儲(chǔ)空間,把select 結(jié)果存在一個(gè)空間,會(huì)提高查詢視圖,增強(qiáng)實(shí)時(shí)性,但是存在刷新問題, 主要應(yīng)用在數(shù)據(jù)倉庫中用要用于聚合表)
    使用示圖的好處:控制數(shù)據(jù)訪問權(quán)限.
    如何創(chuàng)建一個(gè)示圖:
    create?? or replace?? views?? test_vi??? as?????? select?????? *?? from??? test1?? where c1=1;
    此時(shí)往表test1(base?? table? 基表)中插入數(shù)據(jù)時(shí):表中沒能變化,示圖中的數(shù)據(jù)發(fā)生改變
    從示圖中插數(shù)據(jù)時(shí)相對(duì)應(yīng)的表會(huì)發(fā)生改變:
    往示圖中插數(shù)據(jù)時(shí),會(huì)直接插進(jìn)基表中,查看示圖中的數(shù)據(jù)時(shí),相當(dāng)于就是執(zhí)行創(chuàng)建時(shí)的select語句。
    簡單示圖:能進(jìn)行DML操作。
    復(fù)雜示圖:來源于多張表,不能執(zhí)行DML操作。
    關(guān)于rownum:
    rownum? 有個(gè)特點(diǎn)要么等于1 要么小于某個(gè)值, 不能直接等于某個(gè)值, 不能大于某個(gè)值。rownum常用于分頁顯示。
    練習(xí):查詢出第5條數(shù)據(jù)和第10條數(shù)據(jù)之間:
    ?select?? first_name , rnum??? from?? (? select?? rownum?? rnum??? , first_name?? from??? s_emp? where rownum <=10 )???? where rnum? between 5? and? 10 ;

    分面顯示:
    SELECT * FROM (SELECT a.*, rownum r FROM?? S_EMP? a? WHERE r between 5? AND? 10 );


    練習(xí):哪些員工的工資比本部門的平均工資高?
    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;
    ?在示圖上加一個(gè) with? check?? option 就相當(dāng)于給示圖加上了約束
    create??? view??? test_v? as? select?? *? from?? test? where c =1? with check option ;
    同義詞:相當(dāng)于別名的作用(***只需了解***)系統(tǒng)自建的同義詞:??? user_tables
    create? synonym??? asd_s_emp?? for??? asd_0607.s_emp ;
    目的就是為了給asd_0607_s_emp表起另一個(gè)代替的名稱asd.s_emp;注意這個(gè)同義詞只能自己使用;
    create? public???? synonym? p_s_emp? fro asd_0607.s_emp; 創(chuàng)建公共的同義詞,但是要權(quán)限.
    刪除同義詞:
    drop? synonym??? 同義詞名稱

    創(chuàng)建索引:? Creating??? indexes(概念很重要對(duì)系統(tǒng)的性能影響非常大)
    建索引的目的就是為了加快查詢速度。
    索引就相于一本的書的目錄。索引點(diǎn)系統(tǒng)空間,屬于表的附屬物。刪除一個(gè)表時(shí),相對(duì)應(yīng)的索引也會(huì)刪除。truncate 表時(shí)索引結(jié)構(gòu)在,但是數(shù)據(jù)不存在。
    full?? table??? scan? 全表掃描
    用索引就是為了快速定位數(shù)據(jù):(理解時(shí)就以字典的目錄為例)
    查看表的rowid:
    select???? rowid? , first_name??? from? s_emp;
    rowid 定義的信息有:? object?? block? table
    每條記錄都有自己的rowid
    索引由誰創(chuàng)建:用戶,建索引后會(huì)使DML操作效率慢,但是對(duì)用戶查詢會(huì)提高效率,這就是我們建索引的最終目的,
    創(chuàng)建一個(gè)索引:
    create? index???? 索引名???? on?? 表名 (? 字段名);
    create?? insex testindex? on test(c1, c2);
    哪些字段應(yīng)該建索引:
    經(jīng)常要用where的子句的地方,所以要用索引.用不用索引,關(guān)鍵要看所查詢的數(shù)據(jù)與所有數(shù)據(jù)的百分比,表越大,查詢的記錄越少,索引的效率最高.


    替換變量:用&符號(hào)來定義替換變量支持交互性提示,對(duì)于字符性的數(shù)字,一定要寫在單引號(hào)之間
    set??? verify on
    set??? verify off;
    相當(dāng)于開關(guān)變量,用于控制是否顯示新舊的sql語句
    select?? id ,last_name? ,salary?? from s_emp? where? title='&job_title';
    更改交互的提示信息:
    accept? p_dname prompt ' 提示信息';
    定義變量:
    define???? p_dname='abc';

    分頁的實(shí)現(xiàn)語句:(可以正常運(yùn)行)
    ? select?? *?? from? (? select?? rownum?? rnum? , a.*?? from?? (select * from s_emp) a? )???? where rnum? between 5? and? 10 ;

    -------------------------------------------------------------------------------------------------------------------------
    1、關(guān)于約束的知識(shí):
    primary key約束:
    主鍵約束的定義:
    第一種定義形式:
    create table?? test(c?? number? primary key? );???? 列級(jí)約束
    第二種定義形式:
    create table? test(c? number , primary key(c) )? ; 表級(jí)約束
    create table?? test( c1? number? constraints?? pkc1? primary key );?? 此約束有名字:? pkc1
    create table?? test(c number , c2? number ,? primary key (c ,c1) )? ; 用表級(jí)約束可以實(shí)現(xiàn)聯(lián)合主鍵

    foregin? key?? (fk)?? 外鍵約束:
    (先定義父表,再定義子表)
    carete?? table???? parent(c1 number? primary key );
    create?? table??? child? (c? number primary key ,?? c2 number? references parent(c1));
    或表級(jí)約束定義:
    create?? table? child( c number primary key ,? c2? number? , foreign key(c2)? references? parent(c1));

    check 約束:
    create?? table?? test(c1?? number? check(c1>1000));
    此表中要求c1的值必須要大于1000 才為有效值 .??
    ****************************************************************************
    2、關(guān)于針對(duì)表操作的語法知識(shí):
    ? 創(chuàng)建表:
    ?? create??? table? 表名?? (??? 字段名1??? 類型?? 約束條件,?? 字段名2??? 類型??? 約束條件 );
    ?
    ?插入數(shù)據(jù)命令:
    ?方式一:(指定字段名插入數(shù)據(jù))
    ? insert? into?? 表名? ( 字段名 )??? values ( 數(shù)據(jù));
    ?方式二:
    ? insert? into? 表名?? values(數(shù)據(jù)1,? 數(shù)據(jù)2);

    ?修改數(shù)據(jù):
    ?update?? table?? 表名? set ( 字段名?? 數(shù)據(jù), 字段名? 數(shù)據(jù));
    ****************************************************************************
    3、關(guān)于alter table 命令知識(shí):
    alter table 命令用于修改表的結(jié)構(gòu)(這些命令不會(huì)經(jīng)常用):
    增加約束:
    alter table? 表名 add?? constraint  約束名? primary key? (字段);
    解除約束:(刪除約束)
    alter? table 表名? drop? primary? key(對(duì)于主鍵約束可以直接用此方法,因?yàn)橐粡埍碇兄挥幸粋€(gè)主鍵約束名, 注意如果主鍵此時(shí)還有其它表引用時(shí)刪除主鍵時(shí)會(huì)出錯(cuò))
    alter? tbale?? father?? drop? primary key??? cascade ;? (如果有子表引用主鍵時(shí),要用此語法來刪除主鍵,這時(shí)子表還存在只是子表中的外鍵約束被及聯(lián)刪除了)
    alter table? 表名 drop? constraint?? 約束名;
    (怎樣取一個(gè)約束名:
    a、人為的違反約束規(guī)定根據(jù)錯(cuò)誤信息獲取!
    b、查詢示圖獲取約束名!)
    alter? table?? 表名? disable??? from?? primary? key ;? (相當(dāng)于把一個(gè)表的主鍵禁用)
    alter? table?? 表名? enable??? primary key ;(enable 時(shí)會(huì)自動(dòng)去檢查表的記錄是不是符合要求,如果有臟數(shù)據(jù)時(shí)必須要先刪除臟數(shù)據(jù)才可以 enable)
    增加字段:
    alter? table   表名   add(字段字,字段類型)
    刪除字段:
    alter table    表名???? drop(字段)
    alter tbale???????? 表名??? drop??? column?? 字段 ; (8i 以后才支持)
    給列改名:920才支持
    alter? table?? 表名?? rename?? column?? 舊字段名??? to???? 新字段名;
    修改字段
    (此時(shí)應(yīng)注意的問題,更改時(shí)要看具體值情況之間的轉(zhuǎn)達(dá)換, 改為字符類型時(shí),必須要為空)
    alter? table??  表名???? modify( 字段,類型)
    更改表中的字段:
    update 表名?? set???? 字段???? =????? 值???? where?????? 條件
    更改表名
    rename?????? 舊表名?????????? to  ?  新表名?????????? ;
    刪除表:
    trucate?? table??? 表名:(表結(jié)構(gòu)還在,數(shù)據(jù)全部刪除,釋放表所占的空間,不支持回退,常用刪除大表)
    ****************************************************************************
    4、關(guān)于oralce中產(chǎn)生序列(sequence)
    create sequence?? 序列名alter system? flush?? shared_pool;
    (不帶參數(shù)時(shí)默認(rèn)為從1 開始每次遞增 1,oracle中為了提高產(chǎn)生序列的效率一般一次性產(chǎn)生20個(gè)序列放入當(dāng)前會(huì)話的序列池中備用以加快效率,序列會(huì)出現(xiàn)不連續(xù)的動(dòng)作回退操作不會(huì)影響序列取值)
    sequence 的參數(shù):
    ?increment by? n 起始值,??? start with? n 遞增量, maxvalue? n 最大值,? minvalue n? 最小值,cycle | no cycle 輪回,? cache n? 綬存(第一次取時(shí)會(huì)一次取多少個(gè)id存起來)
    查看?? sequence 示圖:
    desc??? user_sequences ;
    select?? sequence_name , cache_size , last_number? from? user_sequences?? where?? sequence_name? like 's_';
    select? 序列名.currval? from?? dual??? 查看當(dāng)前的序列數(shù)
    select? 序列名.nextval? from?? dual??? 查看下一個(gè)序列數(shù),它會(huì)自動(dòng)給當(dāng)前的序列加1
    為列:nextval????????? currval
    (開另一個(gè)session時(shí)取當(dāng)前值不成功時(shí),應(yīng)該先取下一個(gè)值,再取當(dāng)前值)
    清空當(dāng)前會(huì)話的內(nèi)存:
    alter system? flush?? shared_pool;(執(zhí)行此命令要有DBA權(quán)限,一般用戶執(zhí)行出錯(cuò))
    修改序列:(此命令不常用,只需了解就行不必深究)
    alter? sequence? 序列名? 修改項(xiàng);
    刪除序列sequence
    drop? sequence 序列名;
    ****************************************************************************
    5、創(chuàng)建示圖: creating????? views(屬于了解知識(shí))
    示圖就相當(dāng)于一條select 語句,定義了一個(gè)示圖就是定義了一個(gè)sql語句,示圖不占空間,使用view 不會(huì)提高性能,但是能簡單化sql語句
    (擴(kuò)展知識(shí): oracle? 8i 以后的新示圖)MV?? 物化視圖(占存儲(chǔ)空間,把select 結(jié)果存在一個(gè)空間,會(huì)提高查詢視圖,增強(qiáng)實(shí)時(shí)性,但是存在刷新問題, 主要應(yīng)用在數(shù)據(jù)倉庫中用要用于聚合表)
    使用示圖的好處:控制數(shù)據(jù)訪問權(quán)限.
    如何創(chuàng)建一個(gè)示圖:
    create?? or replace?? views?? test_vi??? as?????? select?????? *?? from??? test1?? where c1=1;
    此時(shí)往表test1(base?? table? 基表)中插入數(shù)據(jù)時(shí):表中沒能變化,示圖中的數(shù)據(jù)發(fā)生改變
    從示圖中插數(shù)據(jù)時(shí)相對(duì)應(yīng)的表會(huì)發(fā)生改變:
    往示圖中插數(shù)據(jù)時(shí),會(huì)直接插進(jìn)基表中,查看示圖中的數(shù)據(jù)時(shí),相當(dāng)于就是執(zhí)行創(chuàng)建時(shí)的select語句。
    簡單示圖:能進(jìn)行DML操作。
    復(fù)雜示圖:來源于多張表,不能執(zhí)行DML操作。
    關(guān)于rownum:
    rownum? 有個(gè)特點(diǎn)要么等于1 要么小于某個(gè)值, 不能直接等于某個(gè)值, 不能大于某個(gè)值。rownum常用于分頁顯示。
    練習(xí):查詢出第5條數(shù)據(jù)和第10條數(shù)據(jù)之間:
    select?? first_name? , rnum??? from?? (? select?? rownum?? rnum??? , first_name?? from?? s_emp??? where rownum <=10 )??? where rnum? between 5? and? 10;
    練習(xí):哪些員工的工資比本部門的平均工資高?
    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;
    ?關(guān)于同義詞:
    同義詞:相當(dāng)于別名的作用(***只需了解***)系統(tǒng)自建的同義詞:??? user_tables
    create? synonym??? asd_s_emp?? for??? asd_0607.s_emp ;
    目的就是為了給asd_0607_s_emp表起另一個(gè)代替的名稱asd.s_emp;注意這個(gè)同義詞只能自己使用;
    create? public???? synonym? p_s_emp? fro asd_0607.s_emp; 創(chuàng)建公共的同義詞,但是要權(quán)限.
    刪除同義詞:
    drop? synonym??? 同義詞名稱

    ****************************************************************************
    6、創(chuàng)建索引:? Creating??? indexes(概念很重要對(duì)系統(tǒng)的性能影響非常大)
    建索引的目的就是為了加快查詢速度。
    索引就相于一本的書的目錄。索引點(diǎn)系統(tǒng)空間,屬于表的附屬物。刪除一個(gè)表時(shí),相對(duì)應(yīng)的索引也會(huì)刪除。truncate 表時(shí)索引結(jié)構(gòu)在,但是數(shù)據(jù)不存在。
    full?? table??? scan? 全表掃描
    用索引就是為了快速定位數(shù)據(jù):(理解時(shí)就以字典的目錄為例)
    查看表的rowid:
    select???? rowid? , first_name??? from? s_emp;
    rowid 定義的信息有:? object?? block? table
    每條記錄都有自己的rowid
    索引由誰創(chuàng)建:用戶,建索引后會(huì)使DML操作效率慢,但是對(duì)用戶查詢會(huì)提高效率,這就是我們建索引的最終目的,
    創(chuàng)建一個(gè)索引:
    create? index???? 索引名???? on?? 表名 (? 字段名);
    create?? insex testindex? on test(c1, c2);
    哪些字段應(yīng)該建索引:
    經(jīng)常要用where的子句的地方,所以要用索引.用不用索引,關(guān)鍵要看所查詢的數(shù)據(jù)與所有數(shù)據(jù)的百分比,表越大,查詢的記錄越少,索引的效率最高.


    替換變量:用&符號(hào)來定義替換變量支持交互性提示,對(duì)于字符性的數(shù)字,一定要寫在單引號(hào)之間
    set??? verify on
    set??? verify off;
    相當(dāng)于開關(guān)變量,用于控制是否顯示新舊的sql語句
    select?? id ,last_name? ,salary?? from s_emp? where? title='&job_title';
    更改交互的提示信息:
    accept? p_dname prompt ' 提示信息';
    定義變量:
    define???? p_dname='abc';


    posted @ 2007-03-20 12:57 sunny 閱讀(756) | 評(píng)論 (0)編輯 收藏


    兩表沒有任何關(guān)聯(lián)時(shí)會(huì)產(chǎn)生迪卡爾機(jī):
    select first_name , name from s_emp , s_dept;
    等值連接:
    練習(xí)一:查看員工的姓名和員工部門號(hào):(要考慮到表中實(shí)際數(shù)據(jù)中空值的影響)
    select first_name , name from s_emp, s_dept where s_emp.dept_id=s_dept.id;
     
    練習(xí)二:每個(gè)員工所在的部門和部門所在的地區(qū)
    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;

    非等值連接
    練習(xí)三:查出每個(gè)員工和每個(gè)員工的工資級(jí)別)
    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;
    練習(xí)四:查出所有員工的部門領(lǐng)導(dǎo)的名稱:( 這種sql會(huì)少一條記錄,總經(jīng)理沒有被配置上)
    select e.first_name , m.first_name from s_emp e , s_emp m where e.manager_id=m.id;7fg
     
    外連接:(防止空值時(shí),用(+)的一方會(huì)模擬一條記錄配置另一方)這就稱為外連接,一個(gè)記錄都不能少;
    select e.first_name , m.first_name from s_emp e , s_emp m where e.manager_id=m.id(+);

    練習(xí)五:查看員工分部的部門:
    select distinct(deptno) from emp ;
    找出沒有員工的部門:(很經(jīng)典的一個(gè)例子,用外連接來解決的標(biāo)準(zhǔn)做法,這是一種方式,用子查詢也可以實(shí)現(xiàn))
    第一步:
    select e.deptno , d.deptno from emp e , dept d where e.deptno(+)=d.deptno;
    第二步:(!L_=N
    select e.deptno , d.deptno from emp e , dept d where e.deptno(+)=d.deptno and e.deptno is null;

    練習(xí)六:查詢員工有多少人有提成:
    select count( commission_pct ) from s_emp ;
    select sum(commission_pct)/ count(*) from s_emp;
      
    練習(xí)七:員工分部在多少個(gè)不同的部門:
    select count(dept_id) from s_emp;
    select count(distinct dept_id) from s_emp;
     
    練習(xí)八:求各個(gè)部門的平均工資:
    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 ;
    //體會(huì)下句sql
    select region_id , count(*) from s_dept ****此句會(huì)有錯(cuò),請(qǐng)多體會(huì)********
    select max(region_id) , count(*) from s_dept; (強(qiáng)制語法上可以正確,但是不能保證結(jié)果也會(huì)正確)

    練習(xí)九:求各個(gè)部門不同工種的平均工資:
    select dept_id , title, avg(salary) from s_emp group by dept_id , title ;

    練習(xí)十:查詢哪些部門的平均工資比2000高:
    select dept_id, avg(salary) aa from s_emp group by (dept_id) having avg(salary)>2000;

    練習(xí)十一:除了42部門以外的部門的平均工資:
    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效率要高,先過濾再計(jì)算)

    練習(xí)十二:求各個(gè)部門的平均工資:
    //****這問題很經(jīng)典,為了過 oracle sql 語法關(guān)而寫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 ;

    關(guān)于子查詢: Subqueries
    練習(xí)十三:找出所有員工中,工資最低的那個(gè)員工:( 利用子查詢 )
    select first_name, salary from s_emp where salary = ( select min(salary) from s_emp) ;
    //這樣寫會(huì)出錯(cuò)姓名和工資不一致
    select max(first_name), min(salary) from s_emp;

    練習(xí)十四:查詢誰跟Smith的工種一樣:
    select last_name from s_emp where last_name='Smith';
    //下種寫法可能還存在bug,沒有考慮到數(shù)據(jù)的全面性,有潛在性問題
    select last_name , title from s_emp where title =( select title from s_emp where last_name='Smith' )and

    last_name <> 'Smith' ;
    //這種寫法才考慮的比較全面
    select last_name , title from s_emp where title in ( select title from s_emp where last_name='Smith' ) and

    last_name <> 'Smith' ;
    使用子查詢時(shí)應(yīng)注意: 單行子查詢返回多個(gè)結(jié)果時(shí)會(huì)有錯(cuò)誤 single-row subquery returns more than one value(
    練習(xí)十五:查出哪些員工的工資比平均工資低:
    select * from s_emp where salary < ( select avg(salary) from s_emp) ;
    哪些部門的平均工資比32部門的平均工資要低:
    第一步先查出各個(gè)部門的平均工資:
    select min(avg(salary ) ) from s_emp group by dept_id;
    第二步再查出哪個(gè)部門的工資是最低的:
    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 ) ;
    練習(xí)十六:哪個(gè)部門里沒有員工(用子查詢的方式來實(shí)現(xiàn)):
    select deptno from dept where deptno not in ( select deptno from emp );

    posted @ 2007-03-20 12:48 sunny 閱讀(429) | 評(píng)論 (0)編輯 收藏

    SQL*PLUS命令的使用大全

    ?????????????????????????????? SQL*PLUS命令的使用大全
    ???
    ?????? Oracle的sql*plus是與oracle進(jìn)行交互的客戶端工具。在sql*plus中,可以運(yùn)行sql*plus命令與sql*plus語句。我們通常所說的DML、DDL、DCL語句都是sql*plus語句,它們執(zhí)行完后,都可以保存在一個(gè)被稱為
    sql buffer的內(nèi)存區(qū)域中,并且只能保存一條最近執(zhí)行的sql語句,我們可以對(duì)保存在sql buffer中的sql 語句進(jìn)行修改,然后再次執(zhí)行,sql*plus一般都與數(shù)據(jù)庫打交道。
    ?? 除了sql*plus語句,在sql*plus中執(zhí)行的其它語句我們稱之為sql*plus命令。它們執(zhí)行完后,不保存在sql buffer的內(nèi)存區(qū)域中,它們一般用來對(duì)輸出的結(jié)果進(jìn)行格式化顯示,以便于制作報(bào)表。
    ?? 下面就介紹一下一些常用的sql*plus命令:
    ?
    1. 執(zhí)行一個(gè)SQL腳本文件
    SQL>start file_name
    SQL>@ file_name
    我們可以將多條sql語句保存在一個(gè)文本文件中,這樣當(dāng)要執(zhí)行這個(gè)文件中的所有的sql語句時(shí),用上面的任一命令即可,這類似于dos中的批處理。
    ?
    2. 對(duì)當(dāng)前的輸入進(jìn)行編輯
    SQL>edit
    ?
    3. 重新運(yùn)行上一次運(yùn)行的sql語句
    SQL>/
    ?
    4. 將顯示的內(nèi)容輸出到指定文件
    SQL> SPOOL file_name
    ?? 在屏幕上的所有內(nèi)容都包含在該文件中,包括你輸入的sql語句。
    ?
    5. 關(guān)閉spool輸出
    SQL> SPOOL OFF
    ?? 只有關(guān)閉spool輸出,才會(huì)在輸出文件中看到輸出的內(nèi)容。
    ?
    6.顯示一個(gè)表的結(jié)構(gòu)
    SQL> desc table_name
    ?
    7. COL命令:
    主要格式化列的顯示形式。
    該命令有許多選項(xiàng),具體如下:
    COL[UMN] [{ column|expr} [ option ...]]
    Option選項(xiàng)可以是如下的子句:
    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). 改變?nèi)笔〉牧袠?biāo)題
    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 NAME并將新列名放在兩行上:
    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). 改變列的顯示長度:
    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). 設(shè)置列標(biāo)題的對(duì)齊方式
    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
    對(duì)于NUMBER型的列,列標(biāo)題缺省在右邊,其它類型的列標(biāo)題缺省在左邊
    ?
    5). 不讓一個(gè)列顯示在屏幕上
    NOPRI[NT]|PRI[NT]
    SQL> col job noprint
    SQL> /
    ????? EMPNO?????????? ENAME
    ----------???? ----------------------------------------
    ?????? 7369 SMITH
    ?????? 7499 ALLEN
    7521 WARD
    ?
    6). 格式化NUMBER類型列的顯示:
    SQL> COLUMN SAL FORMAT $99,990
    SQL> /
    Employee
    Department Name??????? Salary??? Commission
    ---------- ---------- --------- ----------
    30????????? ALLEN??????? $1,600??? 300
    ?
    7). 顯示列值時(shí),如果列值為NULL值,用text值代替NULL值
    COMM NUL[L] text
    SQL>COL COMM NUL[L] text
    ?
    8). 設(shè)置一個(gè)列的回繞方式
    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). 顯示列的當(dāng)前的顯示屬性值
    SQL> COLUMN column_name
    ?
    10). 將所有列的顯示屬性設(shè)為缺省值
    SQL> CLEAR COLUMNS
    ?
    8. 屏蔽掉一個(gè)列中顯示的相同的值
    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. 在上面屏蔽掉一個(gè)列中顯示的相同的值的顯示中,每當(dāng)列值變化時(shí)在值變化之前插入n個(gè)空行。
    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. 顯示對(duì)BREAK的設(shè)置
    SQL> BREAK
    ?
    11. 刪除6、7的設(shè)置
    SQL> CLEAR BREAKS
    ?
    12. Set 命令:
    該命令包含許多子命令:
    SET system_variable value
    system_variable value 可以是如下的子句之一:
    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). 設(shè)置當(dāng)前session是否對(duì)修改的數(shù)據(jù)進(jìn)行自動(dòng)提交
    SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
    ?
    2).在用start命令執(zhí)行一個(gè)sql腳本時(shí),是否顯示腳本中正在執(zhí)行的SQL語句
    SQL> SET ECHO {ON|OFF}
    ?
    3).是否顯示當(dāng)前sql語句查詢或修改的行數(shù)
    SQL> SET FEED[BACK] {6|n|ON|OFF}
    ?? 默認(rèn)只有結(jié)果大于6行時(shí)才顯示結(jié)果的行數(shù)。如果set feedback 1 ,則不管查詢到多少行都返回。當(dāng)為off 時(shí),一律不顯示查詢的行數(shù)
    ?
    4).是否顯示列標(biāo)題
    SQL> SET HEA[DING] {ON|OFF}
    當(dāng)set heading off 時(shí),在每頁的上面不顯示列標(biāo)題,而是以空白行代替
    ?
    5).設(shè)置一行可以容納的字符數(shù)
    SQL> SET LIN[ESIZE] {80|n}
    ?? 如果一行的輸出內(nèi)容大于設(shè)置的一行可容納的字符數(shù),則折行顯示。
    ?
    6).設(shè)置頁與頁之間的分隔
    SQL> SET NEWP[AGE] {1|n|NONE}
    當(dāng)set newpage 0 時(shí),會(huì)在每頁的開頭有一個(gè)小的黑方框。
    當(dāng)set newpage n 時(shí),會(huì)在頁和頁之間隔著n個(gè)空行。
    當(dāng)set newpage none 時(shí),會(huì)在頁和頁之間沒有任何間隔。
    ?
    7).顯示時(shí),用text值代替NULL值
    SQL> SET NULL text
    ?
    8).設(shè)置一頁有多少行數(shù)
    SQL> SET PAGES[IZE] {24|n}
    如果設(shè)為0,則所有的輸出內(nèi)容為一頁并且不顯示列標(biāo)題
    ?
    9).是否顯示用DBMS_OUTPUT.PUT_LINE包進(jìn)行輸出的信息。
    SQL> SET SERVEROUT[PUT] {ON|OFF}?
    在編寫存儲(chǔ)過程時(shí),我們有時(shí)會(huì)用dbms_output.put_line將必要的信息輸出,以便對(duì)存儲(chǔ)過程進(jìn)行調(diào)試,只有將serveroutput變量設(shè)為on后,信息才能顯示在屏幕上。
    ?
    10).當(dāng)SQL語句的長度大于LINESIZE時(shí),是否在顯示時(shí)截取SQL語句。
    SQL> SET WRA[P] {ON|OFF}
    ?? 當(dāng)輸出的行的長度大于設(shè)置的行的長度時(shí)(用set linesize n命令設(shè)置),當(dāng)set wrap on時(shí),輸出行的多于的字符會(huì)另起一行顯示,否則,會(huì)將輸出行的多于字符切除,不予顯示。
    ?
    11).是否在屏幕上顯示輸出的內(nèi)容,主要用與SPOOL結(jié)合使用。
    SQL> SET TERM[OUT] {ON|OFF}
    ?? 在用spool命令將一個(gè)大表中的內(nèi)容輸出到一個(gè)文件中時(shí),將內(nèi)容輸出在屏幕上會(huì)耗費(fèi)大量的時(shí)間,設(shè)置set termspool off后,則輸出的內(nèi)容只會(huì)保存在輸出文件中,不會(huì)顯示在屏幕上,極大的提高了spool的速度。
    ?
    12).將SPOOL輸出中每行后面多余的空格去掉
    SQL> SET TRIMS[OUT] {ON|OFF}?
    ???
    13)顯示每個(gè)sql語句花費(fèi)的執(zhí)行時(shí)間
    set TIMING? {ON|OFF}
    ?
    14.修改sql buffer中的當(dāng)前行中,第一個(gè)出現(xiàn)的字符串
    C[HANGE] /old_value/new_value
    SQL> l
    ?? 1* select * from dept
    SQL> c/dept/emp
    ?? 1* select * from emp
    ?
    15.編輯sql buffer中的sql語句
    EDI[T]
    ?
    16.顯示sql buffer中的sql語句,list n顯示sql buffer中的第n行,并使第n行成為當(dāng)前行
    L[IST] [n]
    ?
    17.在sql buffer的當(dāng)前行下面加一行或多行
    I[NPUT]
    ?
    18.將指定的文本加到sql buffer的當(dāng)前行后面
    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
    ?
    19.將sql buffer中的sql語句保存到一個(gè)文件中
    SAVE file_name
    ?
    20.將一個(gè)文件中的sql語句導(dǎo)入到sql buffer中
    GET file_name
    ?
    21.再次執(zhí)行剛才已經(jīng)執(zhí)行的sql語句
    RUN
    or
    /
    ?
    22.執(zhí)行一個(gè)存儲(chǔ)過程
    EXECUTE procedure_name
    ?
    23.在sql*plus中連接到指定的數(shù)據(jù)庫
    CONNECT user_name/passwd@db_alias
    ?
    24.設(shè)置每個(gè)報(bào)表的頂部標(biāo)題
    TTITLE
    ?
    25.設(shè)置每個(gè)報(bào)表的尾部標(biāo)題
    BTITLE
    ?
    26.寫一個(gè)注釋
    REMARK [text]
    ?
    27.將指定的信息或一個(gè)空行輸出到屏幕上
    PROMPT [text]
    ?
    28.將執(zhí)行的過程暫停,等待用戶響應(yīng)后繼續(xù)執(zhí)行
    PAUSE [text]
    ?
    Sql>PAUSE Adjust paper and press RETURN to continue.
    ?
    29.將一個(gè)數(shù)據(jù)庫中的一些數(shù)據(jù)拷貝到另外一個(gè)數(shù)據(jù)庫(如將一個(gè)表的數(shù)據(jù)拷貝到另一個(gè)數(shù)據(jù)庫)
    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
    ?
    30.不退出sql*plus,在sql*plus中執(zhí)行一個(gè)操作系統(tǒng)命令:
    HOST
    ?
    Sql> host hostname
    該命令在windows下可能被支持。
    ?
    31.在sql*plus中,切換到操作系統(tǒng)命令提示符下,運(yùn)行操作系統(tǒng)命令后,可以再次切換回sql*plus:
    !
    ?
    sql>!
    $hostname
    $exit
    sql>
    ?
    該命令在windows下不被支持。
    ?
    32.顯示sql*plus命令的幫助
    HELP
    如何安裝幫助文件:
    Sql>@ ?\sqlplus\admin\help\hlpbld.sql ?\sqlplus\admin\help\helpus.sql
    Sql>help index
    ?
    33.顯示sql*plus系統(tǒng)變量的值或sql*plus環(huán)境變量的值
    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) . 顯示當(dāng)前環(huán)境變量的值:
    Show all
    ?
    2) . 顯示當(dāng)前在創(chuàng)建函數(shù)、存儲(chǔ)過程、觸發(fā)器、包等對(duì)象的錯(cuò)誤信息
    Show error
    當(dāng)創(chuàng)建一個(gè)函數(shù)、存儲(chǔ)過程等出錯(cuò)時(shí),變可以用該命令查看在那個(gè)地方出錯(cuò)及相應(yīng)的出錯(cuò)信息,進(jìn)行修改后再次進(jìn)行編譯。
    ?
    3) . 顯示初始化參數(shù)的值:
    show PARAMETERS [parameter_name]
    ?
    4) . 顯示數(shù)據(jù)庫的版本:
    show REL[EASE]
    ?
    5) . 顯示SGA的大小
    show SGA
    ?
    6). 顯示當(dāng)前的用戶名
    show user

    posted @ 2007-03-20 10:36 sunny| 編輯 收藏
    一個(gè)寄人籬下的無業(yè)游民被人拋棄!
    posted @ 2007-03-11 21:45 sunny 閱讀(272) | 評(píng)論 (0)編輯 收藏

    1)最近做上傳文件時(shí)遇到了討厭的亂碼問題!
    現(xiàn)象是上傳純文本文件,顯示沒有問題,但是word文檔中有圖表就會(huì)出現(xiàn)亂碼!

    原因,是由于我用了clob字段來保存文檔!

    2)在下載時(shí)遇到中文文件名亂碼.解決方法是把文件名重新編碼!
    ?response.setHeader("Content-disposition", "attachment;filename=\"" +new String(bszn.getFileFileName().getBytes("gb2312"),"iso8859-1")+"\"");

    mysql?的blob字段只有64k,要有大點(diǎn)的文件要用longBlob
    ??????????????????

    posted @ 2007-01-30 23:12 sunny 閱讀(210) | 評(píng)論 (0)編輯 收藏
    #include<iostream>//快速排序不新建臨時(shí)數(shù)組
    using 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;
    ??? }
    posted @ 2007-01-25 22:51 sunny 閱讀(240) | 評(píng)論 (0)編輯 收藏

    #include<iostream>//一個(gè)快速排序的例子

    using? namespace std;

    void swap(int &a,int &b){
    ???? a=a^b;
    ???? b=a^b;
    ???? a=a^b;
    ???? }

    void quick(int *a,int n){
    ???? if(n<=1)
    ???? return;
    ???? swap(*a,a[n>1]);//把中間的數(shù)作為分組的標(biāo)準(zhǔn),并把它換到數(shù)組首
    ???? int *p=new int[n];
    ???? int*lp=p;
    ???? int*rp=p+n-1;
    ???? int*pt=a+1;
    ???? int pivot=*a;
    ???? for(int i=1;i<n;i++)//把數(shù)據(jù) 考到臨時(shí)數(shù)組
    ???????????? {
    ????????????? if(*pt>pivot)
    ??????????????????? *rp--=*pt++;
    ?????????????? else
    ??????????????????? *lp++=*pt++;??????????????????
    ???????????? }
    ?? *lp=pivot;
    ??? pt=a;
    ??? lp=p;
    ??? for(int i=0;i<n;i++)//把數(shù)據(jù)考回來
    ?????????? *pt++=*lp++;
    ? delete[] p;
    ? int left=rp-p;//計(jì)算左邊部分的元素個(gè)數(shù)
    ? quick(a,left);
    ?quick(a+left+1,n-left-1);?
    }

    ?

    int main(){
    ??
    ??? int a[11]={5,456,3219,416,4,64,31,987,1987,98731,9841};
    ?quick(a,11);
    ?
    ?for(int i=0;i<11;i++)
    ???????? cout<<a[i]<<' ';
    ???????? cout<<endl;
    ???????? char t;
    ???????? cin>>t;
    ???????? return 0;
    ??????
    ??????
    ??? }

    posted @ 2007-01-24 22:16 sunny 閱讀(875) | 評(píng)論 (0)編輯 收藏


    #include<iostream>
    using namespace std;
    typedef int T;

    class Node{
    ????? T data;
    ????? Node *next;
    public:
    ?????? Node(T t):data(t),next(NULL){}
    ?????? friend class List;?????
    ?????? };
    ?????
    class List{
    ????? Node * head;
    ????? int len;
    public:
    ??????? List(int len=0):len(len),head(NULL){}
    ??????? ~List(){clear();}
    ??????? Node* & getp( int pos ); 
    ??????? void insert( T d, int pos=0 );//插入
    ??????? int size();
    ??????? bool empty();
    ?????? ?void travel();//遍歷
    ????????void clear();
    ??????? int find( T d );//查找
    ??????? bool update( T d1, T d2 );//更新
    ??????? bool erase( T d );//刪除
    ??????? T getHead();
    ??????? T getTail();
    ??????? void reverse();
    ????? };
    void List::insert(T d,int pos){
    ???? Node *p=new Node(d);
    ???? Node *&pn=getp(pos);
    ???? p->next=pn;
    ???? pn=p;
    ???? ++len;
    ???? }
    ????
    Node*& List::getp(int pos){//返回一個(gè)引用而不是一個(gè)復(fù)制的數(shù)據(jù)
    ???? if(pos<0||pos>len)
    ??????????? pos=len;??????????????????
    ???? if(pos==0)
    ???????????? return head;
    ?????? Node*p=head;?????
    ???? for(int i=0;i<pos-1;i++)
    ??????????? p=p->next;
    ???? return p->next;
    ???? }
    int List::size(){
    ??? return len;
    ??? }
    bool List::empty(){
    ???? return head==NULL;
    ???? }?
    ??????
    void List::clear(){
    ????? while(head!=NULL){
    ???? Node *p =head->next;
    ???? delete head;
    ???? head=p;
    ???? }??
    ???? len=0 ;???????????????
    ???? }
    void List::travel(){
    ???? Node*p=head;
    ???? while(p!=NULL){
    ???? cout<<p->data<<' ';
    ???? p=p->next;??????????????
    ???? }
    ???? cout<<endl;??
    ???? }
    int List::find( T d ){
    ???? Node*p=head;
    ???? int pos=0;
    ????
    ???? while(p!=NULL){
    ??????? if(d==p->data)
    ??????????? return pos;
    ??????? p=p->next;
    ??????? ++pos;???????????????
    ???? }????
    ?????????? return -1;
    ???? }
    bool List::update( T d1, T d2 ){
    ???? int t=find(d1);
    ???? if(t==-1)
    ?????? return false;
    ???? Node*&p=getp(t);
    ???? p->data=d2;
    ???? return true;
    ???? }
    bool List:: erase(T d){
    ???? int t=find(d);
    ???? if(t==-1)
    ?????? return false;
    ????? Node*&pn=getp(t);
    ????? Node*p=pn;
    ????? pn=pn->next;
    ????? delete p;
    ????? --len;?????
    ???? return true;
    ???? }
    ?void List:: reverse(){
    ????? Node *ph=head;
    ????? Node *p=NULL;
    ????? head=NULL;
    ????? while(ph!=NULL){
    ??????? p=ph;
    ??????? ph=ph->next;
    ???????
    ??????? p->next=head;
    ??????? head=p;
    ???? }
    ????
    ????? }
    ?????
    T List::getHead(){
    ????? if(empty())
    ????????? return T();??????????
    ??????? return head->data;?????????
    ????? }
    T? List::getTail(){
    ????? if(empty())
    ?????????? return T();
    ?????? return getp(len-1)->data;????????????
    ????? }
    int main(){
    ??? List obj;
    ?obj.reverse();
    ?obj.travel();
    ?obj.insert(1,-1);
    ?obj.insert(2,-1);
    ?obj.insert(3,-1);
    ?obj.insert(4,-1);
    ?obj.insert(5);
    ?obj.insert(6);
    ?obj.insert(7);
    ?obj.insert(8);
    ?obj.insert(60,6);
    ?obj.insert(40,4);
    ?obj.insert(20,2);
    ?obj.travel();
    ?obj.reverse();
    ?obj.travel();
    ??? cout<<obj.find(60)<<endl;
    ?obj.update(20,600);
    ?obj.travel();
    ?obj.erase(600);
    ?obj.travel();
    ?cout<<obj.getHead()<<' '<<obj.getTail()<<endl;
    ?int t;
    ?cin>>t;
    ?return 0;
    ??? }

    posted @ 2007-01-23 21:59 sunny 閱讀(180) | 評(píng)論 (0)編輯 收藏

    import jxl.Workbook;
    import jxl.Sheet;

    import java.io.*;
    import java.nio.Buffer;

    /**
    ?* Created by IntelliJ IDEA.
    ?* User: sunny
    ?* Date: 2006-9-27
    ?* Time: 15:25:39
    ?* To change this template use File | Settings | File Templates.
    ?*/
    public class a {


    ??? public static void main(String args[]) {
    ??????? StringBuffer buffer = new StringBuffer();
    ??????? try {
    ??????????? FileWriter out = new FileWriter("C:\\Documents and Settings\\sunny\\桌面\\kd.txt");
    ??????????? Workbook workbook = Workbook.getWorkbook(new File("C:\\Documents and Settings\\sunny\\桌面\\kd.xls"));
    ??????????? Sheet sheet = workbook.getSheet("kd");
    ??????????? int r = sheet.getRows();
    ??????????? int c = sheet.getColumns();
    ??????????? buffer.append("numleng=").append(r).append("&");
    ??????????? for (int i = 0; i < r; i++) {
    ??????????????? for (int j = 0; j < c; j++) {
    ??????????????????? buffer = buffer.append("n").append(i).append("=").append(sheet.getCell(j, i).getContents()).append("&");
    ??????????????????? //?? System.out.print(sheet.getCell(j, i).getContents());
    ??????????????? }
    ??????????? }
    ?????????? out.write(buffer.toString());
    ??????????? workbook.close();
    ??????? } catch (Exception e) {
    ??????????? System.out.println(e);
    ??????? }
    ??????? {
    ??????? }
    ??? }
    }

    posted @ 2006-09-27 17:51 sunny 閱讀(139) | 評(píng)論 (0)編輯 收藏
    終于搞出來了把它寫下來備份一下!我用的是apache_2.0.59-win32-x86-no_ssl(1).msi 和 resin3.0.18

    先把resin3.0.18 下的mod_caucho.dll考到apache的modules下再把下面一段考到httpd.conf的后面就ok了

    LoadModule caucho_module modules/mod_caucho.dll
    ResinConfigServer localhost 6802
    CauchoStatus yes
    ?<LocationMatch "/WEB-INF/">
    ? AllowOverride None
    ? deny from all
    ?</LocationMatch>
    ?<LocationMatch "/META-INF/">
    ? AllowOverride None
    ? deny from all
    ?</LocationMatch>?
    ?<IfModule mod_caucho.c>
    ResinConfigServer localhost 6802
    <Location /caucho-status>
    SetHandler caucho-status
    </Location>
    </IfModule>
    AddHandler caucho-request .action? .jsp
    <Location /servlet/*>
    SetHandler caucho-request
    </Location>

    這跟apache 的版本有關(guān)如果在2.2apache就會(huì)報(bào)錯(cuò)!
    posted @ 2006-09-06 17:23 sunny 閱讀(193) | 評(píng)論 (0)編輯 收藏
    ???前幾天在寫代碼的時(shí)又遇到一個(gè)頁面不能顯示一個(gè)list的錯(cuò)誤!
    ???現(xiàn)象:后臺(tái)可以打出log(list.size())。但是頁面上用c 標(biāo)簽顯示時(shí),提示類型錯(cuò)誤。用ww標(biāo)簽可以輸出? 循?環(huán),但是具體的property顯示不出來!
    原因:原來是在用Hibernate 的createMysqlQuery()時(shí)沒有加上addEntity().也就是hibernate 返回的是一個(gè)object 的list。而我在頁面上是把這個(gè)list ,當(dāng)作具體的對(duì)象的list操作的!所以才出現(xiàn)了這樣的錯(cuò)誤!
    啟發(fā):在與數(shù)據(jù)庫打交道時(shí)要注意把object轉(zhuǎn)換成具體的class!要盡量用hibernate的hql,這樣可以減少類型轉(zhuǎn)換問題。要盡量用面向?qū)ο蟮乃枷雭砜紤]問題!
    posted @ 2006-07-19 17:37 sunny 閱讀(115) | 評(píng)論 (0)編輯 收藏

    div.compadmin2 {
    ??????????? top: 172px;
    ??????????? left: 316px;
    ??????????? position: absolute;
    ??????????? border-bottom: #939395 solid 0px;
    ??????????? border-left: #939395 solid 0px;
    ??????????? border-right: #939395 solid 0px;
    ??????????? border-top: #939395 solid 0px;
    ??????????? width: 541px;
    ??????????? height: 466px;
    ??????????? padding: 5px;
    ??????????? overflow: auto;

    ??????? }

    posted @ 2006-07-14 11:07 sunny 閱讀(137) | 評(píng)論 (0)編輯 收藏
    <2006年7月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    相冊

    收藏夾

    朋友

    搜索

    •  

    最新評(píng)論

    評(píng)論排行榜

    主站蜘蛛池模板: 免费精品国产自产拍在线观看| 免费观看的毛片手机视频| 国产亚洲一卡2卡3卡4卡新区| 久久久久亚洲AV成人无码网站| 好吊妞788免费视频播放| 8x8×在线永久免费视频| 午夜在线免费视频 | 亚洲入口无毒网址你懂的| 亚洲人成网7777777国产| 免费一级特黄特色大片在线| 成人免费无码视频在线网站| 57pao一国产成永久免费| A级毛片成人网站免费看| 羞羞视频免费网站含羞草| 亚洲综合激情五月色一区| 亚洲首页在线观看| 久久久无码精品亚洲日韩蜜桃| 亚洲综合色视频在线观看| 免费国产精品视频| 日本免费网站观看| 成人黄动漫画免费网站视频| 在线看免费观看AV深夜影院| 99久久免费观看| 免费无码成人AV在线播放不卡| 花蝴蝶免费视频在线观看高清版| 中文字幕免费在线视频| 一区二区免费电影| 精品无码国产污污污免费网站国产| 激情小说亚洲色图| 苍井空亚洲精品AA片在线播放 | 99久久99久久免费精品小说| 久久精品国产影库免费看| 中文字幕无码毛片免费看 | 九月丁香婷婷亚洲综合色| 国产亚洲精品成人AA片新蒲金| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 国产精品日本亚洲777| 激情小说亚洲图片| 亚洲精品国产日韩无码AV永久免费网| 国产亚洲精品第一综合| 免费无码一区二区|