日历

2018年九月
« 7月    
 12
3456789
10111213141516
17181920212223
24252627282930

最近评论

    linux/unix基础知识

    mysql第四部分 mysql的特征句子

       1、首先来看几个能反映存储过程特性的子句,子句在存储过程之后(也就是p20()之后),存储过程的主题之前(也就是sql语句之前)。
    mysql> create procedure p20()
        ->  language sql                #注意,每个->之后都要有一个空格,否则,辛辛苦苦将全部的存储过程语句写完后,会提示错误
        ->  not deterministic     #也可以在每行的最后一个词之后加一个空格
        ->  sql security definer
        ->  comment ‘a procedure’
        ->  select current_date,rand() from t1;
    调用一下存储过程,看一下结果:
    mysql> call p20;
    +————–+——————+
    | current_date | rand()           |
    +————–+——————+
    | 2010-06-25   | 0.25000709225424 |
    +————–+——————+
    1 row in set (0.00 sec)
    Query OK, 0 rows affected (0.00 sec)
        实际上并没有t1这个表中的数据!!只是返回了当前日期和一个随机数:lol: 那么这些子句,哪些是需要的,哪些是不需要的呢?接着看。

        2、首先看一下第一条子句language sql,这条子句的作用是说明下面过程的主题语句是使用sql语言编写,实际上mysql默认就是使用sql语言进行查询,所以如果只针对mysql编写存储过程的话,这条子句可以不要。但是如果考虑的兼容性的话,比如在mysql下写的存储过程要移植到IBM的DB2数据库上使用,那么最好还是保留这条子句,因为DB2默认不是sql语言进行查询的。

            3、再来看一下第二条子句:not deterministic,这个子句是传递给系统信息的。在mysql中,如果程序或线程总是对同样的输入参数产生同样的结果,则认为它是“确定的”,否则就是“非确定”的。deterministic和not deterministic指出一个程序是否对给定的输入总是产生同样的输出,如果没有指定deterministic,即没有指定对同样的输入产生同样的输出,那么就采用系统的默认值not deterministic对同样的输入产生不同的输出。
        在这个例子中,主题语句使用的是select语句,返回的结果肯定是不确定的,所以在这里指定使用not deterministic(不确定)。

       4、再来看一下第三条子句,sql security,sql security是用来指定程序应该用创建程序的用户的身份执行,还是使用调用这个程序的用户的身份执行,默认值是definer,意思是在创建这个存储过程的时候要检查一下创建过程用户的权限,当过程已经被调用,就不用检查执行调用过程的用户了。sql security后还可以接invoker,invoker是告诉服务器,在创建存储过程程序和调用这个存储过程程序的时候都要检查一下用户的身份。

        5、再来看一下第四条子句comment ‘a procedure’,这条语句是一个可选的注释说明,comment后的信息被SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION这两个语句显示。 

        6、实际上
    mysql> create procedure p20()
        ->  language sql               
        ->  not deterministic    
        ->  sql security definer
        ->  comment ‘a procedure’
        ->  select current_date,rand() from t1;
        这些程序语句,进行简化的话,和下面的语句是一样的:
    mysql> create procedure p20()
        ->  comment ‘a procedure’  #默认注释是空,不过已经设定comment那么就不能省略了
        ->  select current_date,rand() from t1;
        也就是说,有一些是默认的,在编写存储过程程序的时候是可以不写的,如果没有写出来,那么默认值是:LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER。

        做一个小练习              
        问题:创建一个过程,显示`Hello world`。
        答案
    mysql> create procedure p5() select “Hello,world!”;
    Query OK, 0 rows affected (0.00 sec)

    mysql> call p5();
    +————–+
    | Hello,world! |
    +————–+
    | Hello,world! |
    +————–+
    1 row in set (0.01 sec)
    Query OK, 0 rows affected (0.01 sec)

    评论已关闭。