歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java中用JDBC調用Oracle存儲過程和函數

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

Copyright © Linux教程網 All Rights Reserved