用过begin——end句块的应该都接触过declare。
declare是用来定义变量和常用处理、声明之类的关键字。在mysql存储过程出现之前declare是一块鸡肋,大家常用declare来定义局部变量,我习惯性的还是使用set来定义变量(虽然是全局的,但是来的方便)。
存储过程出现后declare的标准处理定义就变成了非常强大的工具,可以用来为存储过程添加一些非常强大的错误处理机制。
首先需要提一点的是declare定义变量如果想定义varchar型的,必须注明参数最大长度,即declare varchar(20).
在这里我们不深究它用来定义参数的小细节
我们主要来研究DECLARE Condition 和 DECLARE Handler
DECLARE Condition 和 DECLARE Handler可以说是为了处理错误而生的。
功能上讲DECLARE Condition出现的时间比较早,功能也比较简单,它可以通过错误编号或者SQLSTATE来触发一各名字,说明白一点就是当某个错误编号出现的时候替换一个名字给它。这样调用的时候,我们不用去记一大串错误编号了。
它的标准语法我们可以在mysql的附注中找到。
DECLARE condition_name CONDITION FOR condition_value
condition_value:
例子如下:
DECLARE errname CONDITION FOR SQLSTATE '23000'
将返回SQLSTATE信息为23000的错误定名为errname
这个名字就可以被我们的绝对重头戏DECLARE Handler调用了,在DECLARE Handler中可以定义错误的处理办法,可以使用begin和end来标记语句块,可以单独使用rollback。处理的过程也可以定义为继续执行和中断存储过程。
标准语法:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type: 处理的过程。
CONTINUE 继续执行未完成的存储过程,直至结束。(常用,默认)
| EXIT 出现错误即自动跳出所在的begin不再执行后面的语句。
| UNDO 气死我了,不支持为什么写在这里,害我测试了好久都是语法错误。
condition_value: 处理的触发条件
SQLSTATE [VALUE] sqlstate_value 不用说了,最常用的错误定义,自己去查错误列表吧。
| condition_name 我们刚刚定义的那个名字errnmae就是用在这里的。
| SQLWARNING 这个太好用了,从错误编号01开始的错误。相当于错误的通配符。
| NOT FOUND 和上面差不多,从02开始。
| SQLEXCEPTION 上面两个中没有包括的错误它都可以用来触发,就是说你想定义只要出错就触发的话就定义出错条件为SQLWARNING+SQLEXCEPTION。
| mysql_error_code 错误编号,和第一个不一样,不过同样可以在错误列表从中查到,是我比较常用的。
例子
DECLARE errname CONDITION FOR SQLSTATE '23000'; 给导致错误23000的错误定义名字为errname
DECLARE continue handler for errname 当errname发生时作下面的处理
BEGIN 语句开始
set @x=1; 设置@x=1
select @x; 输出x
END; 结束出错处理。
‘贰’ mysql存储过程的小问题,无法运行
CREATE PROCEDURE p7 (IN b INTEGER(12))
begin
declare a INTEGER(12);
set a=5;
INSERT INTO t VALUES (a);
SELECT s1*a FROM t WHERE b<=s1;
end
这一段可以执行游御的- -~~~难道没有BEGIN 没有END么- -,这段代码凯中你用不了?
哦......你难道是在命令行里面创建存储过程!!!?神孙岩
那这样不行,我从来没在命令行里面试过,有很多软件可以用啊,而且没软件也可以写SQL脚本,然后直接执行啊,在命令行里面创建不是很方便。
命令行下创建这个存储过程:
delimiter //
CREATE PROCEDURE p7 (IN b INTEGER(12))
begin
declare a INTEGER(12);
set a=5;
INSERT INTO t VALUES (a);
SELECT s1*a FROM t WHERE b<=s1;
end;
//
刚刚在命令行下创建成功了的
不过推荐使用EMS FOR MYSQL,DREAMCODE FOR MYSQL,PHPMYADMIN或者使用官方的MYSQL图形化工具
你的问题1在于没有传参数,就上上面这段代码,要是把参数去掉还是会报错,MYSQL好像不允许执行不传参数的存储过程,但是你也可以随便声明一个,因为你可以把b定义在存储过程内,参数不使用就是了,比如:
CREATE PROCEDURE p7 (IN X INTEGER(12))
begin
declare a INTEGER(12);
declare b integer(12);
set a=5;
set b=5;
INSERT INTO t VALUES (a);
SELECT s1*a FROM t WHERE b<=s1;
end
然后call p7(12);但是参数X并不影响你的存储过程,但是必须传一个。
问题2,你没有声明a,b,变量必须声明- -
问题3,我是从5.0开始用MYSQL的,所以我不太清楚以前MYSQL变量的表现形式,但是在存储过程内,declare a char(4);声明一个变量a,我要用它的时候,set a='abcd';就行了,不用带@
还是上面的代码
我把insert into t values(a) 改为@a,那就插入的是空值
最后end 后面没有分号,最后一个END后面没分号,中间的有分号的比如
CREATE PROCEDURE p7 (IN X INTEGER(12))
begin
declare a INTEGER(12);
declare b integer(12);
set a=5;
set b=5;
if(a=b)
then
begin
INSERT INTO t VALUES (a);
SELECT s1*a FROM t WHERE b<=s1;
end;
else
INSERT INTO t VALUES (b);
SELECT s1*a FROM t WHERE a<=s1;
end;
end if;
end
最后一个end 没分号,中间有
‘叁’ mysql 存储过程总结(一)
1、存储过程定义:
存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发 人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
2、特点:
封装,复用 : 可以把某一业务SQL封装在存储过程中,需要用到 的时候直接调用即可。
可以接收参数,也可以返回数据 :再存储过程中,可以传递参数,也可以接收返回 值。
减少网络交互,效率提升 : 如果涉及到多条SQL,每执行一次都是一次网络传 输。 而如果封装在存储过程中,我们只需要网络交互一次可能就可以了。
3、基本语法
(1)创建:
(2)调用:
(3)查看:
(4)删除
注意: 在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的 结束符。
‘肆’ MYSQL 的存储过程总是错.新手问题.求解答
先照着网上写一个简单的没有什么功能的存储过程,这个存储过程没有问题再慢慢往里加入需要的功能,每次修改存储过程需要重新编译,通过调用查看存储过程的功能是否达到你想的效果,这样不容易出差错。需要注意的是存储过程中delimiter $的位置,有时候$有空格之类的没有注意容易照成存储过程结束的位置不对而报错
‘伍’ mysql存储过程为什么不推荐使用
维护不方便,对数据库压力不较大,不易于数据库集群的扩展和迁移。
能够在业务系统层面做的逻辑尽量不要用存储过程来做。
以后做数据库的迁移的时候,换了数据库,存储过程可能要重写或重构。但是如果放在业务代码层去实现对应的逻辑,数据库换了之后,更改对应的连接驱动,业务代码不用做任何吸怪。