先看例子:
1、delimiter $$
2、drop procedure if exists`test_procedure` $$
3、create procedure test_procedure(IN puser_id VARCHAR(30),IN pitem_id varchar(45),OUT result INT)
4、begin
5、select id into result from train_tbl where user_id = puser_id;
6、set result=10;
7、end $$
8、delimiter ;
详解:
1、首先使用delimiter将结束符从“;”变为$$ ,这样就不会在过程或者函数中的“;”被mysql解释成语句的结束而提示错误。
在存储过程或函数创建完毕后,使用“delimiter”再把结束符该为“;”。
2、演示了存储过程的删除,通过存储过程的名称来删除一个存储过程
3、创建一个存储过程,设定存储过程的名字为 “test_procedure”,设置存储过程的参数,及其参数类型。存储过程的参数可以是IN、OUT、INOUT类型,函数的参数只能是IN类型。
IN OUT INOUT的区别:详情参见http://www.blogjava.net/nonels/archive/2009/04/22/233324.html
IN类型类似于值传递,MYSQL存储过程内部可能会修改此参数,但是对于IN类型的参数的修改对于调用者来说是不可见的。
例如:
drop procedure if exists pr_param_in; create procedure pr_param_in ( in id int -- in 类型的 MySQL 存储过程参数 ) begin if (id is not null) then set id = id + 1; end if; select id as id_inner; end;
set @id = 10; call pr_param_in(@id); select @id as id_out;
mysql> call pr_param_in(@id); +----------+ | id_inner | +----------+ | 11 | +----------+ mysql> select @id as id_out; +--------+ | id_out | +--------+ | 10 | +--------+
OUT类型:MySQL 存储过程 “out” 参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值。
INOUT MySQL 存储过程 inout 参数跟 out 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout 参数传递值给存储过程。
4、begin 和end 详见:http://dev.mysql.com/doc/refman/5.1/en/begin-end.html
BEGIN END被用来写并列复合句,比如存储过程。一个并列复合句可以包括多条语句,0条也是合法的。
BEGIN……END块可以内嵌。
语句之间用定界符(delimiter)“;”分隔。
5、自己的查询语句。
参考资料:
http://www.blogjava.net/nonels/archive/2009/04/22/233324.html
(存储过程没有返回值,函数必须有返回值)