知识大全 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相关参考
MySQL5.0数据库新特性的存储过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 当你提交一
MySQL数据库新特性之存储过程入门教程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在MYSQL
知识大全 MySQL 5.0系列新的社区稳定版5.0.75发布!
MySQL5.0系列新的社区稳定版5.0.75发布! 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
C#发现之旅第二讲 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 为了让大家更深入的了解和使用C
PHP调用MySQL的存储过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! MySQL好像从开
J2SE5.0新特性示例---泛型 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 简介 泛型其
php调用MySQL存储过程的方法集合 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本篇文章是对p
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)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧