在开始创建存储过程之前,先介绍一个很实用的命令,即DELIMITER命令。在MySQL中,服务器处理语句的时候是以分号为结束标志的。但是在创建存储过程的时候,存储过程体中可能包含多个SQL语句,每个SQL语句都是以分号为结尾的,这时服务器处理程序的时候遇到第一个分号就会认为程序结束,这肯定是不行的。所以这里使用DELIMITER命令将MySQL语句的结束标志修改为其他符号。
DELIMITER语法格式为:
DELIMITER $$
说明:$$是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个“#”,两个“¥”等。当使用DELIMITER命令时,应该避免使用反斜杠(“\”)字符,因为那是MySQL的转义字符
--命令窗口里创建存储过程
delimiter &&
create procedure yunjuan()
begin
end &&
show tables &&
--存储过程一一个表里可以有多个存储过程,但名字不能相同,数据库里是没有重载的,(存储过程没有返回值,存储函数有返回值)
create PROCEDURE mypro1(sellday date,pruductid varchar(20),sellerid varchar(20),amount int(11),money decimal(10,2))
begin
insert into stu_ values(select *from stu where stuid=1);--必须保证查询出的语句是一条语句,不然报错
insert into prosell values(sellday,pruductid,sellerid,amount,money);
end
call mypro1('2012-1-12','2013003','2012002',100,10.5);--调用存储过程
--存储过程二
create PROCEDURE mypro2()
begin
create table stu_ as select * from stu;
end
call mypro2();
--存储过程三
create PROCEDURE mypro3(id int)
begin
declare vv int default 0;--设置默认值1
declare vvvv int ;
set vvvv=0;--设置默认值2
DECLARE v1 int;
declare v2 varchar(20);
SELECT stuid,stuname into v1,v2 from stu where stuid=id;
insert into stu_1 values(v1,v2);
end
call mypro3(3);
create table if not exists stu_1(
stuid int,
stuname varchar(20)
);
--存储过程四
create PROCEDURE mypro4(id int)
begin
DECLARE v1 int;
declare v2 varchar(20);
create table if not exists stu_4(
stuid int,
stuname varchar(20)
);
SELECT stuid,stuname into v1,v2 from stu where stuid=id;
insert into stu_4 values(v1,v2);
end
call mypro4(4);
--存储过程五(建存储过程时先定义变量)
create PROCEDURE mypro_1(a int)
begin
DECLARE V varchar(20);
if a>=90 then
set v='优秀';
elseif a>70 then
set v='良好';
elseif a>60 then
set v='良';
else
set v='差';
end if;
insert into stu(stuname)values (v);
end;
call mypro_1(70);
--存储函数
create function myfun()
returns varchar(20)
begin
return '我很好';
end;
select myfun();
--用存储过程调用存储函数
create PROCEDURE profun()
begin
DECLARE vv varchar(20);
set vv=myfun();
end;
--创建视图 (视图里没有真实的数据,是一个虚拟的表)
create view myview as select *from stu;
desc myview;
select * from myview;
--创建触发器(同一个表中可以建多个触发器 after/before)
create TRIGGER mytrigger
after insert on stu
for each row
begin
insert into stu_ values(5,'我被触发器触发了');
end;
insert into stu values(1,'我有触发器');
--索引的目的只是为了提高查询的效率