MySQL 5.0新特性教程 存储进程:第一讲

   泉源:网海拾贝  




作者:mysql AB;翻译:陈朋奕

Introduction 简介

MySQL 5.0 新特性教程是为必要看法5.0版本新特性的MySQL老用户而写的。复杂的来说是介绍了“存储进程、触发器、视图、信息架构视图”,在此谢谢译者陈朋奕的欢腾.

  希冀这本书能像内行专家那样与您中止对话,用复杂的成绩、例子让你学到必要的知识。为了达到这样的目的,我会从每一个细节开端渐渐的为大年夜家设立设置配备摆设观点,末了会给大年夜家展示较大年夜的实用例,在进修之前大概大年夜家会以为这个用例很难,但是只需随着课程去学,相信很快就能把握。

Conventions and Styles 约定和编程作风

  每次我想要演示实际代码时,我会对mysql客户真个屏幕就出现的代码中止调整,将字体改成Courier,使他们看起来与通俗文本不一样。

  在这里举个例子:mysql> DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec)

  如果实例比力大年夜,则必要在某些行和段落间加表明,同时我会用将“<--”标志放在页面的右边以表示夸大。

  譬喻:


mysql> CREATE PROCEDURE p ()
-> BEGIN
-> /* This procedure does nothing */ <--
-> END;//Query OK, 0 rows affected (0.00 sec)

  无意辰我会将例子中的"mysql>"和"->"这些系统显示去丢掉,你可以直接将代码复制到mysql客户端顺序中(如果你现在所读的不是电子版的,可以在mysql.com网站下载相关脚本)以是的例子都已经在Suse 9.2 Linux、Mysql 5.0.3大众版上测试经由进程。

  在您阅读本书的时辰,Mysql已经有更高的版本,同时能撑持更多OS了,包罗Windows,Sparc,HP-UX。是以这里的例子将能正常的运转在您的电脑上。但如果运转仿照照旧出现弊端,可以咨询你看法的资深Mysql用户,以取得耐久的撑持和扶助。

A Definition and an Example 界说及实例

  界说及实例存储进程是一种存储在书库中的顺序(就像正轨言语里的子顺序一样),准确的来说,MySQL撑持的“routines(例程)”有两种:一是我们说的存储进程,二是在其他SQL语句中可以前往值的函数(运用起来和Mysql预装载的函数一样,如pi())。我在本书内中会更往往运用存储进程,由于这是我们过去的习气,相信大年夜家也会吸收。

  一个存储进程包罗名字,参数列表,以及可以包罗良多SQL语句的SQL语句集。

  在这里对部分变量,异常处置处罚,循环控制和IF前提句有新的语法界说。

  上面是一个包罗存储进程的实例声明:(译注:为了等闲阅读,尔后的顺序不添任何中文表明)


CREATE PROCEDURE procedure1 /* name存储进程名*/

(IN parameter1 INTEGER) /* parameters参数*/

BEGIN /* start of block语句块头*/

DECLARE variable1 CHAR(10); /* variables变量声明*/

IF parameter1 = 17 THEN /* start of IF IF前提开端*/

SET variable1 = 'birds'; /* assignment赋值*/

ELSE

SET variable1 = 'beasts'; /* assignment赋值*/

END IF; /* end of IF IF结束*/

INSERT INTO table1 VALUES (variable1);/* statement SQL语句*/

END /* end of block语句块结束*/

  上面我将会介绍你可以哄骗存储进程做的任务的统统细节。同时我们将介绍新的数据库工具—触发器,由于触发器和存储进程的关联是肯定的。

Why Stored Procedures 为什么要用存储进程

  由于存储进程搪塞MySQL来说是新的苦守,很自然的在运用时你必要更加详尽。

  终究后果,在此之前没有任何人运用过,也没有良多大年夜量的有经历的用户来带你走他们走过的路。但是你应该开端思索把现有顺序(大概在效劳器使用顺序中,用户自界说函数(UDF)中,或是脚本中)转移到存储进程中来。这样做不必要原因,你不得不去做。

  由于存储进程是已经被认证的技术!当然在Mysql中它是新的,但是相反苦守的函数在其他DBMS中早已存在,而它们的语法往是相反的。是以你可以从其别人那边取得这些观点,也有良多你可以咨询大年夜约招聘的经历用户,尚有良多第三方的文档可供你阅读。

  存储进程会使系统运转更快!当然我们且则不能在Mysql上证实这个上风,用户取得的体验也不一样。我们可以说的就是Mysql效劳器在缓存机制上做了刷新,就像Preparedstatements(预处置处罚语句)所做的那样。由于没有编译器,是以SQL存储进程不会像内部言语(如C)编写的顺序运转起来那么快。但是提升速度的主要方法却在于可否飞腾网络信息流量。如果你必要处置处罚的是必要查抄、循环、多语句但没有效户交互的反复性任务,你就可以运用糊口在效劳器上的存储进程来完成。这样在实行任务的每一步时效劳器和客户端之间就没那么多的信息交游了。

  以是存储进程是可复用的组件!想象一下如果你变化了主机的言语,这对存储进程不会产生影响,由于它是数据库逻辑而不是使用顺序。存储进程是可以移植的!当你用SQL编写存储进程时,你就知道它可以运转在Mysql撑持的任何平台上,不必要你额外添加运转情况包,也不必要为顺序在操纵系统中实行设置承诺,大年夜约为你的不合型号的电脑存储进程将被糊口!如果你编写好了一个顺序,譬喻显示银行事物处置处罚中的支票吊销,那想要看法支票的人就可以找到你的顺序。

  它会以源代码的方法糊口在数据库中。这将使数据和处置处罚数据的进程居心义的关联这大概跟你在课上听到的规画论中说的一样。存储进程可以迁移!

  Mysql完全撑持SQL 2003尺度。某些数据库(如DB2、Mimer)异常撑持。但也有部分不撑持的,如Oracle、SQL Server不撑持。我们将会给予足够扶助和工具,使为其他DBMS编写的代码能更随便转移到Mysql上。

Setting up with MySQL 5.0 设置并开端MySQL 5.0效劳

  经由进程
  mysql_fix_privilege_tables

  大年夜约
  ~/mysql-5.0/scripts/mysql_install_db

  来开端MySQL效劳
  作为我们操练的筹办任务的一部分,我假定MySQL 5.0已经安装。如果没稀有据库治理员为你安装好数据库以及其他软件,你就必要自己去安装了。不过你很随便忘丢掉一件事,那就是你必要有一个名为mysql.proc的表。

  在安装了最新版本后,你必须运转


mysql_fix_privilege_tables

  大年夜约
mysql_install_db

  (只必要运转其中一个就够了)——不然存储进程将不能任务。我同时启用在root身份后运转一个非正式的SQL脚本,如下:
mysql>source/home/pgulutzan/mysql-5.0/scripts/mysql_prepare_privilege_tables_for_5.sql


Starting the MySQL Client 启动MySQL客户端

  这是我启动mysql客户真个方式。你大概会运用其他方式,如果你运用的是二进制版今大年夜约是Windows系统的电脑,你大概会在其他子目录下运转以下顺序:
easy@phpv:~> /usr/local/mysql/bin/mysql --user=root
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL 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客户端前往的后果,这样意味着我有极大年夜的特权。

Check for the Correct Version 核对版本
  为了确认运用的MySQL的版本是准确的,我们要盘问版本。我有两种方法确认我运用的是5.0版本:
SHOW VARIABLES LIKE 'version';

or
SELECT VERSION();

 

  譬喻:
mysql> SHOW VARIABLES LIKE 'version';
--------------- -------------------
| Variable_name | Value |
--------------- -------------------
| version | 5.0.3-alpha-debug |
--------------- -------------------
1 row in set (0.00 sec)
mysql> 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> CREATE DATABASE db5;
Query OK, 1 row affected (0.00 sec)
mysql> USE db5;
Database changed

  在这里要避免运用有求助数据的实际的数据库然后我们创立一个复杂的任务表。
  完成这个步骤的SQL
  语句如下:
mysql> CREATE DATABASE db5;
Query OK, 1 row affected (0.01 sec)
mysql> USE db5;
Database changed
mysql> CREATE TABLE t (s1 INT);
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO t VALUES (5);
Query OK, 1 row affected (0.00 sec)

  你会缔造我只在表中拔出了一列。这样做的原因是我要连结表的复杂,由于在这里并不必要展示盘问数据的才智,而是教授存储进程,不必要运用大年夜的数据表,由于它自己已经够庞大了。

  这就是示例数据库,我们将从这个名字为t的只包罗一列的表开端Pick a Delimiter 选择离开符
现在我们必要一个离开符,完成这个步骤的SQL语句如下:
  DELIMITER //

  譬喻:
  mysql> DELIMITER //

  离开符是你通知mysql客户端你已经完成输出一个SQL语句的字符或字符串标志。一直以来我们都运用分号“;”,但在存储进程中,这会产生不少成绩,由于存储进程中有良多语句,以是每一个都必要一个分号是以你必要选择一个不太大概出现在你的语句或顺序中的字符串作为离开符。我曾用过双斜杠“//”,也有人用竖线“|”。我曾见过在DB2顺序中运用“@”标志的,但我不喜好这样。你可以依据自己的兴味来选择,但是在这个课程中为了更随便看法,你最好选择跟我一样。如果以后要规复运用“;”(分号)作为离开符,输出上面语句就可以了:
"DELIMITER ;//".
CREATE PROCEDURE Example 创立顺序实例
CREATE PROCEDURE p1 () SELECT * FROM t; //

  大概这是你运用Mysql创立的第一个存储进程。假如是这样的话,最亏得你的日记中记下这个求助的里程碑。
CREATE PROCEDURE p1 () SELECT * FROM t; // <--

  SQL语句存储进程的第一部分是“CREATE PROCEDURE”:
CREATE PROCEDURE p1 () SELECT * FROM t; // <--

  第二部分是进程名,上面新存储进程的名字是p1。

Digression: Legal Identifiers 题外话:合法标识符的成绩

  存储进程名对大年夜小写不敏感,是以‘P1’和‘p1’是同一个名字,在同一个数据库中你将不能给两个存储进程取相反的名字,由于这样将会招致重载。某些DBMS承诺重载(Oracle撑持),但是MySQL不撑持(译者话:希冀以后会撑持吧。)。

  你可以采取“数据库名.存储进程名”这样的折中方法,如“db5.p1”。存储进程名可以离开断绝分袂,它可以包罗空格符,其长度限制为64个字符,但详尽不要运用MySQL内建函数的名字,如果这样做了,在调用时将会出现上面的情况:
mysql> CALL pi();
Error 1064 (42000): You have a syntax error.
mysql> CALL pi ();
Error 1305 (42000): PROCEDURE does not exist.

  在上面的第一个例子里,我调用的是一个名字叫pi的函数,但你必须在调用的函数名后加上空格,就像第二个例子那样。
CREATE PROCEDURE p1 () SELECT * FROM t; // <--

  其中“()”是“参数列表”。
CREATE PROCEDURE

  语句的第三部分是参数列表。凡是必要在括号内添加参数。例子中的存储进程没有参数,是以参数列表是空的—以是我只必要键入空括号,但是这是必须的。
CREATE PROCEDURE p1 () SELECT * FROM t; // <--
"SELECT * FROM t;"

  是存储进程的主体。
  然后到了语句的末了一个部分了,它是存储进程的主体,是通俗的SQL语句。进程体中语句
  "SELECT * FROM t;"

  包罗一个分号,如果后面有语句结束标志(//)时可以不写这个分号。

  如果你还记得我把这部分叫做顺序的主体将会是件好事,由于(body)这个词是大年夜家运用的技术上的术语。凡是我们不会将SELECT语句用在存储进程中,这里只是为了演示。以是运用这样的语句,能在调用时更好的看出顺序可否正常任务。




版权声明: 原创作品,承诺转载,转载时请务必以超链接方法标明文章 原始来由 、作者信息和本声明。不然将究查功令责任。

posted @ 2011-03-07 19:00  蓝色的天空III  阅读(186)  评论(0编辑  收藏  举报