今天公司老大讓我做一個MySQL的調研工作,是關於MySQL的存儲結構的使用。這裡我會通過3個例子來介紹一下MySQL中存儲結構的使用過程,以及一些需要注意的點。
系統:Windows 7
MySQL:MySQL 5.0.96
新建student1
DROP TABLE IF EXISTS student1; CREATE TABLE student1 ( id INT NOT NULL auto_increment, name TEXT, age INT, PRIMARY KEY(id) );
DROP TABLE IF EXISTS student2; CREATE TABLE student2 ( id INT NOT NULL auto_increment, name TEXT, age INT, PRIMARY KEY(id) );
INSERT INTO student1 (name, age) VALUES ('xiaoming', 18);
INSERT INTO student1 (name, age) VALUES ('xiaohong', 17);
INSERT INTO student1 (name, age) VALUES ('xiaogang', 19);
INSERT INTO student1 (name, age) VALUES ('xiaoyu', 18);
INSERT INTO student1 (name, age) VALUES ('xiaohua', 20);
1.打印student1中的部分信息
2.把student1中的部分數據復制到student2中
3.傳入參數作為限制條件,把student1中的部分數據復制到student2中
在編寫存儲結構的時候,我們不能以分號(;)結束。因為我們的SQL語句就是以分號(;)結尾的。這裡我們要修改一下存儲結構的結束符號(&&)。
這裡我們使用MySQL中的DELIMITER進行修改,並在存儲結構創建完畢時,再改為分號(;)結束即可。
關於這一點在後面的例子中有所體現。在編寫MySQL的觸發器中,也會用到類似的情況。
--------------------------------------------------------------- DROP PROCEDURE IF EXISTS test_pro1; --------------------------------------------------------------- DELIMITER && CREATE PROCEDURE test_pro1() BEGIN set @sentence = 'select * from student1 where age<19;'; prepare stmt from @sentence; execute stmt; deallocate prepare stmt; END && DELIMITER ;
---------------------------------------------------------------
DROP PROCEDURE IF EXISTS test_pro2;
---------------------------------------------------------------
DELIMITER &&
create procedure test_pro2()
begin
DECLARE stop_flag INT DEFAULT 0;
DECLARE s_name TEXT default '';
DECLARE s_age INT default 0;
DECLARE cur1 CURSOR FOR (select name, age from student1 where age<19);
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET stop_flag=1;
open cur1;
fetch cur1 into s_name, s_age;
while stop_flag<>1 DO
insert into student2(name, age) values(s_name, s_age);
fetch cur1 into s_name, s_age;
end while;
close cur1;
end &&
DELIMITER ;
---------------------------------------------------------------
DROP PROCEDURE IF EXISTS test_pro3;
---------------------------------------------------------------
DELIMITER &&
create procedure test_pro3(IN p_age INT)
begin
DECLARE stop_flag INT DEFAULT 0;
DECLARE s_name TEXT default '';
DECLARE s_age INT default 0;
DECLARE cur1 CURSOR FOR (select name, age from student1 where age1 DO
insert into student2(name, age) values(s_name, s_age);
fetch cur1 into s_name, s_age;
end while;
close cur1;
end &&
DELIMITER ;
call test_pro1(); or call test_pro1(123);