MySQL存储过程初遇
2015-11-07 00:00
525 查看
摘要: 帮同学做一个项目,用MySQL数据库,想要添加一些测试数据。本来想用编程语言来实现,但是知道有存储过程这一工具,就尝试着先学习一下,第一次尝试写发现一些有趣的事情,分享给大家。
我用记事本写了一个简单的存储过程如下:
delimiter$$
create procedure show_users()
comment '查看market数据库中的user表中的所有信息'
begin
select * from user;
END$$
delimiter;
保存为show_users.sql
执行(show_users.sql在工作目录,如果不在请加上绝对路径):
mysql> source show_users.sql
发生错误信息为:
ERROR 1064 (42000): 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 'delim
iter$$create procedure show_users()
comment '?鿴market???ݿ??е?user??????' at line 1
ERROR 1064 (42000): 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 'END$$
delimiter' at line 1
首先是看到了有乱码,我们可以先来看一下数据库的编码信息:
mysql> show variables like 'char%';
发现是mysql数据可以的除了文件系统的编码是binary其他的编码都是utf8(MySQL中把utf-8的别名设置为utf8)
我们是用记事本编写存储过程并导入执行的,记事本的默认的编码是ANSI,所以我们改变一下我们存储过程文件show_users.sql的编码方式。可以选择记事本文件菜单下的另存为,编码选择utf-8就可以了。
我们再来看一看错误信息:
ERROR 1064 (42000): 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 'END$$
delimiter' at line 1
我们得到的信息提示是语法错误,在END$$附近。我们暂时还不清楚1064到底是什么错误,我们用MySQL提供的工具perror来看一看错误代码1064代表什么。
C:\Users\Administrator>perror 1064(请保证mysql的bin目录在系统环境变量中,如果没有请加上绝对路径)
第一个是MySQL1064的错误代码信息,第二个是Windows的1064错误代码信息。
ER_PARSE_ERROR解析错误,说明我们犯了什么基本的语法错误,但是END$$好像并没有错误。整个存储过程也很简单,我们可以简单分析一下,其他地方都是SQL语句,应该没有没有错误。报错的的地方是END$$,我们可以猜测要么是这个地方出错了,要么是开始的delimiter$$出错了,END$$我们可不出什么错误,所以我们从delimiter$$开始分析一下。
delimiter是MySQL的一个关键字,是用来修改SQL语句的结束符的,这句话的意思是把SQL语句的结束符修改为$$为了避免和存储过程的结束符冲突。
尝试了很多次才发现,既然delimiter是一个关键字,那么delimiter和$$之间是不是应该有一个空格分开呢?尝试在delimiter和$$之间加上空格分隔,发现问题确实是delimiter和$$之间少了一个空格。后来想一想也对,delimiter是一个关键字,如果和$直接没有空格分开,MySQL应该就会就会把它解析为delimiter$$标识符。
上一个问题算是解决了,我们来重新执行:
mysql> source show_users.sql
ERROR 1044 (42000): Access denied for user 'tim'@'%' to database 'market'
这个错误信息,很容易知道,用户tim没有权限,用管理员用户为tim用户赋予创建存储过程的权限。
mysql> grant create routine on market.* to tim;
flush privileges;(刷新系统权限表,有时候,需要重新登录)
再次重新执行:
这次我们发现没有任何问题了,我们来查看一下:
调用存储过程(需要执行存(execute)储过程的权限,同上,用管理员账户赋予):
到此终于完成了第一个存储过程的执行,我们发现这其实并不是一个容易的过程,不过我们也知道了一些其他实用的东西,相信以后就会慢慢熟悉,很快定位错误了。
我用记事本写了一个简单的存储过程如下:
delimiter$$
create procedure show_users()
comment '查看market数据库中的user表中的所有信息'
begin
select * from user;
END$$
delimiter;
保存为show_users.sql
执行(show_users.sql在工作目录,如果不在请加上绝对路径):
mysql> source show_users.sql
发生错误信息为:
ERROR 1064 (42000): 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 'delim
iter$$create procedure show_users()
comment '?鿴market???ݿ??е?user??????' at line 1
ERROR 1064 (42000): 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 'END$$
delimiter' at line 1
首先是看到了有乱码,我们可以先来看一下数据库的编码信息:
mysql> show variables like 'char%';
发现是mysql数据可以的除了文件系统的编码是binary其他的编码都是utf8(MySQL中把utf-8的别名设置为utf8)
我们是用记事本编写存储过程并导入执行的,记事本的默认的编码是ANSI,所以我们改变一下我们存储过程文件show_users.sql的编码方式。可以选择记事本文件菜单下的另存为,编码选择utf-8就可以了。
我们再来看一看错误信息:
ERROR 1064 (42000): 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 'END$$
delimiter' at line 1
我们得到的信息提示是语法错误,在END$$附近。我们暂时还不清楚1064到底是什么错误,我们用MySQL提供的工具perror来看一看错误代码1064代表什么。
C:\Users\Administrator>perror 1064(请保证mysql的bin目录在系统环境变量中,如果没有请加上绝对路径)
第一个是MySQL1064的错误代码信息,第二个是Windows的1064错误代码信息。
ER_PARSE_ERROR解析错误,说明我们犯了什么基本的语法错误,但是END$$好像并没有错误。整个存储过程也很简单,我们可以简单分析一下,其他地方都是SQL语句,应该没有没有错误。报错的的地方是END$$,我们可以猜测要么是这个地方出错了,要么是开始的delimiter$$出错了,END$$我们可不出什么错误,所以我们从delimiter$$开始分析一下。
delimiter是MySQL的一个关键字,是用来修改SQL语句的结束符的,这句话的意思是把SQL语句的结束符修改为$$为了避免和存储过程的结束符冲突。
尝试了很多次才发现,既然delimiter是一个关键字,那么delimiter和$$之间是不是应该有一个空格分开呢?尝试在delimiter和$$之间加上空格分隔,发现问题确实是delimiter和$$之间少了一个空格。后来想一想也对,delimiter是一个关键字,如果和$直接没有空格分开,MySQL应该就会就会把它解析为delimiter$$标识符。
上一个问题算是解决了,我们来重新执行:
mysql> source show_users.sql
ERROR 1044 (42000): Access denied for user 'tim'@'%' to database 'market'
这个错误信息,很容易知道,用户tim没有权限,用管理员用户为tim用户赋予创建存储过程的权限。
mysql> grant create routine on market.* to tim;
flush privileges;(刷新系统权限表,有时候,需要重新登录)
再次重新执行:
这次我们发现没有任何问题了,我们来查看一下:
调用存储过程(需要执行存(execute)储过程的权限,同上,用管理员账户赋予):
到此终于完成了第一个存储过程的执行,我们发现这其实并不是一个容易的过程,不过我们也知道了一些其他实用的东西,相信以后就会慢慢熟悉,很快定位错误了。
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- Android之获取手机上的图片和视频缩略图thumbnails
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- 数据库链接字符串查询网站
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法