自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳細(xì)介紹JDBC存儲(chǔ)過程

開發(fā) 后端
CallableStatement 對(duì)象為所有的DBMS提供了一種以標(biāo)準(zhǔn)形式調(diào)用已儲(chǔ)存過程的方法。已儲(chǔ)存過程儲(chǔ)存在數(shù)據(jù)庫(kù)中。對(duì)已儲(chǔ)存過程的調(diào)用是CallableStatement對(duì)象所含的內(nèi)容。本文將談?wù)凧DBC存儲(chǔ)過程。

對(duì)已儲(chǔ)存過程的調(diào)用是CallableStatement對(duì)象所含的內(nèi)容。這種調(diào)用是用一種換碼語(yǔ)法來寫的,有兩種形式:一種形式帶結(jié)果參,另一種形式不帶結(jié)果參數(shù)。結(jié)果參數(shù)是一種輸出(OUT)參數(shù),是已儲(chǔ)存過程的返回值。兩種形式都可帶有數(shù)量可變的輸入(IN參數(shù))、輸出(OUT參數(shù))或輸入和輸出(INOUT參數(shù))的參數(shù)。問號(hào)將用作參數(shù)的占位符。

在JDBC中調(diào)用已儲(chǔ)存過程的語(yǔ)法如下所示。注意,方括號(hào)表示其間的內(nèi)容是可選項(xiàng);方括號(hào)本身并非語(yǔ)法的組成部份。

{call過程名[(?,?,...)]}

返回結(jié)果參數(shù)的過程的語(yǔ)法為:

{?=call過程名[(?,?,...)]}

不帶參數(shù)的已儲(chǔ)存過程的語(yǔ)法類似:

{call過程名}

通常,創(chuàng)建CallableStatement對(duì)象的人應(yīng)當(dāng)知道所用的DBMS是支持已儲(chǔ)存過程的,并且知道這些過程都是些什么。然而,如果需要檢查,多種DatabaseMetaData方法都可以提供這樣的信息。例如,如果DBMS支持已儲(chǔ)存過程的調(diào)用,則supportsStoredProcedures方法將返回true,而getProcedures方法將返回對(duì)已儲(chǔ)存過程的描述。

CallableStatement繼承Statement的方法(它們用于處理一般的SQL語(yǔ)句),還繼承了PreparedStatement的方法(它們用于處理IN參)。

CallableStatement中定義的所有方法都用于處理OUT參數(shù)或INOUT參數(shù)的輸出部分:注冊(cè)O(shè)UT參數(shù)的JDBC類型(一般SQL類型)、從這些參數(shù)中檢索結(jié)果,或者檢查所返回的值是否為JDBCNULL。

JDBC存儲(chǔ)過程1、創(chuàng)建CallableStatement對(duì)象

CallableStatement對(duì)象是用Connection方法prepareCall創(chuàng)建的。下例創(chuàng)建CallableStatement的實(shí)例,其中含有對(duì)已儲(chǔ)存過程getTestData調(diào)用。該過程有兩個(gè)變量,但不含結(jié)果參數(shù):CallableStatementcstmt=con.prepareCall("{callgetTestData(?,?)}");其中?占位符為IN、OUT還是INOUT參數(shù),取決于已儲(chǔ)存過程getTestData。

JDBC存儲(chǔ)過程2、IN和OUT參數(shù)

將IN參數(shù)傳給CallableStatement對(duì)象是通過setXXX方法完成的。該方法繼承自PreparedStatement。所傳入?yún)?shù)的類型決定了所用的setXXX方法(例如,用setFloat來傳入float值等)。如果已儲(chǔ)存過程返回OUT參數(shù),則在執(zhí)行CallableStatement對(duì)象以前必須先注冊(cè)每個(gè)OUT參數(shù)的JDBC類型(這是必需的,因?yàn)槟承〥BMS要求JDBC類型)。注冊(cè)JDBC類型是用registerOutParameter方法來完成的。語(yǔ)句執(zhí)行完后,CallableStatement的getXXX方法將取回參數(shù)值。正確的getXXX方法是為各參數(shù)所注冊(cè)的JDBC類型所對(duì)應(yīng)的Java類型。換言之,registerOutParameter使用的是JDBC類型(因此它與數(shù)據(jù)庫(kù)返回的JDBC類型匹配),而getXXX將之轉(zhuǎn)換為Java類型。

作為示例,下述代碼先注冊(cè)O(shè)UT參數(shù),執(zhí)行由cstmt所調(diào)用的已儲(chǔ)存過程,然后檢索在OUT參數(shù)中返回的值。方法getByte從***個(gè)OUT參數(shù)中取出一個(gè)Java字節(jié),而getBigDecimal從第二個(gè)OUT參數(shù)中取出一個(gè)BigDecimal對(duì)象(小數(shù)點(diǎn)后面帶三位數(shù)):

  1. CallableStatementcstmt=con.prepareCall("{callgetTestData(?,?)}");  
  2. cstmt.registerOutParameter(1,java.sql.Types.TINYINT);  
  3. cstmt.registerOutParameter(2,java.sql.Types.DECIMAL,3);  
  4. cstmt.executeQuery();  
  5. bytex=cstmt.getByte(1);  
  6. java.math.BigDecimaln=cstmt.getBigDecimal(2,3); 

CallableStatement與ResultSet不同,它不提供用增量方式檢索大OUT值的特殊機(jī)制。

JDBC存儲(chǔ)過程3、INOUT參數(shù)

既支持輸入又接受輸出的參數(shù)(INOUT參數(shù))除了調(diào)用registerOutParameter方法外,還要求調(diào)用適當(dāng)?shù)膕etXXX方法(該方法是從PreparedStatement繼承來的)。setXXX方法將參數(shù)值設(shè)置為輸入?yún)?shù),而registerOutParameter方法將它的JDBC類型注冊(cè)為輸出參數(shù)。setXXX方法提供一個(gè)Java值,而驅(qū)動(dòng)程序先把這個(gè)值轉(zhuǎn)換為JDBC值,然后將它送到數(shù)據(jù)庫(kù)中。這種IN值的JDBC類型和提供給registerOutParameter方法的JDBC類型應(yīng)該相同。然后,要檢索輸出值,就要用對(duì)應(yīng)的getXXX方法。例如,Java類型為byte的參數(shù)應(yīng)該使用方法setByte來賦輸入值。應(yīng)該給registerOutParameter提供類型為TINYINT的JDBC類型,同時(shí)應(yīng)使用getByte來檢索輸出值。

下例假設(shè)有一個(gè)已儲(chǔ)存過程reviseTotal,其唯一參數(shù)是INOUT參數(shù)。方法setByte把此參數(shù)設(shè)為25,驅(qū)動(dòng)程序?qū)阉鳛镴DBCTINYINT類型送到數(shù)據(jù)庫(kù)中。接著,registerOutParameter將該參數(shù)注冊(cè)為JDBCTINYINT。執(zhí)行完該已儲(chǔ)存過程后,將返回一個(gè)新的JDBCTINYINT值。方法getByte將把這個(gè)新值作為Javabyte類型檢索。

  1. CallableStatementcstmt=con.prepareCall("{callreviseTotal(?)}");  
  2. cstmt.setByte(1,25);  
  3. cstmt.registerOutParameter(1,java.sql.Types.TINYINT);  
  4. cstmt.executeUpdate();  
  5. bytex=cstmt.getByte(1); 

JDBC存儲(chǔ)過程4、先檢索結(jié)果,再檢索OUT參數(shù)

由于某些DBMS的限制,為了實(shí)現(xiàn)***的可移植性,建議先檢索由執(zhí)行CallableStatement對(duì)象所產(chǎn)生的結(jié)果,然后再用CallableStatement.getXXX方法來檢索OUT參數(shù)。如果CallableStatement對(duì)象返回多個(gè)ResultSet對(duì)象(通過調(diào)用execute方法),在檢索OUT參數(shù)前應(yīng)先檢索所有的結(jié)果。這種情況下,為確保對(duì)所有的結(jié)果都進(jìn)行了訪問,必須對(duì)Statement方法getResultSet、getUpdateCount和getMoreResults進(jìn)行調(diào)用,直到不再有結(jié)果為止。

檢索完所有的結(jié)果后,就可用CallableStatement.getXXX方法來檢索OUT參數(shù)中的值。

JDBC存儲(chǔ)過程5、檢索作為OUT參數(shù)的NULL值

返回到OUT參數(shù)中的值可能會(huì)是JDBCNULL。當(dāng)出現(xiàn)這種情形時(shí),將對(duì)JDBCNULL值進(jìn)行轉(zhuǎn)換以使getXXX方法所返回的值為null、0或false,這取決于getXXX

方法類型。對(duì)于ResultSet對(duì)象,要知道0或false是否源于JDBCNULL的唯一方法,是用方法wasNull進(jìn)行檢測(cè)。如果getXXX方法讀取的***一個(gè)值是JDBCNULL,則該方法返回true,否則返回flase。多個(gè)參數(shù)或者沒有參數(shù)就是改變這里多個(gè)參數(shù)cstmt.setString(1,str);
.
.
.
n
cstmt.registerOutParameter(n+1,oracle.jdbc.OracleTypes.CURSOR);

沒有參數(shù)就是直接

cstmt.registerOutParameter(1,[/color]oracle.jdbc.OracleTypes.CURSOR);

【編輯推薦】

  1. 談?wù)剝?yōu)化JDBC數(shù)據(jù)庫(kù)編程
  2. 實(shí)例說明對(duì)MySQL的JDBC連接設(shè)置
  3. 淺談如何利用JSP網(wǎng)頁(yè)中JDBC代碼連接MySQL
  4. 淺談JDBC代碼如何重復(fù)使用
  5. 如何進(jìn)行Jython數(shù)據(jù)庫(kù)插入(JDBC)
<
責(zé)任編輯:彭凡 來源: IT專家網(wǎng)論壇
相關(guān)推薦

2009-12-21 09:39:50

Oracle 存儲(chǔ)過程

2011-07-22 13:47:23

存儲(chǔ)過程

2009-07-08 17:17:16

JDBC調(diào)用存儲(chǔ)過程

2009-07-22 15:58:34

JDBC調(diào)用Oracl

2009-08-06 16:44:06

2009-07-23 14:10:38

Hibernate J

2009-06-22 11:04:00

Jdbc存儲(chǔ)過程

2010-04-07 12:08:28

Oracle存儲(chǔ)過程

2023-07-27 07:03:24

MySQL存儲(chǔ)SQL

2010-04-08 18:10:37

Oracle存儲(chǔ)過程

2010-04-07 14:01:40

Oracle存儲(chǔ)過程

2010-04-08 17:59:38

Oracle存儲(chǔ)

2011-08-25 11:36:50

PreparedStaJDBC存儲(chǔ)過程調(diào)用

2009-07-08 17:42:33

JDBC存儲(chǔ)過程

2010-04-26 18:17:19

Oracle存儲(chǔ)過程

2010-01-06 11:30:22

.NET Framew

2011-08-23 13:14:05

JDBC帶輸出參數(shù)的存儲(chǔ)過程

2010-04-16 11:39:56

Oracle存儲(chǔ)過程

2017-09-04 11:48:56

MybatisOracle存儲(chǔ)過程

2009-08-17 18:30:29

C# SQL Serv
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)