在MySQL中創建簡易的存儲過程:
delimiter // 將MySQL結束符改爲//
create procedure add_pro(a int,b int,out sum int) sum使用out修飾是傳出參數
begin
set sum=a+b;
end;
//
CallableStatement對象可以通過Connection對象的prepareCall方法來創建。
cstm=con.prepareCall("{call add_pro(?,?,?)}");
cstm可以通過setXXX爲傳入參數設置值。
傳出參數就是java程序可以通過該參數獲取存儲過程裏的值。
cstm.registerOutParameter(3.Types.INTEGER); 註冊cstm第三個參數是int類型
接下來就可以調用cstm的execute方法來執行存儲過程了,執行結束後就可以通過cstm對象的
getXXX(int index)方法來獲取指定傳出參數。
完整示例如下:
import java.io.IOException;
import java.io.InputStream;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Properties;
public class CallTest {
public static String url;
public static String driver;
public static String username;
public static String password;
public static Connection con;
public static CallableStatement cstm;
public static Properties p;
public static InputStream is;
static
{
try {
p=new Properties();
is=CallTest.class.getClassLoader().getResourceAsStream("mysql.properties");
p.load(is);
url=p.getProperty("url");
driver=p.getProperty("driver");
username=p.getProperty("username");
password=p.getProperty("password");
Class.forName(driver);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
}
public static void main(String []args)
{
try {
con=DriverManager.getConnection(url, username, password);
cstm=con.prepareCall("{call add_pro(?,?,?)}");
cstm.setInt(1, 4);
cstm.setInt(2, 19);
cstm.registerOutParameter(3, Types.INTEGER);
cstm.execute();
System.out.println(cstm.getInt(3));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}