数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

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


发布日期:2022年04月10日
 
MySQL 5.0新特性教程 存储过程:第一讲

Introduction 简介

MySQL 新特性教程是为需要了解版本新特性的MySQL老用户而写的简单的来说是介绍了存储过程触发器视图信息架构视图在此感谢译者陈朋奕的努力

希望这本书能像内行专家那样与您进行对话用简单的问题例子让你学到需要的知识为了达到这样的目的我会从每一个细节开始慢慢的为大家建立概念最后会给大家展示较大的实用例在学习之前也许大家会认为这个用例很难但是只要跟着课程去学相信很快就能掌握

Conventions and Styles 约定和编程风格

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

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

如果实例比较大则需要在某些行和段落间加注释同时我会用将<符号放在页面的右边以表示强调

例如

mysql> CREATE PROCEDURE p ()

> BEGIN

> /* This procedure does nothing */ <

> END;//Query OK rows affected ( sec)

有时候我会将例子中的mysql>>这些系统显示去掉你可以直接将代码复制到mysql客户端程序中(如果你现在所读的不是电子版的可以在网站下载相关脚本)所以的例子都已经在Suse LinuxMysql 公共版上测试通过

在您阅读本书的时候Mysql已经有更高的版本同时能支持更多OS了包括WindowsSparcHPUX因此这里的例子将能正常的运行在您的电脑上但如果运行仍然出现故障可以咨询你认识的资深Mysql用户以得到长久的支持和帮助

A Definition and an Example 定义及实例

定义及实例存储过程是一种存储在书库中的程序(就像正规语言里的子程序一样)准确的来说MySQL支持的routines(例程)有两种一是我们说的存储过程二是在其他SQL语句中可以返回值的函数(使用起来和Mysql预装载的函数一样如pi())我在本书里面会更经常使用存储过程因为这是我们过去的习惯相信大家也会接受

一个存储过程包括名字参数列表以及可以包括很多SQL语句的SQL语句集

在这里对局部变量异常处理循环控制和IF条件句有新的语法定义

下面是一个包括存储过程的实例声明(译注为了方便阅读此后的程序不添任何中文注释)

CREATE PROCEDURE procedure /* name存储过程名*/

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

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

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

IF parameter = THEN /* start of IF IF条件开始*/

SET variable = birds; /* assignment赋值*/

ELSE

SET variable = beasts; /* assignment赋值*/

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

INSERT INTO table VALUES (variable);/* statement SQL语句*/

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

下面我将会介绍你可以利用存储过程做的工作的所有细节同时我们将介绍新的数据库对象—触发器因为触发器和存储过程的关联是必然的

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

由于存储过程对于MySQL来说是新的功能很自然的在使用时你需要更加注意

毕竟在此之前没有任何人使用过也没有很多大量的有经验的用户来带你走他们走过的路然而你应该开始考虑把现有程序(可能在服务器应用程序中用户自定义函数(UDF)中或是脚本中)转移到存储过程中来这样做不需要原因你不得不去做

因为存储过程是已经被认证的技术!虽然在Mysql中它是新的但是相同功能的函数在其他DBMS中早已存在而它们的语法往是相同的因此你可以从其他人那里获得这些概念也有很多你可以咨询或者雇用的经验用户还有许多第三方的文档可供你阅读

存储过程会使系统运行更快!虽然我们暂时不能在Mysql上证明这个优势用户得到的体验也不一样我们可以说的就是Mysql服务器在缓存机制上做了改进就像Preparedstatements(预处理语句)所做的那样由于没有编译器因此SQL存储过程不会像外部语言(如C)编写的程序运行起来那么快但是提升速度的主要方法却在于能否降低网络信息流量如果你需要处理的是需要检查循环多语句但没有用户交互的重复性任务你就可以使用保存在服务器上的存储过程来完成这样在执行任务的每一步时服务器和客户端之间就没那么多的信息来往了

所以存储过程是可复用的组件!想象一下如果你改变了主机的语言这对存储过程不会产生影响因为它是数据库逻辑而不是应用程序存储过程是可以移植的!当你用SQL编写存储过程时你就知道它可以运行在Mysql支持的任何平台上不需要你额外添加运行环境包也不需要为程序在操作系统中执行设置许可或者为你的不同型号的电脑存储过程将被保存!如果你编写好了一个程序例如显示银行事物处理中的支票撤消那想要了解支票的人就可以找到你的程序

它会以源代码的形式保存在数据库中这将使数据和处理数据的进程有意义的关联这可能跟你在课上听到的规划论中说的一样存储过程可以迁移!

Mysql完全支持SQL 标准某些数据库(如DBMimer)同样支持但也有部分不支持的如OracleSQL Server不支持我们将会给予足够帮助和工具使为其他DBMS编写的代码能更容易转移到Mysql上

Setting up with MySQL 设置并开始MySQL 服务

通过

mysql_fix_privilege_tables

或者

~/mysql/scripts/mysql_install_db

来开始MySQL服务

作为我们练习的准备工作的一部分我假定MySQL 已经安装如果没有数据库管理员为你安装好数据库以及其他软件你就需要自己去安装了不过你很容易忘掉一件事那就是你需要有一个名为mysqlproc的表

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

mysql_fix_privilege_tables

或者

mysql_install_db

(只需要运行其中一个就够了)——不然存储过程将不能工作我同时启用在root身份后运行一个非正式的SQL脚本如下

mysql>source/home/pgulutzan/mysql/scripts/mysql_prepare_privilege_tables_for_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 to server version: alphadebug

Type help; or \h for help Type \c to clear the buffer

在演示中我将会展示以root身份登陆后的mysql客户端返回的结果这样意味着我有极大的特权

Check for the Correct Version 核对版本

为了确认使用的MySQL的版本是正确的我们要查询版本我有两种方法确认我使用的是版本

SHOW VARIABLES LIKE version;

or

SELECT VERSION();

例如

mysql> SHOW VARIABLES LIKE version;

+++

| Variable_name | Value |

+++

| version | alphadebug |

+++

row in set ( sec)

mysql> SELECT VERSION();

++

| VERSION() |

++

| alphadebug |

++

row in set ( sec)

当看见数字x 后就可以确认存储过程能够在这个客户端上正常工作

The Sample Database 示例数据库

现在要做的第一件事是创建一个新的数据库然后设定为默认数据库实现这个步骤的SQL语句如下

CREATE DATABASE db;

USE db;

例如

mysql> CREATE DATABASE db;

Query OK row affected ( sec)

mysql> USE db;

Database changed

在这里要避免使用有重要数据的实际的数据库然后我们创建一个简单的工作表

实现这个步骤的SQL语句如下

mysql> CREATE DATABASE db;

Query OK row affected ( sec)

mysql> USE db;

Database changed

mysql> CREATE TABLE t (s INT);

Query OK rows affected ( sec)

mysql> INSERT INTO t VALUES ();

Query OK row affected ( sec)

你会发现我只在表中插入了一列这样做的原因是我要保持表的简单因为在这里并不需要展示查询数据的技巧而是教授存储过程不需要使用大的数据表因为它本身已经够复杂了

这就是示例数据库

上一篇:MySQL安装笔记和一些使用方法

下一篇:面向MYSQL数据构架梭子鱼负载均衡解决方案