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

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

通常在使用图形界面工具进行存储过程编写的时候,图形界面工具会自动加上这部分内容比如用HeidiSQL创建存储过程的时候,会自动生成这些特性(characteristic)的默认值。
但是这些特性究竟是干啥的,有什么影响,一直没有怎么弄清楚。

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

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

参考:《深入浅出MySQL》

时间: 2024-10-28 03:49:52

MySQL存储过程定义中的特性(characteristic)的含义的相关文章

MySQL存储过程定义及调用

#MySQL存储过程 ##最简单的存储过程 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() COMMENT '最简单的存储过程' SELECT 1; ##调用 CALL sp1 (); ##带输入参数的存储过程 DROP PROCEDURE IF EXISTS sp2; CREATE PROCEDURE sp2(IN p INT) COMMENT '带输入参数的存储过程' SELECT p; ##调用 CALL sp2(1); #带输出参

mysql 存储过程权限问题

协助开发导入库时,他提醒我,库里有存储过程的定义.我使用了--routines 的选项,可是导入时,出了问题: 1.提示无法创建该存储过程,原来是忘了打开 log_bin_trust_function_creators 变量, set global log_bin_trust_function_creators=on; 后,成功创建,从服务器也需要此操作 才行,如果二进制日志是 ROW 的话,即使从上有此存储过程,也是不会调用的. 2.等到导入成功后,却又出现了无法调用的问题,搜索了 http:

mysql -- 存储过程中 declare 和 set 定义变量的区别

mysql存储过程中,定义变量有两种方式:1.使用set或select直接赋值,变量名以 @ 开头.例如:set @var=1;可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量. 2.以 DECLARE 关键字声明的变量,只能在存储过程中使用,称为存储过程变量,例如:DECLARE var1  INT DEFAULT 0;  主要用在存储过程中,或者是给存储传参数中. 两者的区别是:在调用存储过程时,以DECLARE声明的变量都会被初始化为 NULL.而会话变量(即@开头的变量)则不

mybatics 中调用mysql存储过程。

说起mybatics 框架,身边的java开发工程师们基本上都是耳熟能详. mybatics是apache的一个开源项目,前身为ibatics,2010年此项目由apache软件基金会迁移到了google code,mybatics的确是一款十分优秀的开源持久层框架,sql代码隔离封装.自动POJO映射.jdbc 动态sql---- mybatics的好处可以说出一箩筐,然而mybatics还有一个十分优秀的特性却往往被人忽略 ----那就是mybatics还支持存储过程的调用. 不熟悉存储过程

Mysql存储过程中使用cursor

一.表 学生表 CREATE TABLE `t_student` ( `stuNum` int(11) NOT NULL auto_increment, `stuName` varchar(20) default NULL, `birthday` date default NULL, PRIMARY KEY  (`stuNum`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 学生分数表 CREATE TABLE `t_stu_score` ( `id` int(11

MySQL存储过程中的3种循环

在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体介绍了. 这几个循环语句的格式如下: WHILE……DO……END WHILE REPEAT……UNTIL END REPEAT LOOP……END LOOP GOTO 下面首先使用第一种循环编写一个例子. mysql> create procedure pro10() -> begin ->

mysql存储过程中的异常处理

http://www.cnblogs.com/cookiehu/p/4994278.html 定义异常捕获类型及处理方法: DECLARE handler_action HANDLER FOR condition_value [, condition_value] ... statement handler_action: CONTINUE | EXIT | UNDO condition_value: mysql_error_code | SQLSTATE [VALUE] sqlstate_va

mysql存储过程中使用事务

1 DROP PROCEDURE IF EXISTS test_sp1 2 CREATE PROCEDURE test_sp1( ) 3 BEGIN 4 DECLARE t_error INTEGER DEFAULT 0; 5 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; 6 7 START TRANSACTION; 8 INSERT INTO test VALUES(NULL, 'test sql 001'); 9 INSER

MySQL 存储过程中分页

2014-11-20 MySQL数据库中,自定义存储过程查询表中的数据,带有分页功能.具体实例如下代码: 1 DROP PROCEDURE IF EXISTS `sampledb`.`proc_GetPagedDataSet`; 2 3 CREATE DEFINER=`root`@`%` PROCEDURE `proc_GetPagedDataSet`( 4 IN tableName VARCHAR (20), /*表名 5 IN pageIndex INT, /*当前页*/ 6 IN page