关于MySQL数据库存储过程的感想

时间:2021-03-07 23:50:40

以下只是学习路上的浅薄感想,如理解有所偏差,还请有识之士指正!

一、存储过程意义理解

    关于存储过程,我的理解是对数据库语言进行编程调用,就像Java代码类编程写一个具有某种特定功能的方法去进行调用一样。数据库的存储过程是一组相关联的sql语句或函数,通过进行组合形成模块化,从而具有某种特定的功能。而这种存储过程创建后会被保存在数据库中,被编译,随时可以被数据库用户调用。

    前面说过,数据库存储过程是一组sql语句或者函数,那么为什么这种存储过程会和普通的sql DDL(数据定义语言)、DML(数据管理语言)、DQL(数据查询语言)这类CRUD语句不同呢,因为普通的sql语句是告诉数据库需要做什么,而这种对数据库存储过程进行编程,是告诉数据库引擎做什么。就好比要求一个人10天跑完1万公里路程,前者是我需要告诉你每天跑1000公里,10天跑完。而后者只需要输入一个参数10天,他自己就跑完了。从而达到了你所需要的结果预期。

 一个存储过程也可以嵌套在另一个存储过程里,就像Java里的方法调用一样,这种设计可能是为了提高这种模块化的(sql语句和函数组合)编程复用性。

二、存储过程与单个sql语句相比较

   优点提取:

                  1、支持模块化编程。

     2、语句已经保存在数据库里了且被解析过,以可执行格式存在。

     3、可被其他存储过程调用,提高了开发的复用性。

三、语法

       CREATE   [OR REPLACE]    PROCEDURE  PROCEDURE_NAME   //创建存储过程

  [AGUMENT [{  IN  |  OUT  |  IN OUT }]   TYPE ,          //参数

  AGUMENT [{  IN  |  OUT  |  IN OUT }]   TYPE]  {AS}        

  PROCEDURE_BODY                     //主体内容

四、案例  {mysql创建用户表并利用存储过程添加10万条随机测试数据}

(1)建表数据

CREATE TABLE User_Hundred_Thousand(
user_id INT NOT NULL AUTO_INCREMENT,
first_name VARCHAR(20) NOT NULL,
last_name VARCHAR(20) NOT NULL,
sex VARCHAR(5) NOT NULL,
score INT NOT NULL,
copy_id INT NOT NULL,
PRIMARY KEY (`user_id`)
);

(2)建立储存过程

create PROCEDURE add_user(in num INT)
BEGIN
DECLARE rowid INT DEFAULT 0;
DECLARE firstname CHAR(1);
DECLARE name1 CHAR(1);
DECLARE name2 CHAR(1);
DECLARE lastname VARCHAR(3) DEFAULT '';
DECLARE sex CHAR(1);
DECLARE score CHAR(2);
WHILE rowid < num DO
SET firstname = SUBSTRING('赵钱孙李周吴郑王林杨柳刘孙陈江阮侯邹高彭徐',FLOOR(1+21*RAND()),1);
SET name1 = SUBSTRING('一二三四五六七八九十甲乙丙丁静景京晶名明铭敏闵民军君俊骏天田甜恬益依成城诚立莉力黎励',ROUND(1+43*RAND()),1);
SET name2 = SUBSTRING('一二三四五六七八九十甲乙丙丁静景京晶名明铭敏闵民军君俊骏天田甜恬益依成城诚立莉力黎励',ROUND(1+43*RAND()),1);
SET sex=FLOOR(0 + (RAND() * 2));
SET score= FLOOR(40 + (RAND() *60));
SET rowid = rowid + 1;
IF ROUND(RAND())=0 THEN
SET lastname =name1;
END IF;
IF ROUND(RAND())=1 THEN
SET lastname = CONCAT(name1,name2);
END IF;
insert INTO User_Hundred_Thousand (first_name,last_name,sex,score,copy_id) VALUES (firstname,lastname,sex,score,rowid);
END WHILE;
END ;

(3)调用存储过程

call add_user(100000);