mysql创建存储过程

所有在navicat for mysql on ubuntu上面实现。
MySQL中,创建存储过程的基本形式如下:

    CREATE PROCEDURE sp_name ([proc_parameter[,...]])  [characteristic ...] routine_body 

其中,sp_name参数是存储过程的名称;proc_parameter表示存储过程的参数列表; characteristic参数指定存储过程的特性;routine_body参数是SQL代码的内容,可以用BEGIN…END来标志SQL代码的开始和结束。

proc_parameter中的每个参数由3部分组成。这3部分分别是输入输出类型、参数名称和参数类型。其形式如下:

[ IN | OUT | INOUT ] param_name type 

其中,
IN表示输入参数;表示该形参的值必须在调用存储过程时指定并传递给存储过程,在存储过程中修改该参数的值不能被返回,为原来值。
OUT表示输出参数; 该值可在存储过程内部被改变,并更新调用外面的变量。
INOUT表示既可以是输入,也可以是输出;
param_name参数是存储过程的参数名称;
type参数指定存储过程的参数类型,该类型可以是MySQL数据库的任意数据类型。

characteristic参数有多个取值。其取值说明如下:

LANGUAGE SQL:说明routine_body部分是由SQL语言的语句组成,这也是数据库系统默认的语言。

[NOT] DETERMINISTIC:指明存储过程的执行结果是否是确定的。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是非确定的,相同的输入可能得到不同的输出。默认情况下,结果是非确定的。

{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;NO SQL表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句;MODIFIES SQL DATA表示子程序中包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。

SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行。默认情况下,系统指定的权限是DEFINER。

COMMENT ‘string’:注释信息。

技巧:创建存储过程时,系统默认指定CONTAINS SQL,表示存储过程中使用了SQL语句。但是,如果存储过程中没有使用SQL语句,最好设置为NO SQL。而且,存储过程中最好在COMMENT部分对存储过程进行简单的注释,以便以后在阅读存储过程的代码时更加方便。
定义一个参数是输入输出的类型的存储过程。


定义一个输入参数是INOUT类型的存储过程,命名为inout_procedure
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(INOUT `p_inout` int)
    READS SQL DATA
    COMMENT 'inout_procedure '
BEGIN
    #Routine body goes here...
SELECT p_inout;
set p_inout=5;
SELECT p_inout;
END;

然后新建一个query,命名为inout_procedure_query
SET @p_inout=9;
CALL inout_procedure(@p_inout);
SELECT @p_inout;

进入存储过程第一个select语句输出的结果,result1
这里写图片描述
进入存储过程对传进来的变量改变后输出的结果。result2
这里写图片描述
调用存储过程后,在外面看变量在存储过程里面更改后是不是有效。输出说明有效。
这里写图片描述

定义一个out类型参数的存储过程。

定义一个输入参数是OUT类型的存储过程,命名为out_procedure
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(OUT `out_p` int)
BEGIN
    #Routine body goes here...
SELECT out_p;
set out_p=3;
SELECT out_p;
END;

新建一个查询query,命名为out_procedure_query
SET @out_p=1;
CALL  out_procedure(@out_p);#先输出null,为什么是null呢?调用存储过程前明明给out_p赋值了呢?这也说明存储过程里面的变量没有获得调用者传递进去的结果。
SELECT @out_p; #输出3 说明存储过程里面的值写回到调用者外面了。

从输出结果可以看到对传进去的变量也是可以在存储过程外面获得改变的变量。

定义一个in类型的输入参数存储过程。

定义一个输入参数是In类型的存储过程,命名为in_procedure
CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(IN `one` int)
BEGIN
#Routine body goes here...
SELECT  one;
SET one=2;
SELECT one;
END;
新建一个查询query,命名为in_procedure_query
SET @p_in=1;
CALL  in_procedure(@p_in);#先输出1,后输出2;说明调用者的变量值传递给了存储过程里面变量的值。
SELECT @p_in;  #输出1,说明存储过程里面变量的值没有写回到调用者外面变量。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值