今天晚上室友说我看看你写的那个框架,听说查询十万条数据只需要几秒钟,我当然愿意展示,开始准备环境:
在公司我是用的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 版的存储过程: