1、存储过程简介:

存储过程,英文名Stored Procedure,说简单点,就是将MySQL语句集或必要的程序封装在一个结构体里面,存储在数据库中,供外部调用的一个数据库对象,存储过程在思想上很简单,就是SQL代码的封装与重用。

优点

  • 存储过程可封装,并隐藏复杂的商业逻辑。
  • 存储过程可以回传值,并可以接受参数。
  • 存储过程可以返回多个值,而普通函数只能返回一个值。
  • 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
  • 存储过程可以用在数据检验,强制实行商业逻辑等。

缺点

  • 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
  • 存储过程的性能调校与撰写,受限于各种数据库系统。

2、学习前准备(主题引出)

创建一张简单表名为table1,仅有一个列name;

SQL语句:create table table1(name varchar(10));

再创建两张表运动员和赛事情况表;

SQL语句-运动员表:

create table Players(
 id int(10)  Auto_Increment Not null Primary Key,
 name varchar(20)  Not null,
 age varchar(4) not null,
 gender varchar(4))Engine=InnoDB Auto_increment=1 Default Charset=utf8;

SQL语句-赛事情况表:

create table Matches(

id int(10) Auto_Increment Not null,

MATCHNO int(5)  Not null,

TEAMNO Varchar(6)  not Null,

PLAYERNO int(7) Not null ,

WON Int(8) not null,

LOST varchar(2),

Primary Key(id))Engine=InnoDB Auto_increment=1 default Charset =utf8;

向三张表插入数据:

insert into table1 values(78);insert into table1 values('ls');

insert into players  values(1,'lsq',22,'男');insert into Players  values(2,'lqq',23,'女');

insert into Matches values(1,5,6,3,8,9); insert into Matches values(2,2,3,4,3,8);

注意:小细节,关于SQL语句结构体是不分大小写的,但表名必须区分大小写,我用的Mysql版本是8.0后的版本。

这些语句我们可以写成存储语句,外部调用,一次性执行。

存储过程语句:

Delimiter //
CREATE PROCEDURE first_proc()
BEGIN
DECLARE x VARCHAR(20) DEFAULT '';
DECLARE y VARCHAR(20) DEFAULT '';
DECLARE z VARCHAR(20) DEFAULT '';
DECLARE m VARCHAR(20) DEFAULT '';
DECLARE n VARCHAR(20) DEFAULT '';
DECLARE o VARCHAR(20) DEFAULT '';
DECLARE p VARCHAR(20) DEFAULT '';
set x='执行开始了,先删除之前创建的三张表';
drop table table1;
drop table Players;
drop table Matches;
select x;
set y='创建第一张table1';
select y;
create table table1(name varchar(10));
set z='创建第二张表Players';
select z;
create table Players(
id int(10)  Auto_Increment Not null Primary Key,
name varchar(20)  Not null,
age varchar(4) not null,
gender varchar(4))Engine=InnoDB Auto_increment=1 Default Charset=utf8;
set m='创建第三张表';
select m;
create table Matches(
id int(10) Auto_Increment Not null,
MATCHNO int(5)  Not null,
TEAMNO Varchar(6)  not Null,
PLAYERNO int(7) Not null ,
WON Int(8) not null,
LOST varchar(2),
Primary Key(id))Engine=InnoDB Auto_increment=1 default Charset =utf8;
set n='向表中插入数据';
select n;
insert into table1  values(78);insert into table1 values('ls');
insert into Players values(1,'lsq',22,'男');insert into Players values(2,'lqq',23,'女');
insert into Matches values(1 ,5,6,3,8,9); insert into Matches values(2,2,3,4,3,8);
set o='下面是每张表的详细信息';
select z;
select * from table1;
select * from Players;
select * from Matches;
set p='结束';
select p;
end;
//
Delimiter ;
call first_proc;
在此,你可能会问,我直接执行SQL语句岂不是来得更直接?很明显,你在抬杠了,存储过程的用途绝不仅限于此,这里的重点是引出“存储过程”话题,你有没有发现这里我们仅需调用一下first_proc,预设的所有功能都一步到位了吗?
3、存储过程基本语法

声明语句结束符,可以自定义:

DELIMITER $$

DELIMITER //

其他任意符号都行,结构体写完,推荐都用";" 习惯了。

声明存储过程:

CREATE PROCEDURE proc_name(IN p_in int)

存储过程开始和结束符号:

BEGIN .... END

变量定义:

DECLARE num int unsigned default 100;

Declare char_1 varchar(10) default '';

变量赋值:

set num=23;

set  char_1='我是齐天大圣';

存储过程结构体:

存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等
过程体格式:以begin开始,以end结束(可嵌套)
BEGIN
  BEGIN
    BEGIN
      statements;
    END
  END
END

4、实操
4.1、关于参数
Create  Procedure   存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
  • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
  • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
  • INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
例1:外部传参到结构体

Delimiter //
Create Procedure proc_in(In p_in varchar(20))
Begin
select p_in;
insert into table1 values(p_in);
select * from table1;
set p_in='我是牛魔王';
select p_in;
End;
//
Delimiter ;
set @p_in='我是齐天大圣';
call proc_in(@p_in);

设置传入参数值:

调用存储过程:  可以看到外部参数被传进存储过程体,然后再插入table1表中,接着在结构体内更改了变量。

例2:结构体内部参数传到外面

Delimiter //
Create Procedure proc_out(Out  p_out  varchar(20))
Begin
select p_out;
set p_out='我是牛魔王';
insert into table1 values(p_out);
select  * from  table1;
End;
//
Delimiter ;
set @p_out='我是太白金星';
call proc_out(@p_out);

调用存储过程:可以看出“太白金星”并没有被传到存储过程结构体中。

select @p_out;

结果是结构体中返回的变量“牛魔王”。

例3:既能输入也能输出

只需 InOut:  create procedure inout_param(InOut p_inout  int)
这里不再详细阐释。
4.2、关于存储过程变量
局部声明变量: DECLARE  variable_name [,variable_name...] datatype [DEFAULT value];

其中,datatype 为 MySQL 的数据类型,如: int, float, date,varchar(length)

例如:

DECLARE l_int int unsigned default 400;
DECLARE l_numeric number(8,2) DEFAULT 9.95;
DECLARE l_date date DEFAULT '1999-12-31';
DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';
DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';

变量赋值:
SET 变量名 = 表达式值 [,variable_name = expression ...]
set x=500;
在存储过程汇总使用变量:

CREATE PROCEDURE GreetWorld1()  SELECT CONCAT(@greeting,' World') As "hello world";
SET @greeting='Hello';
CALL GreetWorld1( );

 

在MySQL客户端使用存储变量:读者自行测试

SELECT 'Hello World' into @x;
SELECT @x;

SET @y='Goodbye Cruel World';
SELECT @y;

SET @z=1+2+3;
SELECT @z;

在存储过程间传递全局范围的用户变量:不推荐,滥用变量会导致难以理解和管理

CREATE PROCEDURE p1() SET @last_procedure='p1';
CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure);
CALL p1( );
CALL p2( );

 

 4.3、存储过程查看

select routine_name from information_schema.routines where routine_schema='数据库名';

 select routine_name from information_schema.routines where routine_schema='shop';

show procedure status where db='shop';

show create procedure  first_proc;    #表示查看创建存储过程的语句

 4.4、删除存储过程
drop procedure proc_name;
4.5、存储过程修改
注:存储过程只能修改特征,不能修改过程里面的sql语句及参数变量,如果想对过程体结构更改,只能是删掉存储过程,然后重建。
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
characteristic:
  COMMENT 'string'
  |LANGUAGE SQL
  |{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  |SQL SECURITY { DEFINER | INVOKER }

存储过程的特征characteristic:指定存储的特性

1、COMMENT 'string'是注释信息;

  LANGUAGE SQL是指明过程体是用sql语言编写的,而不是java或php;

2、SQL SECURITY { DEFINER | INVOKER }指明谁有权限来执行:

  DEFINER表示只有定义者自己才能够执行;

  INVOKER表示调用者可以执行。

转载于:https://www.cnblogs.com/Rosen-Walk/p/11192409.html

MySQL之存储过程实例讲解(创建、调用、查看、修改、删除)相关推荐

  1. 索引语法——创建索引 || 查看索引 || 删除索引 || ALTER命令 索引设计原则

    索引语法 索引在创建表的时候,可以同时创建,也可以随时增加新的索引. 准备环境: 创建索引 查看索引 删除索引 ALTER命令 索引设计原则 索引的设计可以遵循一些已有的原则,创建索引的时候请尽量考虑 ...

  2. 第十二讲 dom对象(DOM对象、document对象的常用方法、节点、查找结点、 查看/修改/删除属性节点、创建和增加节点)

    一.查看节点 getElementById( ) 元素的ID名称来访问,返回对拥有指定id的第一个对象的引用 getElementsByName( )  按元素的name名称来访问,返回带有指定名称的 ...

  3. es 索引操作(创建、查看、删除)

    文章目录 es 索引操作(创建.查看.删除) 创建 判断索引是否存在 查看索引 批量查看索引 查看所有索引 删除索引库 es 索引操作(创建.查看.删除) 创建 PUT /test01_demo{ & ...

  4. java sql函数_Java调用Sql存储过程实例讲解

    1.使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转 义序列.不带参数的 call 转义序列的语法如下所示: {call procedure-n ...

  5. Mysql之存储过程,动态创建表和数据库-,动态删除-yellowcong

    今天在弄mycat 的时候,有一个需求,就是创建12个数据库,然后数据库里面都创建一个表,我当时想象,这个玩意也不难,于是寻思通过存储过程来动态创建表,只需要传递进来数据的前缀名称和表名称,即可创建1 ...

  6. mysql 统计存储过程实例_MySQL存储过程实例

    一.创建MySQL数据库函数 TCC:无参数,查询fruit表中的所有数据 : TAA:两个参数,查询fruit总共有多少行:查询ids为某个值时水果表的数据 TDD:两个参数,查询ids不等于某个值 ...

  7. Sql Server 存储过程实例讲解

    一.简介 简单记录一下存储过程的使用.存储过程是预编译SQL语句集合,也可以包含一些逻辑语句,而且当第一次调用存储过程时,被调用的存储过程会放在缓存中,当再次执行时,则不需要编译可以立马执行,使得其执 ...

  8. 【MySQL视图】视图的概念、创建、查看、删除和修改

    目录 一.什么是视图 二.创建视图 1.在单表上创建视图 2.在多表上创建视图 三.查看视图 1.使用DESCRIBE | DESC语句查看视图基本信息 2.使用SHOW TABLES语句查看视图基本 ...

  9. 【 Linux 】创建、查看、删除文件

    目录 创建并查看 vim创建c文件 单个删除 批量创建或删除 从小白开始,记录每一次遇到的问题,然后整理出来,我相信刚接触Linux的人多多少少也会遇到类似的问题,如果看到了我的博客,也是一种缘分. ...

  10. mysql的存储过程和索引区别_mysql查看索引与存储过程

    mysql查看索引与存储过程创建索引: CREATE INDEX可对表增加普通索引或UNIQUE唯一索引. CREATE INDEX index_name ON table_name (column_ ...

最新文章

  1. Pandas中Apply函数加速百倍的技巧
  2. 模型越复杂越容易惰性_ML模型的惰性预测
  3. 为什么程序员发现不了自己的BUG?
  4. SQL Server 2005之PIVOT/UNPIVOT行列转换(转)
  5. aspen plus大小_Aspen入门篇2—Aspen Plus 使用介绍
  6. C语言课后习题(38)
  7. 【jQuery笔记Part2】02-jQuery展开收起动画帷幔效果案例下拉菜单案例显示隐藏更多案例折叠菜单案例
  8. FPGA相关术语(一)
  9. delphi中webbrowse控件中模拟点击文本超链接_游戏中lt;控件gt;的思考
  10. squid笔记下载_Squid下载-Squid鱿鱼笔记下载v3.4.9.5 安卓版-西西软件下载
  11. java性能调优原因和因素
  12. 自己动手写网络爬虫(第一天)
  13. 51单片机红外线发射c语言,51单片机红外发射模块与红外接收模块的代码程序设计...
  14. 第17章 其他数据库日志【4.日志与备份篇】【MySQL高级】
  15. Linux环境下使用阿里云盘
  16. 西门子300 PLC 功能块及背景数据块的说明
  17. 剖析抖音快速涨粉的文案号,了解大佬运营技巧,学以致用
  18. 2017年南海区青少年信息学奥林匹克竞赛(小学甲组)
  19. 面向对象类与对象的关系
  20. 半年面试,我总结出了java面试笔记

热门文章

  1. PUE的精确性得益于持续监控
  2. 英语小作文模板(10招募+通知;15通知+介绍)
  3. 1、 D435i ----- Ubuntu18.04下D435i使用(SDK安装与测试)
  4. 数据库连接的五种方式
  5. Matlab中flip
  6. android 副屏旋转无效,设置副屏旋转
  7. 我在婚姻生活里犯的五个错误
  8. 32Bit程序使用超过2G内存的方法
  9. 一篇文章带你学完链表基础(C语言)
  10. 标准作业与VIOOVI的ECRS工时分析软件:生产效率的提升与变革