此文檔中除MySQL 存儲(chǔ)過(guò)程參數(shù)類型(in、out、inout)小節(jié)來(lái)自網(wǎng)上,其余均為本人原創(chuàng),歡迎大家轉(zhuǎn)載,如有不足,請(qǐng)指教。
由于是在word中編輯好拷貝過(guò)來(lái)的所以字體較小大家點(diǎn)此下載電子版文檔
MySQL存儲(chǔ)過(guò)程
1.1 CREATE PROCEDURE (創(chuàng)建)
CREATE PROCEDURE存儲(chǔ)過(guò)程名 (參數(shù)列表)
BEGIN
SQL語(yǔ)句代碼塊
END
|
注意:
由括號(hào)包圍的參數(shù)列必須總是存在。如果沒(méi)有參數(shù),也該使用一個(gè)空參數(shù)列()。每個(gè)參數(shù)默認(rèn)都是一個(gè)IN參數(shù)。要指定為其它參數(shù),可在參數(shù)名之前使用關(guān)鍵詞 OUT或INOUT
在mysql客戶端定義存儲(chǔ)過(guò)程的時(shí)候使用delimiter命令來(lái)把語(yǔ)句定界符從;變?yōu)?/。
當(dāng)使用delimiter命令時(shí),你應(yīng)該避免使用反斜杠(‘"’)字符,因?yàn)槟鞘?/span>MySQL的轉(zhuǎn)義字符。
如:
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)
|
1.2 ALTER PROCEDURE (修改)
ALTER PROCEDURE 存儲(chǔ)過(guò)程名SQL語(yǔ)句代碼塊
|
這個(gè)語(yǔ)句可以被用來(lái)改變一個(gè)存儲(chǔ)程序的特征。
1.3 DROP PROCEDURE (刪除)
DROP PROCEDURE IF EXISTS存儲(chǔ)過(guò)程名
eg:DROP PROCEDURE IF EXISTS proc_employee (proc_employee 存儲(chǔ)過(guò)程名)
|
這個(gè)語(yǔ)句被用來(lái)移除一個(gè)存儲(chǔ)程序。不能在一個(gè)存儲(chǔ)過(guò)程中刪除另一個(gè)存儲(chǔ)過(guò)程,只能調(diào)用另一個(gè)存儲(chǔ)過(guò)程
1.4 SHOW CREATE PROCEDURE(類似于SHOW CREATE TABLE,查看一個(gè)已存在的存儲(chǔ)過(guò)程)
SHOW CREATE PROCEDURE 存儲(chǔ)過(guò)程名
|
1.5 SHOW PROCEDURE STATUS (列出所有的存儲(chǔ)過(guò)程)
1.6 CALL語(yǔ)句(存儲(chǔ)過(guò)程的調(diào)用)
CALL 存儲(chǔ)過(guò)程名(參數(shù)列表)
|
CALL語(yǔ)句調(diào)用一個(gè)先前用CREATE PROCEDURE創(chuàng)建的程序。
CALL語(yǔ)句可以用聲明為OUT或的INOUT參數(shù)的參數(shù)給它的調(diào)用者傳回值。
存儲(chǔ)過(guò)程名稱后面必須加括號(hào),哪怕該存儲(chǔ)過(guò)程沒(méi)有參數(shù)傳遞
1.7 BEGIN ... END(復(fù)合語(yǔ)句)
[begin_label:]
BEGIN
[statement_list]
END
[end_label]
|
存儲(chǔ)子程序可以使用BEGIN ... END復(fù)合語(yǔ)句來(lái)包含多個(gè)語(yǔ)句。
statement_list 代表一個(gè)或多個(gè)語(yǔ)句的列表。statement_list之內(nèi)每個(gè)語(yǔ)句都必須用分號(hào)(;)來(lái)結(jié)尾。
復(fù)合語(yǔ)句可以被標(biāo)記。除非begin_label存在,否則end_label不能被給出,并且如果二者都存在,他們必須是同樣的。
1.8 DECLARE語(yǔ)句(用來(lái)聲明局部變量)
DECLARE語(yǔ)句被用來(lái)把不同項(xiàng)目局域到一個(gè)子程序:局部變量
DECLARE僅被用在BEGIN ... END復(fù)合語(yǔ)句里,并且必須在復(fù)合語(yǔ)句的開(kāi)頭,在任何其它語(yǔ)句之前。
1.9 存儲(chǔ)程序中的變量
1.1 DECLARE局部變量
DECLARE var_name[,...] type [DEFAULT value]
這個(gè)語(yǔ)句被用來(lái)聲明局部變量。
要給變量提供一個(gè)默認(rèn)值,請(qǐng)包含一個(gè)DEFAULT子句。
值可以被指定為一個(gè)表達(dá)式,不需要為一個(gè)常數(shù)。
如果沒(méi)有DEFAULT子句,初始值為NULL。
局部變量的作用范圍在它被聲明的BEGIN ... END塊內(nèi)。
它可以被用在嵌套的塊中,除了那些用相同名字聲明變量的塊。
|
1.2 變量SET語(yǔ)句
SET var_name = expr [, var_name = expr]
在存儲(chǔ)程序中的SET語(yǔ)句是一般SET語(yǔ)句的擴(kuò)展版本。
被參考變量可能是子程序內(nèi)聲明的變量,或者是全局服務(wù)器變量。
在存儲(chǔ)程序中的SET語(yǔ)句作為預(yù)先存在的SET語(yǔ)法的一部分來(lái)實(shí)現(xiàn)。這允許SET a=x, b=y, ...這樣的擴(kuò)展語(yǔ)法。
其中不同的變量類型(局域聲明變量及全局和集體變量)可以被混合起來(lái)。
這也允許把局部變量和一些只對(duì)系統(tǒng)變量有意義的選項(xiàng)合并起來(lái)。
|
1.3 SELECT ... INTO語(yǔ)句
SELECT col_name[,...] INTO var_name[,...] table_expr
這個(gè)SELECT語(yǔ)法把選定的列直接存儲(chǔ)到變量。
因此,只有單一的行可以被取回。
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
注意,用戶變量名在MySQL 5.1中是對(duì)大小寫不敏感的。
|
重要: SQL變量名不能和列名一樣。如果SELECT ... INTO這樣的SQL語(yǔ)句包含一個(gè)對(duì)列的參考,并包含一個(gè)與列相同名字的局部變量,MySQL當(dāng)前把參考解釋為一個(gè)變量的名字。
1.10 MySQL 存儲(chǔ)過(guò)程參數(shù)類型(in、out、inout)
此小節(jié)內(nèi)容來(lái)自:
參見(jiàn)地址:http://www.tkk7.com/nonels/archive/2009/04/22/233324.html
MySQL 存儲(chǔ)過(guò)程參數(shù)(in)
MySQL 存儲(chǔ)過(guò)程 “in” 參數(shù):跟 C 語(yǔ)言的函數(shù)參數(shù)的值傳遞類似, MySQL 存儲(chǔ)過(guò)程內(nèi)部可能會(huì)修改此參數(shù),但對(duì) in 類型參數(shù)的修改,對(duì)調(diào)用者(caller)來(lái)說(shuō)是不可見(jiàn)的(not visible)。
|
MySQL 存儲(chǔ)過(guò)程參數(shù)(out)
MySQL 存儲(chǔ)過(guò)程 “out” 參數(shù):從存儲(chǔ)過(guò)程內(nèi)部傳值給調(diào)用者。在存儲(chǔ)過(guò)程內(nèi)部,該參數(shù)初始值為 null,無(wú)論調(diào)用者是否給存儲(chǔ)過(guò)程參數(shù)設(shè)置值
|
MySQL 存儲(chǔ)過(guò)程參數(shù)(inout)
MySQL 存儲(chǔ)過(guò)程 inout 參數(shù)跟 out 類似,都可以從存儲(chǔ)過(guò)程內(nèi)部傳值給調(diào)用者。不同的是:調(diào)用者還可以通過(guò) inout 參數(shù)傳遞值給存儲(chǔ)過(guò)程。
|
總結(jié)
如果僅僅想把數(shù)據(jù)傳給 MySQL 存儲(chǔ)過(guò)程,那就使用“in” 類型參數(shù);如果僅僅從 MySQL 存儲(chǔ)過(guò)程返回值,那就使用“out” 類型參數(shù);如果需要把數(shù)據(jù)傳給 MySQL 存儲(chǔ)過(guò)程,還要經(jīng)過(guò)一些計(jì)算后再傳回給我們,此時(shí),要使用“inout” 類型參數(shù)。
|
1.11 例子:
1.1 創(chuàng)建存儲(chǔ)過(guò)程
帶(輸出參數(shù))返回值的存儲(chǔ)過(guò)程:
--刪除存儲(chǔ)過(guò)程
DROP PROCEDURE IF EXISTS proc_employee_getCount
--創(chuàng)建存儲(chǔ)過(guò)程
CREATE PROCEDURE proc_employee_getCount(out n int)
BEGIN
SELECT COUNT(*) FROM employee ;
END
--MYSQL調(diào)用存儲(chǔ)過(guò)程
CALL proc_employee_getCount(@n);
|
帶輸入?yún)?shù)的存儲(chǔ)過(guò)程:
--刪除存儲(chǔ)過(guò)程
DROP PROCEDURE IF EXISTS proc_employee_findById;
--創(chuàng)建存儲(chǔ)過(guò)程
CREATE PROCEDURE proc_employee_findById(in n int)
BEGIN
SELECT * FROM employee where id=n;
END
--定義變量
SET @n=1;
--調(diào)用存儲(chǔ)過(guò)程
CALL proc_employee_findById(@n);
|
操作存儲(chǔ)過(guò)程時(shí)應(yīng)注意:
1. 刪除存儲(chǔ)過(guò)程時(shí)只需要指定存儲(chǔ)過(guò)程名即可,不帶括號(hào);
2. 創(chuàng)建存儲(chǔ)過(guò)程時(shí),不管該存儲(chǔ)過(guò)程有無(wú)參數(shù),都需要帶括號(hào);
3. 在使用SET定義變量時(shí)應(yīng)遵循SET的語(yǔ)法規(guī)則;
SET @變量名=初始值;
4. 在定義存儲(chǔ)過(guò)程參數(shù)列表時(shí),應(yīng)注意參數(shù)名與數(shù)據(jù)庫(kù)中字段名區(qū)別開(kāi)來(lái),否則將出現(xiàn)無(wú)法預(yù)期的結(jié)果
1.12 Java代碼調(diào)用存儲(chǔ)過(guò)程(JDBC)
相關(guān)API:java.sql.CallableStatement
使用到java.sql.CallableStatement接口,該接口專門用來(lái)調(diào)用存儲(chǔ)過(guò)程;
該對(duì)象的獲得依賴于java.sql.Connection;
通過(guò)Connection實(shí)例的prepareCall()方法返回CallableStatement對(duì)象
prepareCall()內(nèi)部為一固定寫法{call 存儲(chǔ)過(guò)程名(參數(shù)列表1,參數(shù)列表2)}可用?占位
eg: connection.prepareCall("{call proc_employee(?)}");
存儲(chǔ)過(guò)程中參數(shù)處理:
輸入?yún)?shù):通過(guò)java.sql.CallableStatement實(shí)例的setXXX()方法賦值,用法等同于java.sql.PreparedStatement
輸出參數(shù):通過(guò)java.sql.CallableStatement實(shí)例的registerOutParameter(參數(shù)位置, 參數(shù)類型)方法賦值,其中參數(shù)類型主要使用java.sql.Types中定義的類型
Java代碼調(diào)用帶輸入?yún)?shù)的存儲(chǔ)過(guò)程 (根據(jù)輸入ID查詢雇員信息)
publicvoid executeProcedure()
{
try {
/**
*callableStatementjava.sql.CallableStatement
*connectionjava.sql.Connection
*jdbc調(diào)用存儲(chǔ)過(guò)程原型
*{call存儲(chǔ)過(guò)程名(參數(shù)列表1,參數(shù)列表2)}可用?代替
*/
callableStatement=connection.prepareCall("{call proc_employee_findById(?)}");
callableStatement.setInt(1, 1); //設(shè)置輸入?yún)?shù)
resultSet=callableStatement.executeQuery();//執(zhí)行存儲(chǔ)過(guò)程
if(resultSet.next())
{
System.out.println(resultSet.getInt(1)+""t"+resultSet.getString(2));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
|
Java代碼調(diào)用帶輸出參數(shù)的存儲(chǔ)過(guò)程 (返回?cái)?shù)據(jù)庫(kù)中的記錄數(shù))
publicvoid executeProcedure()
{
try {
/**
*callableStatementjava.sql.CallableStatement
*connectionjava.sql.Connection
*jdbc調(diào)用存儲(chǔ)過(guò)程原型
*{call存儲(chǔ)過(guò)程名(參數(shù)列表1,參數(shù)列表2)}可用?代替
*/
callableStatement=connection.prepareCall("{call proc_employee_getCount(?)}");
//設(shè)置輸出參數(shù)
callableStatement.registerOutParameter(1, Types.INTEGER);
//執(zhí)行存儲(chǔ)過(guò)程
resultSet=callableStatement.executeQuery();
if(resultSet.next())
{
System.out.println(resultSet.getInt(1));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
|
1.13 聲明:
此文檔中除MySQL 存儲(chǔ)過(guò)程參數(shù)類型(in、out、inout)小節(jié)來(lái)自網(wǎng)上,其余均為本人原創(chuàng),歡迎大家轉(zhuǎn)載,如有不足,請(qǐng)指教。
由于是在word中編輯好拷貝過(guò)來(lái)的所以字體較小大家點(diǎn)此下載電子文檔