知识大全 MySQL 5.0 新特性教程 存储过程:第二讲

Posted 过程

篇首语:坚强的意志,是不会被假设所谓的命运击败的。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 MySQL 5.0 新特性教程 存储过程:第二讲相关的知识,希望对你有一定的参考价值。

MySQL 5.0 新特性教程 存储过程:第二讲  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Why MySQL Statements are Legal in a Procedure Body     什么MySQL语句在存储过程体中是合法的?    什么样的SQL语句在Mysql存储过程中才是合法的呢?你可以创建一个包含INSERT UPDATE DELETE SELECT DROP CREATE REPLACE等的语句 你唯一需要记住的是如果代码中包含MySQL扩充功能 那么代码将不能移植 在标准SQL语句中 任何数据库定义语言都是合法的 如     CREATE PROCEDURE p () DELETE FROM t; //    SET MIT以及ROLLBACK也是合法的 如     CREATE PROCEDURE p () SET @x = ; //    MySQL的附加功能 任何数据操作语言的语句都将合法     CREATE PROCEDURE p () DROP TABLE t; //    MySQL扩充功能 直接的SELECT也是合法的     CREATE PROCEDURE p () SELECT a ; //    顺便提一下 我将存储过程中包括DDL语句的功能称为MySQL附加功能的原因是在SQL标准中把这个定义为非核心的 即可选组件     在过程体中有一个约束 就是不能有对例程或表操作的数据库操作语句 例如下面的例子就是非法的     CREATE PROCEDURE p ()  CREATE PROCEDURE p () DELETE FROM t; //    下面这些对MySQL 来说全新的语句 过程体中是非法的:    CREATE PROCEDURE ALTER PROCEDURE DROP PROCEDURE CREATE FUNCTION   DROP FUNCTION CREATE TRIGGER DROP TRIGGER      不过你可以使用    CREATE PROCEDURE db p () DROP DATABASE db //     但是类似     USE database     语句也是非法的 因为MySQL假定默认数据库就是过程的工作场所     Call the Procedure 调用存储过程     现在我们就可以调用一个存储过程了 你所需要输入的全部就是CALL和你过程名以及一个括号再一次强调 括号是必须的当你调用例子里面的p 过程时 结果是屏幕返回了t表的内容    mysql> CALL p () //  + +  | s |  + +  | |  + +   row in set ( sec)  Query OK rows affected ( sec)    因为过程中的语句是     SELECT * FROM t;      Let me say that again another way     其他实现方式    mysql> CALL p () //    和下面语句的执行效果一样     mysql> SELECT * FROM t; //    所以 你调用p 过程就相当于你执行了下面语句      SELECT * FROM t;     好了 主要的知识点 创建和调用过程方法 已经清楚了 我希望你能对自己说这相当简单 但是很快我们就有一系列的练习 每次都加一条子句 或者改变已经存在的子句 那样在写复杂部件前我们将会有很多可用的子句     Characteristics Clauses 特征子句     CREATE PROCEDURE p ()  LANGUAGE SQL <   NOT DETERMINISTIC <   SQL SECURITY DEFINER <   MENT A Procedure <   SELECT CURRENT_DATE RAND() FROM t //    这里我给出的是一些能反映存储过程特性的子句 子句内容在括号之后 主体之前 这些子句都是可选的 他们有什么作用呢?     CREATE PROCEDURE p ()  LANGUAGE SQL <   NOT DETERMINISTIC  SQL SECURITY DEFINER  MENT A Procedure   SELECT CURRENT_DATE RAND() FROM t //    很好 这个LANGUAGE SQL子句是没有作用的 仅是为了说明下面过程的主体使用SQL语言编写 这条是系统默认的 但你在这里声明是有用的 因为某些DBMS(IBM的DB )需要它 如果你关注DB 的兼容问题最好还是用上 此外 今后可能会出现除SQL外的其他语言支持的存储过程      CREATE PROCEDURE p ()  LANGUAGE SQL  NOT DETERMINISTIC <   SQL SECURITY DEFINER  MENT A Procedure   SELECT CURRENT_DATE RAND() FROM t //    下一个子句 NOT DETERMINISTIC 是传递给系统的信息 这里一个确定过程的定义就是那些每次输入一样输出也一样的程序 在这个案例中 既然主体中含有SELECT语句 那返回肯定是未知的因此我们称其NOT DETERMINISTIC 但是MySQL内置的优化程序不会注意这个 至少在现在不注意      CREATE PROCEDURE p ()  LANGUAGE SQL  NOT DETERMINISTIC  SQL SECURITY DEFINER <   MENT A Procedure   SELECT CURRENT_DATE RAND() FROM t //    下一个子句是SQL SECURITY 可以定义为SQL SECURITY DEFINER或SQL SECURITY INVOKER     这就进入了权限控制的领域了 当然我们在后面将会有测试权限的例子     SQL SECURITY DEFINER    意味着在调用时检查创建过程用户的权限(另一个选项是SQLSECURITY INVOKER)     现在而言 使用    SQL SECURITY DEFINER    指令告诉MySQL服务器检查创建过程的用户就可以了 当过程已经被调用 就不检查执行调用过程的用户了 而另一个选项(INVOKER)则是告诉服务器在这一步仍然要检查调用者的权限      CREATE PROCEDURE p ()  LANGUAGE SQL  NOT DETERMINISTIC  SQL SECURITY DEFINER  MENT A Procedure <   SELECT CURRENT_DATE RAND() FROM t //    MENT A procedure   是一个可选的注释说明     最后 注释子句会跟过程定义存储在一起 这个没有固定的标准 我在文中会指出没有固定标准的语句 不过幸运的是这些在我们标准的SQL中很少      CREATE PROCEDURE p ()  LANGUAGE SQL  NOT DETERMINISTIC  SQL SECURITY DEFINER  MENT   SELECT CURRENT_DATE RAND() FROM t //    上面过程跟下面语句是等效的     CREATE PROCEDURE p ()  SELECT CURRENT_DATE RAND() FROM t //    特征子句也有默认值 如果省略了就相当于     LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER MENT     Digressions一些题外话    Digression:  调用p ()//的结果    mysql> call p () //  + + +  | CURRENT_DATE | RAND() |  + + +  | | |  + + +   row in set ( sec)  Query OK rows affected ( sec)    当调用过程p 时 一个SELECT语句被执行返回我们期望获得的随机数     Digression: sql_mode unchanging    不会改变的    sql_mode  mysql> set sql_mode= ansi //  mysql> create procedure p ()select a || b //  mysql> set sql_mode= //  mysql> call p ()//  + +  | a || b |  + +  | ab |  + +    MySQL在过程创建时会自动保持运行环境 例如 我们需要使用两条竖线来连接字符串但是这只有在sql mode为ansi的时候才合法 如果我们将sql mode改为non ansi 不用担心 它仍然能工作 只要它第一次使用时能正常工作      Exercise 练习    Question  问题    如果你不介意练习一下的话 试能否不看后面的答案就能处理这些请求     创建一个过程 显示`Hello world` 用大约 秒时间去思考这个问题 既然你已经学到了这里 这个应该很简单 当你思考问题的时候 我们再随机选择一些刚才讲过的东西复习     DETERMINISTIC    (确定性)子句是反映输出和输入依赖特性的子句…调用过程使用CALL过程名(参数列表)方式 好了 我猜时间也到了     Answer  答案    好的 答案就是在过程体中包含     SELECT Hello world     语句  MySQL    mysql> CREATE PROCEDURE p () SELECT Hello world //  Query OK rows affected ( sec)  mysql> CALL p ()//  + +  | Hello world |  + +  | Hello world |  + +   row in set ( sec)  Query OK rows affected ( sec)     Parameters 参数    让我们更进一步的研究怎么在存储过程中定义参数     CREATE PROCEDURE p     ()      CREATE PROCEDURE p   ([IN] name data type)      CREATE PROCEDURE p   (OUT name data type)      CREATE PROCEDURE p   (INOUT name data type)     回忆一下前面讲过的参数列表必须在存储过程名后的括号中 上面的第一个例子中的参数列表是空的 第二个例子中有一个输入参数 这里的词IN可选 因为默认参数为IN(input)     第三个例子中有一个输出参数 第 cha138/Article/program/MySQL/201311/29319

相关参考

知识大全 MySQL 5.0 数据库新特性的存储过程

MySQL5.0数据库新特性的存储过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  当你提交一

知识大全 MySQL数据库新特性之存储过程入门教程

MySQL数据库新特性之存储过程入门教程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在MYSQL

知识大全 MySQL 5.0系列新的社区稳定版5.0.75发布!

MySQL5.0系列新的社区稳定版5.0.75发布!  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 C#发现之旅第二讲

C#发现之旅第二讲  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  为了让大家更深入的了解和使用C

知识大全 PHP调用MySQL的存储过程

PHP调用MySQL的存储过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  MySQL好像从开

知识大全 J2SE5.0新特性示例---泛型

J2SE5.0新特性示例---泛型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  简介  泛型其

知识大全 php调用MySQL存储过程的方法集合

php调用MySQL存储过程的方法集合  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本篇文章是对p

知识大全 MySQL两种表存储结构性能比较测试过程

MySQL两种表存储结构性能比较测试过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  MySQ

知识大全 在Eclipse 3.1体验J2SE 5.0新特性六

在Eclipse3.1体验J2SE5.0新特性六  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 在Eclipse 3.1体验J2SE 5.0新特性四(图)

在Eclipse3.1体验J2SE5.0新特性四(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧