日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java 储存过程_Java储存过程

發(fā)布時(shí)間:2024/9/19 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 储存过程_Java储存过程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

存儲(chǔ)過程:是指保存在數(shù)據(jù)庫并在數(shù)據(jù)庫端執(zhí)行的程序。

CallableStatement 對(duì)象為所有的 DBMS 提供了一種以標(biāo)準(zhǔn)形式調(diào)用已儲(chǔ)存過程的方法。已儲(chǔ)存過程儲(chǔ)存在數(shù)據(jù)庫中。

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

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

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

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

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

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

{call? 過程名}

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

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

1、創(chuàng)建 CallableStatement 對(duì)象

CallableStatement 對(duì)象是用 Connection 方法 prepareCall 創(chuàng)建的。下例創(chuàng)建 CallableStatement 的實(shí)例,其中含有對(duì)已儲(chǔ)存過程 getTestData 調(diào)用。

該過程有兩個(gè)變量,但不含結(jié)果參數(shù):CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");其中?占位符為IN、OUT還是INOUT參數(shù),取決于已儲(chǔ)存過程getTestData。

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)槟承?DBMS 要求 JDBC 類型)。注冊(cè) JDBC 類型是用 registerOutParameter 方法來完成的。語句執(zhí)行完后,CallableStatement 的 getXXX 方法將取回參數(shù)值。正確的 getXXX 方法是為各參數(shù)所注冊(cè)的 JDBC 類型所對(duì)應(yīng)的 Java 類型。換言之, registerOutParameter 使用的是 JDBC 類型(因此它與數(shù)據(jù)庫返回的 JDBC 類型匹配),而 getXXX 將之轉(zhuǎn)換為 Java 類型。

3、INOUT參數(shù)

既支持輸入又接受輸出的參數(shù)(INOUT 參數(shù))除了調(diào)用 registerOutParameter 方法外,還要求調(diào)用適當(dāng)?shù)?setXXX 方法(該方法是從 PreparedStatement 繼承來的)。

setXXX 方法將參數(shù)值設(shè)置為輸入?yún)?shù),而 registerOutParameter 方法將它的 JDBC 類型注冊(cè)為輸出參數(shù)。setXXX 方法提供一個(gè) Java 值,而驅(qū)動(dòng)程序先把這個(gè)值轉(zhuǎn)換為 JDBC 值,然后將它送到數(shù)據(jù)庫中。這種 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 來檢索輸出值。

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é)果為止。

5、檢索作為OUT參數(shù)的NULL值

返回到 OUT 參數(shù)中的值可能會(huì)是JDBC NULL。當(dāng)出現(xiàn)這種情形時(shí),將對(duì) JDBC NULL 值進(jìn)行轉(zhuǎn)換以使 getXXX 方法所返回的值為 null、0 或 false,這取決于getXXX 方法類型。對(duì)于 ResultSet 對(duì)象,要知道0或false是否源于JDBCNULL的唯一方法,是用方法wasNull進(jìn)行檢測(cè)。如果 getXXX 方法讀取的最后一個(gè)值是 JDBC NULL,則該方法返回 true,否則返回 flase。

步驟:

1.? class.forname("驅(qū)動(dòng)");

2.? java.sql.connection conn=

java.sql.drivermanager.getconnection("聯(lián)接字符串",

"用戶名","密碼");

3.? callablestatement cs=conn.preparecall("調(diào)用存取過程sql");

調(diào)用存儲(chǔ)過程sql語法: {call 存取過程名稱(?,?)}

4.? 為?號(hào)賦值. cs.setstring(1,"?號(hào)1值");cs.setstring(2,"?號(hào)2值");

5.? cs.executeupdate();

第一個(gè)代碼說明:

此代碼是調(diào)用有一個(gè)輸出的存儲(chǔ)過程

1 try{2 Connection con=GetConnection.getCon();3 con.setAutoCommit(false);4 CallableStatement proc = con.prepareCall("{call au_info_out(?)}");5 proc.registerOutParameter(1, Types.INTEGER);6 proc.executeUpdate();7 //con.commit();//將存儲(chǔ)過程提交。當(dāng)存儲(chǔ)過程中有向表中插入數(shù)據(jù)時(shí)用

8 int age = proc.getInt(1);9

10 System.out.println("結(jié)果是:"+age);11 System.out.println("執(zhí)行存儲(chǔ)過程成功!");12 }catch(SQLException e){13 e.printStackTrace();14 } catch(Exception e) {15 //TODO 自動(dòng)生成 catch 塊

16 e.printStackTrace();17 }

第二個(gè)代碼說明:

此代碼是調(diào)用有二個(gè)時(shí)輸出的存儲(chǔ)過程

1 try{2 Connection con=GetConnection.getCon();3 con.setAutoCommit(false);4 CallableStatement proc = con.prepareCall("{call au_info_out1(?,?)}");5 proc.registerOutParameter(1, Types.INTEGER);6 proc.registerOutParameter(2, Types.VARCHAR);7 proc.executeUpdate();8 //con.commit();//將存儲(chǔ)過程提交。當(dāng)存儲(chǔ)過程中有向表中插入數(shù)據(jù)時(shí)用

9 int age = proc.getInt(1);10 String str=proc.getString(2);11

12 System.out.println("結(jié)果是:"+age+" "+str);13 System.out.println("執(zhí)行存儲(chǔ)過程成功!");14 }catch(SQLException e){15 e.printStackTrace();16 } catch(Exception e) {17 //TODO 自動(dòng)生成 catch 塊

18 e.printStackTrace();19 }

第三個(gè)代碼說明:

無參和無輸出值的存儲(chǔ)過程時(shí)

1 try{2 Connection con=GetConnection.getCon();3 CallableStatement proc = con.prepareCall("{call au_info_out2 }");4

5 proc.executeUpdate();6 //con.commit();//將存儲(chǔ)過程提交。當(dāng)存儲(chǔ)過程中有向表中插入數(shù)據(jù)時(shí)使用

7

8

9 System.out.println("執(zhí)行存儲(chǔ)過程成功!");10 }catch(SQLException e){11 e.printStackTrace();12 } catch(Exception e) {13 //TODO 自動(dòng)生成 catch 塊

14 e.printStackTrace();15 }

第三個(gè)代碼說明:含有參數(shù)的存儲(chǔ)過程

1 try{2 Connection con=GetConnection.getCon();3 CallableStatement proc = con.prepareCall("{call au_info_out3(?) }");4 proc.setString(1, "李四");5

6 proc.executeUpdate();7 //con.commit();//將存儲(chǔ)過程提交。當(dāng)存儲(chǔ)過程中有向表中插入數(shù)據(jù)時(shí)使用

8

9 System.out.println("執(zhí)行存儲(chǔ)過程成功!");10 }catch(SQLException e){11 e.printStackTrace();12 } catch(Exception e) {13 //TODO 自動(dòng)生成 catch 塊

14 e.printStackTrace();15 }

總結(jié)

以上是生活随笔為你收集整理的java 储存过程_Java储存过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。