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:59  蓝色的天空III  阅读(160)  评论(0编辑  收藏  举报