mysql存儲過程的使用

直入正題吧:首先建立一張 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 存儲過程名;
相關文章
相關標籤/搜索