mysql存储过程之基本语法篇

基本语法的学习主要参考了mysql用户指南

 

存储程序需要在mysql数据库中有proc表。这个表在MySQL 5.1安装过程中创建。如果你从早期的版本升级到MySQL 5.1 ,请确定更新你的授权表以确保proc表的存在。(mysql数据库安装完毕,在mysql库里面有一个proc表)

 

创建mysql存储过程的权限问题

.创建存储子程序需要CREATE ROUTINE权限。
·提醒或移除存储子程序需要ALTER ROUTINE权限。这个权限自动授予子程序的创建者。
·执行子程序需要EXECUTE权限。然而,这个权限自动授予 子程序的创建者。同样,子程序默认的SQL SECURITY 特征是DEFINER,它允许用该子程序访问数据库的用户与执行子程序联系到一起。

 

存储程序和函数是用CREATE PROCEDURE和CREATE FUNCTION语句创建的子程序。当前只学习CREATE PROCEDURE

 

在MySQL 5.1中,一个存储子程序或函数与特定的数据库相联系。这里有几个意思:
·当一个子程序被调用时,一个隐含的USEdb_name被执行(当子程序终止时停止执行)。存储子程序内的USE语句时不允许的。
·你可以使用数据库名限定子程序名。这可以被用来引用一个不在当前数据库中的子程序。比如,要引用一个与test数据库关联的存储程序p或函数f,你可以说CALL test.p()或test.f()。
·数据库移除的时候,与它关联的所有存储子程序也都被移除。

 

CREATE PROCEDURE基本语法
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
 [characteristic ...] routine_body


characteristic:
 LANGUAGE SQL
 | [NOT] DETERMINISTIC
 | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
 | SQL SECURITY { DEFINER | INVOKER }
 | COMMENT 'string'

 

routine_body:
 Valid SQL procedure statement or statements

 

注意: 指定参数为IN, OUT, 或INOUT 只对PROCEDURE是合法的。(FUNCTION参数总是被认为是IN参数)

 

BEGIN ... END复合语句
[begin_label:] BEGIN
 [statement_list]
END [end_label]

存储子程序可以使用BEGIN ... END复合语句来包含多个语句。statement_list代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。
除非begin_label存在,否则end_label不能被给出,并且如果二者都存在。

 

存储程序中的变量
1、DECLARE局部变量
2、变量SET语句
3、SELECT ... INTO语句

1.1 DECLARE var_name[,...] type [DEFAULT value]
这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个DEFAULT子句。值可以被指定为一个表达式,不需要为一个常数。如果没有DEFAULT子句,初始值为NULL。
局部变量的作用范围在它被声明的BEGIN ... END块内。它可以被用在嵌套的块中,除了那些用相同名字 声明变量的块。

 

2.1 变量SET语句
SET var_name = expr [, var_name = expr] ...

 

3.1 SELECT ... INTO语句
SELECT col_name[,...] INTO var_name[,...] table_expr
这个SELECT语法把选定的列直接存储到变量。因此,只有单一的行可以被取回。
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
注意,用户变量名在MySQL 5.1中是对大小写不敏感的。

重要: SQL变量名不能和列名一样。如果SELECT ... INTO这样的SQL语句包含一个对列的参考,并包含一个与列相同名字的 局部变量,MySQL当前把参考解释为一个变量的名字。例如,在下面的语句中,xname 被解释为到xnamevariable的参考而不是到xnamecolumn的:
CREATE PROCEDURE sp1 (x VARCHAR(5))
 BEGIN
 DECLARE xname VARCHAR(5) DEFAULT 'bob';
 DECLARE newname VARCHAR(5);
 DECLARE xid INT;
 
SELECT xname,id INTO newname,xid
FROM table1 WHERE xname = xname;
 SELECT newname;
 END;
当这个程序被调用的时候,无论table.xname列的值是什么,变量newname将返回值‘bob’。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值