mysql execute 存储过程_Mysql存储过程调用
1.1create? procedure? (創(chuàng)建)
create procedure存儲過程名 (參數(shù)列表)
begin
sql語句代碼塊
end
注意:
由括號包圍的參數(shù)列必須總是存在。如果沒有參數(shù),也該使用一個(gè)空參數(shù)列()。每個(gè)參數(shù)默認(rèn)都是一個(gè)in參數(shù)。要指定為其它參數(shù),可在參數(shù)名之前使用關(guān)鍵詞 out或inout
在mysql客戶端定義存儲過程的時(shí)候使用delimiter命令來把語句定界符從;變?yōu)?/。
當(dāng)使用delimiter命令時(shí),你應(yīng)該避免使用反斜杠(‘"’)字符,因?yàn)槟鞘莔ysql的轉(zhuǎn)義字符。
如:
復(fù)制代碼代碼示例:
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.2alter? procedure (修改)
alter procedure 存儲過程名sql語句代碼塊
這個(gè)語句可以被用來改變一個(gè)存儲程序的特征。
1.3drop? procedure (刪除)
drop procedure? if? exists存儲過程名
eg:drop procedure if exists proc_employee (proc_employee 存儲過程名)
這個(gè)語句被用來移除一個(gè)存儲程序。不能在一個(gè)存儲過程中刪除另一個(gè)存儲過程,只能調(diào)用另一個(gè)存儲過程
1.4show? create? procedure(類似于show create table,查看一個(gè)已存在的存儲過程)
show create procedure 存儲過程名
1.5show? procedure? status (列出所有的存儲過程)
show? procedure? status
1.6call語句(存儲過程的調(diào)用)
call 存儲過程名(參數(shù)列表)
call語句調(diào)用一個(gè)先前用create procedure創(chuàng)建的程序。
call語句可以用聲明為out或的inout參數(shù)的參數(shù)給它的調(diào)用者傳回值。
存儲過程名稱后面必須加括號,哪怕該存儲過程沒有參數(shù)傳遞
1.7begin ... end(復(fù)合語句)
[begin_label:]begin
[statement_list]
end[end_label]
存儲子程序可以使用begin ... end復(fù)合語句來包含多個(gè)語句。
statement_list 代表一個(gè)或多個(gè)語句的列表。statement_list之內(nèi)每個(gè)語句都必須用分號(;)來結(jié)尾。
復(fù)合語句可以被標(biāo)記。除非begin_label存在,否則end_label不能被給出,并且如果二者都存在,他們必須是同樣的。
1.8declare語句(用來聲明局部變量)
declare語句被用來把不同項(xiàng)目局域到一個(gè)子程序:局部變量
declare僅被用在begin ... end復(fù)合語句里,并且必須在復(fù)合語句的開頭,在任何其它語句之前。
1.9存儲程序中的變量
1.1??? declare局部變量
declare var_name[,...] type [default value]
這個(gè)語句被用來聲明局部變量。
要給變量提供一個(gè)默認(rèn)值,請包含一個(gè)default子句。
值可以被指定為一個(gè)表達(dá)式,不需要為一個(gè)常數(shù)。
如果沒有default子句,初始值為null。
局部變量的作用范圍在它被聲明的begin ... end塊內(nèi)。
它可以被用在嵌套的塊中,除了那些用相同名字聲明變量的塊。
1.2??? 變量set語句
set var_name = expr [, var_name = expr]在存儲程序中的set語句是一般set語句的擴(kuò)展版本。
被參考變量可能是子程序內(nèi)聲明的變量,或者是全局服務(wù)器變量。
在存儲程序中的set語句作為預(yù)先存在的set語法的一部分來實(shí)現(xiàn)。這允許set a=x, b=y, ...這樣的擴(kuò)展語法。
其中不同的變量類型(局域聲明變量及全局和集體變量)可以被混合起來。
這也允許把局部變量和一些只對系統(tǒng)變量有意義的選項(xiàng)合并起來。
1.3??? select ... into語句
select col_name[,...] into var_name[,...] table_expr
這個(gè)select語法把選定的列直接存儲到變量。
因此,只有單一的行可以被取回。
select id,data into x,y from test.t1 limit 1;
注意,用戶變量名在mysql 5.1中是對大小寫不敏感的。
重要: sql變量名不能和列名一樣。如果select ... into這樣的sql語句包含一個(gè)對列的參考,并包含一個(gè)與列相同名字的局部變量,mysql當(dāng)前把參考解釋為一個(gè)變量的名字。
1.10???? mysql 存儲過程參數(shù)類型(in、out、inout)
mysql 存儲過程參數(shù)(in)
mysql 存儲過程 “in” 參數(shù):跟 c 語言的函數(shù)參數(shù)的值傳遞類似, mysql 存儲過程內(nèi)部可能會(huì)修改此參數(shù),但對 in 類型參數(shù)的修改,對調(diào)用者(caller)來說是不可見的(not visible)。
mysql 存儲過程參數(shù)(out)
mysql 存儲過程 “out” 參數(shù):從存儲過程內(nèi)部傳值給調(diào)用者。在存儲過程內(nèi)部,該參數(shù)初始值為 null,無論調(diào)用者是否給存儲過程參數(shù)設(shè)置值
mysql 存儲過程參數(shù)(inout)
mysql 存儲過程 inout 參數(shù)跟 out 類似,都可以從存儲過程內(nèi)部傳值給調(diào)用者。不同的是:調(diào)用者還可以通過 inout 參數(shù)傳遞值給存儲過程。
總結(jié)
如果僅僅想把數(shù)據(jù)傳給 mysql 存儲過程,那就使用“in” 類型參數(shù);如果僅僅從 mysql 存儲過程返回值,那就使用“out” 類型參數(shù);如果需要把數(shù)據(jù)傳給 mysql 存儲過程,還要經(jīng)過一些計(jì)算后再傳回給我們,此時(shí),要使用“inout” 類型參數(shù)。
1.11???? 例子:
1.1?? 創(chuàng)建存儲過程
帶(輸出參數(shù))返回值的存儲過程:
復(fù)制代碼代碼示例:
--刪除存儲過程
drop procedure if exists proc_employee_getcount
--創(chuàng)建存儲過程
create procedure proc_employee_getcount(out n int)
begin
select count(*) from employee ;
end
--mysql調(diào)用存儲過程
call proc_employee_getcount(@n);
帶輸入?yún)?shù)的存儲過程:
復(fù)制代碼代碼示例:
--刪除存儲過程
drop procedure if exists proc_employee_findbyid;
--創(chuàng)建存儲過程
create procedure proc_employee_findbyid(in n int)
begin
select * from employee where id=n;
end
--定義變量
set @n=1;
--調(diào)用存儲過程
call proc_employee_findbyid(@n);
操作存儲過程時(shí)應(yīng)注意:
1. 刪除存儲過程時(shí)只需要指定存儲過程名即可,不帶括號;
2. 創(chuàng)建存儲過程時(shí),不管該存儲過程有無參數(shù),都需要帶括號;
3. 在使用set定義變量時(shí)應(yīng)遵循set的語法規(guī)則;
set @變量名=初始值;
4. 在定義存儲過程參數(shù)列表時(shí),應(yīng)注意參數(shù)名與數(shù)據(jù)庫中字段名區(qū)別開來,否則將出現(xiàn)無法預(yù)期的結(jié)果
1.12???? java代碼調(diào)用存儲過程(jdbc)
相關(guān)api:java.sql.callablestatement
使用到j(luò)ava.sql.callablestatement接口,該接口專門用來調(diào)用存儲過程;
該對象的獲得依賴于java.sql.connection;
通過connection實(shí)例的preparecall()方法返回callablestatement對象
preparecall()內(nèi)部為一固定寫法{call 存儲過程名(參數(shù)列表1,參數(shù)列表2)}可用?占位
eg: connection.preparecall("{call proc_employee(?)}");
存儲過程中參數(shù)處理:
輸入?yún)?shù):通過java.sql.callablestatement實(shí)例的setxxx()方法賦值,用法等同于java.sql.preparedstatement
輸出參數(shù):通過java.sql.callablestatement實(shí)例的registeroutparameter(參數(shù)位置, 參數(shù)類型)方法賦值,其中參數(shù)類型主要使用java.sql.types中定義的類型
java代碼調(diào)用帶輸入?yún)?shù)的存儲過程 (根據(jù)輸入id查詢雇員信息)
復(fù)制代碼代碼示例:
publicvoid executeprocedure()
{
try {
/**
*callablestatementjava.sql.callablestatement
*connectionjava.sql.connection
*jdbc調(diào)用存儲過程原型
*{call存儲過程名(參數(shù)列表1,參數(shù)列表2)}可用?代替
*/
callablestatement=connection.preparecall("{call proc_employee_findbyid(?)}");
callablestatement.setint(1, 1); //設(shè)置輸入?yún)?shù)
resultset=callablestatement.executequery();//執(zhí)行存儲過程
if(resultset.next())
{
system.out.println(resultset.getint(1)+""t"+resultset.getstring(2));
}
} catch (sqlexception e) {
e.printstacktrace();
}
}
java代碼調(diào)用帶輸出參數(shù)的存儲過程 (返回?cái)?shù)據(jù)庫中的記錄數(shù))
復(fù)制代碼代碼示例:
publicvoid executeprocedure()
{
try {
/**
*callablestatementjava.sql.callablestatement
*connectionjava.sql.connection
*jdbc調(diào)用存儲過程原型
*{call存儲過程名(參數(shù)列表1,參數(shù)列表2)}可用?代替
*/
callablestatement=connection.preparecall("{call proc_employee_getcount(?)}");
//設(shè)置輸出參數(shù)
callablestatement.registeroutparameter(1, types.integer);
//執(zhí)行存儲過程
resultset=callablestatement.executequery();
if(resultset.next())
{
system.out.println(resultset.getint(1));
}
} catch (sqlexception e) {
e.printstacktrace();
}
}
總結(jié)
以上是生活随笔為你收集整理的mysql execute 存储过程_Mysql存储过程调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Coursera | Introduct
- 下一篇: 秩和检验-matlab函数ranksum