Mysql存儲過程入門知識
[sql] #1,查看數據庫所有的存儲過程名 #--這個語句被用來移除一個存儲程序。不能在一個存儲過程中刪除另一個存儲過程,只能調用另一個存儲過程 #SELECT NAME FROM mysql.proc WHERE db='數據庫名';
[sql] #2,列出所有的存儲過程 #SHOW PROCEDURE STATUS; #3,查看存儲過程詳細 #SHOW CREATE PROCEDURE 數據庫名.存儲過程名;
[sql] #4,存儲過程的創建 由括號包圍的參數列必須總是存在。如果沒有參數,也該使用一個空參數列()。 #每個參數默認都是一個IN參數。要指定為其它參數,可在參數名之前使用關鍵詞 OUT或INOUT #CREATE PROCEDURE存儲過程名 (參數列表); 使用BEGIN ... END復合語句來包含多個語句 # BEGIN # SQL語句代碼塊 # END
[sql] #5,DECLARE語句(用來聲明局部變量); #要給變量提供一個默認值,需包含一個DEFAULT子句。如果沒有DEFAULT子句,初始值為NULL。局部變量的作用范圍在它被聲明的BEGIN ... END塊內。 #DECLARE var_name[,...] type [DEFAULT value]
[sql]
#6,變量SET語句
#SET var_name = expr [, var_name = expr]
[sql]
#7,SELECT ... INTO語句;這個SELECT語法把選定的列直接存儲到變量,因此,只有單一的行可以被取回。
#SELECT col_name[,...] INTO var_name[,...] table_expr
[sql]
#8,修改存儲過程
#ALTER PROCEDURE 存儲過程名SQL語句代碼塊;
[sql]
#9,刪除存儲過程
#DROP PROCEDURE IF EXISTS 存儲過程名;
#存儲過程的調用;存儲過程名稱後面必須加括號,哪怕該存儲過程沒有參數傳遞。
[sql]
#10,CALL 存儲過程名(參數列表);
[sql]
#11,MySQL 存儲過程參數(in;)
#跟 C 語言的函數參數的值傳遞類似, MySQL 存儲過程內部可能會修改此參數,但對 in 類型參數的修改,對調用者(caller)來說是不可見的(not visible)。
[sql]
#12,MySQL 存儲過程參數(out)
#MySQL 存儲過程 “out” 參數:從存儲過程內部傳值給調用者。在存儲過程內部,該參數初始值為 null,無論調用者是否給存儲過程參數設置值
[sql]
#13,MySQL 存儲過程參數(inout)
#MySQL 存儲過程 inout 參數跟 out 類似,都可以從存儲過程內部傳值給調用者。不同的是:調用者還可以通過 inout 參數傳遞值給存儲過程。
#注:如果僅僅想把數據傳給 MySQL 存儲過程,那就使用“in” 類型參數;
# 如果僅僅從 MySQL 存儲過程返回值,那就使用“out” 類型參數;
# 如果需要把數據傳給 MySQL 存儲過程,還要經過一些計算後再傳回給我們,此時,要使用“inout” 類型參數。
#demo1:創建一個簡單的存儲過程(獲取用戶總數),帶輸出參數。
#--刪除存儲過程
DROP PROCEDURE IF EXISTS proc_users_getCount
#--創建存儲過程
CREATE PROCEDURE proc_users_getCount(OUT n INT)
BEGIN
SELECT COUNT(*) FROM users ;
END
#--MYSQL調用存儲過程
CALL proc_users_getCount(@n);
#demo2:創建一個簡單的存儲過程(根據用戶id獲取用戶信息),帶輸入參數。
#--刪除存儲過程
DROP PROCEDURE IF EXISTS proc_users_findById;
#--創建存儲過程
CREATE PROCEDURE proc_users_findById(IN n INT)
BEGIN
SELECT * FROM users WHERE id=n;
END
#--定義變量
SET @n=1;
#--調用存儲過程
CALL proc_users_findById(@n);
#Last:操作存儲過程時應注意:
#1.刪除存儲過程時只需要指定存儲過程名即可,不帶括號;
#2.創建存儲過程時,不管該存儲過程有無參數,都需要帶括號;
#3.在使用SET定義變量時應遵循SET的語法規則;
#SET @變量名=初始值;
#4.在定義存儲過程參數列表時,應注意參數名與數據庫中字段名區別開來,否則將出現無法預期的結果.
#END:java中調用存儲過程util
# // 執行存儲過程
# @Override
# public ResultSet execProc(final String procName, final Object[] params) {
# return (ResultSet) getHibernateTemplate().execute(
# new HibernateCallback() {
# public Object doInHibernate(Session session)
# throws HibernateException, SQLException {
# CallableStatement cstmt = session.connection()
# .prepareCall(procName);
# if (params != null) {
# for (int i = 0; i < params.length; i++) {
# cstmt.setObject(i + 1, params[i]);
# }
# }
# ResultSet rs = cstmt.getResultSet();
# return rs;
# }
# });
# }