java執行預存程序

來源:互聯網
上載者:User

CallableStatement   對象為所有的   DBMS   提供了一種以標準形式調用已儲存過程的方法。已儲存過程儲存在資料庫中。對已儲存過程的調用是   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   類型)、從這些參數中檢索結果,或者檢查所返回的值是否為   JDBC   NULL。  
  1、建立   CallableStatement   對象  
    CallableStatement   對象是用   Connection   方法   prepareCall   建立的。下例建立   CallableStatement   的執行個體,其中含有對已儲存過程   getTestData   調用。該過程有兩個變數,但不含結果參數:  
  CallableStatement   cstmt   =   con.prepareCall("{call   getTestData(?,   ?)}");  
    其中?預留位置為IN、OUT還是INOUT參數,取決於已儲存過程getTestData。  
  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   對象(小數點後面帶三位元):  
  CallableStatement   cstmt   =   con.prepareCall("{call   getTestData(?,   ?)}");  
  cstmt.registerOutParameter(1,   java.sql.Types.TINYINT);  
  cstmt.registerOutParameter(2,   java.sql.Types.DECIMAL,   3);  
  cstmt.executeQuery();  
  byte   x   =   cstmt.getByte(1);  
  java.math.BigDecimal   n   =   cstmt.getBigDecimal(2,   3);  
   
    CallableStatement   與   ResultSet   不同,它不提供用增量方式檢索大   OUT   值的特殊機制。  
   
  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,驅動程式將把它作為   JDBC   TINYINT   類型送到資料庫中。接著,registerOutParameter   將該參數註冊為   JDBC   TINYINT。執行完該已儲存過程後,將返回一個新的   JDBC   TINYINT   值。方法   getByte   將把這個新值作為   Java   byte   類型檢索。  
  CallableStatement   cstmt   =   con.prepareCall("{call   reviseTotal(?)}");  
  cstmt.setByte(1,   25);  
  cstmt.registerOutParameter(1,   java.sql.Types.TINYINT);  
  cstmt.executeUpdate();  
  byte   x   =   cstmt.getByte(1);  
   
  4、先檢索結果,再檢索   OUT   參數  
   
    由於某些   DBMS   的限制,為了實現最大的可移植性,建議先檢索由執行CallableStatement   對象所產生的結果,然後再用   CallableStatement.getXXX   方法來檢索   OUT   參數。如果   CallableStatement   對象返回多個   ResultSet   對象(通過調用   execute   方法),在檢索   OUT   參數前應先檢索所有的結果。這種情況下,為確保對所有的結果都進行了訪問,必須對   Statement   方法   getResultSet、getUpdateCount   和getMoreResults   進行調用,直到不再有結果為止。  
   
    檢索完所有的結果後,就可用   CallableStatement.getXXX   方法來檢索   OUT   參數中的值。  
   
  5、檢索作為OUT參數的NULL值  
   
  返回到   OUT   參數中的值可能會是JDBC   NULL。當出現這種情形時,將對   JDBC   NULL   值進行轉換以使   getXXX   方法所返回的值為   null、0   或   false,這取決於getXXX   方法類型。對於   ResultSet   對象,要知道0或false是否源於JDBCNULL的唯一方法,是用方法wasNull進行檢測。如果   getXXX   方法讀取的最後一個值是   JDBC   NULL,則該方法返回   true,否則返回   flase。

 

內容出處:http://topic.csdn.net/t/20041124/11/3583311.html,記下,容易忘

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.