1.调用存储过程

存储过程和存储函数都是存储在服务器端的SQL语句的集合,要使用这些已经定义好的存储过程和存储函数就必须要通过调用的方式来实现

存储过程是通过CALL语句来调用的。而存储函数的使用方法与MySQL内部函数的使用方法是一样的

。执行存储过程和存储函数需要拥有EXECUTE权限

。EXECUTE权限的信息存储在information_schema数据库下面的USER_PRIVILEGES表中。

存储过程使用CALL语句来调用存储过程。调用存储过程后,数据库系统将执行存储过程中的语句。然后,将结果返回给输出值。

CALL语句的基本语法形式如下:

CALL sp_name([parameter[,…]]) ;

其中,sp_name是存储过程的名称;parameter是指存储过程的参数。

定义一个存储过程,示例如下:

delimiter//
create procedure countproc1(in sid int, out num int)
begin
select count(*) into num from fruits where s_id=sid;
end//
delimiter;
call countproc1(101,@num);
select @num;

2.调用存储函数

在MySQL中,存储函数的使用方法与MySQL内部函数的使用方法是一样的。换言之,用户自己定义的存储函数与MySQL内部函数是一个性质的。区别在于,存储函数是用户自己定义的,而内部函数是MySQL的开发者定义的。

下面定义一个存储函数,然后调用这个存储函数。代码执行如下:

delimiter//
create function countproc2(sid int)
returns int
begin
return (select count(*) from fruits where s_id=sid);
end//
delimiter;
select countproc2(101);

与上面存储过程的结果完全相同。

二、查看存储过程和函数

存储过程和函数创建以后,可以查看存储过程和函数的状态和定义。

通过SHOW STATUS语句来查看存储过程和函数的状态,也可以通过SHOW CREATE语句来查看存储过程和函数的定义。

通过查询information_schema数据库下的Routines表来查看存储过程和函数的信息。

1.SHOW STATUS语句来查看

其基本语法形式如下:

SHOW { PROCEDURE | FUNCTION } STATUS [ LIKE ' pattern ' ] ;

其中,PROCEDURE参数表示查询存储过程;FUNCTION参数表示查询存储函数;

LIKE ' pattern '参数用来匹配存储过程或函数的名称。

下面查询名为name_from_t3的函数的状态。代码执行如下:

SHOW FUNCTION STATUS LIKE '%name_from_t3%';

注意:SHOW STATUS语句只能查看存储过程或函数是操作哪一个数据库、存储过程或函数的名称、类型、谁定义的、创建和修改时间、字符编码等信息。但是,这个语句不能查询存储过程或函数的具体定义。如果需要查看详细定义,需要使用SHOW CREATE语句。

2.SHOW CREATE语句查看存储过程和函数的定义

基本语法形式如下:

SHOW CREATE { PROCEDURE | FUNCTION } sp_name ;

其中,PROCEDURE参数表示查询存储过程;FUNCTION参数表示查询存储函数;sp_name参数表示存储过程或函数的名称

下面查询名为name_from_t3的函数的定义。代码执行如下:

SHOW CREATE FUNCTION name_from_t3 \G

3.从information_schema.Routines表中查看存储过程和函数的信息

存储过程和函数的信息存储在information_schema数据库下的Routines表中。可以通过查询该表的记录来查询存储过程和函数的信息。其基本语法形式如下:

SELECT * FROM information_schema.Routines

WHERE ROUTINE_NAME=' sp_name ' ;

其中,ROUTINE_NAME字段中存储的是存储过程和函数的名称;sp_name参数表示存储过程或函数的名称。

SELECT * FROM information_schema.Routines

WHERE ROUTINE_NAME='countproc1' and ROUTINE_type='function' \G

注意:在information_schema数据库下的Routines表中,存储着所有存储过程和函数的定义。如果使用SELECT语句查询Routines表中的存储过程和函数的定义时,一定要使用ROUTINE_NAME字段指定存储过程或函数的名称。否则,将查询出所有的存储过程或函数的定义。如果存储过程或函数的名称相同,使用ROUTINE_type字段表明查询的是哪种类型的存储程序。

三、修改存储过程和函数

MySQL中通过ALTER PROCEDURE语句来修改存储过程。通过ALTER FUNCTION语句来修改存储函数。语法形式如下:

ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]

characteristic:

{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

| SQL SECURITY { DEFINER | INVOKER }

| COMMENT 'string'修改存储过程和函数,只能修改他们的权限,目前MYSQL还不提供对已存在的存储过程和函数代码的修改

如果要修改,只能通过先DROP掉,然后重新建立新的存储过程和函数来实现。

在SQLYOG里选中选中函数,然后右键ALTER FUNCTION的时候,也是这样,先DROP掉,然后重新建立新的函数来实现

四、删除存储过程和函数

MySQL中使用DROP PROCEDURE语句来删除存储过程。通过DROP FUNCTION语句来删除存储函数。

DROP { PROCEDURE| FUNCTION }[if exists] sp_name;

其中,sp_name参数表示存储过程或函数的名称; [if exists]表示,如果程序或者函数不存储,它可以防止发生错误,产生一个show warnings的警告。

代码如下:

drop procedure countproc1;
drop function countproc2;