資源描述:
《java調(diào)用存儲(chǔ)過程詳解.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、1、什么是存儲(chǔ)過程。存儲(chǔ)過程是數(shù)據(jù)庫服務(wù)器端的一段程序,它有兩種類型。一種類似于SELECT查詢,用于檢索數(shù)據(jù),檢索到的數(shù)據(jù)能夠以數(shù)據(jù)集的形式返回給客戶。另一種類似于INSERT或DELETE查詢,它不返回?cái)?shù)據(jù),只是執(zhí)行一個(gè)動(dòng)作。有的服務(wù)器允許同一個(gè)存儲(chǔ)過程既可以返回?cái)?shù)據(jù)又可以執(zhí)行動(dòng)作。2、什么時(shí)候需要用存儲(chǔ)過程 如果服務(wù)器定義了存儲(chǔ)過程,應(yīng)當(dāng)根據(jù)需要決定是否要用存儲(chǔ)過程。存儲(chǔ)過程通常是一些經(jīng)常要執(zhí)行的任務(wù),這些任務(wù)往往是針對(duì)大量的記錄而進(jìn)行的。在服務(wù)器上執(zhí)行存儲(chǔ)過程,可以改善應(yīng)用程序的性能。這是因?yàn)椋?服務(wù)器往往具有強(qiáng)大的計(jì)算能力
2、和速度。.避免把大量的數(shù)據(jù)下載到客戶端,減少網(wǎng)絡(luò)上的傳輸量?! ±?,假設(shè)一個(gè)應(yīng)用程序需要計(jì)算一個(gè)數(shù)據(jù),這個(gè)數(shù)據(jù)需要涉及到許多記錄。如果不使用存儲(chǔ)過程的話,把這些數(shù)據(jù)下載到客戶端,導(dǎo)致網(wǎng)絡(luò)上的流量劇增。 不僅如此,客戶端可能是一臺(tái)老掉牙的計(jì)算機(jī),它的運(yùn)算速度很慢。而改用存儲(chǔ)過程后,服務(wù)器會(huì)很快地把數(shù)據(jù)計(jì)算出來,并且只需傳遞一個(gè)數(shù)據(jù)給客戶端,其效率之高是非常明顯的。3、存儲(chǔ)過程的參數(shù) 要執(zhí)行服務(wù)器上的存儲(chǔ)過程,往往要傳遞一些參數(shù)。這些參數(shù)分為四種類型: 第一種稱為輸入?yún)?shù),由客戶程序向存儲(chǔ)過程傳遞值?! 〉诙N稱為輸出參數(shù),由存儲(chǔ)
3、過程向客戶程序返回結(jié)果。 第三種稱為輸入/輸出參數(shù),既可以由客戶程序向存儲(chǔ)過程傳遞值,也可以由存儲(chǔ)過程向客戶程序返回結(jié)果?! 〉谒姆N稱為狀態(tài)參數(shù),由存儲(chǔ)過程向客戶程序返回錯(cuò)誤信息?! ∫f明的是,并不是所有的服務(wù)器都支持上述四種類型的參數(shù),例如,InterBase就不支持狀態(tài)參數(shù)。4、oracle存儲(chǔ)過程的基本語法?1.基本結(jié)構(gòu)CREATEORREPLACEPROCEDURE存儲(chǔ)過程名字(??參數(shù)1INNUMBER,??參數(shù)2INNUMBER)IS變量1INTEGER:=0;變量2DATE;BEGINEND存儲(chǔ)過程名字2.SELEC
4、TINTOSTATEMENT?將select查詢的結(jié)果存入到變量中,可以同時(shí)將多個(gè)列存儲(chǔ)多個(gè)變量中,必須有一條?記錄,否則拋出異常(如果沒有記錄拋出NO_DATA_FOUND)?例子:?BEGIN?SELECTcol1,col2into變量1,變量2FROMtypestructwherexxx;?EXCEPTION?WHENNO_DATA_FOUNDTHEN???xxxx;?END;一:無返回值的存儲(chǔ)過程存儲(chǔ)過程為:CREATEORREPLACEPROCEDURETESTA(PARA1INVARCHAR2,PARA2INVARCHAR
5、2)ASBEGIN?INSERTINTOHYQ.B_ID(I_ID,I_NAME)S(PARA1,PARA2);ENDTESTA;然后呢,在java里調(diào)用時(shí)就用下面的代碼:packagecom.hyq.src;importjava.sql.*;importjava.sql.ResultSet;publicclassTestProcedureOne{publicTestProcedureOne(){}publicstaticvoidmain(String[]args){??Stringdriver="oracle.jdbc.driver
6、.OracleDriver";??StringstrUrl="jdbc:oracle:thin:@127.0.0.1:1521:hyq";??Statementstmt=null;??ResultSetrs=null;??Connectionconn=null;??CallableStatementcstmt=null;??try{???Class.forName(driver);???conn=DriverManager.getConnection(strUrl,"hyq","hyq");???CallableStatementpr
7、oc=null;???proc=conn.prepareCall("{callHYQ.TESTA(?,?)}");???proc.setString(1,"100");???proc.setString(2,"TestOne");???proc.execute();??}??catch(SQLExceptionex2){???ex2.printStackTrace();??}??catch(Exceptionex2){???ex2.printStackTrace();??}??finally{???try{????if(rs!=nul
8、l){?????rs.close();?????if(stmt!=null){??????stmt.close();?????}?????if(conn!=null){??????conn.close();?????}?