zoukankan      html  css  js  c++  java
  • MySQL存储结构的使用

    前言

      今天公司老大让我做一个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);

  • 相关阅读:
    使用SolrJ生成索引
    olr 性能调优 NO_NORMS
    关于 solr solrconfig.xml 的配置说明
    动态生成二维码并利用canvas合成出一张图片(类似海报、分享页)
    如何将打包好的文件做成一个APP
    vue路由对不同界面进行传参及跳转的总结
    移动端自适应布局的适配
    08年12月到1月15的工作
    继续被reject!
    虽然预料到结果,但还是感觉不爽!
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7207235.html
Copyright © 2011-2022 走看看