存儲過程

 

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();
        }

    }
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息