<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月19日
    再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) | 評論 (0)編輯 收藏
    實際編程時,要使Log4j真正在系統中運行事先還要對配置文件進行定義。定義步驟就是對Logger、Appender及Layout的分別使用。 Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是java properties(key=value)【Java特性文件(鍵=值)】。下面我們介紹使用Java特性文件做為配置文件的方法 具體如下:      1、配置根Logger,其語法為:   log4j.rootLogger = [ level ] , appenderName1, appenderName2, … level : 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。比如在這里定義了INFO級別,則應用程序中所有DEBUG級別的日志信息將不被打印出來。    appenderName:就是指定日志信息輸出到哪個地方。您可以同時指定多個輸出目的地。 例如:log4j.rootLogger=info,A1,B2,C3      2、配置日志信息輸出目的地,其語法為:   log4j.appender.appenderName = fully.qualified.name.of.appender.class //    "fully.qualified.name.of.appender.class" 可以指定下面五個目的地中的一個: 1.org.apache.log4j.ConsoleAppender(控制臺) 2.org.apache.log4j.FileAppender(文件) 3.org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件) 4.org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件) 5.org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方) 1.ConsoleAppender選項 Threshold=WARN:指定日志消息的輸出最低層次。 ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。 Target=System.err:默認情況下是:System.out,指定輸出控制臺 2.FileAppender 選項 Threshold=WARN:指定日志消息的輸出最低層次。 ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。 File=mylog.txt:指定消息輸出到mylog.txt文件。 Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。 3.DailyRollingFileAppender 選項 Threshold=WARN:指定日志消息的輸出最低層次。 ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。 File=mylog.txt:指定消息輸出到mylog.txt文件。 Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。 DatePattern='.'yyyy-ww:每周滾動一次文件,即每周產生一個新的文件。當然也可以指定按月、周、天、時和分。即對應的格式如下: 1)'.'yyyy-MM: 每月 2)'.'yyyy-ww: 每周 3)'.'yyyy-MM-dd: 每天 4)'.'yyyy-MM-dd-a: 每天兩次 5)'.'yyyy-MM-dd-HH: 每小時 6)'.'yyyy-MM-dd-HH-mm: 每分鐘 4.RollingFileAppender 選項 Threshold=WARN:指定日志消息的輸出最低層次。 ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。 File=mylog.txt:指定消息輸出到mylog.txt文件。 Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。 MaxFileSize=100KB: 后綴可以是KB, MB 或者是 GB. 在日志文件到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1文件。 MaxBackupIndex=2:指定可以產生的滾動文件的最大數。 實際應用:   log4j.appender.A1=org.apache.log4j.ConsoleAppender //這里指定了日志輸出的第一個位置A1是控制臺ConsoleAppender      3、配置日志信息的格式,其語法為:   A.log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class "fully.qualified.name.of.layout.class" 可以指定下面4個格式中的一個: 1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),    2.org.apache.log4j.PatternLayout(可以靈活地指定布局模式),    3.org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),    4.org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息) 1.HTMLLayout 選項 LocationInfo=true:默認值是false,輸出java文件名稱和行號 Title=my app file: 默認值是 Log4J Log Messages. 2.PatternLayout 選項 ConversionPattern=%m%n :指定怎樣格式化指定的消息。 3.XMLLayout 選項 LocationInfo=true:默認值是false,輸出java文件和行號 實際應用:   log4j.appender.A1.layout=org.apache.log4j.PatternLayout B. log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n 這里需要說明的就是日志信息格式中幾個符號所代表的含義:    -X號: X信息輸出時左對齊; %p: 輸出日志信息優先級,即DEBUG,INFO,WARN,ERROR,FATAL, %d: 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921 %r: 輸出自應用啟動到輸出該log信息耗費的毫秒數 %c: 輸出日志信息所屬的類目,通常就是所在類的全名 %t: 輸出產生該日志事件的線程名 %l: 輸出日志事件的發生位置,相當于%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10) %x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中。 %%: 輸出一個"%"字符 %F: 輸出日志消息產生時所在的文件名稱 %L: 輸出代碼中的行號 %m: 輸出代碼中指定的消息,產生的日志具體信息 %n: 輸出一個回車換行符,Windows平臺為"\r\n",Unix平臺為"\n"輸出日志信息換行 可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如: 1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,默認的情況下右對齊。 2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,"-"號指定左對齊。 3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大于30的話,就會將左邊多出的字符截掉,但小于30的話也不會有空格。 4)%20.30c:如果category的名稱小于20就補空格,并且右對齊,如果其名稱長于30字符,就從左邊交遠銷出的字符截掉。   這里上面三個步驟是對前面Log4j組件說明的一個簡化;下面給出一個具體配置例子,在程序中可以參照執行:   log4j.rootLogger=INFO,A1,B2   log4j.appender.A1=org.apache.log4j.ConsoleAppender   log4j.appender.A1.layout=org.apache.log4j.PatternLayout   log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n   根據上面的日志格式,某一個程序的輸出結果如下:   0  INFO 2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014] 16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'   16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD   16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'   16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP   16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'   16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT 4. # 當輸出信息于回滾文件時 log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender //指定以文件的方式輸出日志 log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用變量${java.home}、rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸 log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //備份數 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n    ×××××××××××××××××××××××××××××××××××××××××××××××× Log4j比較全面的配置 LOG4J的配置之簡單使它遍及于越來越多的應用中了:Log4J配置文件實現了輸出到控制臺、文件、回滾文件、發送日志郵件、輸出到數據庫日志表、自定義標簽等全套功能。擇其一二使用就夠用了, log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true # 應用于控制臺 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n #應用于文件 log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=file.log log4j.appender.FILE.Append=false log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # Use this layout for LogFactor 5 analysis # 應用于文件回滾 log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用變量${java.home}、rolling.log log4j.appender.ROLLING_FILE.Append=true //true:添加 false:覆蓋 log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸 log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //備份數 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #應用于socket log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true # Set up for Log Facter 5 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n # Log Factor 5 Appender log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 # 發送日志給郵件 log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.From=web@www.wuset.com log4j.appender.MAIL.SMTPHost=www.wusetu.com log4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=web@www.wusetu.com log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # 用于數據庫 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver log4j.appender.DATABASE.user=root log4j.appender.DATABASE.password= log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=SampleMessages.log4j log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout #自定義Appender log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender log4j.appender.im.host = mail.cybercorlin.net log4j.appender.im.username = username log4j.appender.im.password = password log4j.appender.im.recipient = corlin@cybercorlin.net log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
    posted @ 2007-06-05 19:37 sunny 閱讀(491) | 評論 (1)編輯 收藏


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

    <h3 align="center">Dispatch Action</h3>
    <hr>
    <pre>
    ??? 根據請求中的某個(1)參數的值來調用Action的方法(2)。
    ??? (1)參數名字在&lt;action parameter="method" /&gt;
    ??? (2)方法名字為 method 參數的值。
    </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>
    ??? 根據<action>標記的parameter屬性的值來調用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 閱讀(305) | 評論 (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

    數據源的配置
    <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) | 評論 (0)編輯 收藏

    上午:

    一.JDBC原理概述

    ?

    1,JDBC是一套協議,是JAVA開發人員和數據庫廠商達成的協議,也就是由Sun定義一組接口,由數據庫廠商來實現,并規定了JAVA開發人員訪問數據庫所使用的方法的調用規范。

    ?

    2,JDBC的實現是由數據庫廠商提供,以驅動程序形式提供。

    ?

    3,JDBC在使用前要先加載驅動。

    JDBC對于使用者要有一致性,對不同的數據庫其使用方法都是相同的。

    ?

    驅動開發必須要實現Driver接口。

    數據庫驅動的實現方式

    JDBC-ODBC橋接式

    JDBC網絡驅動,這種方式是通過中間服務器的協議轉換來實現的

    JDBC+本地驅動,這種方式的安全性比較差。

    JDBC驅動,由數據庫廠商實現。

    ?

    二.JDBC的API

    ?

    java.sql包和javax.sql包

    Driver接口(驅動),在加載某一 Driver 類時,它應該創建自己的實例并向 DriverManager 注冊該實例。這意味著用戶可以通過調用以下程序加載和注冊一個驅動程序

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

    DriverManager類(驅動管理器),它可以創建連接,它本身就是一個創建Connection的工廠(Factory)。

    Connection接口,會根據不同的驅動產生不同的連接

    Statement接口,發送sql語句

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

    ?

    下午:

    三.JDBC應用步驟

    1,注冊加載一個driver驅動

    2,創建數據庫連接(Connection)

    3,創建一個Statement(發送sql)

    4,執行sql語句

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

    6,關閉Statement

    7,關閉連接Connection。

    ?

    注意:6,7兩個步驟勢必須要做的,因為這些資源是不會自動釋放的,必須要自己關閉

    ?

    訪問Oracle的數據庫的驅動名字叫ojdbc14.jar,要使用這個驅動程序,要先將他加到環境變量CLASSPATH中。

    ?

    ??? 注冊加載驅動driver,也就是強制類加載

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

    ?

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

    ??? DriverManager.registerDriver(d);

    ?

    ?

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

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

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

    ?

    ??? 創建連接

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

    ??? Connection連接是通過DriverManager的靜態方法getConnection(.....)來得到的,這個方法的實質是把參數傳到實際的Driver中的connect()方法中來獲得數據庫連接的。

    ??? Oracle的URL值是由連接數據庫的協議和數據庫的IP地址及端口號還有要連接的數據庫的庫名(DatebaseName)

    ??? Oracle URL的格式

    ??? jdbc:oracle:thin:(協議)@XXX.XXX.X.XXX:XXXX(IP地址及端口號):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=驅動的完整類名

    ?

    ??? 使用虛擬機參數,加載驅動 -D表示為虛擬機參數賦值

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

    ??

    四.JDBC基本方法

    ??? DriverManager:如果有多個驅動可用的話,DriverManager會選擇其中一個.?

    ???

    ??? Driver:可以選擇固定的驅動

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

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

    ??? execute(sqlString);

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

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

    ???

    ??? ResultSet

    ??? next()方法:

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

    ??? 2.將游標移向下一條記錄??

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

    ???

    ??? 關閉問題:

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

    注意:要按先ResultSet結果集,后Statement,最后Connection的順序關閉資源,因為Statement和ResultSet是需要連接時才可以使用的,所以在使用結束之后有可能其他的Statement還需要連接,所以不能先關閉Connection。



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

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

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

    ?

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


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

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

    9.讀取配置文件時,我們采用Properties對象。它是HashTable的子類,它有個load(InputStream inStream) 的方法可以直接從輸入流中讀取屬性列表(鍵值對)。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第三天
    上午:
    一.事務(Transaction)
    原子操作:不可再分的操作,一個操作不能再分成比它更細小的操作.
    事務是針對原子操作的,要求原子操作不可再分,并且必須同時成功同時失敗。
    事務就是把一些非原子操作,變成原子操作,由應用服務器來提出要求,由數據庫服務器來執行操作.

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

    ? 注意:打開事務就要關閉自動提交,當不需要再使用事務的時候調用
    setAutoCommite(true).

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

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

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

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

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

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

    //當結果集為空的時候,這兩個方法會返回false.
    boolean next(),此方法是使游標向下一條記錄移動。
    boolean previous() ,此方法可以使游標向上一條記錄移動,前提是前面還有記錄。

    boolean relative(int rows) ,相對定位方法,參數值可正可負,參數為正,游標從當前位置向后移動指定值條記錄,參數為負,游標從當前位置向前移動指定值條記錄。

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

    要使用可滾動結果集時,需要一次設置更新特性與滾動特性,不能分開.

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

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


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


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


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

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

    六.批量更新
    優勢:
    1.節省傳遞時間
    2.并發處理

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

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

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

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

    boolean absolute (int row)絕對定位,

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

    ?

    ?

    ?

    ?

    ?

    ?

    ?


    ?

    ?

    ?

    ?

    ?

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

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

    恢復練習表命令:
    sqlplus? openlab/open123 @summit2.sql


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

    show?? user??????? 顯示當前登陸的身份.
    set??? pause on
    set??? pause off?? 分頁顯示.

    oracle中默認日期和字符是左對齊,數字是右對齊
    table or view does? not? exist ; 表或示圖不存在

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

    執行出錯時,利用錯誤號來查錯誤:
    !oerr ora 942? (裝完系統后會裝一個oerr工具,用于通過錯誤號來查看錯

    誤的具體信息)

    想在sql中執行unix命令時,把所有的命令前加一個!就可以, 或者host( 用

    于從sql從切換至unix環境中去)

    /*** 初次使用時注意? ****
    運行角本時的命令:
    先切換到unix環境下,cd $oracle_home?? cd sqlplus? cd demo 下面有兩

    個角本建表語句。
    @demobld.sql
    sqlplus nanjing/nanjing @demobid.sql 直接運行角本,后面跟當前目錄或

    者是絕對路徑

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

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

    spool? 文件名
    此命令會把所有的操作存在某個文件中去
    spool off

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

    給列起別名的命令:
    利用關鍵字? as? 或者用空格? "別名"? 雙引號內大小寫敏感保持引號內容

    原樣輸出,如果不加雙引號時,默認為大寫

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

    一個空格)

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

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

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

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

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

    下午:
    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? 升序(默認)??? DESC 降序
    select * from s_emp? order by dept_id , salary desc? 部門號升序,工

    資降序
    關鍵字distinct也會觸發排序操作。

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

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

    某個具體表名時,表名的字符串必須要為大寫

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

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

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

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

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

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

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

    ?escape '\';

    當有多個條件時,要用邏輯運算符:AND OR
    寫對where語句:正確的數據類型判斷、邏輯運算符

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

    對純字符串處理的時候
    upper????? 轉大寫????????? 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; (取前六個字符)?? select substr('tarenasd0603',-2) from dual;

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

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

    (first_name)='george';

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

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

    dual;
    日期函數:DD-MON-RR ,默認不顯示世紀、時、分、秒?????? 日期格式敏感
    世紀、年、月、日
    sysdate 返回當前系統時間?????? select sysdate from dual;????
    更改當前會話的設置格式:?????
    alter session set nls_date_format='yyyy mm dd hh24:mi:ss';
    select? sysdate-1, sysdate+1, sysdate , sysdate+1 from dual;? 注意

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

    FRIDAY
    last_day 求月的最后一天

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

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

    轉換函數:
    to_char顯示日期:
    從數字轉化為char? to_char(date,'格式')
    從日期轉化為char?????????? to_char(date,? 'fmt' )????????????

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

    ?????????

    ?????????

    ????select to_char(sysdate, 'fmyyyy mm

    dd hh24:mi:ss') from dual;去掉前導名
    ????????????????????????????? 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表達日期:
    ????? 字符轉日期???? select?? to_date('2000 11 20', 'yyyy mm dd ')?

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

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

    day2


    where 條件一定是根據某個字段來進行過濾操作.

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

    練習二:每個員工所在的部門和部門所在的地區
    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;
    等值連接:
    練習三:找出每個員工和每個員工的工資級別
    ? 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;
    查出所有員工的部門領導的名稱:( 這種sql會少一條記錄,總經理沒有被配置上)
    select? e.first_name , m.first_name?? from s_emp e , s_emp m? where?? e.manager_id=m.id;
    外連接:(防止空值時,用(+)的一方會模擬一條記錄配置另一方)這就稱為外連接,一個記錄都不能少;
    select? e.first_name , m.first_name?? from s_emp e , s_emp m? where?? e.manager_id=m.id(+);
    +號放在哪邊就表示在哪邊補空,來跟對方來匹配,使得數據一個都不會漏掉,這個例子中的領導有可能會沒有(最高領導就再沒有領導了,所以就
    方法領導的那邊)
    ?標準寫法: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 ;
    找出沒有員工的部門:(很經典的一個例子,用外連接來解決的標準做法,這是一種方式)
    第一步:
    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;

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

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

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

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

    E--R圖? 實體關系圖entity? relation?
    開發流程先進行需求分析,進行系統設計,建表,再進行開發編碼,測試最終產品上線試運行。
    把軟件設計模型轉化為數據中的表,設計時要考慮性能的設計

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

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


    DDL語句:數據庫定義語句:
    table (表)
    view(示圖)
    sequence(序列號)
    index(索引)

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

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


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

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

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

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


    day3

    不給約束起名字時,系統給約束起名時的規律為:數據庫用戶名_數字(約束名也不能重名)
    定義一個約束的兩種形式:
    列級約束????? 表級約束

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

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

    foregin? key?? (fk)?? 外鍵約束:
    (先定義父表,再定義子表)
    create?? table???? parent(c1 number? primary key );
    create?? table??? child? (c? number primary key ,?? c2 number? references parent(c1));
    或表級約束定義:
    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 才為有效值 .??

    怎么創建一個角本文件: xxx.sql結尾
    ?執行角本的方法:
    ?在sqlplus環境中執行:@filename.sql
    ?在shell環境中執行: sqlplus?? nanjing/nanjing?? @filename.sql

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

    查看一張表的約束:( 查數據字典示圖)
    ?desc? user_constraints;(這個數據字典中會查到相應的信息)
    ?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 相當于組示圖加了一個約束)
    ?O??? 也是出現在示圖中
    ?非空約束和CHECK都是用C來表示

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

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

    查看當前數據庫數據字典的字典(這個示圖很重要)
    desc?? dict;
    select table_name form? dict where table_name like?? '%cons%;

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

    介紹事務的概念:
    commit? 提交,此時說明前面所有語句都成功執行
    rollback 回退操作,此時會恢復至上一次提交時的狀態。
    savepoint 設置保存點

    ?注意?? 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條件時說明是改表中所有的值.
    注意:如有外鍵引用時常會出現外鍵引用值沒有找到等錯誤?

    delete? 刪除記錄命令語法:
    delete from?? s_emp? where? dept_id=42;
    delete form?? s_emp ;????? 沒有where條件時說明刪除表中所有的值
    注意:如有外鍵引用時,刪除一張表時常會出現不能刪除的情況,
    原因一?? 是因為此時正在有人操作表中記錄
    原因二?? 此表有其他的表引用,沒能設及聯刪除:
    delete 刪除一張大表時空間不釋放,非常慢是因為占用大量的系統資源,支持回退操作,空間還被這張表占用著。
    truncate table 表名? (刪除表中記錄時釋放表空間)

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


    alter table 命令用于修改表的結構(這些命令不會經常用):
    增加約束:
    alter table? 表名 add?? constraint  約束名? primary key? (字段);
    解除約束:(刪除約束)
    alter? table 表名? drop? primary? key(對于主鍵約束可以直接用此方法,因為一張表中只有一個主鍵約束名, 注意如果主鍵此時還有其它表引用時刪除主鍵時會出錯)
    alter? tbale?? father?? drop? primary key??? cascade ;? (如果有子表引用主鍵時,要用此語法來刪除主鍵,這時子表還存在只是子表中的外鍵約束被及聯刪除了)
    alter table? 表名 drop? constraint?? 約束名;
    (怎樣取一個約束名:1、人為的違反約束規定根據錯誤信息獲取!
    ???????????????????????????????? 2、查詢示圖獲取約束名!)

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

    ?

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

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

    ?

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

    創建示圖: creating????? views(屬于了解知識)
    desc? user_views;
    select?? text?? from? user_views??? where?? view_name='TEST1_V1' ;
    示圖就相當于一條select 語句,定義了一個示圖就是定義了一個sql語句,示圖不占空間,使用view 不會提高性能,但是能簡單化sql語句
    (擴展知識: oracle? 8i 以后的新示圖)MV?? 物化視圖(占存儲空間,把select 結果存在一個空間,會提高查詢視圖,增強實時性,但是存在刷新問題, 主要應用在數據倉庫中用要用于聚合表)
    使用示圖的好處:控制數據訪問權限.
    如何創建一個示圖:
    create?? or replace?? views?? test_vi??? as?????? select?????? *?? from??? test1?? where c1=1;
    此時往表test1(base?? table? 基表)中插入數據時:表中沒能變化,示圖中的數據發生改變
    從示圖中插數據時相對應的表會發生改變:
    往示圖中插數據時,會直接插進基表中,查看示圖中的數據時,相當于就是執行創建時的select語句。
    簡單示圖:能進行DML操作。
    復雜示圖:來源于多張表,不能執行DML操作。
    關于rownum:
    rownum? 有個特點要么等于1 要么小于某個值, 不能直接等于某個值, 不能大于某個值。rownum常用于分頁顯示。
    練習:查詢出第5條數據和第10條數據之間:
    ?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 );


    練習:哪些員工的工資比本部門的平均工資高?
    select?? first_name? , salary?? , avgsal???? from? s_emp?? e , ( select?? dept_id? , avg (salary )?? avgsal? from?? s_emp? group? by dept_id )? a?? where?? e.dept_id =a.dept_id and e.salary > a.avgsal;
    ?在示圖上加一個 with? check?? option 就相當于給示圖加上了約束
    create??? view??? test_v? as? select?? *? from?? test? where c =1? with check option ;
    同義詞:相當于別名的作用(***只需了解***)系統自建的同義詞:??? user_tables
    create? synonym??? asd_s_emp?? for??? asd_0607.s_emp ;
    目的就是為了給asd_0607_s_emp表起另一個代替的名稱asd.s_emp;注意這個同義詞只能自己使用;
    create? public???? synonym? p_s_emp? fro asd_0607.s_emp; 創建公共的同義詞,但是要權限.
    刪除同義詞:
    drop? synonym??? 同義詞名稱

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


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

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

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

    foregin? key?? (fk)?? 外鍵約束:
    (先定義父表,再定義子表)
    carete?? table???? parent(c1 number? primary key );
    create?? table??? child? (c? number primary key ,?? c2 number? references parent(c1));
    或表級約束定義:
    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、關于針對表操作的語法知識:
    ? 創建表:
    ?? create??? table? 表名?? (??? 字段名1??? 類型?? 約束條件,?? 字段名2??? 類型??? 約束條件 );
    ?
    ?插入數據命令:
    ?方式一:(指定字段名插入數據)
    ? insert? into?? 表名? ( 字段名 )??? values ( 數據);
    ?方式二:
    ? insert? into? 表名?? values(數據1,? 數據2);

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

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


    替換變量:用&符號來定義替換變量支持交互性提示,對于字符性的數字,一定要寫在單引號之間
    set??? verify on
    set??? verify off;
    相當于開關變量,用于控制是否顯示新舊的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) | 評論 (0)編輯 收藏


    兩表沒有任何關聯時會產生迪卡爾機:
    select first_name , name from s_emp , s_dept;
    等值連接:
    練習一:查看員工的姓名和員工部門號:(要考慮到表中實際數據中空值的影響)
    select first_name , name from s_emp, s_dept where s_emp.dept_id=s_dept.id;
     
    練習二:每個員工所在的部門和部門所在的地區
    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;

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

    練習五:查看員工分部的部門:
    select distinct(deptno) from emp ;
    找出沒有員工的部門:(很經典的一個例子,用外連接來解決的標準做法,這是一種方式,用子查詢也可以實現)
    第一步:
    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;

    練習六:查詢員工有多少人有提成:
    select count( commission_pct ) from s_emp ;
    select sum(commission_pct)/ count(*) from s_emp;
      
    練習七:員工分部在多少個不同的部門:
    select count(dept_id) from s_emp;
    select count(distinct dept_id) from s_emp;
     
    練習八:求各個部門的平均工資:
    select dept_id , avg(salary) aa from s_emp group by dept_id order by aa ;
    select dept_id , avg(salary) aa from s_emp group by dept_id ;
    //體會下句sql
    select region_id , count(*) from s_dept ****此句會有錯,請多體會********
    select max(region_id) , count(*) from s_dept; (強制語法上可以正確,但是不能保證結果也會正確)

    練習九:求各個部門不同工種的平均工資:
    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效率要高,先過濾再計算)

    練習十二:求各個部門的平均工資:
    //****這問題很經典,為了過 oracle sql 語法關而寫max(d.name)
    select max(d.name) , avg(e.salary) , max(r.name) from s_emp e, s_dept d , s_region r where e.dept_id = d.id and

    d.region_id=r.id group by d.id ;

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

    練習十四:查詢誰跟Smith的工種一樣:
    select last_name from s_emp where last_name='Smith';
    //下種寫法可能還存在bug,沒有考慮到數據的全面性,有潛在性問題
    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' ;
    使用子查詢時應注意: 單行子查詢返回多個結果時會有錯誤 single-row subquery returns more than one value(
    練習十五:查出哪些員工的工資比平均工資低:
    select * from s_emp where salary < ( select avg(salary) from s_emp) ;
    哪些部門的平均工資比32部門的平均工資要低:
    第一步先查出各個部門的平均工資:
    select min(avg(salary ) ) from s_emp group by dept_id;
    第二步再查出哪個部門的工資是最低的:
    select dept_id, avg(salary) from s_emp group by dept_id having avg(salary) = (select min(avg(salary) ) from

    s_emp group by dept_id ) ;
    練習十六:哪個部門里沒有員工(用子查詢的方式來實現):
    select deptno from dept where deptno not in ( select deptno from emp );

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

    SQL*PLUS命令的使用大全

    ?????????????????????????????? SQL*PLUS命令的使用大全
    ???
    ?????? Oracle的sql*plus是與oracle進行交互的客戶端工具。在sql*plus中,可以運行sql*plus命令與sql*plus語句。我們通常所說的DML、DDL、DCL語句都是sql*plus語句,它們執行完后,都可以保存在一個被稱為
    sql buffer的內存區域中,并且只能保存一條最近執行的sql語句,我們可以對保存在sql buffer中的sql 語句進行修改,然后再次執行,sql*plus一般都與數據庫打交道。
    ?? 除了sql*plus語句,在sql*plus中執行的其它語句我們稱之為sql*plus命令。它們執行完后,不保存在sql buffer的內存區域中,它們一般用來對輸出的結果進行格式化顯示,以便于制作報表。
    ?? 下面就介紹一下一些常用的sql*plus命令:
    ?
    1. 執行一個SQL腳本文件
    SQL>start file_name
    SQL>@ file_name
    我們可以將多條sql語句保存在一個文本文件中,這樣當要執行這個文件中的所有的sql語句時,用上面的任一命令即可,這類似于dos中的批處理。
    ?
    2. 對當前的輸入進行編輯
    SQL>edit
    ?
    3. 重新運行上一次運行的sql語句
    SQL>/
    ?
    4. 將顯示的內容輸出到指定文件
    SQL> SPOOL file_name
    ?? 在屏幕上的所有內容都包含在該文件中,包括你輸入的sql語句。
    ?
    5. 關閉spool輸出
    SQL> SPOOL OFF
    ?? 只有關閉spool輸出,才會在輸出文件中看到輸出的內容。
    ?
    6.顯示一個表的結構
    SQL> desc table_name
    ?
    7. COL命令:
    主要格式化列的顯示形式。
    該命令有許多選項,具體如下:
    COL[UMN] [{ column|expr} [ option ...]]
    Option選項可以是如下的子句:
    ALI[AS] alias
    CLE[AR]
    FOLD_A[FTER]
    FOLD_B[EFORE]
    FOR[MAT] format
    HEA[DING] text
    JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
    LIKE { expr|alias}
    NEWL[INE]
    NEW_V[ALUE] variable
    NOPRI[NT]|PRI[NT]
    NUL[L] text
    OLD_V[ALUE] variable
    ON|OFF
    WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
    ?
    1). 改變缺省的列標題
    COLUMN column_name HEADING column_heading
    For example:
    Sql>select * from dept;
    ???? DEPTNO DNAME??????????????????????? LOC
    ---------- ---------------------------- ---------
    ???????? 10 ACCOUNTING?????????????????? NEW YORK
    sql>col? LOC heading location
    sql>select * from dept;
    ??? DEPTNO DNAME??????????????????????? location
    --------- ---------------------------- -----------
    ??????? 10 ACCOUNTING?????????????????? NEW YORK
    ?
    2). 將列名ENAME改為新列名EMPLOYEE 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). 設置列標題的對齊方式
    JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
    SQL> col ename justify center
    SQL> /
    ????? EMPNO?????????? ENAME?????????????????? JOB
    ----------?? ----------------------------------------?????? ---------
    ?????? 7369 SMITH??????????????????????????????????? CLERK
    ?????? 7499 ALLEN??????????????????????????????????? SALESMAN
    7521 WARD???????????????????????????????????? SALESMAN
    對于NUMBER型的列,列標題缺省在右邊,其它類型的列標題缺省在左邊
    ?
    5). 不讓一個列顯示在屏幕上
    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). 顯示列值時,如果列值為NULL值,用text值代替NULL值
    COMM NUL[L] text
    SQL>COL COMM NUL[L] text
    ?
    8). 設置一個列的回繞方式
    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). 顯示列的當前的顯示屬性值
    SQL> COLUMN column_name
    ?
    10). 將所有列的顯示屬性設為缺省值
    SQL> CLEAR COLUMNS
    ?
    8. 屏蔽掉一個列中顯示的相同的值
    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. 在上面屏蔽掉一個列中顯示的相同的值的顯示中,每當列值變化時在值變化之前插入n個空行。
    BREAK ON break_column SKIP n
    ?
    SQL> BREAK ON DEPTNO SKIP 1
    SQL> /
    DEPTNO ENAME SAL
    ---------- ----------- ---------
    10 CLARK 2450
    MILLER 1300
    ?
    20 SMITH 800
    ADAMS 1100
    ?
    10. 顯示對BREAK的設置
    SQL> BREAK
    ?
    11. 刪除6、7的設置
    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). 設置當前session是否對修改的數據進行自動提交
    SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
    ?
    2).在用start命令執行一個sql腳本時,是否顯示腳本中正在執行的SQL語句
    SQL> SET ECHO {ON|OFF}
    ?
    3).是否顯示當前sql語句查詢或修改的行數
    SQL> SET FEED[BACK] {6|n|ON|OFF}
    ?? 默認只有結果大于6行時才顯示結果的行數。如果set feedback 1 ,則不管查詢到多少行都返回。當為off 時,一律不顯示查詢的行數
    ?
    4).是否顯示列標題
    SQL> SET HEA[DING] {ON|OFF}
    當set heading off 時,在每頁的上面不顯示列標題,而是以空白行代替
    ?
    5).設置一行可以容納的字符數
    SQL> SET LIN[ESIZE] {80|n}
    ?? 如果一行的輸出內容大于設置的一行可容納的字符數,則折行顯示。
    ?
    6).設置頁與頁之間的分隔
    SQL> SET NEWP[AGE] {1|n|NONE}
    當set newpage 0 時,會在每頁的開頭有一個小的黑方框。
    當set newpage n 時,會在頁和頁之間隔著n個空行。
    當set newpage none 時,會在頁和頁之間沒有任何間隔。
    ?
    7).顯示時,用text值代替NULL值
    SQL> SET NULL text
    ?
    8).設置一頁有多少行數
    SQL> SET PAGES[IZE] {24|n}
    如果設為0,則所有的輸出內容為一頁并且不顯示列標題
    ?
    9).是否顯示用DBMS_OUTPUT.PUT_LINE包進行輸出的信息。
    SQL> SET SERVEROUT[PUT] {ON|OFF}?
    在編寫存儲過程時,我們有時會用dbms_output.put_line將必要的信息輸出,以便對存儲過程進行調試,只有將serveroutput變量設為on后,信息才能顯示在屏幕上。
    ?
    10).當SQL語句的長度大于LINESIZE時,是否在顯示時截取SQL語句。
    SQL> SET WRA[P] {ON|OFF}
    ?? 當輸出的行的長度大于設置的行的長度時(用set linesize n命令設置),當set wrap on時,輸出行的多于的字符會另起一行顯示,否則,會將輸出行的多于字符切除,不予顯示。
    ?
    11).是否在屏幕上顯示輸出的內容,主要用與SPOOL結合使用。
    SQL> SET TERM[OUT] {ON|OFF}
    ?? 在用spool命令將一個大表中的內容輸出到一個文件中時,將內容輸出在屏幕上會耗費大量的時間,設置set termspool off后,則輸出的內容只會保存在輸出文件中,不會顯示在屏幕上,極大的提高了spool的速度。
    ?
    12).將SPOOL輸出中每行后面多余的空格去掉
    SQL> SET TRIMS[OUT] {ON|OFF}?
    ???
    13)顯示每個sql語句花費的執行時間
    set TIMING? {ON|OFF}
    ?
    14.修改sql buffer中的當前行中,第一個出現的字符串
    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行成為當前行
    L[IST] [n]
    ?
    17.在sql buffer的當前行下面加一行或多行
    I[NPUT]
    ?
    18.將指定的文本加到sql buffer的當前行后面
    A[PPEND]
    SQL> select deptno,
    ?? 2? dname
    ?? 3? from dept;
    ???? DEPTNO DNAME
    ---------- --------------
    ???????? 10 ACCOUNTING
    ???????? 20 RESEARCH
    ???????? 30 SALES
    ???????? 40 OPERATIONS
    ?
    SQL> L 2
    ?? 2* dname
    SQL> a ,loc
    ?? 2* dname,loc
    SQL> L
    ?? 1? select deptno,
    ?? 2? dname,loc
    ?? 3* from dept
    SQL> /
    ?
    ???? DEPTNO DNAME????????? LOC
    ---------- -------------- -------------
    ???????? 10 ACCOUNTING???? NEW YORK
    ???????? 20 RESEARCH?????? DALLAS
    ???????? 30 SALES????????? CHICAGO
    ???????? 40 OPERATIONS???? BOSTON
    ?
    19.將sql buffer中的sql語句保存到一個文件中
    SAVE file_name
    ?
    20.將一個文件中的sql語句導入到sql buffer中
    GET file_name
    ?
    21.再次執行剛才已經執行的sql語句
    RUN
    or
    /
    ?
    22.執行一個存儲過程
    EXECUTE procedure_name
    ?
    23.在sql*plus中連接到指定的數據庫
    CONNECT user_name/passwd@db_alias
    ?
    24.設置每個報表的頂部標題
    TTITLE
    ?
    25.設置每個報表的尾部標題
    BTITLE
    ?
    26.寫一個注釋
    REMARK [text]
    ?
    27.將指定的信息或一個空行輸出到屏幕上
    PROMPT [text]
    ?
    28.將執行的過程暫停,等待用戶響應后繼續執行
    PAUSE [text]
    ?
    Sql>PAUSE Adjust paper and press RETURN to continue.
    ?
    29.將一個數據庫中的一些數據拷貝到另外一個數據庫(如將一個表的數據拷貝到另一個數據庫)
    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中執行一個操作系統命令:
    HOST
    ?
    Sql> host hostname
    該命令在windows下可能被支持。
    ?
    31.在sql*plus中,切換到操作系統命令提示符下,運行操作系統命令后,可以再次切換回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系統變量的值或sql*plus環境變量的值
    Syntax
    SHO[W] option
    where option represents one of the following terms or clauses:
    system_variable
    ALL
    BTI[TLE]
    ERR[ORS] [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY|
    TRIGGER|VIEW|TYPE|TYPE BODY} [schema.]name]
    LNO
    PARAMETERS [parameter_name]
    PNO
    REL[EASE]
    REPF[OOTER]
    REPH[EADER]
    SGA
    SPOO[L]
    SQLCODE
    TTI[TLE]
    USER
    ?
    1) . 顯示當前環境變量的值:
    Show all
    ?
    2) . 顯示當前在創建函數、存儲過程、觸發器、包等對象的錯誤信息
    Show error
    當創建一個函數、存儲過程等出錯時,變可以用該命令查看在那個地方出錯及相應的出錯信息,進行修改后再次進行編譯。
    ?
    3) . 顯示初始化參數的值:
    show PARAMETERS [parameter_name]
    ?
    4) . 顯示數據庫的版本:
    show REL[EASE]
    ?
    5) . 顯示SGA的大小
    show SGA
    ?
    6). 顯示當前的用戶名
    show user

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

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

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

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

    mysql?的blob字段只有64k,要有大點的文件要用longBlob
    ??????????????????

    posted @ 2007-01-30 23:12 sunny 閱讀(210) | 評論 (0)編輯 收藏
    #include<iostream>//快速排序不新建臨時數組
    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) | 評論 (0)編輯 收藏

    #include<iostream>//一個快速排序的例子

    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]);//把中間的數作為分組的標準,并把它換到數組首
    ???? 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++)//把數據 考到臨時數組
    ???????????? {
    ????????????? if(*pt>pivot)
    ??????????????????? *rp--=*pt++;
    ?????????????? else
    ??????????????????? *lp++=*pt++;??????????????????
    ???????????? }
    ?? *lp=pivot;
    ??? pt=a;
    ??? lp=p;
    ??? for(int i=0;i<n;i++)//把數據考回來
    ?????????? *pt++=*lp++;
    ? delete[] p;
    ? int left=rp-p;//計算左邊部分的元素個數
    ? 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) | 評論 (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){//返回一個引用而不是一個復制的數據
    ???? 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) | 評論 (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) | 評論 (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 的版本有關如果在2.2apache就會報錯!
    posted @ 2006-09-06 17:23 sunny 閱讀(193) | 評論 (0)編輯 收藏
    ???前幾天在寫代碼的時又遇到一個頁面不能顯示一個list的錯誤!
    ???現象:后臺可以打出log(list.size())。但是頁面上用c 標簽顯示時,提示類型錯誤。用ww標簽可以輸出? 循?環,但是具體的property顯示不出來!
    原因:原來是在用Hibernate 的createMysqlQuery()時沒有加上addEntity().也就是hibernate 返回的是一個object 的list。而我在頁面上是把這個list ,當作具體的對象的list操作的!所以才出現了這樣的錯誤!
    啟發:在與數據庫打交道時要注意把object轉換成具體的class!要盡量用hibernate的hql,這樣可以減少類型轉換問題。要盡量用面向對象的思想來考慮問題!
    posted @ 2006-07-19 17:37 sunny 閱讀(115) | 評論 (0)編輯 收藏
    <2006年7月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    相冊

    收藏夾

    朋友

    搜索

    •  

    最新評論

    評論排行榜

    主站蜘蛛池模板: 亚洲Av无码乱码在线播放| 免费黄色福利视频| 亚洲v国产v天堂a无码久久| 亚洲色成人WWW永久在线观看| 精品国产sm捆绑最大网免费站| 亚洲成在人天堂一区二区| 久久久精品午夜免费不卡| 久久亚洲国产伦理| 每天更新的免费av片在线观看| 亚洲精品电影天堂网| 人与禽交免费网站视频| 亚洲精品123区在线观看| 在线精品免费视频| 国产亚洲一卡2卡3卡4卡新区| 国产男女猛烈无遮挡免费网站 | 1000部国产成人免费视频| 亚洲妓女综合网99| 成年女人18级毛片毛片免费| 亚洲A∨精品一区二区三区下载 | 丁香花免费高清视频完整版| 亚洲七久久之综合七久久| 亚洲AV成人潮喷综合网| 国产在线观看免费视频软件| 亚洲中文字幕在线无码一区二区| 成年午夜视频免费观看视频| 色多多A级毛片免费看| 久久精品国产精品亚洲蜜月| 无人影院手机版在线观看免费 | 6080午夜一级毛片免费看 | 亚洲春色在线视频| 99在线精品视频观看免费| 国产精品亚洲专区无码不卡| 亚洲精品无码不卡在线播放HE| 99热这里有免费国产精品| 亚洲国产精品ⅴa在线观看| 亚洲中文字幕无码专区| h视频在线观看免费网站| 一进一出60分钟免费视频| 亚洲资源在线观看| 四虎永久在线精品免费观看地址| 久别的草原电视剧免费观看|