您的位置:首页 > 数据库 > MySQL

mysql 存储过程1064问题和事例

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

在公司我是用的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存储过程,实现两个数相加

需要特别注意的是

1. declare语句只能放在存储过程的开始位置,放在后面就会报错

2. if 语句的后面必须有then,但是不需要begin,在if结束时需要end if

3. 判断是否为NULL倒是和MSSQL一样都有IS NULL

4. delimiter是定界符的意思在结束的end后面要添加定界符

5. end if之后必须跟分号,否则语法错误

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

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

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

可以看到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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: