Mysql数据库存储过程基本语法讲解_望崖的博客-程序员秘密

技术标签: 存储过程  mysql  

Mysql数据库存储过程基本语法讲解
一般情况下MYSQL以;结尾表示确认输入并执行语句,但在存储过程中;不是表示结束,因此可以用该命令将;号改为//表示确认输入并执行。存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。
一.创建存储过程
1.基本语法:
?
1
2
3
4
create procedure sp_name()
begin
.........
end
2.参数传递
二.调用存储过程
1.基本语法:
?
1
call sp_name()
注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递
三.删除存储过程
1.基本语法:
drop procedure [存储过程名称];   //后面没有括号
2.注意事项
(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
四.区块,条件,循环
1.区块定义,常用
?
1
2
3
begin
......
end;
也可以给区块起别名,如:
?
1
2
3
lable:begin
...........
end lable;
可以用leave lable;跳出区块,执行区块以后的代码
2.条件语句
if 条件 then
 statement
 else
 statement
 end if;
3.循环语句
(1).while循环
[label:] WHILE expression DO

 statements

 END WHILE [label] ;
(2).loop循环
[label:] LOOP

 statements

 END LOOP [label];
(3).repeat until循环
[label:] REPEAT

 statements

 UNTIL expression

 END REPEAT [label] ;
五.其他常用命令
1.show procedure status
显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
2.show create procedure sp_name
显示某一个存储过程的详细信息
下面看一个例子
一、MySQL 创建存储过程
“pr_add” 是个简单的 MySQL 存储过程,这个MySQL 存储过程有两个 int 类型的输入参数 “a”、“b”,返回这两个参数的和
delimiter //   -- 改变分割符
drop procedure if exists pr_add//  -- 若之前创建有这个存储过程则删除
计算两个数之和
?
1
2
3
4
5
6
7
8
9
10
11
12
13
create procedure pr_add (a int,b int)
begin
declare c int;
if a is null then
set a = 0;
end if;
if b is null then
set b = 0;
end if;
set c = a + b;
select c as sum;
end
//
二、调用 MySQL 存储过程
call pr_add(10, 20);
执行 MySQL 存储过程,存储过程参数为 MySQL 用户变量。
set @a = 10;
set @b = 20;
call pr_add(@a, @b);
三、MySQL 存储过程特点
创建 MySQL 存储过程的简单语法为:
create procedure 存储过程名字()
(
[in|out|inout] 参数 datatype
)
begin
MySQL 语句;
end;
MySQL 存储过程参数如果不显式指定“in”、“out”、“inout”,则默认为“in”。习惯上,对于是“in” 的参数,我们都不会显式指定。
1. MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()”
2. MySQL 存储过程参数,不能在参数名称前加“@”,如: “@a int”。下面的创建存储过程语法在 MySQL 中是错误的(在 SQL Server 中是正确的)。 MySQL 存储过程中的变量,不需要在变量名字前加“@”,虽然 MySQL 客户端用户变量要加个“@”。
create procedure pr_add
(
@a int, -- 错误
b int -- 正确
)
3. MySQL 存储过程的参数不能指定默认值。
4. MySQL 存储过程不需要在 procedure body 前面加 “as”。而 SQL Server 存储过程必须加 “as” 关键字。
?
1
2
3
4
5
6
7
8
9
create procedure pr_add
(
a int,
b int
)
as -- 错误,MySQL 不需要 “as”
begin
mysql statement ...;
end;
5. 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。
?
1
2
3
4
5
6
7
8
9
create procedure pr_add
(
a int,
b int
)
begin
mysql statement 1 ...;
mysql statement 2 ...;
end;
6. MySQL 存储过程中的每条语句的末尾,都要加上分号 “;”
?
1
2
3
4
5
6
7
...
declare c int;
if a is null then
set a = 0;
end if;
...
end;
7. MySQL 存储过程中的注释。
declare c int; -- 这是单行 MySQL 注释 (注意 -- 后至少要有一个空格)
if a is null then # 这也是个单行 MySQL 注释
set a = 0;
end if;
...
end;
8. 不能在 MySQL 存储过程中使用 “return” 关键字。
set c = a + b;
select c as sum;
end;
9. 调用 MySQL 存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也需要“()”
call pr_no_param();
10. 因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参数。可以用 null 来替代。
我们再通过一个实例来加深一下以上知识点:
1、下面为一个存储过程的定义过程:
?
1
2
3
4
5
6
7
8
9
create procedure proc_name (in parameter integer)
begin
declare variable varchar(20);
if parameter=1 then set variable='MySQL';
else set variable='PHP';
end
if;
insert into tb (name) values (variable);
end;
MySQL中存储过程的建立以关键字create procedure开始,后面紧跟存储过程的名称和参数。MySQL的存储过程名称不区分大小写,例如PROCE1()和proce1()代表同一个存储过程名。存储过程名不能与MySQL数据库中的内建函数重名。
存储过程的参数一般由3部分组成。第一部分可以是in、out或inout。in表示向存储过程中传入参数;out表示向外传出参数;inout表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程,存储过程默认为传入参数,所以参数in可以省略。第二部分为参数名。第三部分为参数的类型,该类型为MySQL数据库中所有可用的字段类型,如果有多个参数,参数之间可以用逗号进行分割。
MySQL存储过程的语句块以begin开始,以end结束。语句体中可以包含变量的声明、控制语句、SQL查询语句等。由于存储过程内部语句要以分号结束,所以在定义存储过程前应将语句结束标志“;”更改为其他字符,并且该字符在存储过程中出现的几率也应该较低,可以用关键字delimiter更改。例如:
mysql>delimiter //
存储过程创建之后,可用如下语句进行删除,参数proc_name指存储过程名。
drop procedure proc_name
实现过程
(1)MySQL存储过程是在“命令提示符”下创建的,所以首先应该打开“命令提示符”窗口。
(2)进入“命令提示符”窗口后,首先应该登录MySQL数据库服务器,在“命令提示符”下输入如下命令:
mysql –u用户名 –p用户密码
(3)更改语句结束符号,本实例将语句结束符更改为“//”。代码如下:
delimiter //
(4)创建存储过程前应首先选择某个数据库。代码如下:
use 数据库名
(5)创建存储过程。
(6)通过call语句调用存储过程。
举一反三
?
1
2
3
4
5
6
7
8
use test;
create table user(
id mediumint(8) unsigned not null auto_increment,
name char(15) not null default ”,
pass char(32) not null default ”,
note text not null,
primary key (id)
)engine=Innodb charset=utf8;
示例一
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
delimiter //
create procedure proc_name (in parameter integer)
begin
if parameter=0 then
select * from user order by id asc;
else
select * from user order by id desc;
end if;
end;
//
delimiter ;
show warnings;
call proc_name(1);
call proc_name(0);
示例二
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
drop procedure proc_name;
delimiter //
create procedure proc_name (in parameter integer)
begin
declare variable varchar(20);
if parameter=1 then
set variable='Windows';
else
set variable='Linux';
end if;
select parameter;
end;
//
delimiter ;
show warnings;
call proc_name(1);
call proc_name(0);
删除drop procedure proc_name;
附注:
1.show procedure status;
显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
2.show create procedure sp_name
显示某一个存储过程的详细信息
以上就是本篇MYSQL基本语法相关知识的全部内容,感觉不错就分享给你的朋友们吧。
您可能感兴趣的文章:
如对本文有疑问,请提交到交流社区,广大热心网友会为你解答!! 点击进入社区
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kingscoming/article/details/79273174

智能推荐

云服务器Centos7安装Docker(Docker-ce)_JOKER-Q的博客-程序员秘密

具体命令如下:uname -ryum updateyum erase -y docker docker-common docker-engineyum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo https://download.docker.com/linux...

hive-site.xml的数据库配置文件_韩利鹏的博客-程序员秘密

配置hive连接数据库的配置文件<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration> <property> <name>javax.jdo.option.ConnectionUR

input使用 blur 事件时频繁触发的问题_blur input_那时光〃冷落了初秋!的博客-程序员秘密

@blur / @[email protected] 只要失去焦点就会触发 不管有没有编辑如果想不实时触发 只要求改变后再触发事件,可以将@blur事件改为@change事件 在触发的时候就会监听input框值是否变化 不变化就不触发!!!事件我输入"12" 但是只要不断失去焦点就会不断触发改成change–只有改变值的时候才触发...

专业课考试c语言多媒体,计算机多媒体考试试题及答案_高光杰的博客-程序员秘密

计算机多媒体考试试题及答案在计算机系统中,多媒体指组合两种或两种以上媒体的一种人机交互式信息交流和传播媒体。使用的媒体包括文字、图片、照片、声音 、动画和影片,以及程式所提供的互动功能。下面是小编收集整理的计算机多媒体考试试题及答案,欢迎阅读,希望大家能够喜欢。一、单项选择题(每题2分共50分)1、多媒体信息不包括 ( )A 音频,视频 B 动画,图像 C 声卡,光盘 D 文字,图像2、以下不属于...

[转载]发邮件组件Nodemailer——nodejs中间件系列_weixin_30408165的博客-程序员秘密

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网...

苹果6s上市时间_苹果手机哪款型号好用?_weixin_39915668的博客-程序员秘密

阅读本文前,请您先点击上面的“蓝色字体”,再点击“关注”,这样您就可以继续免费收到文章了。每天都会有分享,都是免费订阅,请您放心关注。注图文来源网络,侵删 ...

随便推点

代码+通俗理解图神经网络GNN_gnn代码_普通攻击往后拉的博客-程序员秘密

1 类比CNN图神经网络GNN用于解决非欧几里得空间结构的数据结构的表征问题,其本质是依赖图形中边的连接关系表征节点或者图的信息。在说图神经网路是如何实现这一点时,可以先对比卷积神经网络对一般图像的处理过程:CNN对于图像的处理就是按照从上到下的顺序依次对图像进行卷积,从而提取整个图像的特征;而GNN对于图结构的处理,类似于按照节点为单位,用一个虚拟的卷积核按照节点的连接顺序对图中的节点依次进行处理。因此GNN与CNN的处理过程本质上是一样的。2 代码理解GNN的训练过程GNN的“模拟卷积核”在每

Mybatis传入参数类型为Map_mybatis中参数为map_茅坤宝骏氹的博客-程序员秘密

转载自   Mybatis传入参数类型为Map mybatis更新sql语句:&amp;lt;update id=&quot;publishT00_notice&quot; parameterType=&quot;Map&quot;&amp;gt;update test  set createdate = #{createdate},creator = #{creator}where id in &amp;lt;foreach coll...

lucene +Ik-Analyzer_lucene ik-analyzer_我不是小白脸的博客-程序员秘密

中文分词分词器选择lucene,检索和查询技术

js数组再倒数第二个添加元素_JavaScript 向数组的开头或末尾添加元素:unshift() 、push()方法详解..._weixin_39976251的博客-程序员秘密

unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。unshift() 实例:unshift()方法可向数组的开头添加一个或更多元素单击按钮在数组开始插入元素。点我function myFunction(){var fruits = ["网页", "设计", "网站", "建设"];fruits.unshif...

python aiml_Python AIML搭建聊天机器人实例_weixin_39540023的博客-程序员秘密

AIML,全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由Richard Wallace和世界各地的自由软件社区在1995年至2002年发明的,通过本文给大家介绍基于Python如何使用AIML搭建聊天机器人,需要的朋友一起学习借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人...

【PAT B1018】锤子剪刀布_林决明的博客-程序员秘密

【PAT B1018】锤子剪刀布题目描述大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。输入格式:输入第 1 行给出正整数 N(≤10*​5​​ ),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C 代表“锤子”、J 代表“剪刀”、B...