簡單使用MySQL的存儲過程 MySQL5.0版本引進了存儲過程的概念。存儲過程可以提高執行效率,更容易維護。 在沒有存儲過程(procedure)概念之前,通常的業務邏輯sql代碼有時很長,它們一般被嵌入在宿主語言(比如Java)中,非常不便於維護,而有了存儲過程,它們被定義在數據庫端,並且進行了預編譯。而且業務邏輯SQL代碼無需在網絡中傳輸,減輕了網絡負擔。可以說存儲過程的優點大於它的缺點。 www.2cto.com 下面實現一個簡單的加法存儲過程。 [sql] mysql> delimiter $ mysql> create procedure pr_add (a int , b int) -> begin -> declare c int; -> if a is null then -> set a = 0; -> end if; -> if b is null then -> set b = 0; -> end if; -> set c = a + b; -> select c as sum; -> end; -> $ 在命令行模式中運行存儲過程: www.2cto.com [sql] mysql> delimiter ; mysql> set @a = 10; Query OK, 0 rows affected (0.00 sec) mysql> set @b = 20; Query OK, 0 rows affected (0.00 sec) mysql> call pr_add(@a,@b); +------+ | sum | +------+ | 30 | +------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) 在客戶端執行存儲過程: [java] public class ProcedureTest { private static final String DB_URL = "jdbc:mysql://localhost:3306/zjut"; private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String USER = "root"; private static final String PASSWORD = "XXXXX"; private static String sql = "call pr_add(?,?)"; public static void main(String[] args) { try { Class.forName(DRIVER); Connection conn = DriverManager.getConnection(DB_URL,USER,PASSWORD); CallableStatement cstmt = conn.prepareCall(sql); cstmt.setInt(1,10); cstmt.setInt(2, 20); ResultSet rs = cstmt.executeQuery(); while(rs.next()) { System.out.println(rs.getInt("sum")); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } } 關鍵代碼是: [java] CallableStatement cstmt = conn.prepareCall("call pr_add(?,?)"); cstmt.setInt(1,10); cstmt.setInt(2, 20); ResultSet rs = cstmt.executeQuery(); 輸出: 30 原理:首先創建SQL字符串,即 "call pr_add(?,?)" ,調用存儲過程用call命令,call命令後跟存儲過程名字,兩個問號是占位符。 使用Connection對象創建CallableStatement對象,即 conn.prepareCall(sql); 該方法接受一個字符串,代表一個sql語句。 再用CallableStatement對象的executeQuery()執行SQL語句,返回一個ResultSet對象。 利用ResultSet對象遍歷得到的數據。