資源描述:
《java調(diào)用存儲過程詳解.doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、1、什么是存儲過程。存儲過程是數(shù)據(jù)庫服務(wù)器端的一段程序,它有兩種類型。一種類似于SELECT查詢,用于檢索數(shù)據(jù),檢索到的數(shù)據(jù)能夠以數(shù)據(jù)集的形式返回給客戶。另一種類似于INSERT或DELETE查詢,它不返回數(shù)據(jù),只是執(zhí)行一個動作。有的服務(wù)器允許同一個存儲過程既可以返回數(shù)據(jù)又可以執(zhí)行動作。2、什么時候需要用存儲過程 如果服務(wù)器定義了存儲過程,應(yīng)當根據(jù)需要決定是否要用存儲過程。存儲過程通常是一些經(jīng)常要執(zhí)行的任務(wù),這些任務(wù)往往是針對大量的記錄而進行的。在服務(wù)器上執(zhí)行存儲過程,可以改善應(yīng)用程序的性能。這是因為:.服務(wù)器往往具有強大的計算能力
2、和速度。.避免把大量的數(shù)據(jù)下載到客戶端,減少網(wǎng)絡(luò)上的傳輸量?! ±?,假設(shè)一個應(yīng)用程序需要計算一個數(shù)據(jù),這個數(shù)據(jù)需要涉及到許多記錄。如果不使用存儲過程的話,把這些數(shù)據(jù)下載到客戶端,導致網(wǎng)絡(luò)上的流量劇增?! 〔粌H如此,客戶端可能是一臺老掉牙的計算機,它的運算速度很慢。而改用存儲過程后,服務(wù)器會很快地把數(shù)據(jù)計算出來,并且只需傳遞一個數(shù)據(jù)給客戶端,其效率之高是非常明顯的。3、存儲過程的參數(shù) 要執(zhí)行服務(wù)器上的存儲過程,往往要傳遞一些參數(shù)。這些參數(shù)分為四種類型: 第一種稱為輸入?yún)?shù),由客戶程序向存儲過程傳遞值。 第二種稱為輸出參數(shù),由存儲
3、過程向客戶程序返回結(jié)果?! 〉谌N稱為輸入/輸出參數(shù),既可以由客戶程序向存儲過程傳遞值,也可以由存儲過程向客戶程序返回結(jié)果?! 〉谒姆N稱為狀態(tài)參數(shù),由存儲過程向客戶程序返回錯誤信息。 要說明的是,并不是所有的服務(wù)器都支持上述四種類型的參數(shù),例如,InterBase就不支持狀態(tài)參數(shù)。4、oracle存儲過程的基本語法?1.基本結(jié)構(gòu)CREATEORREPLACEPROCEDURE存儲過程名字(??參數(shù)1INNUMBER,??參數(shù)2INNUMBER)IS變量1INTEGER:=0;變量2DATE;BEGINEND存儲過程名字2.SELEC
4、TINTOSTATEMENT?將select查詢的結(jié)果存入到變量中,可以同時將多個列存儲多個變量中,必須有一條?記錄,否則拋出異常(如果沒有記錄拋出NO_DATA_FOUND)?例子:?BEGIN?SELECTcol1,col2into變量1,變量2FROMtypestructwherexxx;?EXCEPTION?WHENNO_DATA_FOUNDTHEN???xxxx;?END;一:無返回值的存儲過程存儲過程為:CREATEORREPLACEPROCEDURETESTA(PARA1INVARCHAR2,PARA2INVARCHAR
5、2)ASBEGIN?INSERTINTOHYQ.B_ID(I_ID,I_NAME)S(PARA1,PARA2);ENDTESTA;然后呢,在java里調(diào)用時就用下面的代碼: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();?????}?