1、定義java
百度百科版:一組爲了完成特定功能的SQL 語句集,存儲在數據庫中,通過第一次編譯後再次調用不須要再次編譯,用戶經過指定存儲過程的名字並給出參數(若是該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象。mysql
人話版:存儲過程就是一段保存在數據中的SQL語句,而後給這個語句塊起個名字,下次須要可直接調用。sql
選用存儲過程能夠減小網絡通信量,SQL發送到數據庫,數據庫也會按照本身的優化方式進行優化後執行的,使用存儲過程將SQL語句存到數據庫,使用時執行效率更高,並且更新時實時生效,比修改代碼方便。數據庫
2、語法-以MySQL爲例網絡
建立:建立存儲過程參數能夠沒有,也能夠設置輸入、輸出參數,分別用in和out函數
mysql> delimiter // mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM t; -> END -> // Query OK, 0 rows affected (0.00 sec)
修改:alter procedure 存儲過程名稱 SQL語句塊優化
刪除:spa
DROP PROCEDURE IF EXISTS 存儲過程名code
eg:DROP PROCEDURE IF EXISTS proc_employee對象
存儲過程參數: in out inout
MySQL 存儲過程 「in」 參數:跟 C 語言的函數參數的值傳遞相似, MySQL 存儲過程內部可能會修改此參數,但對 in 類型參數的修改,對調用者(caller)來講是不可見的(not visible);
MySQL 存儲過程 「out」 參數:從存儲過程內部傳值給調用者。在存儲過程內部,該參數初始值爲 null,不管調用者是否給存儲過程參數設置值;
MySQL 存儲過程 inout 參數跟 out 相似,均可以從存儲過程內部傳值給調用者。不一樣的是:調用者還能夠經過 inout 參數傳遞值給存儲過程。
3、例子
帶輸出參數的存儲過程:
--刪除存儲過程 DROP PROCEDURE IF EXISTS proc_employee_getCount --建立存儲過程 CREATE PROCEDURE proc_employee_getCount(out n int) BEGIN SELECT COUNT(*) FROM employee ; END --MYSQL調用存儲過程 CALL proc_employee_getCount(@n);
帶輸入參數的存儲過程:
--刪除存儲過程 DROP PROCEDURE IF EXISTS proc_employee_findById; --建立存儲過程 CREATE PROCEDURE proc_employee_findById(in n int) BEGIN SELECT * FROM employee where id=n; END --定義變量 SET @n=1; --調用存儲過程 CALL proc_employee_findById(@n);
JDBC調用存儲過程
//Java調用輸入參數的存儲過程 public void executeProcedure(){ try { /** *callableStatementjava.sql.CallableStatement *connectionjava.sql.Connection *jdbc調用存儲過程原型 *{call存儲過程名(參數列表1,參數列表2)}可用?代替 */ CallableStatement callableStatement=connection.prepareCall("{call proc_employee_findById(?)}"); callableStatement.setInt(1, 1); //給第一個參數設置值-設置輸入參數 resultSet=callableStatement.executeQuery();//執行存儲過程 if(resultSet.next()){ System.out.println(resultSet.getInt(1)+""t"+resultSet.getString(2)); } } catch (SQLException e) { e.printStackTrace(); } } }
//Java調用輸出參數的存儲過程 public void executeProcedure(){ try { /** *callableStatementjava.sql.CallableStatement *connectionjava.sql.Connection *jdbc調用存儲過程原型 *{call存儲過程名(參數列表1,參數列表2)}可用?代替 */ CallableStatement callableStatement=connection.prepareCall("{call proc_employee_getCount(?)}"); //設置輸出參數 callableStatement.registerOutParameter(1, Types.INTEGER); //執行存儲過程 resultSet=callableStatement.executeQuery(); if(resultSet.next()){ System.out.println(resultSet.getInt(1)); } } catch (SQLException e) { e.printStackTrace(); } }