zoukankan      html  css  js  c++  java
  • MySQL存储过程之特征子句

    CREATE PROCEDURE p2 ()
        LANGUAGE SQL
        NOT DETERMINISTIC
        SQL SECURITY DEFINER
        COMMENT 'A Procedure' 
        SELECT CURRENT_DATE, RAND() FROM t //

      以上括号之后,主体之前的内容是反映存储过程特性的子句,下面分别介绍各自的作用:

    1. LANGUAGE SQL:

      这个子句是没有功能作用的,仅仅是说明下面过程体中所使用的是SQL语言编写.这也是系统默认的.默认不代表完全可省略,因为某些DBMS需要它,如果要考虑IBM的DB2的兼容性可以写上,此外,今后可能会出现SQL外的其他语言支持的存储过程.

    2. NOT DETERMINISTIC:

      传递给系统的信息,即不确定的.如果一个存储过程每次调用只要参数一样,输出也一样,即为确定的.本例中的主体语句为SELECT语句,则返回值肯定是未知的,因此,此处为NOT DETERMINISTIC.MySQL内置的优化程序不会注意这些,至少现在不注意.

    3. SQL SECURITY DEFINER:

      指定权限控制,指定在调用时如何认定调用方的权限:DEFINER表示不管调用方是谁,都拥有定义者的权限,INVOKER表示仅按调用方本身的权限调用.

    4. COMMENT 'a procedure...':

      存储过程的注释说明文本.默认值为空('').

      以上列出的子句都是默认设置,所以如果所有子句省略则相当于:(RAND()返回随机数)

    CREATE PROCEDURE p2 ()
        SELECT CURRENT_DATE, RAND() FROM t //
     
    #相当于:
    CREATE PROCEDURE p2 ()
        LANGUAGE SQL
        NOT DETERMINISTIC
        SQL SECURITY DEFINER
        COMMENT ''
        SELECT CURRENT_DATE, RAND() FROM t // 

    5. 补充说明:

      不会改变的sql_mode,先看以下代码段:

    mysql> set sql_mode='ansi' //
    mysql> create procedure p3()select'a'||'b'//
    mysql> set sql_mode=''//
    mysql> call p3()//  

      MySQL在过程创建时会自动保持当时的运行环境,如上例,如果需要用||来连接字符串,但这只能在sql_mode为ansi时才有效,可以在创建过程之前更改sql_mode,过程创建完成后就算更改的sql_mode,也不会影响以后调用该过程.

  • 相关阅读:
    ORACLE的客户端、后台进程
    第一范式、第二范式、第三范式
    在VMware Workstation10下CentOS7虚拟机中创建与主机共享文件夹的详细步骤
    oracle经典查询语句
    vmware 安装XP 32位Professional版本
    增、删、改、查
    Windows/Linux服务器/Git/svn/get和post
    三大原理(计算机原理、操作系统原理、编译原理)两个协议(TCP与HTTP协议)一种结构(数据结构)
    EF删除,查询,Linq查询,Lambda查询,修改链接字符串
    EF添加和修改
  • 原文地址:https://www.cnblogs.com/free-coder/p/4773917.html
Copyright © 2011-2022 走看看