MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 20331|回复: 11
打印 上一主题 下一主题

[存储过程及函数] MySQL储存过程编程教程-第一章

[复制链接]
跳转到指定楼层
1#
发表于 2007-10-15 09:11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一章 MySQL储存程序介绍
当MySQL于上个世纪90年代中期在IT界刚刚成型的时候,它只具有少量的商用关系型数据库所具备的特性。出现了比如事务处理,子查询,视图和储存过程这样的功能的明显缺失,后继版本提供了大量缺失的功能,现在介绍的MySQL5.0的储存过程,函数和触发器(还有可更新视图以及数据目录)等功能大大的缩短了MySQL和其他关系型数据库系统的差距。

现在介绍的储存程序(我们通常所说的储存过程,函数和触发器)在和其他竞争对手的功能战上赢得了简单的胜利。如果没有储存程序,MySQL就无法以一种完整的姿态和别的竞争对手相比拼,因为在ANSI、ISO的标准当中也要求数据库管理系统应具备执行储存程序的功能。此外,正确的使用储存程序也有助于加强数据库的安全性和完整性及改善你的应用程序的性能和易维护性。我们将在本章的稍后部分介绍这些优势的具体内容。

简短的说,储存程序,过程,函数和触发器是一种MySQL的强大能力,而用好这些编程工具是MySQL专业上所必须具备的。

本章将介绍MySQL储存程序语言,她的起源和她的能力,同样我们为MySQL储存程序开发者提供了一些附属资源的导引和综合开发的建议。

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏3 分享淘帖1 顶2 踩
2#
发表于 2007-10-15 09:40:40 | 只看该作者

非常好,最完善、实用的MySQL存储过程教程了,强,翻译的真好。 ...
3#
 楼主| 发表于 2007-10-15 10:22:15 | 只看该作者
1.1 什么是储存程序
数据库储存程序有时也被称为储存模块或者储存例程 — 一种被数据库服务器所储存和执行的计算机程序(有一系列不同的称呼),储存程序的源代码(有时)可能是二进制编译版本几乎总是占据着数据库服务器系统的表空间,程序总是位于其数据库服务器的进程或线程的内存地址中被执行。

主要有三种类型的数据库储存程序

储存过程
储存过程是最常见的储存程序,储存过程是能够接受数个输入和输出参数并且能够在请求时被执行的程序单元。

储存函数
储存函数和储存过程很相像,但是它的执行结果会返回一个值。最重要的是储存函数可以被用来充当标准的SQL表达式,允许程序员有效的扩展SQL语言的能力。

触发器
触发器是用来响应激活或者数据库行为,事件的储存程序,通常,触发器用来作为DML(数据库操纵语言)的响应而被调用,触发器可以被用来作为数据校验和自动反向格式化。
其他的数据库提供了别的储存程序,包括包和类 — 允许你定义和组织一堆上下文过程和函数,MySQL现在还不提供这种结构,每个程序都是一个单独的实体。


在这本书中,我们将使用术语:储存程序来带指储存过程,函数和触发器,术语:储存程序语言带指用来写这些程序的语言,大多数程序的基本构建都可以在储存过程,函数和触发器中被使用;但是,储存函数和触发器在使用这些构建时是严格受限的。所以我们将另辟章节来专门介绍这些程序类型的限制。


1.1.1为什么使用储存程序
开发者总是有很多种编程语言可以选择,这意味着大多数的语言并非位于数据库内,并受其管理,储存程序相对于这些多用途语言而言拥有很多优势:

  • 储存程序的是使用可以使你的数据库更安全
  • 储存程序提供了一种数据访问的抽象机制,它能够极大的改善你的代码在底层数据结构演化过程中的易维护性
  • 储存程序可以降低网络拥阻,因为属于数据库服务器的内部数据,这相比在网上传输数据要快的多
  • 储存程序可以替多种使用不同构架的外围应用实现共享的访问例程,无论这些构架是基于数据库服务器外部还是内部。
  • 以数据为中心的逻辑可以被独立的放置于储存程序中,这样可以为程序员带来更高,更为独特的数据库编程体验
  • 在某些情况下,使用储存程序可以改善应用程序的可移植性

作为对这些优势的最初映像(大多数将在本书的稍后深入的探讨),我们不建议你立即将所有的程序逻辑移至储存程序中,在今天丰富而复杂的软件技术背景下,你必须清楚的认识你的软件中每个技术细节的优势和弱势,并且将这些优势最大化,我们将在第12章详细的讨论在什么地方,怎样使用MySQL储存程序使用储存程序的底线是:正确的使用储存程序,过程,函数和触发器能够帮助你改善应用程序的性能,安全性,易维护性和稳定性。

后续的章节将带你探索怎样来构建MySQL储存程序和他们的最大好处,在详细介绍之前,让我们来看一下有关这项技术的发展和语言特性的快速浏览。

1.1.2 MySQL的简史
MySQL植根于由瑞典的Tcx公司于1980年开发的一个叫做Unireg的的非SQL数据库系统,作为数据仓库的优化,Unireg的作者Michael "Monty" Widenius于1995年为其加入了SQL接口,这就是MySQL的第一个版本。来自Detron HB的David Axmark为了让MySQL取得成功为其提供了双许可证,这使得MySQL能够广泛的免费得到,同时它也具备了商业使用上的优势,于是,Allan Larsson, David 和Monty成为MySQL公司的创建者。
第一个被广泛使用的MySQL版本是于1996年发布的3.11,随着MySQL及相关开源技术的快速发展,到2005年,MySQL宣称其数据库已经拥有6百万的安装数。

MySQL3适合的应用层面很广,(当然适应于web应用程序是非常可以理解的),但是缺乏一些常规数据库所应具备的功能,举例来说:事务,视图和子查询都没有在这个最初的版本中被支持。

不管怎样,MySQL系统在诞生之初就被设计为具有可扩展数据访问结构,SQL层用能够为底层的数据和文将访问层解偶。这允许使用各种自定义数据引擎来替换原有的本地ISAM(索引顺序存取方法)数据库引擎,2001年,BDB(Berkeley-DB )数据引擎(由Sleepycat负责开发维护)被作为3.23.34的可选组件被集成进MySQL,BDB提供了MySQL最初的事务处理能力,同时,开源的InnoDB很快成为MySQL用户的可选本地数据引擎。

2002年早期发布的4.0版完整的整合了InnoDB这一选项,这让MySQL用户非常容易的获得了事务处理的支持,以及改进的数据同步能力,在2004年发布的4.1版本提供了对于子查询和Unicode的支持。

2005年晚期发布的MySQL 5.0在向商用关系型数据库系统的功能靠近的方面做出了改进,它开始支持储存过程,函数和触发器,及数据目录(INFORMATION_SCHEMA的SQL标准),并支持了可更新视图。

5.1版本预计将于2006年中晚期发布,将提供例如内部作业调度,表分区,基于记录的同步功能和其他一些有意义的改进

1.1.3 MySQL储存过程,函数和触发器
MySQL选择将其储存程序作为ANSI SQL:2003 SQL/PSM(数据持久模块)的一个子集来实现,本质上MySQL的储存程序过程,函数和触发器只是遵循了ANSI对于这些程序类型的开放标准。

很多MySQL和其他开源爱好者则希望将储存程序语言实现为基于其他开源语言,例如PHP或者Python及Java的版本,虽然最后选择了ANSI的规范 — 同样的规范也被IBM的DB2数据库所采用,但这是MySQL在ANSI委员会中做了大量长期的工作的结果,这个标准在大量的商用关系型数据库公司所采纳的标准中具有相当的典型性。

MySQL储存程序语言是一种类似于Pascal的块语句结构的语言,包含了大量人们熟知的命令,包括变量操纵,条件语句的实现方式,迭代编程和错误处理等,其他现有的数据库储存程序用户(例如Oracle 的PL/SQL或者SQL Server的Transact-SQL)将发觉他们大体上看起来非常相似,与PHP或者Java相比,这种语言可能显的过于单薄,但是很快你将发现它很好的适应了数据库编程的常规需求。
4#
 楼主| 发表于 2007-10-15 10:23:09 | 只看该作者
1.2快速浏览
让我们看一些包含MySQL储存程序结构和功能的基本要点的简单示例,完整的内容详见第二章。

1.2.1 和SQL集成
MySQL储存过程语言一个非常重要的方面就是和SQL的紧密结合,你不需要借助于像ODBC或者JDBC这样的软件粘合剂来为你的储存程序创建独立的SQL表达式,只要简单的将UPDATE,INSERT和SELECT这样的表达式直接写进你的储存程序代码中,就像Example 1-1所显示的那样
Example 1-1. 内嵌SQL的储存程序
SQL代码

下表单

  1. 1 CREATE PROCEDURE example1( )
  2. 2 BEGIN
  3. 3 DECLARE
  4. l_book_count INTEGER;
  5. 4
  6. 5 SELECT COUNT(*)
  7. 6 INTO l_book_count
  8. 7 FROM books
  9. 8 WHERE author LIKE '%HARRISON,GUY%';
  10. 9
  11. 10 SELECT CONCAT('Guy has written (or co-written) ',
  12. 11 l_book_count ,
  13. 12 ' books.');
  14. 13
  15. 14 -- Oh, and I changed my name, so...
  16. 15 UPDATE books
  17. 16 SET author = REPLACE (author, 'GUY', 'GUILLERMO')
  18. 17 WHERE author LIKE '%HARRISON,GUY%';
  19. 18
  20. 19 END
复制代码
述了更为详细的代码信息

行号

解释

1

这个区块,是程序的头部,定义了程序的名称(example1)以及类型(PROCEDURE)
2

BEGIN关键字指示了程序体的开始,其中包含了储存过程的变量申明和可执行代码,如果程序体包含了超过一个表达式(就像这个程序中所看到的一样),那么要将多个表达式包含在BEGIN-END块中
3

这里我们申明了一个整型的变量来保存我们将要执行的数据库查询代码
5-8

我们执行了一个数据库查询来获得Guy所编写和执笔的属的总数,特别关注一些第6行:INTO子句和SELECT连用表示将数据库查询结果传递给储存程序的本地变量
10-12

我们是用了一个简单的SQL表达式(例如:没有带FROM字句)来显示书的个数。如果我们使用了没有带INTO字句的SELECT语句,那么结果将返回给调用程序,这是一个能够简单的得到结果集的非ANSI扩展(SQL Server和其他关系型数据库所采用的方式)
14

单行注释解释了UPDATE的用意
15-17

Guy大概想和他的fans讨论有关Oracle,并想改变他姓的拼写方法,所以我们对books表使用了UPDATE,得益于内建的REPLACE函数我们能将表中所有包含“GUY”的实例替换为“GUILLERMO”。


1.2.2 控制和条件逻辑
当然,现实世界中的代码具有特定的用途并且相当复杂,你不可能仅仅在其中使用一系列的SQL表达式,储存过程语言提供了我们非常丰富的条件和控制表达式,这使我们能够编写出适应给定情景的程序,它们包括:


IF和CASE表达式

这些表达式都使用不同的逻辑来实现条件逻辑,这允许我们表达像“如果书本的页数大于1000,然后…”这样的逻辑。

完整的循环和迭代控制

它包含简单循环,WHILE循环和REPEAT UNTIL循环

Example 1-2 是一个用来显示帐户金额收支平衡的储存过程,给出了MySQL的控制表达式示例:
Example 1-2 包含控制和条件逻辑的储存过程
SQL代码
  1. 1 CREATE PROCEDURE pay_out_balance
  2. 2 (account_id_in INT)
  3. 3
  4. 4 BEGIN
  5. 5
  6. 6 DECLARE l_balance_remaining NUMERIC(10,2);
  7. 7
  8. 8 payout_loop:LOOP
  9. 9 SET l_balance_remaining = account_balance(account_id_in);
  10. 10
  11. 11 IF l_balance_remaining < 1000 THEN
  12. 12 LEAVE payout_loop;
  13. 13
  14. 14 ELSE
  15. 15 CALL apply_balance(account_id_in, l_balance_remaining);
  16. 16 END IF;
  17. 17
  18. 18 END LOOP;
  19. 19
  20. 20 END
复制代码
下表阐述了更为详细的代码信息

行号

解释

1-3

这是储存过程的头部;第二行包含了过程的参数列表,接受一个数据参数(帐户的id)
6

申明了一个保存帐余额的变量
8-18

一个简单循环(这样称呼是因为使用LOOP关键字来和WHILE及REPEAT进行区别)直到帐户余额少于1000,在MySQL中我们可以命名一个循环(第8行,payout_loop),这使得我们可以在随后的代码中使用LEAVE表达式(见第12行)来结束这个特定的循环,结束循环后,MySQL引擎将执行END LOOP(见第18行)之后的代码
9

调用了函数account_balance(当然这个函数必须已经在前面的代码中被定义)来获得帐户的收支状况。MySQL允许我们在储存程序中调用别的储存程序,这可以有效的实现代码复用,如果这是一个函数,那么它将返回一个值并且能被其他储存程序和MySQL作业调度所调用
11-16

IF表达式引发了当帐户余额少于1000美元时的循环终结条件,此外(ELSE表达式)能够对收支平衡进行进一步处理,你可以用ELSEIF构建更为负责的布尔表达式
15

调用了储存过程apply_balance,这是一个代码复用的例子,与其重复apply_balance的逻辑,我们还是调用一个共享例程比较方便

1.2.3 储存函数
储存函数是能够返回一个值的储存程序,它也可以当作内建函数一样对待(调用)。


Example 1-3将在存在出生年月的情况下返回这个人的年龄:
SQL代码
  1. 1 CREATE FUNCTION f_age (in_dob datetime) returns int
  2. 2 NO SQL
  3. 3 BEGIN
  4. 4 DECLARE l_age INT;
  5. 5 IF DATE_FORMAT(NOW( ),'00-%m-%d') >= DATE_FORMAT(in_dob,'00-%m-%d') THEN
  6. 6 -- This person has had a birthday this year
  7. 7 SET l_age=DATE_FORMAT(NOW( ),'%Y')-DATE_FORMAT(in_dob,'%Y');
  8. 8 ELSE
  9. 9 -- Yet to have a birthday this year
  10. 10 SET l_age=DATE_FORMAT(NOW( ),'%Y')-DATE_FORMAT(in_dob,'%Y')-1;
  11. 11 END IF;
  12. 12 RETURN(l_age);

  13. END;
复制代码


Example 1-3. 用出生年月计算年龄的储存函数。
接下来让我们看一下具体解释

行号
解释
1
定义函数:名称,参数(日期)和返回值(整型数)。
2
这个函数没有使用SQL表达式,这将在第3章和第10章进行详细的讨论
4
申明一个用来保存我们计算出的年龄的本地变量
5-11
在这个IF-ELSE-END块中,IF块用来检测出生年月是否存在
7
如果出生年月存在,那么我们就可以用现在的年份减去出生的年份得到年龄
10
此外(如果出生年月不存在),我们必须在岁数计算中简单的减去当前的年份
12
返回年份计算的函数调用


我们可以在任何其他的储存程序,SET表达式或者在Example 1-4所显示的那样,在SQL表达式中调用我们的储存函数。

Example 1-4.在SQL表达式中使用储存函数(延续上一部分)
  1. mysql> SELECT firstname,surname, date_of_birth, f_age(date_of_birth) AS age
  2. FROM employees LIMIT 5;
  3. +-----------+---------+---------------------+------+
  4. | firstname | surname | date_of_birth       | age  |
  5. +-----------+---------+---------------------+------+
  6. | LUCAS     | FERRIS  | 1984-04-17 07:04:27 |   21 |
  7. | STAFFORD  | KIPP    | 1953-04-22 06:04:50 |   52 |
  8. | GUTHREY   | HOLMES  | 1974-09-12 08:09:22 |   31 |
  9. | TALIA     | KNOX    | 1966-08-14 11:08:14 |   39 |
  10. | JOHN      | MORALES | 1956-06-22 07:06:14 |   49 |
  11. +-----------+---------+---------------------+------+
复制代码


1.2.4.当发生错误时
即使我们的程序被反复检查并没有bug,我们的输入错误仍然可能发生,MySQL储存程序语言提供了一种错误处理的强大机制,在Example 1-5中,我们创建一个产品代号,如果产品已存在,我们就用新的名称更新它,储存过程的错误处理机制检测到我们试图使用一个重复的值,如果尝试插入失败,错误将被捕获并且使用UPDATE替换INSERT,如果没有错误处理,储存程序将被终止执行,并且错误将被返回给它的调用程序。

Example 1-5 错误处理
SQL代码

    1. 1 CREATE PROCEDURE sp_product_code
    2. 2 (in_product_code VARCHAR(2),
    3. 3 in_product_name VARCHAR(30))
    4. 4
    5. 5 BEGIN
    6. 6
    7. 7 DECLARE l_dupkey_indicator INT DEFAULT 0;
    8. 8 DECLARE duplicate_key CONDITION FOR 1062;
    9. 9 DECLARE CONTINUE HANDLER FOR duplicate_key SET l_dupkey_indicator =1;
    10. 10
    11. 11 INSERT INTO product_codes (product_code, product_name)
    12. 12 VALUES (in_product_code, in_product_name);
    13. 13
    14. 14 IF l dupkey_indicator THEN
    15. 15 UPDATE product_codes
    16. 16 SET product_name=in_product_name
    17. 17 WHERE product_code=in_product_code;
    18. 18 END IF;
    19. 19
    20. 20 END
    复制代码


让我们看一下有关错误处理的详细内容
行号
解释
1-4
这是程序的头部,包含了两个输入参数产品代号和产品名称
7
申明了一个用来检测重复值出现的标志变量,这个变量被初始化为0(false);后续的代码将保证在重复值被替换时将把这个变量设置为1(true)。
8
命名一个条件duplicate_key和MySQL系统错误1062相匹配,虽然这一步并非必需,但是我们建议你定义一个条件来改善你代码的可靠性(现在你可以使用错误名称而不是代码来引用这个错误)
9
定义一个错误处理器,它将在后续的代码中重复值出现的时候将l_dupkey_indicator变量的值设置为1(true)
11-12
插入用户提供的代号和名称
14
检测变量l_dupkey_indicator的值,如果仍为0,那么说明我们的插入成功了,如果值被修改成了1(true),我们就知道出现了重复值,我们可以在地15-17行代码使用UPDATE表达式将原来的产品名称和代号进行更新

错误处理时写出健壮,可维护MySQL储存程序的重要方面,第6章将带我们见识几种不同的错误处理机制。

1.2.5 触发器
触发器是一种用来相应数据库事件是自动回调的储存程序,在MySQL5的实现中,触发器将在特定表的DML(数据库操纵语言)激活时被回调,触发器可以用来自动计算引用值或者格式化值。Example 1-6展示了用于维护引用值的触发器;当员工salary的值被改变是,contrib_401K列将被自动修改为特定值。

Example 1-6.维护引用列的触发器
SQL代码
  1. 1 CREATE TRIGGER employees_trg_bu
  2. 2 BEFORE UPDATE ON employees
  3. 3 FOR EACH ROW
  4. 4 BEGIN
  5. 5 IF NEW.salary <50000 THEN
  6. 6 SET NEW.contrib_401K=500;
  7. 7 ELSE
  8. 8 SET NEW.contrib_401K=500+(NEW.salary-50000)*.01;
  9. 9 END IF;
  10. 10 END
复制代码
下表用来解释这个短小的触发器的代码

行号
解释
1

一个触发器有它独立的名称,通常,我们用名称来描述它的作用,举例来说,名称中的“bu”表示BEFORE UPDATE(在更新前)使用的触发器
2
定义一个触发器激活条件,在这个例子中,触发器代码将在UPDATE表达式起作用前被触发
3

FOR EACH ROW关键字指示了触发器将在所有的记录被DML表达式作用前被触发。这个字句在MySQL5的触发器实现中是强制执行的
4-10
BEGIN-END定义了将被激活的触发器代码
5-9

自动修改emplyees表中contrib_401K列。如果salary列的值小于50000,contrib_401K列将被设置为500,否则,这个值就参与执行第8行的计算


当然,还有有关MySQL储存过程值得说的很多故事,所以你还有上百页的书要看,这些基础的代码主要是让你培养一种对储存程序语言良好的感觉,其中的一些是很重要的语法点,请轻松的面对你所要写和阅读的语言代码。
5#
 楼主| 发表于 2007-10-15 11:18:23 | 只看该作者
注意:这一章中有关书籍和网站的列表内容我暂时没有翻译,有兴趣的读者可以看一下,容我把全书翻完后在细致的来做这些工作


1.3 为开发者准备的储存过程参考资料
已经介绍过MySQL5的储存程序在整个MySQL语言的演进过程中具有里程碑的意义。为了能够全神贯注于任何新技术的需要,技术用户需要大量的技术资料的支持,我们的目标是介绍尽可能全面资料来覆盖MySQL储存程序语言。

我们确信,无论如何你需要很多不同的帮助,所以我们在下面的章节中介绍了完整的书籍(作为其他MySQL技术的参考信息)或者社区支持和只需的新闻内容。在这些章节中我们将提供很多相关信息的概要。这些有极大作用的资源大多数都可以免费获得或以低廉的价格得到,你将在高MySQL开发体验上获得巨大的帮助

1.3.1 书
长期以来,O’Reilly的MySQL系列积累了大量的书籍。在此我们列出了一些我们认为MySQL储存程序开发者应该关心的书籍。当然也包括了其他出版社的书籍,请在O’Reilly OnLAMP 网站的MySQL区查看相关完整列表
http://www.onlamp.com/onlamp/general/mysql.csp

MySQL Stored Procedure Programming, by Guy Harrison with Steven Feuerstein
This is the book you are holding now (or maybe even viewing online). This book was designed to be a complete and comprehensive guide to the MySQL stored program language. However, this book does not attempt complete coverage of the MySQL server, the SQL language, or other programming languages that you might use with MySQL. Therefore, you might want to complement this book with one or more other topics from the O’Reilly catalog or evenheaven forbidfrom another publisher!

MySQL in a Nutshell, by Russell Dyer
This compact quick-reference manual covers the MySQL SQL language, utility programs, and APIs for Perl, PHP, and C. This book is the ideal companion for any MySQL user (O’Reilly).

Web Database Applications with PHP and MySQL, by Hugh Williams and David Lane
This is a comprehensive guide to creating web-based applications using PHP and MySQL. It covers PEAR (PHP Extension and Application Repository) and provides a variety of complete case studies (O’Reilly).

MySQL, by Paul DuBois
This classic referencenow in its third editionis a comprehensive reference to MySQL development and administration. The third edition includes prerelease coverage of MySQL 5.0, including some information about stored procedures, functions, and triggers (SAMS).

High Performance MySQL, by Jeremy Zawodny and Derek Balling
This book covers the construction of high-performance MySQL server environments, along with how you can tune applications to take advantage of these environments. The book focuses on optimization, benchmarking, backups, replication, indexing, and load balancing (O’Reilly).

MySQL Cookbook, by Paul DuBois
This cookbook provides quick and easily applied recipes for common MySQL problems ranging from program setup to table manipulation and transaction management to data import/export and web interaction (O’Reilly).

Pro MySQL, by Michael Krukenberg and Jay Pipes
This book covers many advanced MySQL topics, including index structure, internal architecture, replication, clustering, and new features in MySQL 5.0. Some coverage of stored procedures, functions, and triggers is included, although much of the discussion is based on early MySQL 5 beta versions (APress).

MySQL Design and Tuning, by Robert D. Schneider
This is a good source of information on advanced development and administration topics, with a focus on performance (MySQL Press).

SQL in a Nutshell, by Kevin Kline, et al.
MySQL stored procedures, functions, and triggers rely on the SQL language to interact with database tables. This is a reference to the SQL language as implemented in Oracle, SQL Server, DB2, and MySQL (O’Reilly).

Learning SQL, by Alan Beaulieu
This book provides an excellent entry point for those unfamiliar with SQL. It covers queries, grouping, sets, filtering, subqueries, joins, indexes, and constraints, along with exercises (O’Reilly).

1.3.2网络资源
网络上同样有大量关于MySQL程序员的极好的网站,包括一些关心储存过程的领域
当然我们于书籍相配套的网站上面也有更新和勘误表以及MySQL的信息,你也应该关心一下


MySQL
MySQL AB offers the most comprehensive collection of white papers, documentation, and forums on MySQL in general and MySQL stored programming in particular. Start at
http://www.mysql.com. We outline some specific areas later.

MySQL Developer Zone
http://dev.mysql.com/ is the main entry point for MySQL programmers. From here you can easily access software downloads, online forums, white papers, documentation, and the bug-tracking system.

MySQL online documentation
The MySQL reference manualincluding sections on stored procedures, functions, and triggersis available online at
http://dev.mysql.com/doc/. You can also download the manual in various formats from here, or you can order various selections in printed book format at http://dev.mysql.com/books/mysqlpress/index.html.

MySQL forums
MySQL forums are great places to discuss MySQL features with others in the MySQL community. The MySQL developers are also frequent participants in these forums. The general forum index can be found at
http://forums.mysql.com/. The stored procedure forum includes discussions of both procedures and functions, and there is a separate forum for triggers.

MySQL blogs
There are many people blogging about MySQL nowadays, and MySQL has consolidated many of the most significant feeds on the Planet MySQL web site at
http://www.planetmysql.org/.

MySQL stored routines library
Giuseppe Maxia initiated this routine library, which collects general-purpose MySQL 5 stored procedures and functions. The library is still young, but already there are some extremely useful routines available. For example, you will find routines that emulate arrays, automate repetitive tasks, and perform crosstab manipulations. Check it out at
http://savannah.nongnu.org/projects/mysql-sr-lib/.

O’Reilly’s OnLAMP MySQL section
O’Reilly hosts the OnLAMP site, which is dedicated to the LAMP stack (Linux, Apache, MySQL, PHP/Perl/Python) of which MySQL is such an important part. OnLAMP includes numerous MySQL articles, which you can find at
http://www.onlamp.com/onlamp/general/mysql.csp.
6#
 楼主| 发表于 2007-10-15 11:20:02 | 只看该作者
1.4 给开发者的建议
事实上,每个人对于MySQL储存程序开发都会感到陌生,因为储存程序本身对于MySQL就是新事物,但是,Guy和Steven在其他关系型数据库的储存程序编程上拥有大量的经验,特别是Steven,他在Oracle PL/SQL(Oracle的储存程序语言)的开发商拥有超过十年的经验。我们希望这些建议能帮助你更有效的理解MySQL编程语言的强大魅力

1.4.1万事不能操之过急
我们总是为限定的工期拼命的工作,追逐一个又一个的新事物,新潮流,我们没有时间可以浪费,我们有大量的代码要写,要怎样才能让我们恢复正常?

如果你想一下子接触深度的代码结构,奴隶般的将需求转化为数百行,千行甚至数万行,那么你将被巨大的混乱所摧毁,你的程序将变得难以调试和维护,不要被紧张的开发期限所压垮,我们更希望你能在紧张的期限中做好周密的计划。
我们强烈建议你顶住时间的压力,在你开始新的应用之前做好以下准备:

在你写代码之前建立良好的测试机制和测试脚本
你必须在动手写第一行代码之前给怎样才算一个成功的实现下一个定义。你更像是在为你的程序的该做什么建立一个接口,并彻底搞清楚这些功能的区别

为开发人员在应用程序中所写的SQL表达式建立清晰的规则
总体来说,我们建议你认清这样一个事实:开发者并不需要写一大堆的SQL代码,相反的,各种对数据的查询,插入和更新操作都必须隐藏在我们预先建立并通过大量测试的储存过程函数中(这被称为数据封装),这样做你的程序就能比使用大量离散的SQL表达式写出的程序更易于被优化,测试和维护。

为开发人员在错误处理上建立清晰的规则
如果你不树立标准,那么每个人都会有他自己的错误处理方法或者根本就不处理,这会造成软件混乱。最好的方法是将错误的处理逻辑集中在一个储存过程集合中,这个集合中的过程是专注于错误消息保存,错误的引发和传播方式的内部代码块(言下之意就是将错误处理的复杂度封装在这个过程集合中),并且保证你的开发者不需要为了错误处理而建立非常复杂的代码。

必须分配充足的时间,使用抽丝剥茧的方法(逐层封装复杂度,也就是a.k.a的从上之下的设计模式)来消除你需求中的复杂度
我们时常要面对非常复杂的需求实现,如果你把所有的东西都放在一个“万能”的程序中,那么很快你就会发现这些意大利面式的代码将是你在随后的日子里对代码的理解造成极大的困难,把你的巨大挑战分解为一个个更小的问题,并把这些容易解决的小问题写成大小可以接受的程序,这样做,你将发现程序的可执行段明显的缩小,可读性也提高了,你的代码将变得易于维护又节省了时间。

当你开始写代码的时候其实只有很少事情是你要放在心上的,请记住:在软件开发也盲目求速只能造成更大的浪费和更多bug。

1.4.2 不要害怕请教问题
事实是这样,如果你是个专业的软件从业者,那么你一定很聪明,受过良好的教育,你学习认真,你经验丰富,而且你写出了如此生动的代码,你能解决大多数的问题,这是你骄傲。

不幸的是,你的成功却是你自大,傲慢,不再听取别人的意见(我想大家都知道答案)软件开发也是动态发展的,而这也使之成为最有危机的行业。

软件是有人写的:因此认识人的心理成为软件开发的重要坏节。

这里有一个例子:
Joe,一个由6人组成的高级软件开发团队的头目,在他的软件里出现了一个问题,他在这个问题上花了大量的时间,也经受了大量的挫败,但他始终未能指出bug的源头。他不想去问他的助手,因为他们的经验都没有自己丰富,最后他穷尽脑汁也未能奏效,他只得放弃,在叹息声中他打电话求援:"Sandra,你能不能过来看看我程序中的问题,我不知道错在哪里?"Sandra停下手中的活儿很快的浏览了以下代码,并很快指出了长期以来他没有注意到的问题,程序就这样被修复了,Joe表示感谢,但事实上他内心非常尴尬。

就像“为什么我没看到”还有“如果我在自己这儿多做五分钟的调试就能发现它”这样的念头始终在Joe的心中环绕,他无法理解,但事实上他被误导了,原因就在于我们已经太熟悉自己写的代码了,有些时候我们需要的仅仅是一个新的视角,某人和善的一个建议可能就能打开新的视野,这与资历,能力和经验无关。

此外,Sandra并不认为Joe很差劲,相反的,通过相互的帮助,Joe是他自己更具人情味儿,这对团队开发有很大的好处
我们强烈的建议您在团队的管理中贯彻以下方针

原谅无知
在应用程序开发过程中隐藏你的无知是件及其危险的事情,培养一种能够把“I don’t know”说出口的氛围并且鼓励问问题
请求帮助
如果你在30分钟内不能指出代码中的bug,那么请立即请教别人,这样也就建立了一种“责任机制”,使得每一个被你问起的人都有一种责任感。不要让你一个人孤立的寻找问题的答案。
建立一种代码互查机制
不要让你的代码敲上“金牌质量”的标签或者经不起你团队中任何人的批评(建设性的意见)

1.4.3 打破条条框框
我们都会落入俗套,在这一点上每个人你的方方面面都是相同的,人有创造的天性:你只用学过的一种方法编写代码;你的产品的功能限制有不自觉的假定;你不加思索就抛弃了可能的解决方案,开发者对他们的程序都有自己的偏见,他们总是不恰当的说出这种话:
  • “它就像猪一样不可能让它再快了”
  • “我不能按照用户的预想来实现,这得等到下一个版本”
  • “我用过很多产品,但是他们都是小儿科,放在你眼前的这个不同,它的任何方面都已经做得相当出色”

但事实是你的程序总能运行的更快一些,别人总能把功能做的符合用户的要求,产品虽然都有它的限制,能力范围和弱点,但你永远都不要指望在下一个版本中去完善它,这种不需要借口,没有等待的解决问题的风格不是更能让人满意吗?
你究竟在干什么?打破你自以为是的那成百上千的阅历(或是你自己的小世界),估量你平日里养成的编程习惯。抛弃那些旧方法和你对产品固有性能的一切偏见已经成为现在商业社会的一股强大力量。


尝试各种新事物:用违背常理的方法去实验,你将发现作为一个程序员或者问题解决大师你将能学到多么不可思议的东西。长期以来,在一次次追问自己什么才是终极目标时总是惊奇的发现,当我们谦虚的点点头,轻声询问自己:“如果这样做会发生什么”总会比傲慢的说“你不可能做到”获得的更多。
7#
 楼主| 发表于 2007-10-15 11:20:31 | 只看该作者
1.5 结语
在这一章中,我们带大家快速浏览了MySQL关系型数据库及MySQL储存过程语言的大致情况。我们同样提供了大量的可用资源和建议,希望能给你带来帮助。

在下一掌中,我们将正式开始进行MySQL储存过程,函数和触发器的学习,并会提供更多的相关内容。
8#
发表于 2009-8-11 11:12:44 | 只看该作者
请问以下SqlServer中的存储过程如何转换成mysql中的呢,我自己试了一下,可是在mysql还是无法执行,请各位帮帮忙。
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

CREATE   PROCEDURE getNextSeq2 @tableName varchar(255), @nextseq numeric(10) output, @lastseq numeric(10) output AS
        update CAREFX_TABLE_SEQ
        set @lastseq = seq = seq + 10
        where table_name=@tableName
        set @nextseq = @lastseq-10
        set @lastseq = @lastseq-1

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
9#
发表于 2011-5-11 12:16:16 | 只看该作者
开始学习存储过程。 留个纪念点。[g:15]
10#
发表于 2011-6-20 18:25:13 | 只看该作者
不错,很详细,我喜欢
11#
发表于 2011-8-6 18:33:19 | 只看该作者
先顶在看 谢谢楼主 正在学习中。
     
12#
发表于 2011-11-26 22:55:53 | 只看该作者
先顶顶,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-4-27 08:46 , Processed in 0.079426 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表