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