关于MySql的存储过程
Mysql存储过程 支持5.0以上的版本 。
为什么要用存储过程?
存储过程会使系统运行更快!
是Mysql服务器在缓存机制上做了改进,就像Prepared statements(预处理语句)所做的那样。由于没有编译器,因此SQL存储过程不会像外部语言(如C)编写的程序运行起来那么快。但是提升速度的主要方法却在于能否降低网络信息流量。如果你需要处理的是需要检查、循环、多语句但没有用户交互的重复性任务,你就可以使用保存在服务器上的存储过程来完成。这样在执行任务的每一步时服务器和客户端之间就没那么多的信息来往了。
存储过程是可复用的组件!
当你改变了主机的语言,这对存储过程不会产生影响,因为它是数据库逻辑而不是应用程序。存储过程是可以移植的,用SQL编写存储过程时,就知道它可以运行在Mysql支持的任何平台上,不需要你额外添加运行环境包,也不需要为曾想在操作系统中执行设置许可。
存储过程将保存!
如果你编写好了一个程序,例如显示银行事物处理中的支票撤销,那想要了解支票的人就可以找到你的程序。它会以源代码的形式保存在数据库中。
存储过程可以移植!
Mysql完全支持SQL 2003标准。某些数据库(如DB2、Mimer)同意支持。但也有部分不支持,如Oracle、SQLServer不支持。
启动MySQL客户端,核对版本
有2种方法如下:
1、SHOW VARIABLES LIKE ‘version’;
2、SELECT VERSION();
当看见数字’5.0.x’后就可以确认存储过程能够在这个客户端上正常工作。
创建示例数据库
CREATE DATABASE db5;
USE db5;
CREATE TABLE t(s1 INT);
INSERT INTO v VALUES(5);
我们创建简单一点的,只是为了学习存储过程。
选择分隔符
现在我们需要一个分隔符,实现这个步骤的SQL语句如下:
DELIMITER //
分隔符是通知mysql客户端已经完成输入一个sql语句的字符或字符串符号。
创建程序实例
CREATE PROCEDURE p1() SELECT * FROM t; //
SQL语句存储过程的第一部分是:“CREATE PROCEDURE”
第二部分是过程名,上面新存储过程的名字是p1。
题外话:合法标识符的问题
存储过程名对大小写不敏感,因此’P1’和’p1’是同一个名字,在同一个数据库中不能给两个存储过程取相同的名字,因为这样将会导致重载。
可以采取“数据库名.存储过程名”这样的折中方法,如:“db5.p1”。
存储过程名可以分开,它可以包括空格符,其长度限制为64个字符,但注意不要使用MySql内置函数的名字,否则会发生错误,如下:
mysql> CALL pi(); Error 1064 (42000): You have a syntax error.
第三部分是“()”,是“参数列表”。
通常需要在括号内添加参数。
最后一部分“SELECT * FROM t;”是存储过程的主体。是一般的SQL语句,一般不会将SELECT语句用在存储过程中。
什么MySql语句在存储过程体中是合法的?
什么样的SQL语句在Mysql存储过程中才是合法的呢?你可以创建一个包含INSERT, UPDATE, DELETE, SELECT, DROP, CREATE, REPLACE等等的语句。你唯一需要记住的是如果代码中包含MySQL扩充功能,那么代码将不能移植。在标准SQL语句中:任何数据库定义语言都是合法的,如: CREATE PROCEDURE p () DELETE FROM t; //
SET、COMMIT以及ROLLBACK也是合法的,如: CREATE PROCEDURE p () SET @x = 5; //
MySQL的附加功能:任何数据操作语言的语句都将合法。 CREATE PROCEDURE p () DROP TABLE t; //
MySQL扩充功能:直接的SELECT也是合法的: CREATE PROCEDURE p () SELECT ‘a’; //
顺便提一下,我将存储过程中包括DDL语句的功能称为MySQL附加功能的原因是在SQL标 准中把这个定义为非核心的,即可选组件。
调用存储过程
mysql> CALL p1();//
+—-+
| si |
+—-+
| 5 |
+—-+
这和执行”SELECT * FROM t;”效果一样。