Mysql 存储过程入门


      上网关于Java调用Mysql 存储过程的文章不多;本人是菜鸟刚学习2天,发现一些基本的难点、疑点,就此发表拙见,希望能帮到刚入门的同行;有错漏,欢迎朋友指教。

      关于Mysql 存储过程是如何创建和调用的,本人就不详细介绍了。本人通过一个例子来讲解一下存储过程的基本用法。


      在存储过程中,我们经常会看到在定义变量的时候在变量前边加@。在变量加@就表明这个变量是session级的变量,在存储过程的外边也可以调用,而没有加@的变量只能在begin...end 语句之间使用。一般我们都会加个@。 举个简单的例子(可以直接粘贴到Navicat的查询窗口,方便快捷):

 DROP PROCEDURE IF EXISTS getTotalCounts;
CREATE PROCEDUE 'getTotalCounts'(in tableName varchar(100),in whereText varchar(100),out totalCounts integer(11))
BEGIN
declare noTing = "ok";
if noTing="ok" then
set @s=concat('SELECT count(*) into @total FROM ',tableName,' Where ',WhereText);
end if;
prepare stmt from @s;
execute stmt;
deallocate prepare stmt;
end;            

       在拼接字符串的时候,我们直接把查询到的数据存放到了session变量 @total(不要把@溜掉了!)中了。我们调用存储过程的时候可以

这样写:

call getTotalCounts("blog_article","cate_id>0",@xxx);

       运行之后,没报错,可是似乎也没反应啊?的确,存储过程 编写无误,调用也无误。之所没有结果是因为,存储过程执行了,存储过程的功能根本就没有输出语句。因此,我们可以把调用存储过程的语句改为:


call getTotalCounts("blog_article","cate_id>0",@xxx);
select @total;

      还记得我们在 存储过程语句里边定义的@total变量吗?对,select @total 就是把存储过来里边的 @total 里边的具体数据拿出来,

结果如下:
------------
@total
------------
1020000
-----------

      说到这里,有人就有疑问了,你在调用存储过程的时候:

call getTotalCounts("blog_article","cate_id>0",@xxx);

@xxx 到底是什么啊,你怎么没有用到啊。为什么没有到呢,这个稍后解析。
@xxx 就是用来接收存储过程 out 类型所要返回数据的。在这里,它的值为NULL,因为我们的存储过程里边没有对 totalCounts 进行赋值。
      我们如果在存储过程 execute stmt; 后边加上 set totalCounts=@total; 之后,那个在调用的时候 传进去的这个 @xxx 就有数据了。因此:


call getTotalCounts("blog_article","cate_id>0",@xxx);
select @xxx;

结果:

------------
@xxx
---------------
1020000
-------------

     所以我们在编写存储过程的时候,有两种方法获取数据,一种是在里边直接定义@test,把结果赋值给@test,调用存储过程的时候,传个@什么进去都无所谓,因为我本不就没有到它的返回值,我只需select @test就可以满足我的要求,这种方法我还没见过谁这样用的,因为你如果这样做,创建存储过程的那个out 参数就是多余的了;
      第二种就是 常规方法,存储过程 里边,要把 totalCounts 赋值好,调用的时候,传@test_test就select @test_test。因为这个select @test_test 不能变的。如果我们用java 编程获取数据的话,就应该用这个了(proc.executeQuery();proc.getInt(3)就可以了),因为不用这个 存储过程没有返回值,我们无法获取数据。(其实上一种方法也是可以的,只不过比较别扭(是用proc.executeQuery();rs.getInt(1)),就是在存储过程 execute stmt;后边select @total;就可以了,不过java编程获取数据方式又跟这个有点区别了。)
      那么,上边存储过程里边的concat又是什么意思呢?MySQL的concat函数可以连接一个或者多个字符串。特别是在limit语句后边的条件,变量当做表名等就需要用这个concat来连接了。注意的是在concat函数的 ' '(单引号里边)似乎变量都要是@的,如果 declare con_str int,然后在单引号里con_str边当变量用是不行饿,con_str会被解析为一个字符串而已。调用此存储过程会发生 Unknown variable错误。prepare预定义一个语句。说真的我也不太明白它是什么意思,只能照葫芦画瓢的用了。如果遇到变量当表名(此例就是属于这种情况)、类名等就要使用concat函数和prepare了。说到这里,还要给大家提醒一点就是在定义存储过程参数列表时,应注意参数名与数据库中字名区别开来,否则会给你带来很多不必要的麻烦和莫名其妙的错误。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值