mysql 存储过程1064问题和事例

原创 2013年12月03日 23:52:37

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

 在公司我是用的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 版的存储过程:

存储过程
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

相关文章推荐

navicat for mysql 创建存储过程时报错1064

在navicat for mysql 创建函数,保存的时候出现1064错误 基本上是两个原因导致的: 1:是存储过程的参数没有设定长度导致的,我们在Navicat中创建存储过程时参数的长度需要自己动手...

mysql创建存储过程时ERROR 1064 (42000)的解决办法

转载自:http://blog.chinaunix.net/uid-20263484-id-110165.html 郁闷了我半天,才发现mysql自作聪明的把;看成是procedure的结束...

Mysql创建存储过程时,出现ERROR 1064 (42000):的原因的一种

下面的Error信息,大家看着挺熟悉的吧。 ERROR 1064 (42000):ERROR 1064 (42000): You have an error in your SQL syntax; ...

Mysql 常见错误代码: 1064

错误提示: 错误代码: 1064 You have an error in your SQL syntax; check the manual that corresponds to your M...
  • Naploen8
  • Naploen8
  • 2015年12月17日 11:55
  • 26612

mysql error:1064解决

症状:用创建表时用中文属性出现Error:1064。解决方法:中文属性不能设成VARCHAR,设成VARCHAR(45)或VARCHAR(100)等就可以建表了。当然mysql的默认charset已设...
  • shamaya
  • shamaya
  • 2007年07月26日 15:17
  • 3457

mysql中1064错误和字符处理

在java程序中的一些字符串想要保存到数据库中,就不得不注意这个问题,直接贴代码。sql="insert into data_tb(purpose,user_name) " + " values(\'...

mysql 报错Err] 1064,使用了mysql保留字

执行插入语句:insert into primary values(‘教师’,3,1) 报错:Err] 1064 - You have an error in your SQL syntax; ch...

MYSQL 命令中常出现的error - 1046 1064 1264

130 :文件格式不正确。(还不是很清楚错误的状况)   145 :文件无法打开。   1005:创建表失败。   1006:创建数据库失败。   1007:数据库已存在,创建...

mysql错误:1064

mysql 错误:1064

Mysql创建存储过程时出现ERROR 1064错误

ERROR 1064 (42000):ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql 存储过程1064问题和事例
举报原因:
原因补充:

(最多只允许输入30个字)