直入正題吧:首先建立一張 students 表javascript
create table students( id int primary key auto_increment, age int, name varchar(20), city varchar(20) ) character set utf8; insert into students values(null, 22, '趙四', '杭州'); insert into students values(null, 16, '劉能', '上海'); insert into students values(null, 20, '謝廣坤', '深圳'); insert into students values(null, 21, '劉美蘭', '北京'); insert into students values(null, 20, '宋曉峯', '湖北'); insert into students values(null, 21, '謝大腳', '江蘇'); insert into students values(null, 20, '蘇玉紅', '天津'); insert into students values(null, 21, '陳豔蘭', '雲南');
不帶參數的存儲過程java
delimiter ;; -- 替換分隔符 create procedure select_students_count() begin select count(id) from students; end ;; delimiter ;
調用存儲過程: call select_students_count(); mysql
帶參數的存儲過程sql
-- 根據城市查詢總數 delimiter ;; create procedure select_students_by_city_count(in _city varchar(25))-- in (表示參數傳遞給存儲過程) begin select count(id) from students where city = _city; end;; delimiter ;
執行存儲過程post
call select_students_by_city_count('北京');
啊。這裏咋不對呢?數據是存在的,爲什麼返回0?說道這裏,mysql存儲過程在傳遞中文的時候注意字符集問題。處理的方式有兩種,咱們先作個簡單的測試:測試
delimiter ;; create procedure sp_test(in _city varchar(25))-- in (表示參數傳遞給存儲過程) begin select _city; end;; delimiter ;
發現傳遞在的中文變成亂碼了...只要正確設置編碼便可,這裏有2種方式解決,this
解決方式一:編碼
咱們修改下上面的儲存過程sp_test:spa
delimiter ;; create procedure sp_test(in _city varchar(25) CHARACTER SET utf8)-- in (表示參數傳遞給存儲過程) begin select _city; end;; delimiter ;
解決方式二:設計
delimiter ;; create procedure sp_test(in _city nvarchar(25))-- in (表示參數傳遞給存儲過程,注意這裏是nvarchar) begin select _city; end;; delimiter ;
總結:在建立存儲過程的時候,設計中文的參數的數據類型需爲Nvarchar,網上聽說傳遞參數的時候也須要多加一個N(這裏我沒加貌似也正常輸出)。
繼續回到上面根據城市查詢總數select_students_by_city_count,修改以下:
-- 根據城市查詢總數 delimiter ;; create procedure select_students_by_city_count(in _city nvarchar(25)) begin select count(id) from students where city = _city; end;; delimiter ;
帶有輸出參數的存儲過程
MySQL 支持 in (傳遞給存儲過程),out (從存儲過程傳出) 和 inout (對存儲過程傳入和傳出) 類型的參數。存儲過程的代碼位於 begin 和 end 語句內,它們是一系列 select 語句,用來檢索值,而後保存到相應的變量 (經過 into 關鍵字)
-- 根據姓名查詢學生信息,返回學生的城市 delimiter ;; create procedure select_students_by_name( in _name nvarchar(255), out _city nvarchar(255), -- 輸出參數 inout _age int(11) ) begin select city from students where name = _name and age = _age into _city; end ;; delimiter ;
執行存儲過程:
set @_age = 20; set @_name = '謝廣坤'; call select_students_by_name(@_name, @_city, @_age); select @_name as name,@_city as city, @_age as age;
帶有通配符的存儲過程
delimiter ;; create procedure select_students_by_likename( in _likename nvarchar(255) ) begin select * from students where name like _likename; end ;; delimiter ;
執行存儲過程:
call select_students_by_likename('%劉%');
使用存儲過程進行增長、修改、刪除
增長:
delimiter ;; create procedure insert_student( _id int, _name nvarchar(255), _age int, _city nvarchar(255) ) begin insert into students(id,name,age,city) values(_id,_name,_age,_city); end ;; delimiter ;
執行存儲過程:
call insert_student(9, '瓶底子', 19, '東北');
執行完後,表中多了一條數據,如上圖。
修改:
delimiter ;; create procedure update_student( _id int, _name nvarchar(25), _age int, _city nvarchar(25) ) begin update students set name = _name, age = _age, city = _city where id = _id; end ;; delimiter ;
執行存儲過程:
call update_student(9, '李大個', 22, '杭州');
刪除:
delimiter ;; create procedure delete_student_by_id( _id int ) begin delete from students where id=_id; end ;; delimiter ;
執行存儲過程:
call delete_student_by_id(9);
查詢全部的存儲過程:
select name from mysql.proc where db='test';
查詢某個存儲過程:
show create procedure 存儲過程名;