Stored Procedure(存储过程)编写经验和优化措施
2007-11-11 08:01:05 来源:WEB开发网Introduction 简介
MySQL(和PHP搭配之最佳组合) 5.0 新特性教程是为需要了解5.0版本新特性的MySQL(和PHP搭配之最佳组合)老用户而写的。简单的来说是介绍了“存储过程、触发器、视图、信息架构视图”,在此感谢译者陈朋奕的努力.希望这本书能像内行专家那样与您进行对话,用简单的问题、例子让你学到需要的知识。为了达到这样的目的,我会从每一个细节开始慢慢的为大家建立概念,最后会给大家展示较大的实用例,在学习之前也许大家会认为这个用例很难,但是只要跟着课程去学,相信很快就能掌握。
Conventions and Styles 约定和编程风格
每次我想要演示实际代码时,我会对MySQL(和PHP搭配之最佳组合)客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样。
在这里举个例子:MySQL(和PHP搭配之最佳组合)> DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec)
如果实例比较大,则需要在某些行和段落间加注释,同时我会用将“ <--”符号放在页面的右边以表示强调。
例如:
MySQL(和PHP搭配之最佳组合)> CREATE PROCEDURE p ()-> BEGIN/* This procedure does nothing */ <---> END;//Query OK, 0 rows affected (0.00 sec)
有时候我会将例子中的"MySQL(和PHP搭配之最佳组合)> "和"-> "这些系统显示去掉,你可以直接将代码复制到MySQL(和PHP搭配之最佳组合)客户端程序中(如果你现在所读的不是电子版的,可以在MySQL(和PHP搭配之最佳组合).com网站下载相关脚本)所以的例子都已经在Suse 9.2 Linux、MySQL(和PHP搭配之最佳组合) 5.0.3公共版上测试通过。
在您阅读本书的时候,MySQL(和PHP搭配之最佳组合)已经有更高的版本,同时能支持更多OS了,包括Windows,Sparc,HP-UX。因此这里的例子将能正常的运行在您的电脑上。但如果运行仍然出现故障,可以咨询你认识的资深MySQL(和PHP搭配之最佳组合)用户,以得到长久的支持和帮助。
所以存储过程是可复用的组件!想象一下如果你改变了主机的语言,这对存储过程不会产生影响,因为它是数据库逻辑而不是应用程序。存储过程是可以移植的!当你用SQL编写存储过程时,你就知道它可以运行在MySQL(和PHP搭配之最佳组合)支持的任何平台上,不需要你额外添加运行环境包,也不需要为程序在操作系统中执行设置许可,或者为你的不同型号的电脑存储过程将被保存!如果你编写好了一个程序,例如显示银行事物处理中的支票撤消,那想要了解支票的人就可以找到你的程序。
它会以源代码的形式保存在数据库中。这将使数据和处理数据的进程有意义的关联这可能跟你在课上听到的规划论中说的一样。存储过程可以迁移!
MySQL(和PHP搭配之最佳组合)完全支持SQL 2003标准。某些数据库(如DB2、Mimer)同样支持。但也有部分不支持的,如Oracle(大型网站数据库平台)、sql server(WINDOWS平台上强大的数据库平台)不支持。我们将会给予足够帮助和工具,使为其他DBMS编写的代码能更容易转移到MySQL(和PHP搭配之最佳组合)上。
Setting up with MySQL(和PHP搭配之最佳组合) 5.0 设置并开始MySQL(和PHP搭配之最佳组合) 5.0服务
通过
MySQL(和PHP搭配之最佳组合)_fix_privilege_tables
~/MySQL(和PHP搭配之最佳组合)-5.0/scripts/MySQL(和PHP搭配之最佳组合)_install_db
来开始MySQL(和PHP搭配之最佳组合)服务
作为我们练习的准备工作的一部分,我假定MySQL(和PHP搭配之最佳组合) 5.0已经安装。如果没有数据库管理员为你安装好数据库以及其他软件,你就需要自己去安装了。不过你很容易忘掉一件事,那就是你需要有一个名为MySQL(和PHP搭配之最佳组合).proc的表。
在安装了最新版本后,你必须运行
MySQL(和PHP搭配之最佳组合)_fix_privilege_tables
或者
MySQL(和PHP搭配之最佳组合)_install_db
(只需要运行其中一个就够了)——不然存储过程将不能工作。我同时启用在root身份后运行一个非正式的SQL脚本,如下:
MySQL(和PHP搭配之最佳组合)> source/home/pgulutzan/MySQL(和PHP搭配之最佳组合)-5.0/scripts/MySQL(和PHP搭配之最佳组合)_prepare_privilege_tables_for_5.sql
Starting the MySQL(和PHP搭配之最佳组合) Client 启动MySQL(和PHP搭配之最佳组合)客户端
这是我启动MySQL(和PHP搭配之最佳组合)客户端的方式。你也许会使用其他方式,如果你使用的是二进制版本或者是Windows系统的电脑,你可能会在其他子目录下运行以下程序:
easy@PHPv:~> /usr/local/MySQL(和PHP搭配之最佳组合)/bin/MySQL(和PHP搭配之最佳组合) --user=root
Welcome to the MySQL(和PHP搭配之最佳组合) monitor. Commands end with ; or \g.
Your MySQL(和PHP搭配之最佳组合) connection id is 1 to server version: 5.0.3-alpha-debug
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
在演示中,我将会展示以root身份登陆后的MySQL(和PHP搭配之最佳组合)客户端返回的结果,这样意味着我有极大的特权。
Check for the Correct Version 核对版本
为了确认使用的MySQL(和PHP搭配之最佳组合)的版本是正确的,我们要查询版本。我有两种方法确认我使用的是5.0版本:
SHOW VARIABLES LIKE 'version';
or
SELECT VERSION();
例如:
MySQL(和PHP搭配之最佳组合)> SHOW VARIABLES LIKE 'version';
+---------------+-------------------+
| Variable_name | Value |
+---------------+-------------------+
| version | 5.0.3-alpha-debug |
+---------------+-------------------+
1 row in set (0.00 sec)
MySQL(和PHP搭配之最佳组合)> SELECT VERSION();
+-------------------+
| VERSION() |
+-------------------+
| 5.0.3-alpha-debug |
+-------------------+
1 row in set (0.00 sec)
当看见数字'5.0.x' 后就可以确认存储过程能够在这个客户端上正常工作。
The Sample "Database" 示例数据库
现在要做的第一件事是创建一个新的数据库然后设定为默认数据库实现这个步骤的SQL
语句如下:
CREATE DATABASE db5;
USE db5;
例如:
MySQL(和PHP搭配之最佳组合)> CREATE DATABASE db5;
Query OK, 1 row affected (0.00 sec)
MySQL(和PHP搭配之最佳组合)> USE db5;
Database changed
在这里要避免使用有重要数据的实际的数据库然后我们创建一个简单的工作表。
实现这个步骤的SQL
语句如下:
MySQL(和PHP搭配之最佳组合)> CREATE DATABASE db5;
Query OK, 1 row affected (0.01 sec)
MySQL(和PHP搭配之最佳组合)> USE db5;
Database changed
MySQL(和PHP搭配之最佳组合)> CREATE TABLE t (s1 INT);
Query OK, 0 rows affected (0.01 sec)
MySQL(和PHP搭配之最佳组合)> INSERT INTO t VALUES (5);
Query OK, 1 row affected (0.00 sec)
你会发现我只在表中插入了一列。这样做的原因是我要保持表的简单,因为在这里并不需要展示查询数据的技巧,而是教授存储过程,不需要使用大的数据表,因为它本身已经够复杂了。
这就是示例数据库,我们将从这个名字为t的只包含一列的表开始Pick a Delimiter 选择分隔符
现在我们需要一个分隔符,实现这个步骤的SQL语句如下:
DELIMITER //
例如:
MySQL(和PHP搭配之最佳组合)> DELIMITER //
分隔符是你通知MySQL(和PHP搭配之最佳组合)客户端你已经完成输入一个SQL语句的字符或字符串符号。一直以来我们都使用分号“;”,但在存储过程中,这会产生不少问题,因为存储过程中有许多语句,所以每一个都需要一个分号因此你需要选择一个不太可能出现在你的语句或程序中的字符串作为分隔符。我曾用过双斜杠“//”,也有人用竖线“|”。我曾见过在DB2程序中使用“@”符号的,但我不喜欢这样。你可以根据自己的喜好来选择,但是在这个课程中为了更容易理解,你最好选择跟我一样。如果以后要恢复使用“;”(分号)作为分隔符,输入下面语句就可以了:
"DELIMITER ;//".
CREATE PROCEDURE Example 创建程序实例
CREATE PROCEDURE p1 () SELECT * FROM t; //
也许这是你使用MySQL(和PHP搭配之最佳组合)创建的第一个存储过程。假如是这样的话,最好在你的日记中记下这个重要的里程碑。
CREATE PROCEDURE p1 () SELECT * FROM t; // <--
SQL语句存储过程的第一部分是“CREATE PROCEDURE”:
CREATE PROCEDURE p1 () SELECT * FROM t; // <--
第二部分是过程名,上面新存储过程的名字是p1。Digression: Legal Identifiers 题外话:合法标识符的问题 存储过程名对大小写不敏感,因此‘P1’和‘p1’是同一个名字,在同一个数据库中你将不能给两个存储过程取相同的名字,因为这样将会导致重载。某些DBMS允许重载(Oracle(大型网站数据库平台)支持),但是MySQL(和PHP搭配之最佳组合)不支持(译者话:希望以后会支持吧。)。
你可以采取“数据库名.存储过程名”这样的折中方法,如“db5.p1”。存储过程名可以分开,它可以包括空格符,其长度限制为64个字符,但注意不要使用MySQL(和PHP搭配之最佳组合)内建函数的名字,如果这样做了,在调用时将会出现下面的情况:
MySQL(和PHP搭配之最佳组合)> CALL pi();Error 1064 (42000):
You have a syntax error.MySQL(和PHP搭配之最佳组合)> CALL pi ();
Error 1305 (42000): PROCEDURE does not exist.
在上面的第一个例子里,我调用的是一个名字叫pi的函数,但你必须在调用的函数名后加上空格,就像第二个例子那样。CREATE PROCEDURE p1 () SELECT
更多精彩
赞助商链接