Mysql存储过程(二)

来源:互联网 发布:如何查看淘宝余额 编辑:程序博客网 时间:2024/05/08 22:22

Mysql存储过程里面的变量目前我发现有三种,第一是参数传递进来的变量,第二是DECLARE声明的变量,第三中形式像@x之类的,我就叫它@变量(随便起的,嘿嘿)


最近发现@变量有一个问题,比如:

DELIMITER $$ DROP PROCEDURE IF EXISTS test1$$CREATE PROCEDURE test1(IN a INT) BEGIN       #--没有初始化的@x   SELECT @x ;   IF a = 1 THEN   #--如果a=1则把a的值付给@x   SET @x =   a ;    END IF ;END ;$$DELIMITER ; #--第一次执行CALL test1(1) ;#--第二次执行CALL test1(1) ;

执行结果:


第一次执行test1()的时候,@x没有初始化,所以打印出来为null,下面的if语句中,a为@x变量赋值为1,所以第二次就会打印出@x=1。


为什么会这样?后来我查过网上一些资料,@变量的生命周期是在一个一个session里,也就是说,即使我执行完了这个存储过程,@x还会存在,并且参加下一次的运算,这会产生很多的问题,因为这样,@x的值就不能被控制了,特别是在比如像Java程序运行的时候,@x什么时候归0,什么时候保存上次的变量我们无法估计。


我把上面的Mysql Session中断之后重新执行,执行结果:


@x重新变为null。如果@变量不初始化,会产生很多问题,但Mysql的@变量不像Java程序,会报异常提示终止,Mysql是直接执行,结果怎样只能靠自己去判断了。


把程序改为:

DELIMITER $$ DROP PROCEDURE IF EXISTS test1$$CREATE PROCEDURE test1(IN a INT) BEGIN    #--初始化@x   SET @x = 0 ;   SELECT @x ;   IF a = 1 THEN   #--如果a=1则把a的值付给@x   SET @x =   a ;    END IF ;END ;$$DELIMITER ; 

这样执行结果:


这样就可以控制@变量,不让它产生奇怪的后果。


~综:Mysql使用@变量一定必须要初始化!



0 0
原创粉丝点击