今天晚上室友说我看看你写的那个框架,听说查询十万条数据只需要几秒钟,我当然愿意展示,开始准备环境:
在公司我是用的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 aint,in bint)begin declare cint; 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 $bookNamevarchar(200),in $pricefloat)begin declare $existsFlagint default 0; select bookIdinto $existsFlagfrom bookwhere bookName
= $bookName limit 1; if
bookId > 0 then #ifnot exists
(select *from bookwhere 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 $bookNamevarchar(200),in $pricefloat,in $insertTimesINT)begin while
$insertTimes>0 do insert into book
(bookName,price) values($bookName,$price); end while;end$$delimiter
; |
可以看到while后面跟条件,条件后面要跟一个do,在while循环体结束之后需要end while并以分号结束。
在附上oracle 版的存储过程:
本文详细解析了MySQL存储过程报错的原因及解决方法,并提供了几个实用的存储过程案例,包括相加运算、判断列是否存在以及使用while循环的应用。同时,还附上了Oracle版的存储过程实例。
6073

被折叠的 条评论
为什么被折叠?



