mysql怎样新建存储历程
举荐课程:MySQL教程。
长处(为何要用存储历程?):
①将反复性很高的一些操纵,封装到一个存储历程中,简化了对这些SQL的调取
②大量处置:SQL+轮回,减少流量,也就是“跑批”
③同一接口,确保数据的平安
相关于oracle数据库来说,MySQL的存储历程相对功能较弱,运用较少。
一、存储历程的新建和调取
>存储历程就是拥有名字的一段代码,用来完成一个特定的功能。
>新建的存储历程保留在数据库的数据字典中。
1、新建存储历程
CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type characteristic: COMMENT 'string' | LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } routine_body: Valid SQL routine statement [begin_label:] BEGIN [statement_list] …… END [end_label]
#新建数据库,备份数据表用于示例操纵
mysql> create database db1; mysql> use db1; mysql> create table PLAYERS as select * from TENNIS.PLAYERS; mysql> create table MATCHES as select * from TENNIS.MATCHES;
示例:新建一个存储历程,删除给定球员加入的所有竞赛
mysql> delimiter $$ #将语句的完毕符号从分号;暂时改为两个$$(可以是自定义) mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER) -> BEGIN -> DELETE FROM MATCHES -> WHERE playerno = p_playerno; -> END$$ Query OK, 0 rows affected (0.01 sec) mysql> delimiter ; #将语句的完毕符号恢复为分号
解析:
默许状况下,存储历程和默许数据库相干联,要是想指定存储历程新建在某个特定的数据库下,那么在历程名前面加数据库名做前缀;
在定义历程时,运用DELIMITER $$ 下令将语句的完毕符号从分号 ; 暂时改为两个$$,使得历程体中运用的分号被直接通报到办事器,而不会被客户端(如mysql)解释。
二、存储历程的参数
存储历程可以有0个或多个参数,用于存储历程的定义。
3种参数类型:
IN输入参数:表示调取者向历程传入值(传入值可以是字面量或变量)
OUT输出参数:表示历程向调取者传出值(可以返回多个值)(传出值只能是变量)
INOUT输入输出参数:既表示调取者向历程传入值,又表示历程向调取者传出值(值只能是变量)
1、in输入参数
mysql> delimiter $$ mysql> create procedure in_param(in p_in int) -> begin -> select p_in; -> set p_in=2; -> select P_in; -> end$$ mysql> delimiter ; mysql> set @p_in=1; mysql> call in_param(@p_in);+------+ | p_in | +------+ | 1 | +------+ +------+ | P_in | +------+ | 2 | +------+mysql> select @p_in;+-------+ | @p_in | +-------+ | 1 | +-------+
#以上可以看出,p_in在存储历程中被修改,但并不影响@p_id的值,由于前者为部分变量、后者为全局变量。
2、out输出参数
mysql> delimiter //mysql> create procedure out_param(out p_out int) -> begin -> select p_out; -> set p_out=2; -> select p_out; -> end -> //mysql> delimiter ; mysql> set @p_out=1; mysql> call out_param(@p_out);+-------+ | p_out | +-------+ | NULL | +-------+ #由于out是向调取者输出参数,不接收输入的参数,所以存储历程里的p_out为null+-------+ | p_out | +-------+ | 2 | +-------+mysql> select @p_out;+--------+ | @p_out | +--------+ | 2 | +--------+ #调取了out_param存储历程,输出参数,转变了p_out变量的值
3、inout输入参数
mysql> delimiter $$ mysql> create procedure inout_param(inout p_inout int) -> begin -> select p_inout; -> set p_inout=2; -> select p_inout; -> end -> $$ mysql> delimiter ; mysql> set @p_inout=1; mysql> call inout_param(@p_inout);+---------+ | p_inout | +---------+ | 1 | +---------+ +---------+ | p_inout | +---------+ | 2 | +---------+mysql> select @p_inout;+----------+ | @p_inout | +----------+ | 2 | +----------+
#调取了inout_param存储历程,承受了输入的参数,也输出参数,转变了变量
注意:
①要是历程没有参数,也必需在历程名背面写上小括号
例:CREATE PROCEDURE sp_name ([proc_parameter[,...]]) ……
②确保参数的名字不等于列的名字,不然在历程体中,参数名被当成列名来处置
热烈倡议:
>输入值运用in参数;
>返回值运用out参数;
>inout参数就尽量的少用。
以上就是mysql怎样新建存储历程的细致内容,更多请关注 百分百源码网 其它相干文章!