日期:2014-05-16  浏览次数:20832 次

mysql教程存储过程创建与注意事项 ----摘抄

mysql教程存储过程创建与注意事项
第一 mysql存储过程跟之前写sqlserver 2005 的存储过程有点区别;

第二,用的mysql第三方企业管理器 sqlyogent.exe 调试的时候,写存储过程和一般的查询语句要分开的,我是后来才意识到的,气得要命(可能也是用sqlserver 2005企业管理器的编辑器的习惯导致的)。 废话少说,写存储过程,要注意如下几点:

第一 要定义delimiter //,意思是用//作为一段语句的结束符(这个很重要,我写的存储过程语法一点也没错,但是,就是通不过,原来分号:;分隔符是通知mysql客户端已经输入完成的符号,而我的存储过程里边很多都有分号;结果运行的时候,就是把我一段存储过程分成很多段执行)

第二 如果你想我一样“不幸”选择了第三方mysql客户端sqlyogent.exe ,一定要在数据库教程目录里边的存储过程右键选择新建存储过程,然后在右边弹出的窗口里键入你的存储过程语句,在普通查询分析器输入无效,这是惨痛教训

第三,如果存储过程的参数如果是输入中文的话,要在定义存储过程的后面加上character set gbk这个编码,不然调用存储过程使用中文参数的时候会出错,如:

?

create? procedure countpro(out a_out int,in b_date date, in unit_name varchar(45) character set gbk)
第四,如果你的存储过程里边需要模糊查询,用到 like '%内容%' 不要在select 语句的where后边写'%';定义一个参数,用: set wherestr = "'%"+wherestr+"%'";拼接语句第五,最后要还原结束符:delimiter ; 为;作为语句的结束符

下面来看mysql存储过程实例

1. 创建实例数据库
?? create database db5;
?? use db5;

2.创建一个简单的工作表,并插入数据
?? create table t(s1 int);
?? insert into t values(5);

3.创建程序实例 create procedure example
?? create procedure p1() select * from t;
????? sql语句存储过程的第一部分是 create procedure
????? 第二部分是过程名:上面新存储过程的名字是p1。
????? 第三部分书参数列表(),第四部分是程序的主体,“select * from t”

*****什么样的mysql语句在存储过程体中是合法的?
?????? 在存储过程体中可以包含所有的合法sql数据库定义语言,insert,update,delete,drop,create,replace等等语句
包括(set,commit,rollback)但是,在代码中如果包含mysql的扩充功能,那么代码将不能移植。
????
4. 调用存储过程,所需要输入的就是call和你过程名以及一个括号。
??? call p1();

5.过程中的特征子句
??? create procedure p2()language sql?
???????????????????????? not deterministic
??? sql security definer
??? comment ''
???? select current_date,rand() from t;

6.parameters参数
??? create procedure p5()------; //参数列表是空的
??? create procedure p5([in] name data-type)---- //输入参数in可选,默认为参数为in
??? create procedure p5(out name data-type)----- //输出参数out
??? create procedure p5(inout 那么data-type)----- //即可以做输入参数也可以做输出参数

?? ----输入参数in 例子。
?????? create procedure p5(p int) set @x=p;
?????? call p5(12345);
?????? select @x;

?? ----输出参数out 例子
?????? create procedure p6(out p int)set p=-5;
?????? call p6(@y);
?????? select @y;

7. 复合语句:如果你的过程中有多条语句,那么你需要begin/end块。在这里你可以进行变量的定义和流程的控制
?????? 首先执行命令 delimiter //
?????? create procedure p7()
?????????? begin
????????????? set? @a=6;
?????? set? @b=5;
?????? insert into t values (@a);
?????? select s1 * @a from t where s1>= @b;
??? end;//

?? -----在复合语句中申明变量
?????? create procedure p8()
??????????? begin
?????? declare a int;
?????? declare b int;
?????? set a=5;
?????? set b=5;
?????? insert into t values (a);
?????? select s1*a from t where s1>=b;
??????????? end;//

?????? 含有default默认语句舌设定语句的例子
?????? create procedure p9()
?????? begin
????????? declare a ,b int default 5;
?? insert into t values(a);
?? select s1*a from t where s1>=b;
?????? end;//

8. scope作用域的问题:内部的变量在其作用域范围内享有更高的优先权,当执行到end
??????? 变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
?过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派