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)储过程的权限,同上,用管理员账户赋予):

到此终于完成了第一个存储过程的执行,我们发现这其实并不是一个容易的过程,不过我们也知道了一些其他实用的东西,相信以后就会慢慢熟悉,很快定位错误了。

时间: 2024-11-10 21:17:50

MySQL存储过程初遇的相关文章

MySQL存储过程定义及调用

#MySQL存储过程 ##最简单的存储过程 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() COMMENT '最简单的存储过程' SELECT 1; ##调用 CALL sp1 (); ##带输入参数的存储过程 DROP PROCEDURE IF EXISTS sp2; CREATE PROCEDURE sp2(IN p INT) COMMENT '带输入参数的存储过程' SELECT p; ##调用 CALL sp2(1); #带输出参

MySQL存储过程详解 mysql 存储过程

MySQL存储过程详解  mysql 存储过程 (2010-12-13 10:59:38) 转载▼ 标签: it 分类: mysql mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保

MySQL 存储过程检测表是否存在

SQL语句实现: SELECT COUNT(*) FROM information_schema.`TABLES` WHERE TABLE_NAME='youTableName'; where子句中,表名是字符串类型,要加单引号. MySQL存储过程中 函数实现: CREATE DEFINER = `root`@`localhost` FUNCTION `tableExists`(`tName` varchar(30))  RETURNS tinyint(4) BEGIN DECLARE tab

mysql存储过程入门与提高(第三篇)

由于一些不好说的原因,以后博客内容大多只会发笔记的截图.此博客只发在my.oschina.net上,请勿作任何商业用途!! mysql存储过程:是指在数据库中定义一组sql语句组合在一起,并当作一个整体存储在mysql服务器中. 和存储函数的最主要的区别是对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象.函数只能返回一个变量:而存储过程可以返回多个.my.oschina.net讲存储函数的时候会把储存过程和存储函数的区别列出来.my.oschina.net 基本形式: CREA

MYSQL存储过程和函数学习笔记

学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和函数,可以避免开发人员重复编写相同的SQL语句. MYSQL存储过程和函数是保存在服务器中,在服务器中存储和执行,可以减少客户端和服务器端之间数据传输的消耗. 存储过程就是一组已经保存在数据库中的语句,并且可以随时地调用. 存储过程允许标准组件式编程,存储过程在被创建以后可以在程序中被多次调用而

MySQL存储过程详解 mysql 存储过程(转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html)

转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和

当PHP遇到MySQL存储过程

1.MySQL存储过程 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以看做是对编

【瞎折腾系列】mysql存储过程初接触

开始[瞎折腾系列],这个系列纯属瞎折腾,可能没有什么实际意义. mysql存储过程生成表: 新建一张user表,包含id, username , password , usertable字段. 然后创建存储过程: create PROCEDURE create_table() BEGIN DECLARE n int DEFAULT 0; DECLARE t_error INTEGER DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET

mysql存储过程笔记

mysql  存储过程: 用变量做表名: 简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名.在其他的sql数据库中也是如此,mysql的解决方法是将整条sql语句作为变量,其中穿插变量作为表名,然后用sp_executesql调用该语句. 这在mysql5.0之前是不行的,5.0之后引入了一个全新的语句,可以达到类似sp_executesql的功能(仅对procedure有效,function不支持动态查询),比如在用游标循环遍历多个表