前言
今天公司老大让我做一个MySQL的调研工作,是关于MySQL的存储结构的使用。这里我会通过3个样例来介绍一下MySQL中存储结构的使用过程,以及一些须要注意的点。
笔者环境
系统:Windows 7
MySQL:MySQL 5.0.96
准备工作
1.新建两张数据表:student1, student2
新建student1
DROP TABLE IF EXISTS student1; CREATE TABLE student1 ( id INT NOT NULL auto_increment, name TEXT, age INT, PRIMARY KEY(id) );
新建student2
DROP TABLE IF EXISTS student2; CREATE TABLE student2 ( id INT NOT NULL auto_increment, name TEXT, age INT, PRIMARY KEY(id) );
2.向student1中新增数据
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的触发器中,也会用到相似的情况。
使用方式
1.打印student1中的部分信息
---------------------------------------------------------------
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 ; 2.复制表存储过程的编写(不带參数)
---------------------------------------------------------------
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 ;3.复制表存储过程的编写(带參数)
---------------------------------------------------------------
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 age<p_age);
        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 ;这里的SQLSTATE '02000'和NOT FOUND系统返回值是一样的。4.使用方式
call test_pro1(); or call test_pro1(123);
 
                    
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号