mysql 存储过程1064问题和事例

 今天晚上室友说我看看你写的那个框架,听说查询十万条数据只需要几秒钟,我当然愿意展示,开始准备环境:

 在公司我是用的oracle,我就把写的存储过程拿出来在我本地的mysql中运行,结果一运行报错:

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'proone()' at line 1

 一直报1064  我在网上找了很久,说需要重新定义mysql的结束符号,mysql默认结束是“;”结束

 建立存储过程必须在某个数据库下。

 我写的存储过程:


mysql> delimiter $
mysql> create procedure proone()
    -> begin
    -> declare i int;
    -> set i = 0;
    -> while i < 100000 do
    -> insert into tb_testone (id,name,test_id) values (i,'你妹',1);
    -> set i = i+1;
    -> end while;
    -> end $
Query OK, 0 rows affected


mysql> delimiter ;

 我刚开始的时候存储过程的名称没有加()也会报错,存储过程命名规则***()


 删除存储过程 :  drop procedure proone;

 调用存储过程: CALL proone();


 以上均是本人做过测试,确定好用,本人用的mysql 是5.5的版本。



后面再加点在网上找的存储过程案例:

下面是一个最简单的MySQL存储过程,实现两个数相加

delimiter $$
create  procedure  proc_add( in  a int , in  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;
end $$
delimiter ;

需要特别注意的是 

1. declare语句只能放在存储过程的开始位置,放在后面就会报错 
2. if 语句的后面必须有then,但是不需要begin,在if结束时需要end if 
3. 判断是否为NULL倒是和MSSQL一样都有IS NULL 
4. delimiter是定界符的意思在结束的end后面要添加定界符 
5. end if之后必须跟分号,否则语法错误 

下面是一个较常见的场景,判断表中某列是否存在某值,如果存在执行某操作 

delimiter $$
create  procedure  proc_add_book( in  $bookName varchar (200), in  $price float )
begin
     declare  $existsFlag int  default  0;
     select  bookId into  $existsFlag from  book where  bookName = $bookName limit 1;
     if bookId > 0 then
     #if not  exists ( select  * from  book where  bookNumber = $bookName) then
         insert  into  book(bookNumber,price) values ($bookName,$price);
     end  if;
end $$
delimiter ;

需要注意的是不能用if exists;exists可以在where后面或者在create object是使用,但是在if语句中不可以使用,只能用变通的方法。

while语句也需要注意,下面是一个while的简单应用:

delimiter $$
create  procedure  proc_add_books_looply( in  $bookName varchar (200), in  $price float , in  $insertTimes INT )
begin
     while $insertTimes>0 do
     insert  into  book (bookName,price) values ($bookName,$price);
     end  while;
end $$
delimiter ;

可以看到while后面跟条件,条件后面要跟一个do,在while循环体结束之后需要end while并以分号结束。

在附上oracle 版的存储过程:

存储过程
CREATE OR REPLACE PROCEDURE INERT_test
IS
i number; 
BEGIN
  i := 1;
       FOR i IN 1..10000 LOOP
           insert into 
           test
           (  
           ID,
           NAME,
           EMAIL,
           TIME
           ) 
           values
           ('6','你妹','10236@qq.com',to_date('2012-01-06','yyyy-MM-dd'));
       END LOOP; 
END;


exec INERT_test

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值