mysql characteristic_MySQL存储过程定义中的特性(characteristic)的含义

MySQL的存储过程蛮啰嗦的,与MSSQL或者Oracle的存储过程相比,如果没有显式指定,他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程

fe169de6893c442b46b798e52b04c25e.png

通常在使用图形界面工具进行存储过程编写的时候,图形界面工具会自动加上这部分内容比,

如用HeidiSQL创建存储过程的时候,会自动生成这些特性(characteristic)的默认值。

但是这些特性究竟是干啥的,有什么影响,一直没有怎么弄清楚。

e1fd9648b53bb870aaf64448cc1719c9.png

LANGUAGE SQL

存储过程语言,默认是sql,说明存储过程中使用的是sql语言编写的,暂时只支持sql,后续可能会支持其他语言

NOT DETERMINISTIC

是否确定性的输入就是确定性的输出,默认是NOT DETERMINISTIC,只对于同样的输入,输出也是一样的,当前这个值还没有使用

CONTAINS SQL

提供子程序使用数据的内在信息,这些特征值目前提供给服务器,并没有根据这些特征值来约束过程实际使用数据的情况,说白了就是没有使用的

包括以下四种选择

1.CONTAINS SQL表示子程序不包含读或者写数据的语句

2.NO SQL 表示子程序不包含sql

3.READS SQL DATA 表示子程序包含读数据的语句,但是不包含写数据的语句

4.MODIFIES SQL DATA 表示子程序包含写数据的语句。

SQL SECURITY DEFINER

用来指定存储过程是使用创建者的许可来执行,还是执行者的许可来执行,默认值是DEFINER

DEFINER 创建者的身份来调用,对于当前用户来说:如果执行存储过程的权限,且创建者有访问表的权限,当前用户可以成功执行过程的调用的

说白了就是当前用户调用存储过程,存储过程执行的具体操作是借助定义存储过程的user的权限执行的。

INVOKER 调用者的身份来执行,对于当前用户来说:如果执行存储过程的权限,以当前身份去访问表,如果当前身份没有访问表的权限,即便是有执行过程的权限,仍然是无法成功执行过程的调用的。

说白了就是当前用户调用存储过程,只有当前用户有执行存储过程中涉及的对象的操作的权限的时候,才能成功执行。

COMMENT ”

存储过程的注释性信息写在COMMENT里面,这里只能是单行文本,多行文本会被移除到回车换行等,一个字:扯

为什么说这个扯淡呢?

通常情况下,楼主会注释一个调用存储过程的示例在备注里,以免自己活着别人在调试的时候,参数很多的时候,可以很快调用起来,麻烦写半天参数之类的

— 因此就会存在类似如下的注释,但是注释中的语句会被全部保存成一行,格式给抹掉了

/*

set @p_parameter1 = ‘abc’;

set @p_parameter2 = 200;

call mysql_procedure(@p_parameyter1,@p_parameter2)

*/

以下是一个存储过程的demo,delimiter 仅仅是让存储过程知道,遇到delimiter定义的字符的时候是结束的标记。

话说MySQL不支持匿名块就算了,定义存储过程的时候,什么时候结束他自己都解析不出来?

delimiter KKKKKKKK(当然是fuck也行)

CREATE DEFINER=`root`@`%` PROCEDURE `porcedureName`(in p_parameter1 varchar(200),in p_parameter2 int,out p_outparameter int)

-- 存储过程语言,默认是sql,说明存储过程中使用的是sql语言编写的,暂时只支持sql,后续可能会支持其他语言

LANGUAGE SQL

-- 是否确定性的输入就是确定性的输出,默认是NOT DETERMINISTIC,只对于同样的输入,输出也是一样的,当前这个值还没有使用

NOT DETERMINISTIC

-- 提供子程序使用数据的内在信息,这些特征值目前提供给服务器,并没有根据这些特征值来约束过程实际使用数据的情况,说白了就是没有使用的

-- ONTAINS SQL表示子程序不包含读或者写数据的语句

-- NO SQL 表示子程序不包含sql

-- READS SQL DATA 表示子程序包含读数据的语句,但是不包含写数据的语句

-- MODIFIES SQL DATA 表示子程序包含写数据的语句

CONTAINS SQL

-- 用来指定存储过程是使用创建者的许可来执行,还是执行者的许可来执行,默认值是DEFINER

-- DEFINER 创建者的身份来调用,如果创建者有权限访问存储过程中的表,调用者有执行过程的权限,就可以执行

-- INVOKER 调用者的身份来执行,取决于调用是否有执行过程+执行过程中sql语句对应的权限

SQL SECURITY DEFINER

-- 存储过程的注释性信息写在COMMENT里面,这里只能是单行文本,多行文本会被移除到回车换行等,一个字:扯

-- 为什么说这个扯淡呢?

-- 通常情况下,楼主会注释一个调用存储过程的示例在备注里,以免自己活着别人在调试的时候,参数很多的时候,调用起来,麻烦写半天参数之类的

-- 因此就会存在类似如下的注释,但是注释中的语句会被全部保存成一行,格式给抹掉了

/*

set @p_parameter1 = 'abc';

set @p_parameter2 = 200;

call mysql_procedure(@p_parameyter1,@p_parameter2)

*/

COMMENT ''

begin

select * from user where id = 100;

end

KKKKKKKK(delimiter是fuck的话,这里就是fuck了,结尾的标记而已)

参考:《深入浅出MySQL》

作者:MSSQL123

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL定义存储过程的参数是可以设置成可选的。你可以在存储过程的参数列表使用默认值来实现参数的可选性。当调用存储过程时,如果没有提供该参数的值,那么将会使用默认值作为参数的值。这样就可以实现参数的可选性。例如,可以使用以下语法来定义一个具有可选参数的存储过程: CREATE PROCEDURE sp_name (IN param1 INT, IN param2 INT DEFAULT 0) BEGIN -- 存储过程的逻辑代码 END 在上述示例,param1是必需的参数,而param2是可选的参数,如果没有提供param2的值,将使用默认值0。这样,在调用存储过程时,可以选择性地提供param2的值,如果没有提供,则使用默认值。 引用: \[1\] 使用create PROCEDURE语句创建存储过程。CREATE PROCEDURE:创建存储过程的关键字。sp_name:为存储过程的名称。proc_parameter:存储过程的参数列表。characters:用于指定存储过程特性。routine_body:是SQL代码的内容。也可以只是用begin ...end来表示SQL代码的开始和结束。 \[2\] MySQL可以使用ALTER语句修改存储过程特性。ALTER{PROCEDURE|FUNCTION}sp_name \[characteristic...\]sp_name:表示存储过程或者函数的名称。characteristic:表示要修改存储过程的哪个部分。 \[3\] 存储过程有多种调用方法。必须使用CALL语句调用,并且存储过程和数据库相关。如果要执行其他数据库存储过程,需要指定数据库的名称。CALL sp_name(\[parameter\],...)sp_name:为存储过程的名称。parameter:为存储过程的参数。 #### 引用[.reference_title] - *1* *2* *3* [MySQL操作之存储过程](https://blog.csdn.net/weixin_44624117/article/details/120383054)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值