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中创建存储过程时参数的长度需要自己动手...
  • qq_39654446
  • qq_39654446
  • 2017年08月29日 15:51
  • 1752

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

ERROR 1064 (42000):ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that c...
  • ws379374000
  • ws379374000
  • 2017年10月19日 15:40
  • 561

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
  • 35578

mysql error code '1064' 排查过程

下午自测代码,在这个update上卡了一个半小时,大大的降低了开发的生产力,把排查过程发出来,好的士兵不会掉进同一个陷阱。先把异常堆栈打出来。 2016-03-28 17:23:38.420 main...
  • bruce128
  • bruce128
  • 2016年03月28日 18:02
  • 14293

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

下面的Error信息,大家看着挺熟悉的吧。 ERROR 1064 (42000):ERROR 1064 (42000): You have an error in your SQL syntax; ...
  • alexyangbjb
  • alexyangbjb
  • 2015年10月13日 13:50
  • 3246

mysql 1064 错误 解决方案

len = sprintf(sql_buffer,"replace into `dbname`.`tablename`(`volume1`,`volume2`) values(value1,value...
  • lizhi200404520
  • lizhi200404520
  • 2013年01月05日 20:24
  • 4530

mysql 报错ERROR 1064 (42000),原因使用了mysql保留字

执行select语句: select * from cfg_parameter where key='nSJtifqVSI7HkPrKHlxhD6'; ERROR 1064 (42000): You ...
  • wukong_666
  • wukong_666
  • 2017年04月17日 11:07
  • 4048

mysql中1064错误和字符处理

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

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

执行插入语句:insert into primary values(‘教师’,3,1) 报错:Err] 1064 - You have an error in your SQL syntax; ch...
  • Arrow_linux
  • Arrow_linux
  • 2015年05月08日 18:19
  • 8246

MySQL操作中的Error: 1064(42000)问题

1、Error: 1064(42000)问题 在MySQL 中,有些特殊的字符显式被保留。其中大多数字进制被标准SQL 用作列名和/ 或表名( 例如,GROUP ) 。少数被保留了,因为MySQL...
  • GVFDBDF
  • GVFDBDF
  • 2015年10月27日 22:53
  • 23582
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql 存储过程1064问题和事例
举报原因:
原因补充:

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