posts - 18,  comments - 1,  trackbacks - 0
            2007年3月11日
          再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 閱讀(242) | 評論 (0)編輯 收藏
          實際編程時,要使Log4j真正在系統中運行事先還要對配置文件進行定義。定義步驟就是對Logger、Appender及Layout的分別使用。 Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是java properties(key=value)【Java特性文件(鍵=值)】。下面我們介紹使用Java特性文件做為配置文件的方法 具體如下:      1、配置根Logger,其語法為:   log4j.rootLogger = [ level ] , appenderName1, appenderName2, … level : 是日志記錄的優(yōu)先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優(yōu)先級從高到低分別是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(將日志信息以流格式發(fā)送到任意指定的地方) 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: 輸出日志信息優(yōu)先級,即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: 輸出日志事件的發(fā)生位置,相當于%C.%M(%F:%L)的組合,包括類目名、發(fā)生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10) %x: 輸出和當前線程相關聯的NDC(嵌套診斷環(huán)境),尤其用到像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組件說明的一個簡化;下面給出一個具體配置例子,在程序中可以參照執(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   根據上面的日志格式,某一個程序的輸出結果如下:   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配置文件實現了輸出到控制臺、文件、回滾文件、發(fā)送日志郵件、輸出到數據庫日志表、自定義標簽等全套功能。擇其一二使用就夠用了, 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 # 發(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 # 用于數據庫 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 閱讀(493) | 評論 (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 閱讀(310) | 評論 (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 閱讀(154) | 評論 (0)編輯 收藏

          上午:

          一.JDBC原理概述

          ?

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

          ?

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

          ?

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

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

          ?

          驅動開發(fā)必須要實現Driver接口。

          數據庫驅動的實現方式

          JDBC-ODBC橋接式

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

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

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

          ?

          二.JDBC的API

          ?

          java.sql包和javax.sql包

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

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

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

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

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

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

          ?

          下午:

          三.JDBC應用步驟

          1,注冊加載一個driver驅動

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

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

          4,執(zhí)行sql語句

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

          6,關閉Statement

          7,關閉連接Connection。

          ?

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

          ?

          訪問Oracle的數據庫的驅動名字叫ojdbc14.jar,要使用這個驅動程序,要先將他加到環(huán)境變量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

          ?

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

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

          ??? Connection連接是通過DriverManager的靜態(tài)方法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,代表執(zhí)行查詢操作;否則代表執(zhí)行更新操作.

          ???

          ??? ResultSet

          ??? next()方法:

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

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

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

          ???

          ??? 關閉問題:

          ??? 使用Connection對象獲得一個Statement,Statement中的executeQuery(String sql) 方法可以使用select語句查詢,并且返回一個結果集 ResultSet通過遍歷這個結果集,可以獲得select語句的查詢結果,ResultSet的next()方法會操作一個游標從第一條記錄的前邊開始讀取,直到最后一條記錄。executeUpdate(String sql) 方法用于執(zhí)行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語句傳到數據庫后,數據庫會先對其編譯再執(zhí)行。在使用Statement時,如果要執(zhí)行一組類似的SQL操作時,這樣做效率很低,而且把不同類型的數據直接寫在SQL語句中是比較麻煩的。這時應該用PreparedStatement來代替Statement,PreparedStatement 接口繼承 Statement,并和他在兩方面有所不同:
          ?(1)PreparedStatement 實例包含已編譯的 SQL 語句。這就是使語句先“準備好”。包含于 PreparedStatement對象中的SQL 語句可具有一個或多個 IN 參數。IN參數的值在 SQL 語句創(chuàng)建時未被指定。相反的,該語句為每個 IN 參數保留一個問號(“?”)作為占位符。每個問號的值必須在該語句執(zhí)行之前,通過適當的setXXX 方法來提供。
          ?(2)由于 PreparedStatement 對象已預編譯過,所以其執(zhí)行速度要快于 Statement 對象。因此,多次執(zhí)行的 SQL 語句經常創(chuàng)建為 PreparedStatement 對象,以提高效率。
          ??

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

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

          ?

          4.傳遞 IN 參數
          ?在執(zhí)行 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實現的。持久層是與業(yè)務無關的,具體的業(yè)務由業(yè)務層完成,當業(yè)務層需要和數據庫進行交互時,就需要通過持久層來操作。

          7.BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
          ?由于System.in是字節(jié)流,我們需要把他轉成字符流。并用BufferedReader包裝后方便我們的操作。
          ?
          8.為了區(qū)分表中不同的數據,我們要給放入表中持久化的每個對象都加上一個唯一的標識,這就是ID,ID是與業(yè)務無關的。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)
          原子操作:不可再分的操作,一個操作不能再分成比它更細小的操作.
          事務是針對原子操作的,要求原子操作不可再分,并且必須同時成功同時失敗。
          事務就是把一些非原子操作,變成原子操作,由應用服務器來提出要求,由數據庫服務器來執(zhí)行操作.

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

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

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

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

          以上的五個事務隔離級別都是在Connection類中定義的靜態(tài)常量,使用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)
          在創(chuàng)建Statement的時候就要指定這兩個參數,使用Statement,第一個參數代表滾動特性常量,第二個代表更新特性常量


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


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


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

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

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

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

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

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

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

          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修改剛修執(zhí)行過的sql的命令。
          修改方法二:
          l? 3 先定位到行??? c?? /舊串/新串

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

          誤的具體信息)

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

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

          /*** 初次使用時注意? ****
          運行角本時的命令:
          先切換到unix環(huán)境下,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也會觸發(fā)排序操作。

          過濾操作:? 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???

          ??????????? 注意區(qū)間:[? ]是一個閉區(qū)間
          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';具體到哪個人所在的部門

          練習二:每個員工所在的部門和部門所在的地區(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;
          等值連接:
          練習三:找出每個員工和每個員工的工資級別
          ? 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;
          自連接:當一個表的插入行之間有了關系時就發(fā)生了(又名:內連接)
          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? 子句也會觸發(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 子句后面跟有條件只能是查詢的結果中的字段,所以我們會人為在結果要加入一些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?
          開發(fā)流程先進行需求分析,進行系統設計,建表,再進行開發(fā)編碼,測試最終產品上線試運行。
          把軟件設計模型轉化為數據中的表,設計時要考慮性能的設計

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

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


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

          創(chuàng)建表語句:
          create??? table??? [schema].表名?? (? 字段名,?? 字段類型?? 約束條件);??????????????????? schema?? 默認就是當前用戶,嚴格來訪問表名完整的寫法是schema.tablename
          數據類型:
          表名的命令規(guī)則: 首字母為字母,不得超過30個字符
          char(size)??????????????? 定長? 不管是否達到最大寬度,都會點最大的寬度。
          varchar2(size)???????? 可變長?? 按實際的字節(jié)占用空間
          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

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

          非空約束:
          ??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 才為有效值 .??

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

          創(chuàng)建表的語法:
          ?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? 提交,此時說明前面所有語句都成功執(zhí)行
          rollback 回退操作,此時會恢復至上一次提交時的狀態(tài)。
          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、人為的違反約束規(guī)定根據錯誤信息獲取!
          ???????????????????????????????? 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個序列放入當前會話的序列池中備用以加快效率,序列會出現不連續(xù)的動作回退操作不會影響序列取值)
          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;(執(zhí)行此命令要有DBA權限,一般用戶執(zhí)行出錯)
          修改序列:(此命令不常用,只需了解就行不必深究)
          alter? sequence? 序列名? 修改項;
          刪除序列sequence
          drop? sequence 序列名;

          創(chuàng)建示圖: creating????? views(屬于了解知識)
          desc? user_views;
          select?? text?? from? user_views??? where?? view_name='TEST1_V1' ;
          示圖就相當于一條select 語句,定義了一個示圖就是定義了一個sql語句,示圖不占空間,使用view 不會提高性能,但是能簡單化sql語句
          (擴展知識: oracle? 8i 以后的新示圖)MV?? 物化視圖(占存儲空間,把select 結果存在一個空間,會提高查詢視圖,增強實時性,但是存在刷新問題, 主要應用在數據倉庫中用要用于聚合表)
          使用示圖的好處:控制數據訪問權限.
          如何創(chuàng)建一個示圖:
          create?? or replace?? views?? test_vi??? as?????? select?????? *?? from??? test1?? where c1=1;
          此時往表test1(base?? table? 基表)中插入數據時:表中沒能變化,示圖中的數據發(fā)生改變
          從示圖中插數據時相對應的表會發(fā)生改變:
          往示圖中插數據時,會直接插進基表中,查看示圖中的數據時,相當于就是執(zhí)行創(chuàng)建時的select語句。
          簡單示圖:能進行DML操作。
          復雜示圖:來源于多張表,不能執(zhí)行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; 創(chuàng)建公共的同義詞,但是要權限.
          刪除同義詞:
          drop? synonym??? 同義詞名稱

          創(chuàng)建索引:? Creating??? indexes(概念很重要對系統的性能影響非常大)
          建索引的目的就是為了加快查詢速度。
          索引就相于一本的書的目錄。索引點系統空間,屬于表的附屬物。刪除一個表時,相對應的索引也會刪除。truncate 表時索引結構在,但是數據不存在。
          full?? table??? scan? 全表掃描
          用索引就是為了快速定位數據:(理解時就以字典的目錄為例)
          查看表的rowid:
          select???? rowid? , first_name??? from? s_emp;
          rowid 定義的信息有:? object?? block? table
          每條記錄都有自己的rowid
          索引由誰創(chuàng)建:用戶,建索引后會使DML操作效率慢,但是對用戶查詢會提高效率,這就是我們建索引的最終目的,
          創(chuàng)建一個索引:
          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、關于針對表操作的語法知識:
          ? 創(chuàng)建表:
          ?? 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、人為的違反約束規(guī)定根據錯誤信息獲取!
          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個序列放入當前會話的序列池中備用以加快效率,序列會出現不連續(xù)的動作回退操作不會影響序列取值)
          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;(執(zhí)行此命令要有DBA權限,一般用戶執(zhí)行出錯)
          修改序列:(此命令不常用,只需了解就行不必深究)
          alter? sequence? 序列名? 修改項;
          刪除序列sequence
          drop? sequence 序列名;
          ****************************************************************************
          5、創(chuàng)建示圖: creating????? views(屬于了解知識)
          示圖就相當于一條select 語句,定義了一個示圖就是定義了一個sql語句,示圖不占空間,使用view 不會提高性能,但是能簡單化sql語句
          (擴展知識: oracle? 8i 以后的新示圖)MV?? 物化視圖(占存儲空間,把select 結果存在一個空間,會提高查詢視圖,增強實時性,但是存在刷新問題, 主要應用在數據倉庫中用要用于聚合表)
          使用示圖的好處:控制數據訪問權限.
          如何創(chuàng)建一個示圖:
          create?? or replace?? views?? test_vi??? as?????? select?????? *?? from??? test1?? where c1=1;
          此時往表test1(base?? table? 基表)中插入數據時:表中沒能變化,示圖中的數據發(fā)生改變
          從示圖中插數據時相對應的表會發(fā)生改變:
          往示圖中插數據時,會直接插進基表中,查看示圖中的數據時,相當于就是執(zhí)行創(chuàng)建時的select語句。
          簡單示圖:能進行DML操作。
          復雜示圖:來源于多張表,不能執(zhí)行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; 創(chuàng)建公共的同義詞,但是要權限.
          刪除同義詞:
          drop? synonym??? 同義詞名稱

          ****************************************************************************
          6、創(chuàng)建索引:? Creating??? indexes(概念很重要對系統的性能影響非常大)
          建索引的目的就是為了加快查詢速度。
          索引就相于一本的書的目錄。索引點系統空間,屬于表的附屬物。刪除一個表時,相對應的索引也會刪除。truncate 表時索引結構在,但是數據不存在。
          full?? table??? scan? 全表掃描
          用索引就是為了快速定位數據:(理解時就以字典的目錄為例)
          查看表的rowid:
          select???? rowid? , first_name??? from? s_emp;
          rowid 定義的信息有:? object?? block? table
          每條記錄都有自己的rowid
          索引由誰創(chuàng)建:用戶,建索引后會使DML操作效率慢,但是對用戶查詢會提高效率,這就是我們建索引的最終目的,
          創(chuàng)建一個索引:
          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 閱讀(762) | 評論 (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;
           
          練習二:每個員工所在的部門和部門所在的地區(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;

          非等值連接
          練習三:查出每個員工和每個員工的工資級別)
          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 閱讀(433) | 評論 (0)編輯 收藏

          SQL*PLUS命令的使用大全

          ?????????????????????????????? SQL*PLUS命令的使用大全
          ???
          ?????? Oracle的sql*plus是與oracle進行交互的客戶端工具。在sql*plus中,可以運行sql*plus命令與sql*plus語句。我們通常所說的DML、DDL、DCL語句都是sql*plus語句,它們執(zhí)行完后,都可以保存在一個被稱為
          sql buffer的內存區(qū)域中,并且只能保存一條最近執(zhí)行的sql語句,我們可以對保存在sql buffer中的sql 語句進行修改,然后再次執(zhí)行,sql*plus一般都與數據庫打交道。
          ?? 除了sql*plus語句,在sql*plus中執(zhí)行的其它語句我們稱之為sql*plus命令。它們執(zhí)行完后,不保存在sql buffer的內存區(qū)域中,它們一般用來對輸出的結果進行格式化顯示,以便于制作報表。
          ?? 下面就介紹一下一些常用的sql*plus命令:
          ?
          1. 執(zhí)行一個SQL腳本文件
          SQL>start file_name
          SQL>@ file_name
          我們可以將多條sql語句保存在一個文本文件中,這樣當要執(zhí)行這個文件中的所有的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命令執(zhí)行一個sql腳本時,是否顯示腳本中正在執(zhí)行的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語句花費的執(zhí)行時間
          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.再次執(zhí)行剛才已經執(zhí)行的sql語句
          RUN
          or
          /
          ?
          22.執(zhí)行一個存儲過程
          EXECUTE procedure_name
          ?
          23.在sql*plus中連接到指定的數據庫
          CONNECT user_name/passwd@db_alias
          ?
          24.設置每個報表的頂部標題
          TTITLE
          ?
          25.設置每個報表的尾部標題
          BTITLE
          ?
          26.寫一個注釋
          REMARK [text]
          ?
          27.將指定的信息或一個空行輸出到屏幕上
          PROMPT [text]
          ?
          28.將執(zhí)行的過程暫停,等待用戶響應后繼續(xù)執(zhí)行
          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中執(zhí)行一個操作系統命令:
          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環(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) . 顯示當前環(huán)境變量的值:
          Show all
          ?
          2) . 顯示當前在創(chuàng)建函數、存儲過程、觸發(fā)器、包等對象的錯誤信息
          Show error
          當創(chuàng)建一個函數、存儲過程等出錯時,變可以用該命令查看在那個地方出錯及相應的出錯信息,進行修改后再次進行編譯。
          ?
          3) . 顯示初始化參數的值:
          show PARAMETERS [parameter_name]
          ?
          4) . 顯示數據庫的版本:
          show REL[EASE]
          ?
          5) . 顯示SGA的大小
          show SGA
          ?
          6). 顯示當前的用戶名
          show user

          posted @ 2007-03-20 10:36 sunny| 編輯 收藏
          一個寄人籬下的無業(yè)游民被人拋棄!
          posted @ 2007-03-11 21:45 sunny 閱讀(275) | 評論 (0)編輯 收藏
          <2007年3月>
          25262728123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          朋友

          搜索

          •  

          最新評論

          評論排行榜

          主站蜘蛛池模板: 翼城县| 封开县| 永新县| 炎陵县| 南华县| 天长市| 怀集县| 叶城县| 图木舒克市| 尚志市| 寿光市| 宿松县| 盈江县| 雷波县| 马龙县| 汝南县| 寿光市| 邮箱| 拜城县| 石屏县| 扶沟县| 阿拉善左旗| 娱乐| 陕西省| 嵊泗县| 黔东| 扶沟县| 泾阳县| 泰州市| 平武县| 新巴尔虎右旗| 鹿泉市| 永嘉县| 清新县| 莫力| 阳高县| 丰镇市| 宁城县| 新巴尔虎左旗| 晋州市| 江城|