CREATE PROCEDURE存儲過程名 (參數列表) BEGIN SQL語句代碼塊 END |
注意:
由括號包圍的參數列必須老是存在。若是沒有參數,也該使用一個空參數列()。每一個參數默認都是一個IN參數。要指定爲其它參數,可在參數名以前使用關鍵詞 OUT或INOUT
在mysql客戶端定義存儲過程的時候使用delimiter命令來把語句定界符從;變爲//。
當使用delimiter命令時,你應該避免使用反斜槓(‘"’)字符,由於那是MySQL的轉義字符。
如:
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語句代碼塊 |
這個語句能夠被用來改變一個存儲程序的特徵。
DROP PROCEDURE IF EXISTS存儲過程名html eg:DROP PROCEDURE IF EXISTS proc_employee (proc_employee 存儲過程名)java |
這個語句被用來移除一個存儲程序。不能在一個存儲過程當中刪除另外一個存儲過程,只能調用另外一個存儲過程
SHOW CREATE PROCEDURE 存儲過程名 |
SHOW PROCEDURE STATUSmysql |
CALL 存儲過程名(參數列表)sql |
CALL語句調用一個先前用CREATE PROCEDURE建立的程序。
CALL語句能夠用聲明爲OUT或的INOUT參數的參數給它的調用者傳回值。
存儲過程名稱後面必須加括號,哪怕該存儲過程沒有參數傳遞
[begin_label:] BEGIN [statement_list] END [end_label] |
存儲子程序可使用BEGIN ... END複合語句來包含多個語句。數據庫
statement_list 表明一個或多個語句的列表。statement_list以內每一個語句都必須用分號(;)來結尾。服務器
複合語句能夠被標記。除非begin_label存在,不然end_label不能被給出,而且若是兩者都存在,他們必須是一樣的。函數
DECLARE語句被用來把不一樣項目局域到一個子程序:局部變量spa
DECLARE僅被用在BEGIN ... END複合語句裏,而且必須在複合語句的開頭,在任何其它語句以前。.net
1.1 DECLARE局部變量htm
DECLARE var_name[,...] type [DEFAULT value] 這個語句被用來聲明局部變量。 要給變量提供一個默認值,請包含一個DEFAULT子句。 值能夠被指定爲一個表達式,不須要爲一個常數。 若是沒有DEFAULT子句,初始值爲NULL。 局部變量的做用範圍在它被聲明的BEGIN ... END塊內。 它能夠被用在嵌套的塊中,除了那些用相同名字聲明變量的塊。 |
1.2 變量SET語句
SET var_name = expr [, var_name = expr] 在存儲程序中的SET語句是通常SET語句的擴展版本。 被參考變量多是子程序內聲明的變量,或者是全局服務器變量。 在存儲程序中的SET語句做爲預先存在的SET語法的一部分來實現。這容許SET a=x, b=y, ...這樣的擴展語法。 其中不一樣的變量類型(局域聲明變量及全局和集體變量)能夠被混合起來。 這也容許把局部變量和一些只對系統變量有意義的選項合併起來。 |
1.3 SELECT ... INTO語句
SELECT col_name[,...] INTO var_name[,...] table_expr 這個SELECT語法把選定的列直接存儲到變量。 所以,只有單一的行能夠被取回。 SELECT id,data INTO x,y FROM test.t1 LIMIT 1; 注意,用戶變量名在MySQL 5.1中是對大小寫不敏感的。 |
重要: SQL變量名不能和列名同樣。若是SELECT ... INTO這樣的SQL語句包含一個對列的參考,幷包含一個與列相同名字的局部變量,MySQL當前把參考解釋爲一個變量的名字。
此小節內容來自:
參見地址:http://www.blogjava.net/nonels/archive/2009/04/22/233324.html
MySQL 存儲過程參數(in)
MySQL 存儲過程 「in」 參數:跟 C 語言的函數參數的值傳遞相似, MySQL 存儲過程內部可能會修改此參數,但對 in 類型參數的修改,對調用者(caller)來講是不可見的(not visible)。 |
MySQL 存儲過程參數(out)
MySQL 存儲過程 「out」 參數:從存儲過程內部傳值給調用者。在存儲過程內部,該參數初始值爲 null,不管調用者是否給存儲過程參數設置值 |
MySQL 存儲過程參數(inout)
MySQL 存儲過程 inout 參數跟 out 相似,均可以從存儲過程內部傳值給調用者。不一樣的是:調用者還能夠經過 inout 參數傳遞值給存儲過程。 |
總結
若是僅僅想把數據傳給 MySQL 存儲過程,那就使用「in」 類型參數;若是僅僅從 MySQL 存儲過程返回值,那就使用「out」 類型參數;若是須要把數據傳給 MySQL 存儲過程,還要通過一些計算後再傳回給咱們,此時,要使用「inout」 類型參數。 |
1.1 建立存儲過程
帶(輸出參數)返回值的存儲過程:
--刪除存儲過程 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); |
操做存儲過程時應注意:
1. 刪除存儲過程時只須要指定存儲過程名便可,不帶括號;
2. 建立存儲過程時,無論該存儲過程有無參數,都須要帶括號;
3. 在使用SET定義變量時應遵循SET的語法規則;
SET @變量名=初始值;
4. 在定義存儲過程參數列表時,應注意參數名與數據庫中字段名區別開來,不然將出現沒法預期的結果
相關API:java.sql.CallableStatement
使用到java.sql.CallableStatement接口,該接口專門用來調用存儲過程;
該對象的得到依賴於java.sql.Connection;
經過Connection實例的prepareCall()方法返回CallableStatement對象
prepareCall()內部爲一固定寫法{call 存儲過程名(參數列表1,參數列表2)}可用?佔位
eg: connection.prepareCall("{call proc_employee(?)}");
存儲過程當中參數處理:
輸入參數:經過java.sql.CallableStatement實例的setXXX()方法賦值,用法等同於java.sql.PreparedStatement
輸出參數:經過java.sql.CallableStatement實例的registerOutParameter(參數位置, 參數類型)方法賦值,其中參數類型主要使用java.sql.Types中定義的類型
Java代碼調用帶輸入參數的存儲過程 (根據輸入ID查詢僱員信息)
publicvoid executeProcedure() { try { /** *callableStatementjava.sql.CallableStatement *connectionjava.sql.Connection *jdbc調用存儲過程原型 *{call存儲過程名(參數列表1,參數列表2)}可用?代替 */ 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代碼調用帶輸出參數的存儲過程 (返回數據庫中的記錄數)
publicvoid executeProcedure() { try { /** *callableStatementjava.sql.CallableStatement *connectionjava.sql.Connection *jdbc調用存儲過程原型 *{call存儲過程名(參數列表1,參數列表2)}可用?代替 */ 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(); } } |