斷點(diǎn)

          每天進(jìn)步一點(diǎn)點(diǎn)!
          posts - 174, comments - 56, trackbacks - 0, articles - 21

          2010年7月18日

          1、http://www.jar114.com/site.html
          該網(wǎng)站可以提供我們項(xiàng)目中經(jīng)常需要的jar包,如果缺少包,就可以在這里查找。

          posted @ 2010-10-07 11:54 斷點(diǎn) 閱讀(420) | 評(píng)論 (1)編輯 收藏

          流程定義文件*.jpdl.xml中如果有中文亂碼,肯定是task中有中文。

          需要在eclipse安裝軟件下,即E:\eclipse\eclipse.ini增加
          -Dfile.encoding=UTF-8
          然后重啟eclipse即可解決。

          posted @ 2010-10-05 21:06 斷點(diǎn) 閱讀(805) | 評(píng)論 (0)編輯 收藏

          配置jbpm4工程的運(yùn)行環(huán)境:
          1、添加依賴(lài)庫(kù)。
          E:\JBPM\jbpm-4.3\jbpm.jar
          E:\JBPM\jbpm-4.3\lib下的jar包。

          2、添加配置文件。
          E:\JBPM\jbpm-4.3\examples\src下的配置文件拷貝到自己java工程的src下。

          ---------------------------------------------------------------
          管理流程定義:發(fā)布流程定義、查看流程定義、刪除流程定義。
          RepositoryService repositoryService = processEngine.getRepositoryService();

          String deploymentId = repositoryService.createDeployment().addResourceFromClasspath

          ("helloworld.jpdl.xml").deploy();
          List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();  
          repositoryService.deleteDeploymentCascade(deploymentId);
          ---------------------------------------------------------------

          管理流程實(shí)例:發(fā)起新流程、執(zhí)行等待的流程、查看流程實(shí)例、終止流程實(shí)例、刪除流程實(shí)例。
          ExecutionService executionService = processEngine.getExecutionService();

          ProcessInstance pi = executionService.startProcessInstanceByKey("helloworld");
          ProcessInstance pi = executionService.signalExecutionById(pi.getId()); //執(zhí)行等待的流程.
          List<ProcessInstance> list = executionService.createProcessInstanceQuery().list();
          executionService.endProcessInstance(pi.getId(), "cancel");
          executionService.deleteProcessInstanceCascade(pi.getId());


          TaskService taskService = processEngine.getTaskService();
          taskService.completeTask(taskId, map);

          控制流程的活動(dòng):Start、End、Decision、Fork、Join、Sub-process、State、task.
          原子活動(dòng):java、script、sql、hql、email。

          posted @ 2010-10-05 21:01 斷點(diǎn) 閱讀(450) | 評(píng)論 (0)編輯 收藏

          配置開(kāi)發(fā)環(huán)境:
          1、jbpm4:http://sourceforge.net/projects/jbpm/files/ 下選擇jbpm-4.3.zip  137.9M

          2、eclipse3.5版本以上 : http://www.eclipse.org/downloads/ 下選擇 Eclipse IDE for Java EE  190M

          3、GPD (Graphical Process Designer)插件,路徑:E:\jbpm-4.3\install\src\gpd\jbpm-gpd-site.zip。
          通過(guò)Eclipse-->help-->Install New Software-->Add-->Archive到插件所在路徑。

           

          posted @ 2010-10-05 16:37 斷點(diǎn) 閱讀(709) | 評(píng)論 (1)編輯 收藏

          java.lang.NullPointerException
           at jxl.read.biff.File.<init>(File.java:77)
           at jxl.Workbook.getWorkbook(Workbook.java:250)
           at jxl.Workbook.getWorkbook(Workbook.java:235)
           at org.drools.decisiontable.parser.xls.ExcelParser.parseFile(ExcelParser.java:76)
           at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:89)
           at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:68)
           at com.sample.DecisionTableTest.readDecisionTable(DecisionTableTest.java:59)
           at com.sample.DecisionTableTest.main(DecisionTableTest.java:36)

          Drools調(diào)用readDecisionTable()方法里面一處為:
          InputStream is = DecisionTableTest.class.getResourceAsStream("rules\\Sample.xls");
          final String drl = converter.compile( is, InputType.XLS );  
               
          需改為如下,取的class即錯(cuò)誤解決。
          InputStream is = DecisionTableTest.class.getClassLoader().getResourceAsStream("rules\\Sample.xls");
          final String drl = converter.compile( is, InputType.XLS );

          posted @ 2010-10-05 00:39 斷點(diǎn) 閱讀(697) | 評(píng)論 (0)編輯 收藏

          org.mvel.CompileException: can not resolve identifier: 'declr'
           at org.mvel.ASTNode.getReducedValue(ASTNode.java:315)
           at org.mvel.ast.PropertyASTNode.getReducedValue(PropertyASTNode.java:29)
           at org.mvel.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:103)
           at org.mvel.MVELInterpretedRuntime.parse(MVELInterpretedRuntime.java:51)
           at org.mvel.TemplateInterpreter.execute(TemplateInterpreter.java:428)
           at org.mvel.TemplateInterpreter.parse(TemplateInterpreter.java:320)
           at org.drools.rule.builder.dialect.java.AbstractJavaBuilder.generatTemplates(AbstractJavaBuilder.java:113)
           at org.drools.rule.builder.dialect.java.JavaConsequenceBuilder.build(JavaConsequenceBuilder.java:95)
           at org.drools.rule.builder.RuleBuilder.build(RuleBuilder.java:67)
           at org.drools.compiler.PackageBuilder.addRule(PackageBuilder.java:446)
           at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:304)
           at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:167)
           at com.sample.DecisionTableTest.readDecisionTable(DecisionTableTest.java:63)
           at com.sample.DecisionTableTest.main(DecisionTableTest.java:36)

          替換mvel.jar為mvel14-1.2.10.jar后不再報(bào)錯(cuò),好像是jar包的問(wèn)題。
          看了下jar包里面的org.mvel.ASTNode.getReducedValue方法已經(jīng)注釋掉了。

          posted @ 2010-10-05 00:32 斷點(diǎn) 閱讀(717) | 評(píng)論 (0)編輯 收藏

          WARNING: Wasn't able to correctly close stream for decision table. nulljava.lang.NullPointerException
           at jxl.read.biff.File.<init>(File.java:77)
           at jxl.Workbook.getWorkbook(Workbook.java:250)
           at jxl.Workbook.getWorkbook(Workbook.java:235)
           at org.drools.decisiontable.parser.xls.ExcelParser.parseFile(ExcelParser.java:76)
           at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:89)
           at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:68)
           at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:110)
           at com.sample.DecisionTableTest.readDecisionTable(DecisionTableTest.java:57)
           at com.sample.DecisionTableTest.main(DecisionTableTest.java:35)

          在web項(xiàng)目中的原先的寫(xiě)法為:
          final String drl = converter.compile( "rules\\Sample.xls", InputType.XLS );

          參考了下別人的寫(xiě)法,改為下面的方式進(jìn)行處理:  
          InputStream is = DecisionTableTest.class.getClassLoader().getResourceAsStream("rules\\Sample.xls");
          final String drl = converter.compile( is, InputType.XLS );

          posted @ 2010-10-05 00:22 斷點(diǎn) 閱讀(613) | 評(píng)論 (0)編輯 收藏

          由于drools有新版本了,所以與MyEclipse整合進(jìn)行了解下。
          整合步驟如下:
          1、下載MyEclipse 8.5;
          2、在http://www.jboss.org/drools/downloads.html下載Drools Eclipse 3.5 Workbench 5.1 插件;
          3、在E:\MyEclipse8.5下新建2個(gè)文件:links、myplugins。
          E:\MyEclipse 8.5\links:放drools.link配置文件,內(nèi)容為path=E:\\MyEclipse 8.5\\myplugins\\drools\\
          E:\MyEclipse 8.5\myplugins:放drools文件,該E:\MyEclipse 8.5\myplugins\drools\eclipse下放置從網(wǎng)上下載的drools插件的features和plugins。
          4、重啟MyEclipse 8.5即可看見(jiàn)drools圖標(biāo)。
          5、安裝Jboss:下載jboss-5.0.0.GA,解壓即可。
          打開(kāi)MyEclipse->window->Preference->MyEclipse->Servers->JBoss->JBoss 5.x進(jìn)行jre及相關(guān)配置。

          posted @ 2010-10-04 12:00 斷點(diǎn) 閱讀(1055) | 評(píng)論 (0)編輯 收藏

          在命令行下運(yùn)行java程序,出現(xiàn)如上異常Exception in thread "main" java.lang.UnsupportedClassVersionError。

          主要是jdk的版本被oracle給換成低版本了。
          可以在命令行下輸入:javac -version 查看版本,最后把%JAVA_HOME%\bin;添加到Oracle之前,再重開(kāi)啟電腦,編譯,運(yùn)行即可。

          可以查考:http://hi.baidu.com/tianxingacer/blog/item/e628b947ffc54f016a63e5ac.html/cmtid/1fe1e9ae1dc5b9f6faed50d9

          posted @ 2010-10-02 23:52 斷點(diǎn) 閱讀(1068) | 評(píng)論 (0)編輯 收藏

          我的機(jī)器以前裝的是offices2003自帶的js調(diào)試工具,昨天按照上IE8后,js調(diào)試工具有時(shí)候是ie8的調(diào)試界面,有時(shí)是ie6的調(diào)試界面,經(jīng)網(wǎng)上查找已找到原因。

          主要是我把IE8的‘腳本’下的“啟動(dòng)調(diào)試”給關(guān)了,所以最后只出現(xiàn)ie6的調(diào)試界面。

          解決方法:打開(kāi)IE8后,點(diǎn)擊"工具"->"開(kāi)發(fā)人員工具",或者快捷鍵F12,會(huì)打開(kāi)頁(yè)面調(diào)試窗口。

          posted @ 2010-08-23 15:34 斷點(diǎn) 閱讀(3383) | 評(píng)論 (0)編輯 收藏

              今天用反編譯工具查看java源代碼,發(fā)現(xiàn)反編譯的java文件有錯(cuò)誤,在網(wǎng)上了解了下,是原先開(kāi)發(fā)人員對(duì)代碼做了一下加密處理。下面介紹一下java的混淆器Proguard。
              ProGuard 是一個(gè)免費(fèi)的 Java類(lèi)文件的壓縮,優(yōu)化,混肴器。它刪除沒(méi)有用的類(lèi),字段,方法與屬性。使字節(jié)碼最大程度地優(yōu)化,使用簡(jiǎn)短且無(wú)意義的名字來(lái)重命名類(lèi)、字段和方法 。eclipse已經(jīng)把Proguard集成在一起了。

          其他地方也有介紹,如下:http://blog.csdn.net/alex197963/archive/2008/07/07/2620603.aspx

          posted @ 2010-08-10 11:40 斷點(diǎn) 閱讀(323) | 評(píng)論 (0)編輯 收藏

          1、當(dāng)處理多個(gè)訪問(wèn)相同數(shù)據(jù)的用戶(hù)時(shí),通常可能出現(xiàn)三種問(wèn)題:
          臟讀
          當(dāng)應(yīng)用程序使用了被另一個(gè)應(yīng)用程序修改過(guò)的數(shù)據(jù),而這個(gè)數(shù)據(jù)處于未提交狀態(tài)時(shí),就會(huì)發(fā)生臟讀。第二個(gè)應(yīng)用程序隨后會(huì)請(qǐng)求回滾被其修改的數(shù)據(jù)。第一個(gè)事務(wù)使用的數(shù)據(jù)就會(huì)
          被損壞,或者“變臟”。

          不可重復(fù)的讀
          當(dāng)一個(gè)事務(wù)獲得了數(shù)據(jù),而該數(shù)據(jù)隨后被一個(gè)單獨(dú)的事務(wù)所更改時(shí),若第一個(gè)事務(wù)再次讀取更改后的數(shù)據(jù),就會(huì)發(fā)生不可重復(fù)的讀。這樣,第一個(gè)事務(wù)進(jìn)行了一個(gè)不可重復(fù)的讀。

          虛讀
          當(dāng)事務(wù)通過(guò)某種查詢(xún)獲取了數(shù)據(jù),另一個(gè)事務(wù)修改了部分該數(shù)據(jù),原來(lái)的事務(wù)第二次獲取該數(shù)據(jù)時(shí),就會(huì)發(fā)生虛讀。第一個(gè)事務(wù)現(xiàn)在會(huì)有不同的結(jié)果集,它可能包含虛讀。

           

          2、Java.sql.Connection接口定義的隔離級(jí)別
          TRANSACTION_NONE 說(shuō)明不支持事務(wù)
          TRANSACTION_READ_UNCOMMITTED 說(shuō)明在提交前一個(gè)事務(wù)可以看到另一個(gè)事務(wù)的變化。這樣臟讀、不可重復(fù)的讀和虛讀都是允許的。
          TRANSACTION_READ_COMMITTED 說(shuō)明讀取未提交的數(shù)據(jù)是不允許的。這個(gè)級(jí)別仍然允許不可重復(fù)的讀和虛讀產(chǎn)生。
          TRANSACTION_REPEATABLE_READ 說(shuō)明事務(wù)保證能夠再次讀取相同的數(shù)據(jù)而不會(huì)失敗,但虛讀仍然會(huì)出現(xiàn)。
          TRANSACTION_SERIALIZABLE 是最高的事務(wù)級(jí)別,它防止臟讀、不可重復(fù)的讀和虛讀。


          3、事務(wù)的隔離級(jí)別
          在J2EE中,通過(guò)java.sql.Connection接口設(shè)置事務(wù)隔離級(jí)別,這一接口為連接的隔離級(jí)別提供了getter()和setter()
          Int getTransactionIsolation() throws SQLException
          void setTransactionIsolation() throws SQLException
          Connection對(duì)象負(fù)責(zé)事務(wù),一旦收到事務(wù)請(qǐng)求,事務(wù)將自動(dòng)提交,因?yàn)镃onnection對(duì)象已定義為自動(dòng)提交方式,可通過(guò)setAutoCommit(false)禁用自動(dòng)提交模式
          另外java.sql.DatabaseMetaData接口為數(shù)據(jù)存儲(chǔ)提供支持的隔離級(jí)別查找方法:getTransactionIsolation(),supportsTransactionIsolationLevel()
          對(duì)多個(gè)庫(kù)操作的分布式事務(wù)必須在所有庫(kù)中執(zhí)行同一個(gè)隔離級(jí)別,否則會(huì)出現(xiàn)意想不到的結(jié)果


          4、事務(wù)提交和回滾
          為了完成提交事務(wù)和回滾事務(wù),JDBC API包括了兩個(gè)方法作為 Connection 接口的一部分。若將 Connection 對(duì)象名稱(chēng)指定為 con,通過(guò)調(diào)用 con.commit(); 可以保存程序狀態(tài);

          通過(guò)調(diào)用 con.rollback(); 可以返回到以前保存的狀態(tài)。如果數(shù)據(jù)庫(kù)實(shí)際運(yùn)行操作時(shí)有錯(cuò)誤發(fā)生,這兩個(gè)方法都會(huì)拋出 SQLExceptions,所以您需要在 try ... catch 塊中包裝它們。


          5、批處理和事務(wù)
          缺省情況下,JDBC 驅(qū)動(dòng)程序運(yùn)行在被稱(chēng)為自動(dòng)提交的模式下,可禁用自動(dòng)提交模式
          con.setAutoCommit(false);
          批處理操作中通過(guò)在一次單獨(dú)的操作(或批處理)中執(zhí)行多個(gè)數(shù)據(jù)庫(kù)更新操作
          {con.setAutoCommit(false) ;
          Statement stmt = connection.createStatement() ; stmt.addBatch("INSERT INTO people VALUES('Joe Jackson', 0.325, 25, 105) ; stmt.addBatch("INSERT INTO people

          VALUES('Jim Jackson', 0.349, 18, 99) ; stmt.addBatch("INSERT INTO people VALUES('Jack Jackson', 0.295, 15, 84) ;
          int[] updateCounts = stmt.executeBatch() ; con.commit() ;

          posted @ 2010-07-25 21:18 斷點(diǎn) 閱讀(437) | 評(píng)論 (0)編輯 收藏

          Initial Capacity:池的連接數(shù)量,在啟動(dòng)時(shí)創(chuàng)建
          Maximun Capacity:這是池可以打開(kāi)的連接的最大數(shù)量
          Capacity Increment:成組地打開(kāi)增量連接
          Login Delay Seconds:池驅(qū)動(dòng)程序在啟動(dòng)時(shí)打開(kāi)每一個(gè)新的連接需要等待的時(shí)間
          Refresh Period(刷新周期)
          Supports Local Transaction:只用于XA連接池
          Allow Shrinking and Shrink Period(允許收縮和收縮期):如果池的數(shù)量太大,超過(guò)了初始,且如果任何一個(gè)連接在收縮期內(nèi)空閑,那么空閑的連接將在收縮期末關(guān)閉


          監(jiān)控JDBC連接池:
          Waiters Hight字段指明了最多有多少客戶(hù)等待數(shù)據(jù)庫(kù)連接
          Waiters字段告訴你當(dāng)前有多少客戶(hù)正在等待連接
          Connections Hight字段給出最大的并發(fā)連接數(shù)。
          Wait Seconds Hight字段顯示了客戶(hù)等待數(shù)據(jù)庫(kù)連接的最長(zhǎng)時(shí)間

          posted @ 2010-07-25 21:16 斷點(diǎn) 閱讀(401) | 評(píng)論 (0)編輯 收藏

          1、連接:
          直接連接(direct connection)
          池連接(pooled connection)
          連接復(fù)用 ,避免了數(shù)據(jù)庫(kù)連接頻繁建立、關(guān)閉的開(kāi)銷(xiāo) ;
          對(duì)JDBC中的原始連接進(jìn)行了封裝 ,隔離了應(yīng)用的本身的處理邏輯和具體數(shù)據(jù)庫(kù)訪問(wèn)邏輯 。

          2、什么是連接池?
          連接池是在Weblogic啟動(dòng)時(shí)候預(yù)先建立的數(shù)據(jù)庫(kù)連接,由Weblogic在運(yùn)行時(shí)負(fù)責(zé)維護(hù)。
          可以減少程序每次數(shù)據(jù)庫(kù)請(qǐng)求都要新創(chuàng)建數(shù)據(jù)庫(kù)物理連接的時(shí)間及資源。
          對(duì)數(shù)據(jù)庫(kù)屬性的更改只需通過(guò)控制臺(tái)進(jìn)行,不需改動(dòng)客戶(hù)端代碼

          MultiPool
          可以使用MultiPool為高用戶(hù)訪問(wèn)量提供數(shù)據(jù)庫(kù)負(fù)載均衡,它使用簡(jiǎn)單的循環(huán)算法將連接請(qǐng)求平衡分配MultiPool中的每一個(gè)池。

          多池的作用:為防數(shù)據(jù)庫(kù)連接失敗提供冗余,備份或高有效池;為高用戶(hù)訪問(wèn)量提供數(shù)據(jù)庫(kù)負(fù)載均衡,負(fù)載均衡池。
          備份池:一個(gè)備份池由一個(gè)有順序的連接池列表組成。
          負(fù)載均衡池:使用簡(jiǎn)單的循環(huán)算法將連接請(qǐng)求平衡地分到在列表中的每一個(gè)池。

          3、DataSource

          數(shù)據(jù)源對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)連接池。客戶(hù)程序可以通過(guò)數(shù)據(jù)源綁定的JNDI名字得到該數(shù)據(jù)源的引用,并通過(guò)數(shù)據(jù)源對(duì)象得到數(shù)據(jù)庫(kù)連接。

          JDBC的API:
          java.sql.DriverManager 
          java.sql.Connection 
          java.sql.ResultSet 
          Javax.sql.RowSet:
          javax.sql.Statement  
          java.sql.PreparedStatement:用于執(zhí)行預(yù)編譯的SQL語(yǔ)句
          java.sql.CallableStatement:用于執(zhí)行在數(shù)據(jù)庫(kù)中定義的存儲(chǔ)過(guò)程   
          Javax.sql.DataSource是java.sql.Connectioin對(duì)象的工廠并使用一個(gè)JNDI服務(wù)注冊(cè)它.

          posted @ 2010-07-25 21:13 斷點(diǎn) 閱讀(314) | 評(píng)論 (0)編輯 收藏

          1、Type 1類(lèi)型驅(qū)動(dòng),JDBC-ODBC橋
          通常運(yùn)行Windows平臺(tái),需要在客戶(hù)端安裝ODBC驅(qū)動(dòng),早期Java訪問(wèn)數(shù)據(jù)庫(kù)的主要方式,效率較低。

          適用于快速的原型系統(tǒng),沒(méi)有提供JDBC驅(qū)動(dòng)的數(shù)據(jù)庫(kù)如Access ,由于包含多個(gè)驅(qū)動(dòng)程序?qū)樱湫阅芤话悴贿m合生產(chǎn)系統(tǒng)
          Java-->JDBC-ODBC Bridge---->JDBC-ODBC Library--->ODBC Driver-->Database
          驅(qū)動(dòng)程序的類(lèi)名稱(chēng)是 sun.jdbc.odbc.JdbcOdbcDriver
          JDBC URL 的形式為 jdbc:odbc:dsn(dsn 是使用 ODBC 管理員注冊(cè)數(shù)據(jù)庫(kù)的數(shù)據(jù)源名稱(chēng))
          不是100%JAVA程序,與ODBC之間的接口采用非JAVA方式調(diào)用,因此不能在APPLET中使用
          {
          String url = "jdbc:odbc:jdbc" ;
          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
          Connection con = DriverManager.getConnection(url, "java", "sun");
          }


          2、Type 2類(lèi)型驅(qū)動(dòng),需要在客戶(hù)端安裝數(shù)據(jù)庫(kù)的本地驅(qū)動(dòng),JDBC請(qǐng)求會(huì)轉(zhuǎn)換為對(duì)數(shù)據(jù)庫(kù)本地API的調(diào)用。

          利用開(kāi)發(fā)商提供的本地庫(kù)來(lái)直接與數(shù)據(jù)庫(kù)通信。
          Java-->JDBC-Driver-->DB Client Library-->Database
          繞過(guò)了ODBC層,性能優(yōu)于Type1
          也稱(chēng)為部分 Java 驅(qū)動(dòng)程序,因?yàn)樗鼈冎苯訉?JDBC API 翻譯成具體數(shù)據(jù)庫(kù)的API
          使用第二種模型將開(kāi)發(fā)者限制在數(shù)據(jù)庫(kù)廠商的客戶(hù)機(jī)庫(kù)支持的客戶(hù)機(jī)平臺(tái)和操作系統(tǒng)
          Oracle的OCI驅(qū)動(dòng)就屬于Type2

          3、Type 3類(lèi)型驅(qū)動(dòng),DBC請(qǐng)求通過(guò)網(wǎng)絡(luò)服務(wù)器層實(shí)現(xiàn),在網(wǎng)絡(luò)服務(wù)器層可以實(shí)現(xiàn)負(fù)載均衡,連接池管理等。

          第三種驅(qū)動(dòng)程序是純 Java 驅(qū)動(dòng)程序,它將 JDBC API 轉(zhuǎn)換成獨(dú)立于數(shù)據(jù)庫(kù)的協(xié)議。JDBC 驅(qū)動(dòng)程序并沒(méi)有直接和數(shù)據(jù)庫(kù)進(jìn)行通訊;它和一個(gè)中間件服務(wù)器通訊,然后這個(gè)中間件服務(wù)器和數(shù)據(jù)庫(kù)進(jìn)行通訊。這種額外的中間層次提供了靈活性:可以用相同的代碼訪問(wèn)不同的數(shù)據(jù)庫(kù),因?yàn)橹虚g件服務(wù)器隱藏了 Java 應(yīng)用程序的細(xì)節(jié)。要轉(zhuǎn)到不同的數(shù)據(jù)庫(kù),您只需在中間件服務(wù)器上改變參數(shù)。(有一點(diǎn)需要注意:中間件服務(wù)器必須支持您訪問(wèn)的數(shù)據(jù)庫(kù)格式。)
          第三種驅(qū)動(dòng)程序的缺點(diǎn)是,額外的中間層次可能有損整體系統(tǒng)性能。另一方面,如果應(yīng)用程序需要和不同的數(shù)據(jù)庫(kù)格式進(jìn)行交互,第三種驅(qū)動(dòng)程序是個(gè)有效的方法,因?yàn)椴还艿讓?/span>的數(shù)據(jù)庫(kù)是什么,都使用同樣的 JDBC 驅(qū)動(dòng)程序。另外,因?yàn)橹虚g件服務(wù)器可以安裝在專(zhuān)門(mén)的硬件平臺(tái)上,可以利用總的結(jié)果進(jìn)行一些優(yōu)化。
          Java--->Jdbc Driver(Type3 jdbc driver)----->java middleware--->JDBC Driver---->Database
          Weblogic的Pool驅(qū)動(dòng)程序就是一個(gè)Type3的JDBC驅(qū)動(dòng)程序。


          4、Type 4類(lèi)型驅(qū)動(dòng),為純Java實(shí)現(xiàn),不需要任何客戶(hù)端設(shè)置。
          OCI驅(qū)動(dòng)程序利用Java本地化接口(JNI),通過(guò)Oracle客戶(hù)端軟件與數(shù)據(jù)庫(kù)進(jìn)行通訊。Thin驅(qū)動(dòng)程序是純Java驅(qū)動(dòng)程序,它直接與數(shù)據(jù)庫(kù)進(jìn)行通訊。

          JDBC應(yīng)用的兩種架構(gòu)
          兩層架構(gòu):客戶(hù)程序直接對(duì)數(shù)據(jù)庫(kù)發(fā)起JDBC請(qǐng)求,Type1、2、4支持兩層架構(gòu)。
          多層架構(gòu):客戶(hù)程序?qū)DBC請(qǐng)求發(fā)送到中間層,中間層再將請(qǐng)求發(fā)送到數(shù)據(jù)庫(kù)。

          posted @ 2010-07-25 21:11 斷點(diǎn) 閱讀(676) | 評(píng)論 (0)編輯 收藏

          通常應(yīng)用系統(tǒng)會(huì)根據(jù)用戶(hù)數(shù)、并發(fā)數(shù)、用戶(hù)的行為等等來(lái)確定具體的性能目標(biāo),如果確定應(yīng)用程序不能滿(mǎn)足性能目標(biāo),那么就需要優(yōu)化、重構(gòu)程序并調(diào)整JVM、應(yīng)用服務(wù)器、數(shù)據(jù)庫(kù)、OS 或者改變硬件配置等等。

          影響Java 性能的主要因素:
          硬件,如CPU、內(nèi)存、體系結(jié)構(gòu)等等
          操作系統(tǒng)
          數(shù)據(jù)庫(kù)系統(tǒng)
          JVM
          應(yīng)用服務(wù)器
          數(shù)據(jù)庫(kù)服務(wù)器
          網(wǎng)絡(luò)環(huán)境
          應(yīng)用架構(gòu)及程序編寫(xiě)水平

          性能調(diào)整的步驟:
          1、 使用工具測(cè)試系統(tǒng)是否滿(mǎn)足性能目標(biāo)
          2、 發(fā)現(xiàn)性能瓶頸
          3、 假設(shè)瓶頸的原因
          4、 測(cè)試你的假設(shè)
          5、 如果假設(shè)成立,更改這一部分
          6、 測(cè)試確定更改是否可以提高性能,衡量性能提高的程度
          7、重復(fù)以上步驟,直到獲得可以接受的性能。

          J2EE性能不好時(shí)的現(xiàn)象,主要表現(xiàn)在對(duì)客戶(hù)端的請(qǐng)求響應(yīng)很慢:
          一向很慢:應(yīng)用的響應(yīng)總是很慢,改變環(huán)境(如應(yīng)用負(fù)載、數(shù)據(jù)庫(kù)的連接池?cái)?shù)量等等),對(duì)響應(yīng)時(shí)間的
          影響不大。

          越來(lái)越慢:在相同的負(fù)載情況下,隨著系統(tǒng)運(yùn)行的時(shí)間的增長(zhǎng),系統(tǒng)越來(lái)越慢,這可能是系統(tǒng)已到達(dá)
          極限或是系統(tǒng)死鎖和錯(cuò)誤引起的。

          低于負(fù)載時(shí)會(huì)越來(lái)越慢(Slower and slower under load):.

          偶爾的掛起或異常錯(cuò)誤(Sporadic hangs or aberrant errors):有時(shí)這可能是由于負(fù)載的變化或其他
          情況引起的可以預(yù)測(cè)的死鎖(Foreseeable lock ups): 掛起或最初只有少量錯(cuò)誤,但隨著時(shí)間的推移整個(gè)系統(tǒng)都鎖上了,典型地這可能是為的適應(yīng)"management by restarts.“

          突發(fā)性的混亂(Sudden chaos): 系統(tǒng)已運(yùn)行了一段時(shí)間(如一個(gè)小時(shí)或可能是三、四天),性能穩(wěn)定并
          可以接受, 突然沒(méi)有任何理由,開(kāi)始出錯(cuò)或死鎖了。


          監(jiān)控工具:
          WebLogic Server的控制臺(tái)
          cpu
          內(nèi)存
          JDBC
          輔助的工具
          Jprobe
          Optimizit
          Vtune
          TowerJ Performance

          posted @ 2010-07-25 17:02 斷點(diǎn) 閱讀(222) | 評(píng)論 (0)編輯 收藏

          WebLogic Server 10的下載地址:
          http://www.oracle.com/technology/software/products/ias/htdocs/wls_main.html

          1、域(Domains)
          域是管理的單元或邊界;
          作為一個(gè)單元來(lái)管理的,并相互關(guān)聯(lián)的一組Weblogic 服務(wù)器資源被稱(chēng)為域;
          域由單一的管理服務(wù)器來(lái)管理。

          2、機(jī)器(Machines)
          可以對(duì)應(yīng)到服務(wù)器所在的物理硬件;
          可以是Unix或non-Unix類(lèi)型;
          可以用來(lái)遠(yuǎn)程管理和監(jiān)控;

          3、服務(wù)器(Servers)
          服務(wù)器是執(zhí)行在單一Java虛擬機(jī) (JVM)中weblogic.Server類(lèi)的實(shí)例。
          服務(wù)器:最多和一個(gè)WLS機(jī)器關(guān)聯(lián);占用一定數(shù)量的RAM ;是多線(xiàn)程的。

          4、管理服務(wù)器(Administration server)
          對(duì)整個(gè)域的集中控制
          XML配置存儲(chǔ)庫(kù)的保存者
          日志信息的集中保存

          5、被管理服務(wù)器(Managed Server)
          WebLogicServer的一個(gè)實(shí)例;
          從管理服務(wù)器遠(yuǎn)程加載配置信息‘;
          可以是也可以不是集群的一部分。

          6、集群 (Clustering)
          WebLogic集群技術(shù)指通過(guò)一組服務(wù)器共同 工作,在多臺(tái)機(jī)器間復(fù)制應(yīng)用表示層和應(yīng)用邏輯層的能力,
          實(shí)現(xiàn)關(guān)鍵業(yè)務(wù)系統(tǒng)的負(fù)載分布,消除個(gè)別故障點(diǎn);集群用來(lái)實(shí)現(xiàn)負(fù)載均衡和容錯(cuò)。

          posted @ 2010-07-25 16:03 斷點(diǎn) 閱讀(280) | 評(píng)論 (0)編輯 收藏

          1、J2EE應(yīng)用開(kāi)發(fā)的核心組件。
          Servlet: 處理HTTP請(qǐng)求,產(chǎn)生響應(yīng)。
          JSP:Java Server Pages ,同Servlet。其中包含了HTML和JSP標(biāo)簽、Java代碼和其他信息。
          EJB:EJB服務(wù)端組件模型簡(jiǎn)化了具有交互性、擴(kuò)展性和移植性中間組件的開(kāi)發(fā)。EJB一般用于實(shí)現(xiàn)系統(tǒng)的業(yè)務(wù)邏輯。

          2、J2EE的相關(guān)技術(shù)
          核心:Servlet 、JSP、EJB
          數(shù)據(jù)庫(kù):JDBC
          命名和目錄服務(wù):JNDI
          消息服務(wù):JMS( Java Message Service )
          Email:Java Mail
          分布式計(jì)算:RMI、RMI-IIOP
          事務(wù):JTA(Java Transaction API)
          數(shù)據(jù)格式化:XML、HTML、XSL
          協(xié)議:TCP/IP、HTTP(S)、IIOP、SSL
          安全:JAAS

          3、J2EE的4層結(jié)構(gòu)
          客戶(hù)層(瀏覽器)
          Web層(HTML、Servlet、JSP)
          業(yè)務(wù)層(EJB)
          EIS層(關(guān)系數(shù)據(jù)庫(kù))

          4、J2EE的Application Server:

          Tomcat
          BEA Weblogic
          IBM Websphere
          Oracle Application Server
          Sun Java System
          Jboss
          Borland AppServer
          Sybase Application Server
          HP Application Server
          Apusic

          5、集成開(kāi)發(fā)工具:
          Borland:JBuilder
          Oracle :JDeveloper
          Bea :WebLogic Workshop
          IBM:Websphere Studio
          Sun:NetBeans
          MyEclipse

          在小型的應(yīng)用系統(tǒng)或者有特殊需要的系統(tǒng)中,可以使用一個(gè)免費(fèi)的Web服務(wù)器Tomcat,該服務(wù)器支持全部JSP以及Servlet規(guī)范,但是目前還不支持EJB。

          在Java相關(guān)的開(kāi)發(fā)領(lǐng)域中,常用的是3種數(shù)據(jù)庫(kù):Oracle、DB2和MySQL。有時(shí)候也使用微軟公司的SQL Server數(shù)據(jù)庫(kù)服務(wù)器 。

          posted @ 2010-07-25 15:50 斷點(diǎn) 閱讀(267) | 評(píng)論 (0)編輯 收藏

          DateUtils.compareYear(regDate, base.getTInsrncBgnTm()) // 新舊車(chē)標(biāo)志【保險(xiǎn)起期 - 初登年月】 單位:年

          posted @ 2010-07-25 11:02 斷點(diǎn) 閱讀(267) | 評(píng)論 (0)編輯 收藏

          //顯示輸入框錄入的字符位數(shù)。 ztf 10.07.19
          function displayLength(obj) {
           var lenSpan = document.getElementById("lenSpan");
           if (lenSpan == null) {
            lenSpan = document.createElement("SPAN");
            lenSpan.id = "lenSpan";
            obj.parentNode.appendChild(lenSpan);
           }
           lenSpan.innerText = "已輸入" + obj.value.length + "位";
          }

          onkeyup="displayLength(this)"進(jìn)行js調(diào)用。

          posted @ 2010-07-24 17:02 斷點(diǎn) 閱讀(207) | 評(píng)論 (0)編輯 收藏

          --情況1:多個(gè)參數(shù)的傳遞,由于多個(gè)文件編碼不一致,可能出現(xiàn)亂碼。

          window.open(base+"/policy/universal/pop/flat_vhl_inf_query.jsp?

          cLcnNo="+objPlateNo.value+"&cEngNo="+objEngNo.value+"&cVhlFrm="+objFrmNo.value+"&cPlateTy

          p="+objPlateTyp+"&cProdNo="+objCProdNo+"&cDptCde="+objCDptCde+"&cNewMrk="+objNewMrk.value

          +"&cEcdemicMrk="+objEcdemicMrk.value,"","scrollbars=yes,left=100,top=150,Toolbar=no,Locat

          ion=no,Direction=no,Resizeable=no,Width="+800+" ,Height="+400);


          --相應(yīng)的jsp獲得參數(shù)
          <% 
           String CProdNo = request.getParameter("prodNo");
           String CDptCde = request.getParameter("dptCde");

           String CPlateNo = request.getParameter("plateNo");

           String CFrmNo = request.getParameter("frmNo");
           
           if("".equals(CPlateNo)&&"".equals(CFrmNo)){
            return;
           }
               
           String dwName = "policy.pub.flat_vhl_inf_DW";
          %>


          --情況2:解決亂碼的問(wèn)題。
          function tool_uploadFile(clmNo,billType,maxFileNum,fileType,singleLimit,totalLimit) {//解決亂碼的問(wèn)題,增加變量paramObj。ztf 10.06.01
           var paramObj = {
            "clmNo" : clmNo,
            "billType" : billType,
            "maxFileNum" : maxFileNum,
            "fileType" : fileType,
            "singleLimit" : singleLimit,
            "totalLimit" : totalLimit
           };
           var r = window.showModalDialog(global.WEB_APP_NAME+"/core/jsp/common/uploadFile.jsp",paramObj,"dialogHeight:610px;dialogWidth:530px;center:1;help: 0; status: 0;");

           return r;
          }

          --在相應(yīng)的jsp頁(yè)面通過(guò)js獲得參數(shù):
          <html>
            <head>
              <title>文件上傳</title>
            </head>
            <script type="text/javascript" src="<%=webApp%>/core/js/core/Tool.js"></script>
            <body bgcolor="#85b7ec">
           
            <script>
           var paramObj = window.dialogArguments;
           var clmNo = paramObj.clmNo;
           var billType = paramObj.billType;
           var maxFileNum = paramObj.maxFileNum;
           var fileType = paramObj.fileType;
           var singleLimit = paramObj.singleLimit;
           var totalLimit = paramObj.totalLimit;
           tool.loadApplet('<%=agentIp%>','<%=agentPort%>','<%=orgId%
          >',clmNo,billType,maxFileNum,fileType,singleLimit,totalLimit);
            </script>

          </body>
          </html>


          vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures])

          posted @ 2010-07-24 16:57 斷點(diǎn) 閱讀(339) | 評(píng)論 (0)編輯 收藏

          1、具體業(yè)務(wù)中用到的sql,這個(gè)是查找最近標(biāo)志為1,且有多條記錄的數(shù)據(jù)。 (這個(gè)sql查找錯(cuò)誤比較有用。)
          select a.c_ply_no ,count(1) from web_ply_base a
          where  a.c_latest_mrk='1'
          group by  a.c_ply_no
          having count(1)>1

           

          背景count(*)   count(1)   兩者比較,主要還是要count(1)所相對(duì)應(yīng)的數(shù)據(jù)字段:
           
          如果你的數(shù)據(jù)表沒(méi)有主鍵,那么count(1)比count(*)快  
            如果有主鍵的話(huà),那主鍵(聯(lián)合主鍵)作為count的條件也比count(*)要快  
            如果你的表只有一個(gè)字段的話(huà)那count(*)就是最快的啦
            如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。  
            因?yàn)閏ount(*),自動(dòng)會(huì)優(yōu)化指定到那一個(gè)字段。所以沒(méi)必要去count(?),用count(*),sql會(huì)幫你完成
          優(yōu)化的.
          其他語(yǔ)句:select * from 表名 where 條件 order by 字段名 asc\desc     // asc 升序    desc  降序

          2、C_Nme_En匹配多個(gè) like 查詢(xún)。
          select distinct C_Spec_No
            from WEB_Prd_Fix_Spec
           WHERE C_Spec_No in (SELECT C_Spec_No
                                 FROM web_Prd_Prod_Spec_Rel
                                WHERE C_Prod_No = '0326'
                                  and C_Spec_No like '89%')
             and (C_Nme_En like '%000000%' or C_Nme_En like '%030006%' or
                 C_Nme_En like '%030061%')

          posted @ 2010-07-24 16:42 斷點(diǎn) 閱讀(283) | 評(píng)論 (0)編輯 收藏

          --遞歸,樹(shù)狀結(jié)構(gòu)的存儲(chǔ)與展示
          drop table article;
          create table article
          (
          id number primary key,
          count varchar2(4000),
          pid number,
          isleaf number(1), --0 代表非葉子節(jié)點(diǎn),1代表葉子節(jié)點(diǎn)
          alevel number(2)
          );

          insert into article values(1,'螞蟻大戰(zhàn)大象',0,0,0);
          insert into article values(2,'大象被打趴下',1,0,1);
          insert into article values(3,'螞蟻也不好過(guò)',2,1,2);
          insert into article values(4,'瞎說(shuō)',2,0,2);
          insert into article values(5,'沒(méi)有瞎說(shuō)',4,1,3);
          insert into article values(6,'怎么可能',1,0,1);
          insert into article values(7,'怎么沒(méi)有可能',6,1,2);
          insert into article values(8,'可能性是很大的',6,1,2);
          insert into article values(9,'大象進(jìn)醫(yī)院了',2,0,2);
          insert into article values(10,'護(hù)士是螞蟻',9,1,3);
          commit;

          螞蟻大戰(zhàn)大象
              大象被打趴下了
                  螞蟻也不好過(guò)
                  瞎說(shuō)
                      沒(méi)有瞎說(shuō)
                  大象進(jìn)醫(yī)院了
                      護(hù)士是螞蟻
              怎么可能
                  怎么沒(méi)有可能
                  可能性是很大的
           

          --用存儲(chǔ)過(guò)程展現(xiàn)樹(shù)狀結(jié)構(gòu)。
          create or replace procedure p(v_pid article.pid%type,v_level binary_integer) is
            cursor c is select * from article where pid = v_pid;
            v_preStr varchar2(1024) := '';
          begin
            for i in 0..v_level loop
              v_preStr := v_preStr || '****';
            end loop;

            for v_article in c loop
              dbms_output.put_line(v_preStr ||v_article.cont);
              if(v_article.isleaf=0) then
                 p(v_artile.id,v_levle +1);
              end if;
            end loop;
          end;

          posted @ 2010-07-24 16:25 斷點(diǎn) 閱讀(262) | 評(píng)論 (0)編輯 收藏

          --觸發(fā)器
          create table emp2_log
          (
          uname varchar2(20);
          action varchar2(10);
          atime date
          );

          create or replace trigger trig
            after insert or delete or update on emp2 for each row
          begin
            if inserting then
               insert into emp2_log values (USER,'insert',sysdate); --USER關(guān)鍵字,用戶(hù)。
            elsif updating then
               insert into emp2_log values (USER,'update',sysdate);
            elsif deleting then
               insert into emp2_log values (USER,'delete',sysdate);
            end if;
          end;

          update emp2 set sal = sal*2 where deptno = 30;
          select * from emp2_log;

          drop trigger trig;

          --直接執(zhí)行時(shí),出現(xiàn)違反完整約束條件,已找到子記錄。
          update dept set deptno = 99 where deptno = 10;

          --使用下面的,把子表一起更新。
          create or replace trigger trig
            after update on dept for each row
          begin
            update emp set deptno =:NEW.deptno where deptno =:OLD.deptno;
          end;

          update dept set deptno = 99 where deptno = 10;

          select * from emp;
          rollback;

          posted @ 2010-07-24 16:22 斷點(diǎn) 閱讀(295) | 評(píng)論 (0)編輯 收藏

          --函數(shù)
          create or replace function sal_tax
             (v_sal number)
             return number
          is
          begin
            if(v_sal < 2000) then
              return 0.10;
            elsif(v_sal < 2750) then
              return 0.15;
            else
              return 0.20;
            end if;
          end;

          數(shù)據(jù)庫(kù)定義的函數(shù)money_to_chinese ,把數(shù)字轉(zhuǎn)換正中文輸出。
          create or replace function money_to_chinese(money in VARCHAR2)
             return varchar2 is
               c_money   VARCHAR2(12);
               m_string VARCHAR2(60) := '分角圓拾佰仟萬(wàn)拾佰仟億';
               n_string VARCHAR2(40) := '壹貳叁肆伍陸柒捌玖';
               b_string VARCHAR2(80);
               n         CHAR;
               len       NUMBER(3);
               i         NUMBER(3);
               tmp       NUMBER(12);
               is_zero   BOOLEAN;
               z_count   NUMBER(3);
               l_money   NUMBER;
               l_sign    VARCHAR2(10);

             BEGIN
               l_money := abs(money);
               IF money < 0 THEN
                 l_sign := '負(fù)' ;
               ELSE
                 l_sign := '';
               END IF;
               tmp      := round(l_money, 2) * 100;
               c_money := rtrim(ltrim(to_char(tmp, '999999999999')));
               len      := length(c_money);
               is_zero := TRUE;
               z_count := 0;
               i        := 0;
               WHILE i < len LOOP
                 i := i + 1;
                 n := substr(c_money, i, 1);
                 IF n = '0' THEN
                   IF len - i = 6 OR len - i = 2 OR len = i THEN
                     IF is_zero THEN
                       b_string := substr(b_string, 1, length(b_string) - 1);
                       is_zero   := FALSE;
                     END IF;
                     IF len - i = 6 THEN
                       b_string := b_string || '萬(wàn)';
                     END IF;
                     IF len - i = 2 THEN
                       b_string := b_string || '圓';
                     END IF;
                     IF len = i THEN
                        IF (len = 1) THEN
                           b_string := '零圓整';
                        ELSE
                           b_string := b_string || '整';
                        END IF;
                     END IF;
                     z_count := 0;
                   ELSE
                     IF z_count = 0 THEN
                       b_string := b_string || '零';
                       is_zero   := TRUE;
                     END IF;
                     z_count := z_count + 1;
                   END IF;
                 ELSE
                   b_string := b_string || substr(n_string, to_number(n), 1) ||
                               substr(m_string, len - i + 1, 1);
                   z_count   := 0;
                   is_zero   := FALSE;
                 END IF;
               END LOOP;
               b_string := l_sign || b_string ;
               RETURN b_string;
          exception
             --異常處理
              WHEN OTHERS THEN
                 RETURN(SQLERRM);
          END;

          posted @ 2010-07-24 16:19 斷點(diǎn) 閱讀(302) | 評(píng)論 (0)編輯 收藏

          --創(chuàng)建存儲(chǔ)過(guò)程:
          create or replace procedure p
          is
            cursor c is
            select * from emp2 for update;
          begin
            for v_temp in c loop 
              if(v_temp.deptno = 10) then
                update emp2 set sal = sal+10 where current of c;
              elsif(v_temp.deptno = 20) then
                update emp2 set sal = sal+20 where current of c;
              else
                 update emp2 set sal = sal+50 where current of c;
              end if;
            end loop;
            commit;
          end;

          --執(zhí)行:
          exec p;

          begin
          p;
          end;


          --帶參數(shù)的存儲(chǔ)過(guò)程,in傳入?yún)?shù),默認(rèn)為傳入,out傳出。
          create or replace procedure p
             (v_a in number,v_b number,v_ret out number,v_temp in out number)
          is
          begin
            if(v_a >v_b) then
              v_ret := v_a;
            else
              v_ret := v_b;
            end if;
            v_temp :=v_temp +1;
          end;

          declare
            v_a number := 3;
            v_b number := 4;
            v_ret number;
            v_temp number := 5;
          begin
            p(v_a,v_b,v_ret,v_temp);
            dbms_output.put_line(v_ret);
            dbms_output.put_line(v_temp);
          end;

          posted @ 2010-07-24 16:17 斷點(diǎn) 閱讀(264) | 評(píng)論 (0)編輯 收藏

          --游標(biāo)
          declare
            cursor c is
              select * from emp;
            v_emp c%rowtype;
          begin
            open c;
            loop
              fetch c into v_emp;
              exit when(c%notfound);
              dbms_output.put_line(v_emp.ename);
            end loop;
            close c;
          end;

          declare
            cursor c is
              select * from emp;
            v_emp emp%rowtype;
          begin
            open c;
            fetch c into v_emp;
              while(c%found) loop
                dbms_output.put_line(v_emp.ename);
                fetch c into v_emp;
                --fetch c into v_emp; 導(dǎo)致第一條沒(méi)有打印,最后一條打印2遍。
                --dbms_output.put_line(v_emp.ename);
            end loop;
            close c;
          end;


          declare
            cursor c is
              select * from emp;
          begin
            for v_emp in c loop
              dbms_output.put_line(v_emp.ename);
            end loop;
          end;


          --帶參數(shù)的游標(biāo)
          declare
            cursor c(v_deptno emp.deptno%type,v_job emp.job%type)
            is
              select ename,sal from emp where deptno =v_deptno and job= v_job;
              --v_temp c%rowtype;
          begin
            for v_temp in c(30,'CLERK') loop  --for自動(dòng)打開(kāi)游標(biāo)。
              dbms_output.put_line(v_temp.ename);
            end loop;
          end;


          --可更新的游標(biāo)
          declare
            cursor c
            is
              select * from emp2 for update;
              --v_temp c%rowtype;
          begin
            for v_temp in c loop 
              if(v_temp.sal <2000) then
                update emp2 set sal = sal*2 where current of c;
              elsif(v_temp.sal = 5000) then
                delete from emp2 where current of c;
              end if;
            end loop;
            commit;
          end;

          posted @ 2010-07-24 16:14 斷點(diǎn) 閱讀(246) | 評(píng)論 (0)編輯 收藏

          PLSql是SQL的補(bǔ)充,PL過(guò)程語(yǔ)言procedure language,SQL:Structured Query Language。
          PLSql    帶有分支、循環(huán)的語(yǔ)言,SQL沒(méi)有分支、循環(huán)的語(yǔ)言。

          set serveroutput on;

          -- 簡(jiǎn)單的PL/SQL語(yǔ)句塊
          declare
           v_name varchar2(20);
          begin
            v_name :='myname';
            dbms_output.put_line(v_name);
          end;
          /


          --語(yǔ)句塊的組成
          declare
           v_num number := 0 ;
          begin
            v_num := 2/v_num;
            dbms_output.put_line(v_num);
          exception
            when others then
               dbms_output.put_line('error');

          end;
          /

          --變量聲明的規(guī)則
          1、變量名不能夠使用保留字,如from、select等
          2、第一個(gè)字符必須是字母
          3、變量名最多包含30個(gè)字符
          4、不要與數(shù)據(jù)庫(kù)的表或者列同名
          5、每一行只能聲明一個(gè)變量


          --常用變量類(lèi)型
          1、binary_integer:整數(shù),主要用來(lái)計(jì)數(shù)而不是用來(lái)表示字段類(lèi)型
          2、number:數(shù)字類(lèi)型
          3、char:定長(zhǎng)字符串
          4、varchar2:變長(zhǎng)字符串
          5、date:日期
          6、long:長(zhǎng)字符串,最長(zhǎng)2GB
          7、boolean:布爾類(lèi)型,可以取值true、false和null值


          --變量聲明
          declare
            v_temp number(1);
            v_count binary_integer :=0;
            v_sal number(7,2):= 4000.00;
            v_date date:= sysdate;
            v_pi constant number(3,2) := 3.14;  --constant相當(dāng)java的final常量
            v_valid boolean := false;
            v_name varchar2(20) not null :='MyName';
          begin
            dbms_output.put_line('v_temp value:'|| v_temp);
          end;
           

          --變量聲明,使用%type屬性
          declare
            v_empno number(4);
            v_empno2 emp.empno%type;
            v_empno3 v_empno2%type;
          begin
            dbms_output.put_line('Test');
          end;


          --簡(jiǎn)單變量賦值
          declare
            v_name varchar2(20);
            v_sal number(7,2);
            v_sal2 number(7,2);
            v_valid boolean :=false;
            v_date date;
          begin
            va_name :='MyName';
            v_sal :=23.77;
            v_sal2 :=23.77;
            v_valid:=(v_sal = v_sal2);
            v_date:=to_date('1999-08-12 12:23:38','YYYY-MM-DD HH24:MI:SS');  
          end;


          --Table變量類(lèi)型,定義一種新的類(lèi)型,是數(shù)組。
          declare
            type type_table_emp_empno is table of emp.empno%type index by binary_integer;
            v_empno type_table_emp_empno;
          begin
            v_empnos(0) := 7369;
            v_empnos(2) := 7839;
            v_empnos(-1) := 9999;
            dbms_output.put_line(v_empnos(-1));
          end;


          --Record變量類(lèi)型,類(lèi)似java的類(lèi)的概念。
          declare
            type type_record_dept is record
            (
              deptno dept.deptno%type,
              dname dept.dname%type,
              loc dept.loc%type
            );
            v_tmp type_record_dept;
          begin
            v_tmp.deptno := 50;
            v_tmp.dname := 'aaaa';
            v_tmp.loc := 'bj';
            dbms_output.put_line(v_temp.deptno||''||v_temp.dname);
          end;


          --使用%rowtype聲明Record變量
          declare
            v_temp dept%rowtype;
          begin
            v_tmp.deptno := 50;
            v_tmp.dname := 'aaaa';
            v_tmp.loc := 'bj';
            dbms_output.put_line(v_temp.deptno||''||v_temp.dname);
          end;


          --SQL語(yǔ)句的運(yùn)用,返回?cái)?shù)據(jù)有且只有一條記錄。
          declare
            v_ename emp.ename%type;
            v_sal emp.sal%type;
          begin
            select ename,sal into v_ename,v_sal from emp where empno = 7369;
            dbms_output.put_line(v_ename||''||v_sal);
          end;

          declare
            v_emp emp%rowtype;
          begin
            select * into v_emp from emp where empno = 7369;
            dbms_output.put_line(v_emp.ename);
          end;

          declare
             v_deptno dept.deptno%type := 50;
             v_dname dept.dname%type := 'aaaa';
             v_loc dept.loc%type := 'bj';
          begin
            insert into dept2 values (v_deptno,v_dname,v_loc);
            commit;
          end;

          declare
            v_deptno emp2.deptno%type := 10;
            v_count number ;
          begin
            --update emp2 set sal = sal/2 where deptno = v_deptno;
            --select deptno into v_deptno from emp2 where empno = 7369;
            select count(*) into v_count from emp2;
            dbms_output.put_line(sql%rowcount||'條記錄被影響');
            commit;
          end;


          DDL語(yǔ)句:
          begin
            execute immediate 'create table T(nnn varchar2(20) default ''aaa'')';
          end;

          --if語(yǔ)句:取出7369的薪水,如果<1200,則輸出'low',如果<2000則輸出'middle',否則'high'
          declare
            v_sal emp.sal%type;
          begin
            select sal into v_sal from emp where empno = 7369;
            if(v_sal < 1200) then
              dbms_output.put_line('low');
            elsif(v_sal < 2000) then
              dbms_output.put_line('middle');
            else
              dbms_output.put_line('high');
            end if;
          end;


          --循環(huán)
          declare
            i binary_integer := 1;
          begin
            loop
              dbms_output.put_line(i);
              i := i+ 1;
              exit when (i >= 11);
            end loop;
          end;

          declare
            j binary_integer := 1;
          begin
            while j< 11 loop
              dbms_output.put_line(j);
              j := j+ 1;
            end loop;
          end;

          begin
            for k in 1..10 loop
              dbms_output.put_line(k);
            end loop;

            for k in reverse 1..10 loop
              dbms_output.put_line(k);
            end loop;
          end;


          --錯(cuò)誤處理
          declare
            v_temp number(4);
          begin
            select empno into v_temp from emp where deptno = 10;
          exception
            when too_many_rows then
              dbms_output.put_line('太多記錄了');
            when others then
              dbms_output.put_line('error');
          end;


          declare
            v_temp number(4);
          begin
            select empno into v_temp from emp where empno = 2222;
          exception
            when no_data_found then
              dbms_output.put_line('沒(méi)數(shù)據(jù)');

          end;


          create table errorlog
          (
          id number primary key,
          errcode number,
          errmsg varchar2(1024),
          errdate date
          );


          create sequence seq_errorlog_id start with 1 increment by 1;


          declare
            v_deptno dept.deptno%type := 10;
            v_errmsg varchar2(1024);
          begin
            delete from dept where deptno = v_deptno;
            commit;
          exception
            when others then
            rollback;
            v_errcode := SQLCODE;  --關(guān)鍵字,代表出錯(cuò)的代碼。
            v_errmsg := SQLERRM;
            insert into errorlog values (seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate);
            commit;
          end;

          posted @ 2010-07-24 16:03 斷點(diǎn) 閱讀(316) | 評(píng)論 (0)編輯 收藏

          構(gòu)造數(shù)據(jù)庫(kù)必須遵循一定的規(guī)則。在關(guān)系數(shù)據(jù)庫(kù)中,這種規(guī)則就是范式。關(guān)系數(shù)據(jù)庫(kù)中的關(guān)系必須滿(mǎn)足一定的要求,即滿(mǎn)足不同的范式。目前關(guān)系數(shù)據(jù)庫(kù)有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。滿(mǎn)足最低要求的范式是第一范式(1NF)。在第一范式的基礎(chǔ)上進(jìn)一步滿(mǎn)足更多要求的稱(chēng)為第二范式(2NF),其余范式以次類(lèi)推。一般說(shuō)來(lái),數(shù)據(jù)庫(kù)只需滿(mǎn)足第三范式(3NF)就行了。


          第一范式(1NF):無(wú)重復(fù)的列。
              所謂第一范式(1NF)是指數(shù)據(jù)庫(kù)表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)
          值,即實(shí)體中的某個(gè)屬性不能有多個(gè)值或者不能有重復(fù)的屬性。如果出現(xiàn)重復(fù)的屬性,就可能需要定義一個(gè)新的實(shí)體,新的實(shí)體由重復(fù)的屬性構(gòu)成,新實(shí)體與原實(shí)體之間為一對(duì)多關(guān)系。在第一范式(1NF)中表的每一行只包含一個(gè)實(shí)例的信息。簡(jiǎn)而言之,第一范式就是無(wú)重復(fù)的列。
             
             數(shù)據(jù)庫(kù)表中的字段都是單一屬性的,不可再分。這個(gè)單一屬性由基本類(lèi)型構(gòu)成,包括整型、實(shí)數(shù)、字符型、邏輯型、日期型等。

          說(shuō)明:在任何一個(gè)關(guān)系數(shù)據(jù)庫(kù)中,第一范式(1NF)是對(duì)關(guān)系模式的基本要求,不滿(mǎn)足第一范式(1NF)的數(shù)據(jù)庫(kù)就不是關(guān)系數(shù)據(jù)庫(kù)。

           

          第二范式(2NF):屬性完全依賴(lài)于主鍵[消除部分子函數(shù)依賴(lài)]。
           
              第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來(lái)的,即滿(mǎn)足第二范式(2NF)必須先滿(mǎn)
          足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)例或行必須可以被惟一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的惟一標(biāo)識(shí)。例如員工信息表中加上了員工編號(hào)(emp_id)列,因?yàn)槊總€(gè)員工的員工編號(hào)是惟一的,因此每個(gè)員工可以被惟一區(qū)分。這個(gè)惟一屬性列被稱(chēng)為主關(guān)鍵字或主鍵、主碼。
              第二范式(2NF)要求實(shí)體的屬性完全依賴(lài)于主關(guān)鍵字。所謂完全依賴(lài)是指不能存在僅依賴(lài)主
          關(guān)鍵字一部分的屬性,如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來(lái)形成一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對(duì)多的關(guān)系。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的惟一標(biāo)識(shí)。簡(jiǎn)而言之,第二范式就是屬性完全依賴(lài)于主鍵。

          第三范式(3NF):屬性不依賴(lài)于其它非主屬性[消除傳遞依賴(lài)]。
             
              滿(mǎn)足第三范式(3NF)必須先滿(mǎn)足第二范式(2NF)。簡(jiǎn)而言之,第三范式(3NF)要求一個(gè)數(shù)據(jù)庫(kù)表中不包含已在其它表中已包含的非主關(guān)鍵字信息。例如,存在一個(gè)部門(mén)信息表,其中每個(gè)部門(mén)有部門(mén)編號(hào)(dept_id)、部門(mén)名稱(chēng)、部門(mén)簡(jiǎn)介等信息。那么在的員工信息表中列出部門(mén)編號(hào)后就不能再將部門(mén)名稱(chēng)、部門(mén)簡(jiǎn)介等與部門(mén)有關(guān)的信息再加入員工信息表中。如果不存在部門(mén)信息表,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會(huì)有大量的數(shù)據(jù)冗余。簡(jiǎn)而言之,第三范式就是屬性不依賴(lài)于其它非主屬性。
              
          所謂傳遞函數(shù)依賴(lài),指的是如果存在"A → B → C"的決定關(guān)系,則C傳遞函數(shù)依賴(lài)于A。

          posted @ 2010-07-18 10:23 斷點(diǎn) 閱讀(215) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 涟源市| 英超| 金平| 阿瓦提县| 西昌市| 景泰县| 富平县| 修文县| 托里县| 洛阳市| 惠东县| 岑巩县| 米易县| 博湖县| 武定县| 资兴市| 萝北县| 定西市| 兴化市| 威信县| 偃师市| 阿坝县| 永吉县| 南丹县| 晋江市| 潼关县| 武夷山市| 玉龙| 鹤岗市| 竹溪县| 长寿区| 彩票| 西乌珠穆沁旗| 常熟市| 宁陵县| 新丰县| 康定县| 福建省| 五河县| 讷河市| 顺义区|