Java中通過JDBC可以調用數據庫提供的存儲過程,Oracle中的存儲過程分成2種:
1.procedure: 沒有返回值,但可以有多個輸出參數,相當於返回值。
2.function:有一個返回值,也可以有多個輸出參數。
Java中調用function的語法和調用procedure的不一樣,調用procedure需要的特定語法為:
{ call 存儲過程名(參數1, 參數2,……) }
在java中的寫法是:con.prepareCall("{ call set_death_age(?, ?) }");
而function的調用的特定語法為:
{ 返回值 = call 存儲過程名(參數1,參數2,……) }
在java中的寫法是:connection.prepareCall("{ ? = call snuffed_it_when(?) }");
舉例:
P_DZK_NETRES(V_DZID IN NUMBER,V_DZTYPE IN NUMBER ,V_ZYBM IN VARCHAR2,V_DZ IN VARCHAR2,V_RENUM OUT NUMBER)
而我調用該存儲過程的Java代碼為:
conn=ConnectionManager.getConnection();
CallableStatement proc = conn.prepareCall("{? = call P_DZK_NETRES(?, ?,?,?,?) }"); //調用存儲過程
proc.setInt(1, 1); //為第一個參數賦值
proc.setInt(2, 1); //為第二個參數賦值
proc.setString(3, "a");
proc.setString(4, "b");
proc.registerOutParameter(5, Types.INTEGER); //注冊輸出參數,就是返回值
proc.execute(); //執行
String sql = proc.getInt(5); //接收返回值
System.out.println("存儲過程的值:" + sql);
proc.close();
上面的代碼中的參數的編號是從("{? = call P_DZK_NETRES(?, ?,?,?,?) }")中得到的,按照從左到右的順序排列,從1開始的。
所以很正常的我用該方式訪問這個存過時就一直報錯--- java.sql.SQLException: 索引中丟失 IN 或 OUT 參數:: 6
因為我用錯了訪問的方式
另外,即使Oracle的存儲過程中的輸入參數有默認值,也要在Java程序中賦值,否則報錯:
java.sql.SQLException: 索引中丟失 IN 或 OUT 參數:: 參數的index
更多Oracle相關信息見Oracle 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=12