如何mysql写一个存储过程mysql存储过程

使用 MySQL 写了一个简单存储过程 - 简书
使用 MySQL 写了一个简单存储过程
昨天晚上,受朋友之托解决一个 sql 问题。然而。。。虽然是科班出身,对于 mysql 用的并不多。问题倒是不难,由于对环境不够熟悉,花去了我一点时间。
如何在一个字段中插入100个 0-10 的随机数?
这个问题一看是要采用循环的,被提示到 存储过程 这个名词。
那么,存储过程怎么建立,怎么调用呢?
尼玛,科班不能怂啊。赶紧查查。
一、 Ubuntu 环境
昨天晚上回家没带 win7,win10环境有点麻烦,就开了 ubuntu。没想到被 mysql 的用户名密码给折腾了一下。控制台输入 mysql -uroot -p,提示输入密码,然后怎么都输不对。懵逼几秒中...好吧,马上来解决这个问题。
问题:Ubuntu 系统忘记了 mysql 的用户名密码怎么进入?
解答:让我们来谷度一下。
查看 /etc/f 文件,命令为 vi /etc/f,哇嘎达!找到了用户名密码!
命令行输入 mysql -u刚才的用户名 -p,然后输入密码。
二、 Window7 环境
为什么又切换环境了呢?昨晚太困睡着了,没解决完问题。早上一上班赶紧来弄。好的,现在 Windows 有图了!
废话少说,先进数据库 mysql -uroot -p。
三、 命令行的 mysql 咋用?
既然生疏了,重新用用就好了嘛。朋友让表名写 ceshibiao,字段名写 time。
提醒一下,以下的 sql 语句都要记得加分号,否则会错哦,特殊的我会说。
切换数据库
查看数据库可以用 mysql&
先来建个表(至于英文还是拼音的名称就不要在意了)
mysql&create table ceshibiao(time real);
查看表可以用 mysql&
sql 的类型科普:integer 表示整型,real 表示浮点型,text 表示文本类型
这样,mysql 基本的命令行使用就了解了。
四、存储过程咋写?
我写完以后的长这样:
简单的存储过程实现
先来解释一下这个 delimiter。
这个词其实是 分隔符 的意思,mysql 中默认为分号,分号结尾,回车后自动执行。
如果写一句加一个分号立即执行了,那就没法写存储过程啊。
所以,mysql&delimiter // 这句表示,将;转换为//,只有收到 // 这个符号时,才认为指令结束。
这样,我们在存储过程内部就可以尽情地使用分号啦!
然后解释下取随机数的式子 ceiling(rand()*10))。
ceiling 和 floor 对应,前者表示向上取整(天花板嘛),后者表示向下取整(地板咯)。
rand() 函数表示在 0 和 1 之间产生一个随机数。
所以,这个表达式的意思是,在 1-10 之间产生随机数。
至于数据库基本的 CURD 操作,这里就不用介绍了吧:)
五、 看一下运行结果
调用存储过程,直接 call 名称。
调用存储过程
小功告成!正文 mysql实例 存储过程中向表中添加数据
mysql实例 存储过程中向表中添加数据
发布时间: & 编辑:
本文介绍下,一个在mysql存储过程中向表中添加数据的例子,有需要的朋友,可以参考学习下。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
有一束阳光撒落在我手心
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(5080)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'mysql存储过程的相关权限',
blogAbstract:'
使用存储过程的时候需要的几个小细节。首先,在mysql存储过程出现的同时,用户权限也增加了5种,其中和存储过程有关的权限有三种:ALTER ROUTINE 编辑或删除存储过程 CREATE ROUTINE 建立存储过程 EXECUTE 运行存储过程 在使用GRANT创建用户的时候分配这三种权限。存储过程在运行的时候默认是使用建立者的权限运行的。需要注意的是在一个用户拥有建立存储过程的权限时,如果其没有对于select、update或delete等权限的话,虽然操作数据的存储过程可以建立,但调用存储过程的话仍是无法成功的,会返回权限错误,就算拥有运行存储过程的权限也一样。所以,如果有人给你建立了一个没有select、update、delete权限只有CREATE ROUTINE权限的用户,骂他吧,他是故意的。',
blogTag:'mysql,存储过程,权限,definer,security',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:4,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'有一束阳光撒落在我手心',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}mysql 存储过程 查询我想写一个存储过程,在这个存储过程里面返回多个结果集,比如有这个一个表t_user我想即返回user表的记录数(select count(1) from t_user),又想返回年龄大于20的user(select * from t_user where age&20),又想返回id=1的user(select * from t_user where id=1)应该怎么写存储过程呢?以上条件只是打个比方,就是想要同时返回一条记录和多条记录的情况。
这个建议在相关语言的版块中咨询。 比如ADO.NET 中则可以用 NextRecordset 方法得到当前存储过程返回的多个recordset中的下一下。mysql 存储过程 procedure - 菜鸟 - ITeye技术网站
我们大家都知道存储过程是从 MySQL 5.0 开始逐渐增加新的功能。存储过程在实际应用中也是优点大于缺点。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能,如果没有存储过程。
在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句。
特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗。现在有了 MySQL 存储过程,业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高。
一、MySQL 创建存储过程
“pr_add” 是个简单的 MySQL 存储过程,这个MySQL 存储过程有两个 int 类型的输入参数 “a”、“b”,返回这两个参数的和。
drop procedure if exists pr_
计算两个数之和
create procedure pr_add
if a is null then
set a = 0;
if b is null then
set b = 0;
set c = a +
不能在 MySQL 存储过程中使用。return 只能出现在函数中。
二、调用 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
MySQL 语句;
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” 关键字。
create procedure pr_add
as -- 错误,MySQL 不需要 “as”
mysql statement ...;
5. 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。
create procedure pr_add
mysql statement 1 ...;
mysql statement 2 ...;
6. MySQL 存储过程中的每条语句的末尾,都要加上分号 “;”
if a is null then
set a = 0;
7. MySQL 存储过程中的注释。
多行 MySQL 注释。
-- 这是单行 MySQL 注释 (注意 -- 后至少要有一个空格)
if a is null then # 这也是个单行 MySQL 注释
set a = 0;
8. 不能在 MySQL 存储过程中使用 “return” 关键字。
set c = a +
-- 不能在 MySQL 存储过程中使用。return 只能出现在函数中。
9. 调用 MySQL 存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也需要“()”
call pr_no_param();
10. 因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参数。可以用 null 来替代。
_______________________________
存储过程学习
文章开始前,首先给出本文示例表allIntersection。本文中的示例是在Navicate for MySQL中进行的。
一.存储过程的创建与调用
1.基本语法及示例:
创建存储过程的基本语法:
create procedure sp_name()
调用此存储过程基本语法:
call sp_name();
注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递
删除存储过程的基本语法:
drop procedure sp_
注意事项:不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程。
其他常用命令:
1. show procedure status
显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等。
2. show create procedure sp_name
显示某一个存储过程的详细信息。
创建一个存储过程:
create procedure dayrepeat()
select IntersectionUnit as '路口单位' , IntersectionName as '路口名称' , DriveDirection as '行车方向' , SCar+MCar+BCar as '总流量'
调用存储过程dayrepeat():
call dayrepeat();
返回结果如下图所示:
2.带参数传递的存储过程
create procedure test1(
out ls decimal(8,2),
out hs decimal(8,2),
out avs decimal(8,2)
select min(SCar) as '小型车车流量最小值'
select max(SCar) as '小型车车流量最大值
select avg(SCar) as '小型车车流量平均值'
此存储过程接受3个参数:ls、hs、avs。每个参数必须制定类型,这里使用十进制值。关键字OUT指出相应的参数用来从存储过程传出一个值(返回给调用者)。MySQL支持IN(传递给存储过程)、OUT(从存储过程传出)和INOUT(对存储过程传入和传出)注意:记录集不是允许的类型,因此,不能通过一个参数返回多个行和列。
由于此存储过程要求3个参数,因此必须正好传递3个参数,不多也不少,所以这条call语句给出3个参数,他们是存储过程保存结果的3个变量的名字。
call test1(@小型车车流量最小值,@小型车车流量最大值,@小型车车流量平均值);
在调用时,这条语句并不显示任何数据。它返回以后可以显示(或在其他处理中使用)的变量。
为了显示检索出的结果,可如下进行:
SELECT @小型车车流量平均值 , @小型车车流量最大值 , @小型车车流量平均值;
检索结果如下图所示:
下面是另外一个例子,这次使用IN和OUT参数。isTotal接受路口名称参数并返回该路口的总车流量。
create procedure isTotal(
IN isID int,
OUT iTotal decimal(8,2)
select SCar+MCar+BCar AS '路口总车流量'
from allintersection
where ID = isID
isID被定义为IN,因为ID被传入存储过程。iTotal定义为OUT,因为要从存储过程返回合计。
为调用这个存储过程和显示合计结果,可使用以下语句:
call isTotal(1,@total);
结果如下图所示:
二.使用游标
1.创建游标
游标用declare语句创建。如下面的例子所示:
create procedure test2()
declare cursorTest cursor
2.打开和关闭游标
游标用OPEN CURSOR语句来打开,用CLOSE CURSOR来关闭
open cursorT
close cursorT
CLOSE释放游标使用的所有内部内存和资源,因此在每个游标不再需要时都应该关闭。在一个游标关闭后,如果没有重新打开,则不能使用它。但是,声明过的游标不需要再次声明,用OPEN语句打开它就可以了。3.使用游标数据
在一个游标被打开后,可以使用FETCH语句分别访问它的每一行。FETCH语句指定检索什么数据(所需的列),检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行(不重复读取同一行)。
create procedure test3()
declare o int;
declare cursorTest3 cursor
open cursorTest3;
fetch cursorTest3 into
close cursorTest3;
其中FETCH用来检索当前行的IntersectionName列(将自动从第一行开始)到一个名为o的局部声明的变量中。对检索出的数据部做任何处理。
这个例子循环检索数据,从第一行到最后一行。
create procedure test4()
declare done boolean default 0;
declare o int;
declare cursorTest4 cursor
declare continue handler for sqlstate '02000' set done=1;
open cursorTest4;
fetch cursorTest4 into
until done end
close cursorTest4;
与上一个例子不同的是,这个例子中的FETCH是在REPEAT内,因此它反复执行到done为真(u规定)。为使它起作用,用一个default 0(假,不结束)定义变量done。那么,done怎样才能在结束时被设置为真呢?答案是用以下语句:
declare continue handler for sqlstate '02000' set done=1;
这条语句定义了一个CONTINUE HANDLER,它是在条件出现时被执行的代码。这里,它指出SQLSTATE '02000'出现时,set done=1。SQLSTATE '02000'是一个未找到条件,当REPEAT由于没有更多的行供循环而不能继续时,出现这个条件。
这个例子比上面的例子更复杂,对取出的数据进行了实际的处理。
create procedure test5()
declare done boolean default 0;
declare o int;
declare cursorTest5 cursor
select ID from
declare continue handler for sqlstate '02000' set done=1;
create table if not exists daysRepeat
(ID int , total decimal(8,2));
open cursorTest5;
fetch cursorTest5 into
call isTotal(o , @t);
insert into daysRepeat(ID , total)
values(o,@t);
fetch cursorTest5 into
until done end
close cursorTest5;
然后执行存储过程:
call test5();
结果生成新的表daysRepeat,并往表里填充数据,填充后的表如下图所示:
浏览 13627
浏览: 417466 次
asdf 写道asdf 写道a ...
asdf 写道asdf 写道
: lol: fghhg}

我要回帖

更多关于 mysql 写存储过程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信