成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳細介紹JDBC存儲過程

開發 后端
CallableStatement 對象為所有的DBMS提供了一種以標準形式調用已儲存過程的方法。已儲存過程儲存在數據庫中。對已儲存過程的調用是CallableStatement對象所含的內容。本文將談談JDBC存儲過程。

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

在JDBC中調用已儲存過程的語法如下所示。注意,方括號表示其間的內容是可選項;方括號本身并非語法的組成部份。

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

返回結果參數的過程的語法為:

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

不帶參數的已儲存過程的語法類似:

{call過程名}

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

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

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

JDBC存儲過程1、創建CallableStatement對象

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

JDBC存儲過程2、IN和OUT參數

將IN參數傳給CallableStatement對象是通過setXXX方法完成的。該方法繼承自PreparedStatement。所傳入參數的類型決定了所用的setXXX方法(例如,用setFloat來傳入float值等)。如果已儲存過程返回OUT參數,則在執行CallableStatement對象以前必須先注冊每個OUT參數的JDBC類型(這是必需的,因為某些DBMS要求JDBC類型)。注冊JDBC類型是用registerOutParameter方法來完成的。語句執行完后,CallableStatement的getXXX方法將取回參數值。正確的getXXX方法是為各參數所注冊的JDBC類型所對應的Java類型。換言之,registerOutParameter使用的是JDBC類型(因此它與數據庫返回的JDBC類型匹配),而getXXX將之轉換為Java類型。

作為示例,下述代碼先注冊OUT參數,執行由cstmt所調用的已儲存過程,然后檢索在OUT參數中返回的值。方法getByte從***個OUT參數中取出一個Java字節,而getBigDecimal從第二個OUT參數中取出一個BigDecimal對象(小數點后面帶三位數):

  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值的特殊機制。

JDBC存儲過程3、INOUT參數

既支持輸入又接受輸出的參數(INOUT參數)除了調用registerOutParameter方法外,還要求調用適當的setXXX方法(該方法是從PreparedStatement繼承來的)。setXXX方法將參數值設置為輸入參數,而registerOutParameter方法將它的JDBC類型注冊為輸出參數。setXXX方法提供一個Java值,而驅動程序先把這個值轉換為JDBC值,然后將它送到數據庫中。這種IN值的JDBC類型和提供給registerOutParameter方法的JDBC類型應該相同。然后,要檢索輸出值,就要用對應的getXXX方法。例如,Java類型為byte的參數應該使用方法setByte來賦輸入值。應該給registerOutParameter提供類型為TINYINT的JDBC類型,同時應使用getByte來檢索輸出值。

下例假設有一個已儲存過程reviseTotal,其唯一參數是INOUT參數。方法setByte把此參數設為25,驅動程序將把它作為JDBCTINYINT類型送到數據庫中。接著,registerOutParameter將該參數注冊為JDBCTINYINT。執行完該已儲存過程后,將返回一個新的JDBCTINYINT值。方法getByte將把這個新值作為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存儲過程4、先檢索結果,再檢索OUT參數

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

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

JDBC存儲過程5、檢索作為OUT參數的NULL值

返回到OUT參數中的值可能會是JDBCNULL。當出現這種情形時,將對JDBCNULL值進行轉換以使getXXX方法所返回的值為null、0或false,這取決于getXXX

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

沒有參數就是直接

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

【編輯推薦】

  1. 談談優化JDBC數據庫編程
  2. 實例說明對MySQL的JDBC連接設置
  3. 淺談如何利用JSP網頁中JDBC代碼連接MySQL
  4. 淺談JDBC代碼如何重復使用
  5. 如何進行Jython數據庫插入(JDBC)
<
責任編輯:彭凡 來源: IT專家網論壇
相關推薦

2009-12-21 09:39:50

Oracle 存儲過程

2011-07-22 13:47:23

存儲過程

2009-07-08 17:17:16

JDBC調用存儲過程

2009-07-22 15:58:34

JDBC調用Oracl

2009-08-06 16:44:06

2009-07-23 14:10:38

Hibernate J

2009-06-22 11:04:00

Jdbc存儲過程

2010-04-07 12:08:28

Oracle存儲過程

2023-07-27 07:03:24

MySQL存儲SQL

2010-04-08 18:10:37

Oracle存儲過程

2010-04-07 14:01:40

Oracle存儲過程

2010-04-08 17:59:38

Oracle存儲

2010-04-26 18:17:19

Oracle存儲過程

2011-08-25 11:36:50

PreparedStaJDBC存儲過程調用

2009-07-08 17:42:33

JDBC存儲過程

2010-01-06 11:30:22

.NET Framew

2009-08-17 18:30:29

C# SQL Serv

2017-09-04 11:48:56

MybatisOracle存儲過程

2010-04-16 11:39:56

Oracle存儲過程

2009-08-06 18:02:22

存儲過程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久久久宅男 | 一区欧美 | 亚洲成av| 欧美888 | 久久久久久九九九九九九 | 日韩中文一区二区三区 | 久久成人一区 | 日韩日韩日韩日韩日韩日韩日韩 | 91 在线| 91久久久久久久久久久 | 国产精品一区二区三区在线 | 亚洲一区二区三区桃乃木香奈 | 国产精品美女 | 91国内精品 | 久久国产精品亚洲 | 国产午夜精品一区二区三区 | 艹逼网| 一区二区在线免费观看 | 免费激情网站 | 午夜精品一区二区三区在线 | 欧美一区二区免费视频 | av中文在线播放 | www.国产精品| 亚洲免费一区二区 | 精品综合久久久 | 国产精品不卡 | 91久久久久| 综合精品 | 2一3sex性hd | 久久久久久电影 | 国产欧美日韩精品一区二区三区 | 久久亚洲高清 | 日韩在线欧美 | 久久免费电影 | 国产日韩欧美一区二区 | 亚洲成人天堂 | 亚洲精品久久久久久久久久久久久 | 午夜一级大片 | 欧美电影在线观看网站 | www.狠狠干 | 日本精品一区 |