|
2010年6月1日
1、http://www.jar114.com/site.html
該網站可以提供我們項目中經常需要的jar包,如果缺少包,就可以在這里查找。
流程定義文件*.jpdl.xml中如果有中文亂碼,肯定是task中有中文。
需要在eclipse安裝軟件下,即E:\eclipse\eclipse.ini增加
-Dfile.encoding=UTF-8
然后重啟eclipse即可解決。
配置jbpm4工程的運行環境:
1、添加依賴庫。
E:\JBPM\jbpm-4.3\jbpm.jar
E:\JBPM\jbpm-4.3\lib下的jar包。
2、添加配置文件。
E:\JBPM\jbpm-4.3\examples\src下的配置文件拷貝到自己java工程的src下。
---------------------------------------------------------------
管理流程定義:發布流程定義、查看流程定義、刪除流程定義。
RepositoryService repositoryService = processEngine.getRepositoryService();
String deploymentId = repositoryService.createDeployment().addResourceFromClasspath
("helloworld.jpdl.xml").deploy();
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
repositoryService.deleteDeploymentCascade(deploymentId);
---------------------------------------------------------------
管理流程實例:發起新流程、執行等待的流程、查看流程實例、終止流程實例、刪除流程實例。
ExecutionService executionService = processEngine.getExecutionService();
ProcessInstance pi = executionService.startProcessInstanceByKey("helloworld");
ProcessInstance pi = executionService.signalExecutionById(pi.getId()); //執行等待的流程.
List<ProcessInstance> list = executionService.createProcessInstanceQuery().list();
executionService.endProcessInstance(pi.getId(), "cancel");
executionService.deleteProcessInstanceCascade(pi.getId());
TaskService taskService = processEngine.getTaskService();
taskService.completeTask(taskId, map);
控制流程的活動:Start、End、Decision、Fork、Join、Sub-process、State、task.
原子活動:java、script、sql、hql、email。
配置開發環境:
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。
通過Eclipse-->help-->Install New Software-->Add-->Archive到插件所在路徑。
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調用readDecisionTable()方法里面一處為:
InputStream is = DecisionTableTest.class.getResourceAsStream("rules\\Sample.xls");
final String drl = converter.compile( is, InputType.XLS );
需改為如下,取的class即錯誤解決。
InputStream is = DecisionTableTest.class.getClassLoader().getResourceAsStream("rules\\Sample.xls");
final String drl = converter.compile( is, InputType.XLS );
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后不再報錯,好像是jar包的問題。
看了下jar包里面的org.mvel.ASTNode.getReducedValue方法已經注釋掉了。
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項目中的原先的寫法為:
final String drl = converter.compile( "rules\\Sample.xls", InputType.XLS );
參考了下別人的寫法,改為下面的方式進行處理:
InputStream is = DecisionTableTest.class.getClassLoader().getResourceAsStream("rules\\Sample.xls");
final String drl = converter.compile( is, InputType.XLS );
由于drools有新版本了,所以與MyEclipse整合進行了解下。
整合步驟如下:
1、下載MyEclipse 8.5;
2、在http://www.jboss.org/drools/downloads.html下載Drools Eclipse 3.5 Workbench 5.1 插件;
3、在E:\MyEclipse8.5下新建2個文件:links、myplugins。
E:\MyEclipse 8.5\links:放drools.link配置文件,內容為path=E:\\MyEclipse 8.5\\myplugins\\drools\\
E:\MyEclipse 8.5\myplugins:放drools文件,該E:\MyEclipse 8.5\myplugins\drools\eclipse下放置從網上下載的drools插件的features和plugins。
4、重啟MyEclipse 8.5即可看見drools圖標。
5、安裝Jboss:下載jboss-5.0.0.GA,解壓即可。
打開MyEclipse->window->Preference->MyEclipse->Servers->JBoss->JBoss 5.x進行jre及相關配置。
在命令行下運行java程序,出現如上異常Exception in thread "main" java.lang.UnsupportedClassVersionError。
主要是jdk的版本被oracle給換成低版本了。
可以在命令行下輸入:javac -version 查看版本,最后把%JAVA_HOME%\bin;添加到Oracle之前,再重開啟電腦,編譯,運行即可。
可以查考:http://hi.baidu.com/tianxingacer/blog/item/e628b947ffc54f016a63e5ac.html/cmtid/1fe1e9ae1dc5b9f6faed50d9
我的機器以前裝的是offices2003自帶的js調試工具,昨天按照上IE8后,js調試工具有時候是ie8的調試界面,有時是ie6的調試界面,經網上查找已找到原因。
主要是我把IE8的‘腳本’下的“啟動調試”給關了,所以最后只出現ie6的調試界面。
解決方法:打開IE8后,點擊"工具"->"開發人員工具",或者快捷鍵F12,會打開頁面調試窗口。
今天用反編譯工具查看java源代碼,發現反編譯的java文件有錯誤,在網上了解了下,是原先開發人員對代碼做了一下加密處理。下面介紹一下java的混淆器Proguard。
ProGuard 是一個免費的 Java類文件的壓縮,優化,混肴器。它刪除沒有用的類,字段,方法與屬性。使字節碼最大程度地優化,使用簡短且無意義的名字來重命名類、字段和方法 。eclipse已經把Proguard集成在一起了。
其他地方也有介紹,如下:http://blog.csdn.net/alex197963/archive/2008/07/07/2620603.aspx
1、當處理多個訪問相同數據的用戶時,通常可能出現三種問題:
臟讀
當應用程序使用了被另一個應用程序修改過的數據,而這個數據處于未提交狀態時,就會發生臟讀。第二個應用程序隨后會請求回滾被其修改的數據。第一個事務使用的數據就會被損壞,或者“變臟”。
不可重復的讀
當一個事務獲得了數據,而該數據隨后被一個單獨的事務所更改時,若第一個事務再次讀取更改后的數據,就會發生不可重復的讀。這樣,第一個事務進行了一個不可重復的讀。
虛讀
當事務通過某種查詢獲取了數據,另一個事務修改了部分該數據,原來的事務第二次獲取該數據時,就會發生虛讀。第一個事務現在會有不同的結果集,它可能包含虛讀。
2、Java.sql.Connection接口定義的隔離級別
TRANSACTION_NONE 說明不支持事務
TRANSACTION_READ_UNCOMMITTED 說明在提交前一個事務可以看到另一個事務的變化。這樣臟讀、不可重復的讀和虛讀都是允許的。
TRANSACTION_READ_COMMITTED 說明讀取未提交的數據是不允許的。這個級別仍然允許不可重復的讀和虛讀產生。
TRANSACTION_REPEATABLE_READ 說明事務保證能夠再次讀取相同的數據而不會失敗,但虛讀仍然會出現。
TRANSACTION_SERIALIZABLE 是最高的事務級別,它防止臟讀、不可重復的讀和虛讀。
3、事務的隔離級別
在J2EE中,通過java.sql.Connection接口設置事務隔離級別,這一接口為連接的隔離級別提供了getter()和setter()
Int getTransactionIsolation() throws SQLException
void setTransactionIsolation() throws SQLException
Connection對象負責事務,一旦收到事務請求,事務將自動提交,因為Connection對象已定義為自動提交方式,可通過setAutoCommit(false)禁用自動提交模式
另外java.sql.DatabaseMetaData接口為數據存儲提供支持的隔離級別查找方法:getTransactionIsolation(),supportsTransactionIsolationLevel()
對多個庫操作的分布式事務必須在所有庫中執行同一個隔離級別,否則會出現意想不到的結果
4、事務提交和回滾
為了完成提交事務和回滾事務,JDBC API包括了兩個方法作為 Connection 接口的一部分。若將 Connection 對象名稱指定為 con,通過調用 con.commit(); 可以保存程序狀態;
通過調用 con.rollback(); 可以返回到以前保存的狀態。如果數據庫實際運行操作時有錯誤發生,這兩個方法都會拋出 SQLExceptions,所以您需要在 try ... catch 塊中包裝它們。
5、批處理和事務
缺省情況下,JDBC 驅動程序運行在被稱為自動提交的模式下,可禁用自動提交模式
con.setAutoCommit(false);
批處理操作中通過在一次單獨的操作(或批處理)中執行多個數據庫更新操作
{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() ;
Initial Capacity:池的連接數量,在啟動時創建
Maximun Capacity:這是池可以打開的連接的最大數量
Capacity Increment:成組地打開增量連接
Login Delay Seconds:池驅動程序在啟動時打開每一個新的連接需要等待的時間
Refresh Period(刷新周期)
Supports Local Transaction:只用于XA連接池
Allow Shrinking and Shrink Period(允許收縮和收縮期):如果池的數量太大,超過了初始,且如果任何一個連接在收縮期內空閑,那么空閑的連接將在收縮期末關閉
監控JDBC連接池:
Waiters Hight字段指明了最多有多少客戶等待數據庫連接
Waiters字段告訴你當前有多少客戶正在等待連接
Connections Hight字段給出最大的并發連接數。
Wait Seconds Hight字段顯示了客戶等待數據庫連接的最長時間
1、連接:
直接連接(direct connection)
池連接(pooled connection)
連接復用 ,避免了數據庫連接頻繁建立、關閉的開銷 ;
對JDBC中的原始連接進行了封裝 ,隔離了應用的本身的處理邏輯和具體數據庫訪問邏輯 。
2、什么是連接池?
連接池是在Weblogic啟動時候預先建立的數據庫連接,由Weblogic在運行時負責維護。
可以減少程序每次數據庫請求都要新創建數據庫物理連接的時間及資源。
對數據庫屬性的更改只需通過控制臺進行,不需改動客戶端代碼
MultiPool
可以使用MultiPool為高用戶訪問量提供數據庫負載均衡,它使用簡單的循環算法將連接請求平衡分配MultiPool中的每一個池。
多池的作用:為防數據庫連接失敗提供冗余,備份或高有效池;為高用戶訪問量提供數據庫負載均衡,負載均衡池。
備份池:一個備份池由一個有順序的連接池列表組成。
負載均衡池:使用簡單的循環算法將連接請求平衡地分到在列表中的每一個池。
3、DataSource
數據源對應一個數據庫連接池。客戶程序可以通過數據源綁定的JNDI名字得到該數據源的引用,并通過數據源對象得到數據庫連接。
JDBC的API:
java.sql.DriverManager
java.sql.Connection
java.sql.ResultSet
Javax.sql.RowSet:
javax.sql.Statement
java.sql.PreparedStatement:用于執行預編譯的SQL語句
java.sql.CallableStatement:用于執行在數據庫中定義的存儲過程
Javax.sql.DataSource是java.sql.Connectioin對象的工廠并使用一個JNDI服務注冊它.
1、Type 1類型驅動,JDBC-ODBC橋
通常運行Windows平臺,需要在客戶端安裝ODBC驅動,早期Java訪問數據庫的主要方式,效率較低。
適用于快速的原型系統,沒有提供JDBC驅動的數據庫如Access ,由于包含多個驅動程序層,其性能一般不適合生產系統
Java-->JDBC-ODBC Bridge---->JDBC-ODBC Library--->ODBC Driver-->Database
驅動程序的類名稱是 sun.jdbc.odbc.JdbcOdbcDriver
JDBC URL 的形式為 jdbc:odbc:dsn(dsn 是使用 ODBC 管理員注冊數據庫的數據源名稱)
不是100%JAVA程序,與ODBC之間的接口采用非JAVA方式調用,因此不能在APPLET中使用
{
String url = "jdbc:odbc:jdbc" ;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection(url, "java", "sun");
}
2、Type 2類型驅動,需要在客戶端安裝數據庫的本地驅動,JDBC請求會轉換為對數據庫本地API的調用。
利用開發商提供的本地庫來直接與數據庫通信。
Java-->JDBC-Driver-->DB Client Library-->Database
繞過了ODBC層,性能優于Type1
也稱為部分 Java 驅動程序,因為它們直接將 JDBC API 翻譯成具體數據庫的API
使用第二種模型將開發者限制在數據庫廠商的客戶機庫支持的客戶機平臺和操作系統
Oracle的OCI驅動就屬于Type2
3、Type 3類型驅動,DBC請求通過網絡服務器層實現,在網絡服務器層可以實現負載均衡,連接池管理等。
第三種驅動程序是純 Java 驅動程序,它將 JDBC API 轉換成獨立于數據庫的協議。JDBC 驅動程序并沒有直接和數據庫進行通訊;它和一個中間件服務器通訊,然后這個中間件服務器和數據庫進行通訊。這種額外的中間層次提供了靈活性:可以用相同的代碼訪問不同的數據庫,因為中間件服務器隱藏了 Java 應用程序的細節。要轉到不同的數據庫,您只需在中間件服務器上改變參數。(有一點需要注意:中間件服務器必須支持您訪問的數據庫格式。)
第三種驅動程序的缺點是,額外的中間層次可能有損整體系統性能。另一方面,如果應用程序需要和不同的數據庫格式進行交互,第三種驅動程序是個有效的方法,因為不管底層的數據庫是什么,都使用同樣的 JDBC 驅動程序。另外,因為中間件服務器可以安裝在專門的硬件平臺上,可以利用總的結果進行一些優化。
Java--->Jdbc Driver(Type3 jdbc driver)----->java middleware--->JDBC Driver---->Database
Weblogic的Pool驅動程序就是一個Type3的JDBC驅動程序。
4、Type 4類型驅動,為純Java實現,不需要任何客戶端設置。
OCI驅動程序利用Java本地化接口(JNI),通過Oracle客戶端軟件與數據庫進行通訊。Thin驅動程序是純Java驅動程序,它直接與數據庫進行通訊。
JDBC應用的兩種架構
兩層架構:客戶程序直接對數據庫發起JDBC請求,Type1、2、4支持兩層架構。
多層架構:客戶程序將JDBC請求發送到中間層,中間層再將請求發送到數據庫。
通常應用系統會根據用戶數、并發數、用戶的行為等等來確定具體的性能目標,如果確定應用程序不能滿足性能目標,那么就需要優化、重構程序并調整JVM、應用服務器、數據庫、OS 或者改變硬件配置等等。
影響Java 性能的主要因素:
硬件,如CPU、內存、體系結構等等
操作系統
數據庫系統
JVM
應用服務器
數據庫服務器
網絡環境
應用架構及程序編寫水平
性能調整的步驟:
1、 使用工具測試系統是否滿足性能目標
2、 發現性能瓶頸
3、 假設瓶頸的原因
4、 測試你的假設
5、 如果假設成立,更改這一部分
6、 測試確定更改是否可以提高性能,衡量性能提高的程度
7、重復以上步驟,直到獲得可以接受的性能。
J2EE性能不好時的現象,主要表現在對客戶端的請求響應很慢:
一向很慢:應用的響應總是很慢,改變環境(如應用負載、數據庫的連接池數量等等),對響應時間的影響不大。
越來越慢:在相同的負載情況下,隨著系統運行的時間的增長,系統越來越慢,這可能是系統已到達極限或是系統死鎖和錯誤引起的。
低于負載時會越來越慢(Slower and slower under load):.
偶爾的掛起或異常錯誤(Sporadic hangs or aberrant errors):有時這可能是由于負載的變化或其他情況引起的可以預測的死鎖(Foreseeable lock ups): 掛起或最初只有少量錯誤,但隨著時間的推移整個系統都鎖上了,典型地這可能是為的適應"management by restarts.“
突發性的混亂(Sudden chaos): 系統已運行了一段時間(如一個小時或可能是三、四天),性能穩定并可以接受, 突然沒有任何理由,開始出錯或死鎖了。
監控工具:
WebLogic Server的控制臺
cpu
內存
JDBC
輔助的工具
Jprobe
Optimizit
Vtune
TowerJ Performance
WebLogic Server 10的下載地址:
http://www.oracle.com/technology/software/products/ias/htdocs/wls_main.html
1、域(Domains)
域是管理的單元或邊界;
作為一個單元來管理的,并相互關聯的一組Weblogic 服務器資源被稱為域;
域由單一的管理服務器來管理。
2、機器(Machines)
可以對應到服務器所在的物理硬件;
可以是Unix或non-Unix類型;
可以用來遠程管理和監控;
3、服務器(Servers)
服務器是執行在單一Java虛擬機 (JVM)中weblogic.Server類的實例。
服務器:最多和一個WLS機器關聯;占用一定數量的RAM ;是多線程的。
4、管理服務器(Administration server)
對整個域的集中控制
XML配置存儲庫的保存者
日志信息的集中保存
5、被管理服務器(Managed Server)
WebLogicServer的一個實例;
從管理服務器遠程加載配置信息‘;
可以是也可以不是集群的一部分。
6、集群 (Clustering)
WebLogic集群技術指通過一組服務器共同 工作,在多臺機器間復制應用表示層和應用邏輯層的能力,實現關鍵業務系統的負載分布,消除個別故障點;集群用來實現負載均衡和容錯。
1、J2EE應用開發的核心組件。
Servlet: 處理HTTP請求,產生響應。
JSP:Java Server Pages ,同Servlet。其中包含了HTML和JSP標簽、Java代碼和其他信息。
EJB:EJB服務端組件模型簡化了具有交互性、擴展性和移植性中間組件的開發。EJB一般用于實現系統的業務邏輯。
2、J2EE的相關技術
核心:Servlet 、JSP、EJB
數據庫:JDBC
命名和目錄服務:JNDI
消息服務:JMS( Java Message Service )
Email:Java Mail
分布式計算:RMI、RMI-IIOP
事務:JTA(Java Transaction API)
數據格式化:XML、HTML、XSL
協議:TCP/IP、HTTP(S)、IIOP、SSL
安全:JAAS
3、J2EE的4層結構
客戶層(瀏覽器)
Web層(HTML、Servlet、JSP)
業務層(EJB)
EIS層(關系數據庫)
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、集成開發工具:
Borland:JBuilder
Oracle :JDeveloper
Bea :WebLogic Workshop
IBM:Websphere Studio
Sun:NetBeans
MyEclipse
在小型的應用系統或者有特殊需要的系統中,可以使用一個免費的Web服務器Tomcat,該服務器支持全部JSP以及Servlet規范,但是目前還不支持EJB。
在Java相關的開發領域中,常用的是3種數據庫:Oracle、DB2和MySQL。有時候也使用微軟公司的SQL Server數據庫服務器 。
DateUtils.compareYear(regDate, base.getTInsrncBgnTm()) // 新舊車標志【保險起期 - 初登年月】 單位:年
//顯示輸入框錄入的字符位數。 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)"進行js調用。
--情況1:多個參數的傳遞,由于多個文件編碼不一致,可能出現亂碼。
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);
--相應的jsp獲得參數
<%
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:解決亂碼的問題。
function tool_uploadFile(clmNo,billType,maxFileNum,fileType,singleLimit,totalLimit) {//解決亂碼的問題,增加變量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;
}
--在相應的jsp頁面通過js獲得參數:
<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])
1、具體業務中用到的sql,這個是查找最近標志為1,且有多條記錄的數據。 (這個sql查找錯誤比較有用。)
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)所相對應的數據字段:
如果你的數據表沒有主鍵,那么count(1)比count(*)快
如果有主鍵的話,那主鍵(聯合主鍵)作為count的條件也比count(*)要快
如果你的表只有一個字段的話那count(*)就是最快的啦
如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。
因為count(*),自動會優化指定到那一個字段。所以沒必要去count(?),用count(*),sql會幫你完成優化的.
其他語句:select * from 表名 where 條件 order by 字段名 asc\desc // asc 升序 desc 降序
2、C_Nme_En匹配多個 like 查詢。
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%')
--遞歸,樹狀結構的存儲與展示
drop table article;
create table article
(
id number primary key,
count varchar2(4000),
pid number,
isleaf number(1), --0 代表非葉子節點,1代表葉子節點
alevel number(2)
);
insert into article values(1,'螞蟻大戰大象',0,0,0);
insert into article values(2,'大象被打趴下',1,0,1);
insert into article values(3,'螞蟻也不好過',2,1,2);
insert into article values(4,'瞎說',2,0,2);
insert into article values(5,'沒有瞎說',4,1,3);
insert into article values(6,'怎么可能',1,0,1);
insert into article values(7,'怎么沒有可能',6,1,2);
insert into article values(8,'可能性是很大的',6,1,2);
insert into article values(9,'大象進醫院了',2,0,2);
insert into article values(10,'護士是螞蟻',9,1,3);
commit;
螞蟻大戰大象
大象被打趴下了
螞蟻也不好過
瞎說
沒有瞎說
大象進醫院了
護士是螞蟻
怎么可能
怎么沒有可能
可能性是很大的
--用存儲過程展現樹狀結構。
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;
--觸發器
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關鍵字,用戶。
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;
--直接執行時,出現違反完整約束條件,已找到子記錄。
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;
--函數
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;
數據庫定義的函數money_to_chinese ,把數字轉換正中文輸出。
create or replace function money_to_chinese(money in VARCHAR2)
return varchar2 is
c_money VARCHAR2(12);
m_string VARCHAR2(60) := '分角圓拾佰仟萬拾佰仟億';
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 := '負' ;
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 || '萬';
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;
--創建存儲過程:
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;
--執行:
exec p;
begin
p;
end;
--帶參數的存儲過程,in傳入參數,默認為傳入,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;
--游標
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; 導致第一條沒有打印,最后一條打印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;
--帶參數的游標
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自動打開游標。
dbms_output.put_line(v_temp.ename);
end loop;
end;
--可更新的游標
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;
PLSql是SQL的補充,PL過程語言procedure language,SQL:Structured Query Language。
PLSql 帶有分支、循環的語言,SQL沒有分支、循環的語言。
set serveroutput on;
-- 簡單的PL/SQL語句塊
declare
v_name varchar2(20);
begin
v_name :='myname';
dbms_output.put_line(v_name);
end;
/
--語句塊的組成
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;
/
--變量聲明的規則
1、變量名不能夠使用保留字,如from、select等
2、第一個字符必須是字母
3、變量名最多包含30個字符
4、不要與數據庫的表或者列同名
5、每一行只能聲明一個變量
--常用變量類型
1、binary_integer:整數,主要用來計數而不是用來表示字段類型
2、number:數字類型
3、char:定長字符串
4、varchar2:變長字符串
5、date:日期
6、long:長字符串,最長2GB
7、boolean:布爾類型,可以取值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相當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;
--簡單變量賦值
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變量類型,定義一種新的類型,是數組。
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變量類型,類似java的類的概念。
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語句的運用,返回數據有且只有一條記錄。
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語句:
begin
execute immediate 'create table T(nnn varchar2(20) default ''aaa'')';
end;
--if語句:取出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;
--循環
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;
--錯誤處理
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('沒數據');
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; --關鍵字,代表出錯的代碼。
v_errmsg := SQLERRM;
insert into errorlog values (seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate);
commit;
end;
構造數據庫必須遵循一定的規則。在關系數據庫中,這種規則就是范式。關系數據庫中的關系必須滿足一定的要求,即滿足不同的范式。目前關系數據庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎上進一步滿足更多要求的稱為第二范式(2NF),其余范式以次類推。一般說來,數據庫只需滿足第三范式(3NF)就行了。
第一范式(1NF):無重復的列。
所謂第一范式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重復的屬性。如果出現重復的屬性,就可能需要定義一個新的實體,新的實體由重復的屬性構成,新實體與原實體之間為一對多關系。在第一范式(1NF)中表的每一行只包含一個實例的信息。簡而言之,第一范式就是無重復的列。
數據庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本類型構成,包括整型、實數、字符型、邏輯型、日期型等。
說明:在任何一個關系數據庫中,第一范式(1NF)是對關系模式的基本要求,不滿足第一范式(1NF)的數據庫就不是關系數據庫。
第二范式(2NF):屬性完全依賴于主鍵[消除部分子函數依賴]。
第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數據庫表中的每個實例或行必須可以被惟一地區分。為實現區分通常需要為表加上一個列,以存儲各個實例的惟一標識。例如員工信息表中加上了員工編號(emp_id)列,因為每個員工的員工編號是惟一的,因此每個員工可以被惟一區分。這個惟一屬性列被稱為主關鍵字或主鍵、主碼。
第二范式(2NF)要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。為實現區分通常需要為表加上一個列,以存儲各個實例的惟一標識。簡而言之,第二范式就是屬性完全依賴于主鍵。
第三范式(3NF):屬性不依賴于其它非主屬性[消除傳遞依賴]。
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。例如,存在一個部門信息表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在的員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關的信息再加入員工信息表中。如果不存在部門信息表,則根據第三范式(3NF)也應該構建它,否則就會有大量的數據冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性。
所謂傳遞函數依賴,指的是如果存在"A → B → C"的決定關系,則C傳遞函數依賴于A。
序列:sequence,產生一個獨一無二的序列,是oracle特有的。
create table article
(
id number,
title varchar2(1024),
cont long
);
insert into article values(seq.nextval,'a','b');
select * from user_sequences; --查詢序列
create sequence seq; --創建序列seq對象
select seq.nextval from dual;
drop sequence seq;
視圖:一個虛表,也是一個子查詢,是存儲在數據字典里的一條select語句。
視圖:基于一個表或多個表或視圖的邏輯表,本身不包含數據,通過它可以對表里面的數據進行查詢和修改,視圖基于的表稱為基表。
視圖的優點:
1、對數據庫的訪問,可以有選擇性的選取數據庫里的一部分信息,整張表的信息不對外開放。2.用戶通過簡單的查詢可以從復雜查詢中得到結果。
視圖的缺點:
如果一個表的結構改了,相應的視圖如果用到了該表的字段,也要進行修改,增加維護工作量。
簡單視圖:只從單表里獲取數據,不包含函數和數據組,可以實現DML操作。
復雜視圖:從多表獲取數據,包含函數和數據組,不可以DML操作。
視圖的創建:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
其中:
OR REPLACE:若所創建的試圖已經存在,ORACLE自動重建該視圖;
FORCE:不管基表是否存在ORACLE都會自動創建該視圖;
NOFORCE:只有基表都存在ORACLE才會創建該視圖:
alias:為視圖產生的列定義的別名;
subquery:一條完整的SELECT語句,可以在該語句中定義別名;
WITH CHECK OPTION :插入或修改的數據行必須滿足視圖定義的約束;
WITH READ ONLY :該視圖上不能進行任何DML操作。
例如:
CREATE OR REPLACE VIEW dept_sum_vw
(name,minsal,maxsal,avgsal)
AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.dname;
查詢視圖:select * from user_views;
修改視圖:通過OR REPLACE 重新創建同名視圖即可。
刪除視圖:DROP VIEW VIEW_NAME;
視圖的定義原則:
1.視圖的查詢可以使用復雜的SELECT語法,包括連接/分組查詢和子查詢;
2.在沒有WITH CHECK OPTION和 READ ONLY 的情況下,查詢中不能使用ORDER BY 子句;
3.如果沒有為CHECK OPTION約束命名,系統會自動為之命名,形式為SYS_Cn;
4.OR REPLACE選項可以不刪除原視圖便可更改其定義并重建,或重新授予對象權限。
視圖上的DML操作,應遵循的原則:
1.簡單視圖可以執行DML操作;
2.在視圖包含GROUP 函數,GROUP BY子句,DISTINCT關鍵字時不能刪除數據行;
3.在視圖不出現下列情況時可通過視圖修改基表數據或插入數據:
a.視圖中包含GROUP 函數,GROUP BY子句,DISTINCT關鍵字;
b.使用表達式定義的列;
c .ROWNUM偽列。
d.基表中未在視圖中選擇的其他列定義為非空且無默認值。
WITH CHECK OPTION 子句限定:
通過視圖執行的INSERTS和UPDATES操作不能創建該視圖檢索不到的數據行,因為它會對插入或修改的數據行執行完整性約束和數據有效性檢查。
例如:
CREATE OR REPLACE VIEW vw_emp20
AS SELECT * FROM emp
WHERE deptno=20
WITH CHECK OPTION constraint vw_emp20_ck;
視圖 已建立。
查詢結果:
SELECT empno,ename,job FROM vw_emp20;
EMPNO ENAME JOB
--------------------- -------------- -------------
7369 SMITH CLERK
7566 JONES MANAGER
7902 FORD ANALYST
修改:
UPDATE vw_emp20
SET deptno=20
WHERE empno=7902;
將產生錯誤:
UPDATE vw_emp20
*
ERROR 位于第一行:
ORA-01402:視圖WITH CHECK OPTION 違反WHERE 子句
索引:--像字典里面的索引。
表建立索引后在插入數據時,一要把數據寫入表里,二要把該數據記入索引里面,因此查詢效率高、但插入效率低。
create index idx_stu_email on stu(email,class); --組合索引,查詢效率高。
drop index idx_stu_email;
select * from user_indexes; -- 查詢索引
Oracle的數據庫對象分為五種:表,視圖,序列,索引和同義詞。
select * from user_tables -- 當前用戶下有多少張表
select * from user_views -- 當前用戶下有多少張視圖
select * from user_sequences; --查詢序列
select * from user_indexes; -- 查詢索引
select * from user_constraints -- 當前用戶下有多少約束
select * from dictionary --數據字典表的表
DDL(data definition language):DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定義或改變表(TABLE)的結構,數據類型,表之間的鏈接和約束等初始化工作上,他們大多在建立表時使用。
數據類型:VARCHAR2(50)最大4K(4096字節)、CHAR(1)最大2k、NUMBER(10,6)、NUMBER(6)、DATE、
LONG 變長字符串,最大長度達2G。
約束條件有5個:非空、唯一、主鍵、外鍵、check。
create table stu
(
id number(6), --primary key
name varchar2(20) constraint stu_name_nn not null, --stu_name_nn別名
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4), --references class(id)
email varchar2(50),
--email varchar2(50) unique --字段級約束,不能有重復值
constraint stu_name_email_uni unique(name,email), --表級約束
constraint stu_id_pk primary key(id), --表級約束
constraint stu_class_fk foreign key(class) references class(id) --被參考字段必須是主鍵
);
create table class
(
id number(4) primary key,
name varchar2(20) not null
)
alter table stu add(addr varchar2(100)); --對已存在的表新增字段
alter table stu modify(addr varchar2(150)); --對字段修改
alter table stu drop (addr); --刪除一個字段
alter table stu drop constraint stu_class_fk;
delete from class;
drop table class;
SQL語言共分為四大類:數據查詢語言DQL,數據操縱語言DML,數據定義語言DDL,數據控制語言DCL。
DML(data manipulation language):它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對數據庫里的數據進行操作的語言。
conn sys/sys as sysdba;
drop user pcisv6 cascade;
exp --備份scott用戶下的表
--創建用戶,identified為認證相當是密碼,quota配額就是分配空間。
create user pcisv6 identified by 11 default tablespace core6 quota 10M on corev6
grant create session,create table,create view to pcisv6; --授權,session是用于登錄的
imp --導入scott用戶下的表
SELECT:
select rownum r,ename from emp; --rownum行數,目前只能使用<、<=, 而沒有直接>、=的寫法。
select ename, sal --求薪水最高的前5人
from (select ename, sal from emp order by sal desc)
where rownum <= 5;
--求薪水最高的前6到10人
select ename,sal,rownum r from emp order by sal desc; --r 排序混亂
select ename,sal,rownum r from (select ename,sal from emp order by sal desc); --此時r序號按新表排序
select ename, sal -- 此處為結果
from (select ename, sal, rownum r
from (select ename, sal from emp order by sal desc))
where r >= 6
and r <= 10;
INSERT:
insert into dept values(50,'game','bj'); --整條記錄
rollback;
create table dept2 as selet * from emp; --創建dept2表
insert into dept2(deptno,dname) values(60,'game2'); --有選擇的字段插入
insert into dept2 select * from dept; --插入一個表, 2個表結構一樣
UPDATE:
update emp2 set sal=sal*12,ename=ename||'-' where deptno=10;
DELETE:
delete from dept2 where deptno<25;
rollback;
TRANSACTION:
transaction 起始一條dml語句,在commit、rollback時完成。
transaction 在執行dml后,在其后有執行了ddl、dcl時,事務自動提交。
在正常退出exit時,事務自動提交。
在非正常退出時,事務回滾。
------------------------------------------------------------
例子:
有3個表S,C,SC
S(SNO,SNAME)代表(學號,姓名)
C(CNO,CNAME,CTEACHER)代表(課號,課名,教師)
SC(SNO,CNO,SCGRADE)代表(學號,課號成績)
問題:
1,找出沒選過“黎明”老師的所有學生姓名。
2,列出2門以上(含2門)不及格學生姓名及平均成績。
3,即學過1號課程有學過2號課所有學生的姓名。
請用標準SQL語言寫出答案,方言也行(請說明是使用什么方言)。
1.
select sname froms
join sc on (s.sno = sc.sno)
join c(c.cno = sc.cno)
where c.cteacher <> 'liming';
2.
select sname
where sno in (select sno
from sc
where scgrade < 60
group by sno
having count(*) >= 2);
3.
select sname
where sno in (select sno
from sc
where cno = 1
and sno in (select sno from sc where cno = 2));
錯誤原因:在Oracle新建了一個表,名為“QueryHistory",用來保存用戶的查詢記錄,這時,再用"Select * from QueryHistory"來查詢,報 "ORA-00942: 表或視圖不存在 "。
錯誤分析:利用Google搜索找到了原因,
oracle是大小寫敏感的,如果定義表名稱或列名稱的時候沒有用引號引起來的話 oracle會把他們全部轉換為大寫,這時就會出現錯誤了。
解決方法:將語句改為"Select * from "QueryHistory" 或是語句全部大寫。
PCIS[2010-07-08 18:08:02,531]>> ERROR>> [BizControllerImpl異常堆棧{事務ID/用戶代碼}:[1278583679437325]/[00000210]:com.fwk.service.BusinessServiceException: com.fwk.dao.DaoException: 保存保單, saveOrUpdatePolicy()時出錯; nested exception is org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at com.pcis.policy.dm.PolicyDAO.saveOrUpdatePolicy(PolicyDAO.java:193)
at com.pcis.policy.app.newbusiness.service.PolicyAppService.savePolicy(PolicyAppService.java:343)
at com.pcis.policy.app.underwrite.bm.UnderwriteBM.submitUnderwrite(UnderwriteBM.java:139)
at com.pcis.policy.app.underwrite.action.UnderwriteBizAction.submitUnderwrite(UnderwriteBizAction.java:548)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
...
Caused by: org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:624)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:379)
at org.springframework.orm.hibernate3.HibernateTemplate.flush(HibernateTemplate.java:841)
at com.fwk.dao.BaseDao.flush(Unknown Source)
at com.pcis.policy.dm.PolicyDAO.saveOrUpdatePolicy(PolicyDAO.java:174)
... 80 more
Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (PCISV6_TS.UI_PLY_CVRG) violated
at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:602)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9350)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:210)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
... 90 more
分析及解決:
在頁面保存的時候,后臺提示是違反唯一索引,通過UI_PLY_CVRG 查詢相應的表,
select * from user_indexes where index_name='UI_PLY_CVRG'
該表是WEB_PLY_CVRG ,而該表的唯一索引UI_PLY_CVRG 是由該表的3個字段組成 C_PLY_NO、N_EDR_PRJ_NO、 N_SEQ_NO,然后看下頁面發現是N_SEQ_NO有4個重復,刪除多余的記錄即可保存成功。
在項目中經常需要處理一些輸入字符,往往我們也需要對其進行校驗,而使用正則表達式是一個很好的處理方法。下面介紹一款處理正則表達式的軟件 Match Tracer v2.0,MTracer最有用的特性是中文的正則式分析樹。
下載地址:http://www.52z.com/down/30160.Html
官網:http://www.regexlab.com/zh/mtracer/
在平時的項目中,經常需要開一下別人寫的源碼,而此時別人提供的往往是jar文件,根本看不了,很是不爽。最近很偶然的看見一個同事在eclipse下查看class文件,很是興奮。下面講下是如何安裝下插件的。
打開class文件,我目前了解的有2種類型的軟件:
一、 在eclipse外部打開jar文件。
Java Decompiler.exe,主頁JD home page: http://java.decompiler.free.fr ,該軟件可以打開整個jar包,功能很強大。
二、 在eclipse內部打開jar文件。
net.sf.jadclipse_3.3.0.jar、jad158g.win.zip,需要這兩個文件。
準備工作:
1、下載jad.exe文件: http://www.varaneckas.com/jad
2、下載jadeclipse插件: http://sourceforge.net/projects/jadclipse/files/
安裝如下:
1、將jadeclipse插件net.sf.jadclipse_3.3.0.jar 拷貝到myeclipse安裝目錄E:\MyEclipse 6.0\eclipse\myplugins\jad\eclipse\plugins目錄下,并在目錄E:\MyEclipse 6.0\eclipse\links下新建文件jad.link,內容如下path=E:\\MyEclipse 6.0\\eclipse\\myplugins\\jad\\
2、將jad.exe解壓到指定目錄。如:D:\tools
3、在eclipse窗口下,點擊Window > Preferences > Java > JadClipse > Path to Decompiler。(設置jad的絕對路徑,如 D:\tools\jad\jad.exe)。Use Eclipse code formatter(overrides Jad formatting instructions)選項打勾,與格式化出來的代碼樣式一致。
4、在eclipse窗口下,點擊Window > Preferences > Java > JadClipse > Misc,將Convert Unicode strings into ANSI strings選項打勾,避免反編譯后可能出現的中文亂碼。
5、重新啟動myeclipse,eclipse自動將JadClipse Class File Viewer設置成class文件的缺省打開方式。如果沒有默認,可以在Eclipse的Window > Preferences >General >Editors> File Associations中修改“*.class”默認關聯的編輯器為“JadClipse Class File Viewer”。設置完成后,雙擊*.class文件,eclipse將自動反編譯。
select e1.ename,e2.ename from emp e1 join emp e2 on (e1.mgr=e2.empno); --自連接,從e2中取出e1的經理人。
select ename,dname from emp e left join dept d on (e.deptno=d.deptno); --左外連接
select ename,dname from emp e right outer join dept d on (e.deptno=d.deptno); --右外連接
select ename,dname from emp e full join dept d on (e.deptno=d.deptno); --全連接
--求部門中哪些人的薪水最高
select ename,sal from emp
join (select max(sal) max_sal,deptno from emp group by deptno) t
on (emp.sal = t.max_sal and emp.deptno = t.deptno);
--求部門平均薪水的等級
select deptno,avg_sal,grade from
(select deptno,avg(sal) avg_sal from emp group by deptno) t
join salgrade s on (t.avg_sal between s.losal and s.hisal);
--求部門平均的薪水等級
select avg(grade) from
(select deptno,ename,grade from emp join salgrade s on (emp.sal between s.losal and s.hisal )) t
group by deptno;
--雇員中有哪些人是經理人
select ename from emp where empno in (select distinct mgr from emp);
--不準用組函數,求薪水的最高值。采用的是自連接。
select distinct sal from emp where sal not in
(select distinct e1.sal from emp e1 join emp e2 on (e1.sal < e2.sal));
--求平均薪水最高的部門的部門編號。嵌套的組函數。
select deptno,avg_sal from
(select avg(sal) avg_sal,deptno from emp group by deptno)
where avg_sal =
(select max(avg(sal)),deptno from emp group by deptno;
--求平均薪水的等級最低的部門的部門名稱。
select dname,t1.deptno,grade,avg_sal from
(
select deptno,grade,avg_sal from
(select deptno,avg(sal) avg_sal from emp group by deptno) t
join salgrade s on (t.avg_sal between s.losal and s.hisal)
)
t1
join dept on (t1.deptno = dept.deptno)
)
where t1.grade =
(
select min(grade) from
(select deptno,grade,avg_sal from
(select deptno,grade,avg(sal) avg_sal from emp group by deptno) t
join salgrade s on (t.avg_sal between s.losal and s.hisal)
)
)
--求平均薪水的等級最低的部門的部門名稱。采用視圖。
conn sys/sys as sysdba;
grant create table,create view to scott;
create view v$_dept_avg_sal_info as
select deptno,grade,avg_sal from
(select deptno,grade,avg(sal) avg_sal from emp group by deptno) t
join salgrade s on (t.avg_sal between s.losal and s.hisal);
select dname,t1.deptno,grade,avg_sal from
v$_dept_avg_sal_info t1
join dept on (t1.deptno = dept.deptno)
)
where t1.grade =
(
select min(grade) from v$_dept_avg_sal_info
)
-- 比普通員工的最高薪水還要高的經理人名稱。
select ename from emp
where empno in (select distinct mgr from emp where mgr is not null)
and sal >
(
select max(sal) from emp where empno not in
(select distinct mgr from emp where mgr is not null)
)
--1992年sql標準,連接條件和過濾條件寫在一起。
select ename,dname,grade
from emp e,dept d,salgrade s
where e.deptno = d.deptno and e.sal between s.losal and s.hisal and job<>'CLERK';
--1999年sql標準,連接條件和過濾條件分開
select ename,dname,grade
from emp e join dept d on (e.deptno = d.deptno)
join salgrade s on (e.sal between s.losal and s.hisal)
where ename not like '_A%';
increase the size of the pool and retry..] - [org.hibernate.util.JDBCExceptionReporter] -950125750 [[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)']
PCIS[2010-07-01 12:51:47,456]>> WARN>> [SQL Error: 0, SQLState: null] - [org.hibernate.util.JDBCExceptionReporter] -950125750 [[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)']
PCIS[2010-07-01 12:51:47,456]>>ERROR>> [Cannot obtain connection: driverURL = jdbc:weblogic:pool:pcis_ts, props = {EmulateTwoPhaseCommit=false, connectionPoolID=pcis_ts, jdbcTxDataSource=true, LoggingLastResource=false, dataSourceName=pcis_ts}] - [org.hibernate.util.JDBCExceptionReporter] -950125750 [[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)']
PCIS[2010-07-01 12:51:47,456]>> WARN>> [SQL Error: 0, SQLState: null] - [org.hibernate.util.JDBCExceptionReporter] -950125750 [[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)']
PCIS[2010-07-01 12:51:47,456]>>ERROR>> [weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool pcis_ts to allocate to applications, please increase the size of the pool and retry..] - [org.hibernate.util.JDBCExceptionReporter] -950125750 [[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)']
PCIS[2010-07-01 12:51:47,456]>> WARN>> [SQL Error: 0, SQLState: null] - [org.hibernate.util.JDBCExceptionReporter] -950125750 [[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)']
PCIS[2010-07-01 12:51:47,456]>>ERROR>> [Cannot obtain connection: driverURL = jdbc:weblogic:pool:pcis_ts, props = {EmulateTwoPhaseCommit=false, connectionPoolID=pcis_ts, jdbcTxDataSource=true, LoggingLastResource=false, dataSourceName=pcis_ts}] - [org.hibernate.util.JDBCExceptionReporter] -950125750 [[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kerne
l.Default (self-tuning)']
[com.pcis.premium.service.PremiumService] -950125750 [[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)']
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Cannot open connection; uncategorized SQLException for SQL [???]; SQL state [null]; error code [0]; weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool pcis_ts to allocate to applications, please increase the size of the pool and retry..; nested exception is weblogic.jdbc.extensions.PoolLimitSQLException: weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool pcis_ts to allocate to applications, please increase the size of the pool and retry..
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.translate(SQLStateSQLExceptionTranslator.java:124)
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:322)
at org.springframework.orm.hibernate3.HibernateAccessor.convertJdbcAccessException(HibernateAccessor.java:424)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:410)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:379)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:872)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:868)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:168)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:183)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:138)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:99)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at com.isoftstone.iaeap.web.filter.SetCharacterEncodingFilter.doFilter(Unknown Source)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3393)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(Unknown Source)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2140)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2046)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)
Caused by: weblogic.jdbc.extensions.PoolLimitSQLException: weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool pcis_ts to allocate to applications, please increase the size of the pool and retry..
at weblogic.jdbc.common.internal.JDBCUtil.wrapAndThrowResourceException(JDBCUtil.java:242)
at weblogic.jdbc.pool.Driver.connect(Driver.java:160)
at weblogic.jdbc.jts.Driver.getNonTxConnection(Driver.java:642)
at weblogic.jdbc.jts.Driver.connect(Driver.java:124)
at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:339)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
at org.hibernate.loader.Loader.doQuery(Loader.java:673)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2213)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:881)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:374)
... 31 more
原因:主要是weblogic的連接池已滿,需要重新設置或者重啟weblogic的AdminServer服務器進行釋放連接。
操作:進入weblogic控制臺,選擇:域-->Services-->JDBC-->Data Source-->點擊control-->選中AdminServer,對其重啟即可。
select chr(65) from dual;
select ascii('A') from dual; --求編碼
select ename from emp where lower(ename) like '_a%' -- upper大寫
select round(23.652,2) from dual; -- 四舍五入 23.65,round(23.652)為24
select substr(ename,1,3) from emp; --從第一個開始,總接取3個。
select ename,sal,deptno from emp where length(sal)>3;
select to_char(sal,'$99,999.9999') from emp; --'L00000.0000'千位不夠補0
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;
select ename,hiredate from emp where hiredate>to_date('1981-2-20 12:34:56','YYYY-MM-DD HH24:MI:SS');
select sal from emp where sal>to_number('$1,250.00','$9,999.99');
select ename,sal*12 + nvl(comm,0) from emp; --對空值處理
組函數:
select max(sal) from emp;
select min(sal) from emp;
select avg(sal) from emp;
select sum(sal) from emp;
select count(*) from emp; -- *求出總記錄數, count(comm)求出該列不為空的值。
select deptno,job,max(sal) from emp group by deptno,job; --按照條件組合分組
select ename from emp where sal =(select max(sal) from emp); --子查詢
update Web_Bas_Edr_Rsn set c_rsn_txt=REPLACE(c_rsn_txt,'天津','北京') where c_rsn_txt like '%天津%' --批量替換
-- having對分組進行限制,where對單行限制
select avg(sal) from emp where sal>1000 group by deptno having avg(sal) >1500 order by avg(sal) desc;
sqlplus sys/sys as sysdba;
alert user scott account unlock;
desc emp;
select ename,sal*12 from emp;
select sysdate from dual; --dual為空表
select ename,sal*12 annual_sal from emp; --別名
--數值+null 為null
select ename||sal from emp; --拼串
select ename||'aaa''bbb' from emp; --含'的拼串,''替換為'
select distinct deptno,job from emp; --去掉2個字段值的組合
select * from emp where deptno=10 and ename='CLARK';
select ename,sal from emp where sal>1500;
select ename,sal from emp where deptno<>10;
select ename,sal from emp where sal between 800 and 1500; -- sal>=800 and sal<=1500
select ename,sal,comm from emp where comm is null; --is not null
select ename,sal,comm from emp where sal in (800,1500); -- not in (800,1500)
select ename from emp where ename like '_A%' -- %為0個或多個,-為1個
select ename from emp where ename like '%\%%' -- 名字含有%,需要\為轉義字符處理
select ename from emp where ename like '%$%%' escape '$' -- 可以使用$作為轉義字符
select ename,sal,deptno from emp order by deptno asc,ename desc; -- 升序asc,降序 desc
今天想把tomcat下的程序遷移到weblogic92上,可是程序在發布到weblogic92時報下面的異常:
Home > Summary of Deployments > Summary of JDBC Data Sources > myDataSource > Summary of Deployments :
Messages
An error occurred during activation of changes, please see the log for details.
[HTTP:101064][WebAppModule(nonvhl:WebRoot)] Error parsing descriptor in Web appplication "E:\workspace\nonvhl_policy_TS\WebRoot"
weblogic.application.ModuleException: VALIDATION PROBLEMS WERE FOUND E:\workspace\nonvhl_policy_TS\WebRoot\WEB-INF\web.xml:133:5:133:5: problem: cvc-complex
-type.2.4a: Expected elements 'servlet-class@http://java.sun.com/xml/ns/j2ee jsp-file@http://java.sun.com/xml/ns/j2ee' instead of 'display-
name@http://java.sun.com/xml/ns/j2ee' here in element servlet@http://java.sun.com/xml/ns/j2ee: at weblogic.servlet.internal.WebAppModule.loadDescriptor
(WebAppModule.java:784) at weblogic.servlet.internal.WebAppModule.prepare(WebAppModule.java:275) at
weblogic.application.internal.flow.ScopedModuleDriver.prepare(ScopedModuleDriver.java:176) at
weblogic.application.internal.flow.ModuleListenerInvoker.prepare(ModuleListenerInvoker.java:93) at
weblogic.application.internal.flow.DeploymentCallbackFlow$1.next(DeploymentCallbackFlow.java:360) at weblogic.application.utils.StateMachineDriver.nextState
(StateMachineDriver.java:26) at weblogic.application.internal.flow.DeploymentCallbackFlow.prepare(DeploymentCallbackFlow.java:56) at
weblogic.application.internal.flow.DeploymentCallbackFlow.prepare(DeploymentCallbackFlow.java:46) at weblogic.application.internal.BaseDeployment$1.next
(BaseDeployment.java:621) at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:26) at
weblogic.application.internal.BaseDeployment.prepare(BaseDeployment.java:208) at weblogic.application.internal.DeploymentStateChecker.prepare
(DeploymentStateChecker.java:147) at weblogic.deploy.internal.targetserver.AppContainerInvoker.prepare(AppContainerInvoker.java:61) at
weblogic.deploy.internal.targetserver.operations.ActivateOperation.createAndPrepareContainer(ActivateOperation.java:189) at
weblogic.deploy.internal.targetserver.operations.ActivateOperation.doPrepare(ActivateOperation.java:87) at
weblogic.deploy.internal.targetserver.operations.AbstractOperation.prepare(AbstractOperation.java:217) at
weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentPrepare(DeploymentManager.java:718) at
weblogic.deploy.internal.targetserver.DeploymentManager.prepareDeploymentList(DeploymentManager.java:1185) at
weblogic.deploy.internal.targetserver.DeploymentManager.handlePrepare(DeploymentManager.java:247) at
原因:經過分析是web.xml配置的問題,有些servlet上面配置了'display-name',這個weblogic是不支持的。
解決:在web.xml中把'display-name'刪除掉,工程就可以在weblogic下成功發布。
在配置weblogic的數據源時,提示一下信息:
Home > Summary of Deployments > Summary of JDBC Data Sources:
Messages
An error occurred during activation of changes, please see the log for details.
weblogic.application.ModuleException:
weblogic.common.ResourceException: Could not create pool connection. The DBMS driver exception was: Io 異常: The Network Adapter could not establish the connection
解決:主要是我在配置數據源時沒有把Oracle的服務啟動造成的。
1、今天到客戶現場,輸入系統地址,發現登錄不上,后來查了下是DNS域名的問題。
原因:客戶的機器域名解析地址是:google的DNS,首選DNS服務器和備用DNS服務器分別設置為 8.8.8.8和8.8.4.4。由于我們是在本地局域網設置的域名,公網的域名解析器不識別,導致登錄不了系統。
解決:設置自動獲取DNS。

2、登錄系統后,打來相關的頁面,又出現頁面加載失敗
原因:主要是域名解析后,對相應的ip地址有限制。
解決:把域名、ip地址都加入為可信任站點,調低安全級別即可。

1、聲明式事務配置
* 配置SessionFactory
* 配置事務管理器
* 事務的傳播特性
* 那些類那些方法使用事務
2、編寫業務邏輯方法
* 繼承HibernateDaoSupport類,使用HibernateTemplate來持久化,HibernateTemplate是
Hibernate Session的輕量級封裝
* 默認情況下運行期異常才會回滾(包括繼承了RuntimeException子類),普通異常是不會滾的
* 編寫業務邏輯方法時,最好將異常一直向上拋出,在表示層(struts)處理
* 關于事務邊界的設置,通常設置到業務層,不要添加到Dao上
3、了解事務的幾種傳播特性
1. PROPAGATION_REQUIRED: 如果存在一個事務,則支持當前事務。如果沒有事務則開啟
2. PROPAGATION_SUPPORTS: 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行
3. PROPAGATION_MANDATORY: 如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。
4. PROPAGATION_REQUIRES_NEW: 總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
5. PROPAGATION_NOT_SUPPORTED: 總是非事務地執行,并掛起任何存在的事務。
6. PROPAGATION_NEVER: 總是非事務地執行,如果存在一個活動事務,則拋出異常
7. PROPAGATION_NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務,
則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行
4、Spring事務的隔離級別
1. ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.
另外四個與JDBC的隔離級別相對應
2. ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別,它充許令外一個事務可以看到這個事務未提交的數據。
這種隔離級別會產生臟讀,不可重復讀和幻像讀。
3. ISOLATION_READ_COMMITTED: 保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據
4. ISOLATION_REPEATABLE_READ: 這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻像讀。
它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重復讀)。
5. ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。
除了防止臟讀,不可重復讀外,還避免了幻像讀。
對于出現的亂碼有2種解決方法:
1、在JS中,window.showModalDialog傳遞對象。
 function tool_uploadFile(clmNo,billType,maxFileNum,fileType,singleLimit,totalLimit) {//解決亂碼的問題,增加變量paramObj。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;
}
在uploadFile.jsp中,通過js獲得參數。
<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>
2、在JS中,window.showModalDialog通過?傳遞參數。
 function tool_uploadFile(clmNo,billType,maxFileNum,fileType,singleLimit,totalLimit) {
billType = encodeURIComponent(billType);
var r = window.showModalDialog(global.WEB_APP_NAME+"/core/jsp/common/uploadFile.jsp?clmNo="+clmNo+"&billType="+billType+"&maxFileNum="+maxFileNum+"&fileType="+fileType+"&singleLimit="+singleLimit+"&totalLimit="+totalLimit,"","dialogHeight:610px;dialogWidth:530px;center:1;help: 0; status: 0;");
return r;
}
在uploadFile.jsp中,通過java解析獲得參數。
String paramStr = request.getQueryString();
 if (paramStr == null || paramStr.equals("")) {
return;
}

HashMap<String, ArrayList<String>> parameter = new HashMap<String, ArrayList<String>>();
String[] paramArr = paramStr.split("&+");
String[] arr = null;
 for (int i = 0; i < paramArr.length; i++) {
arr = paramArr[i].split("=", 2);
ArrayList<String> lst = parameter.get(arr[0]);
 if (lst == null) {
lst = new ArrayList<String>();
parameter.put(arr[0], lst);
}
 if (arr.length < 2) {
lst.add("");
 } else {
lst.add(URLDecoder.decode(arr[1], "UTF-8"));
}
}
ArrayList<String> paramlst = parameter.get("billType");
String billType = paramlst.get(0);

以上兩種方法,對應用服務器設置的url編碼沒有關系。
還有一種方法,就是轉換成GB2312,不過此種方法跟服務器編碼設置還有關系,有時還會出現亂碼:
billType = new String(billType.getBytes(" ISO-8859-1"),"GB2312");
|