面试再问MySQL存储过程和触发器就把这篇文章给他

 Mysql存储过程及触发器trigger

存储过程

一、一个简单的存储过程

1,一个简单的存储过程

	delimiter $$
	create procedure testa()
	begin
	 Select * from emp;
	 Select * from dept;
	 End;
	$$;
	delimiter ;
	-- 调用存储过程
	call testa();

存储过程的结构组成:

1,创建格式:create procedure 存储过程名

2,包含一个以上代码块,代码块使用begin和end之间

3,在命令行中创建需要定义分隔符 delimiter $$

2,存储过程的特点

1,能完成复杂的判断和运算

2,可编程性强,灵活

3,SQL编程的代码可重复使用

4,执行速度相对快

5,减少网络之间数据传输,节省开销

二、存储过程变量

1,存储过程中的变量

需求:编写存储过程,使用变量取empno=7369的用户名

Delimiter $$;
Create procedure testa();
BEGIN 
	DECLARE my_uname varchar(32) default ""; -- 定义变量my_uname
 SET my_uname='smith'; -- 为变量my_uname赋值
 -- 查询empno=7369的用户名,并将值赋给my_uname
 select ename into my_uname from emp where empno=7369; -- 为变量赋值
 select my_uname;-- 返回my_uname的值
END;
$$;
Delimiter ;

特点:

1,变量的声明使用declare,一句declare只声明一个变量,变量必须先声明后使用。

2,变量具有数据类型和长度,与mysql的SQL数据类型保持一致,还能指定默认值、字符集和排序规则等。

3,变量可以通过set来赋值,也可以通过select into的方式赋值。

4,变量需要返回,可以使用select语句,如:select 变量名

2,存储过程变量应用示例

需求:统计表emp、dept的行数和emp表中最早,最晚的入职日期。

Delimiter $$;
Create procedure stats_emp();
BEGIN
-- 统计emp和dept表中的记录数
 BEGIN
 DECLARE emp_sum int default 0;
 DECLARE dept_sum int default 0;
 select count(*) into emp_sum from emp; 
 select count(*) into dept_sum from dept; 
 select emp_sum,dept_sum;
 END;
-- 统计最早、最晚入职日期
 BEGIN
 DECLARE max_time TIMESTAMP ;
 DECLARE min_time TIMESTAMP;
 select max(hiredate),min(hiredate) into max_time,min_time from emp;
 select max_time,min_time; 
	END;
END
$$;
Delimiter ;

三、存储过程的参数

1,存储过程的传入参数IN

需求:编写存储过程,传入empno,返回该用户的ename.

Delimiter $$;
Create procedure test_param(IN my_empno int);
--------
BEGIN
 DECLARE my_ename varchar(32) default '';
 select ename into my_ename from emp where empno=my_empno;
 select my_ename;
END;
$$
Delimiter ;
-- 调用
Call test_param(7369);

提示:

1,传入参数:类型为IN,表示该参数的值必须在调用存储过程时指定,如果不显示指定为IN,那么默认就是IN类型。

2,IN类型参数一般只用于传入,在调用存储过程中一般不作修改和返回。

3,如果调用存储过程中需要修改和返回值,可以使用OUT类型参数。

2,存储过程的传出参数OUT

需求:调用存储过程时,传入empno,返回该用户的ename。

Delimiter $$;
create procedure test_param(IN my_empno int,OUT my_ename varcahr(32));
--------
BEGIN
 select ename into my_ename from emp where empno=my_empno;
 select my_ename;
END;
$$
Delimiter ;
-- 调用
Set @uname=’’;
Call test_param_out(7369,@uname);

提示:

1,传出参数:在调用存储过程中,可以改变其值,并可返回。

2,OUT是传出参数,不能用于传入参数值。

3,调用存储过程时,OUT参数也需要指定,但必须是变量,不能是常量。

4,如果既需要传入,同时又需要传出,则可以使用INOUT类型参数。

3,存储过程的可变参数INOUT

需求:调用存储过程时,参数my_empno和my_ename,既是传入,也是传出参数。

Delimiter $$;
create procedure test_param_inout(INOUT my_empno int,INOUT my_ename varchar(32));
BEGIN
 set my_empno=7369;
 set my_ename="smith";
 
 select ename,empno into my_ename,my_empno from emp where empno=my_empno;
END;
$$
Delimiter ;
-- 调用
set @uname:='';
set @empno:=7399;
call test_param_inout(@empno,@uname);
select @empno,@uname;

特点:

1,可变变量INOUT,调用时可传入值,在调用过程中,可以修改其值,同时也可以返回值。

2,INOUT 参数集合了IN和OUT类型参数的功能

3,INOUT调用时传入的是变量,而不是常量

四、存储过程条件语句

1,存储过程的条件语句

需求:编写存储过程,如果用户empno是偶数则给出ename,其他情况只返回empno.

Delimiter $$;
create procedure test_if(IN my_empno int);
BEGIN
	DECLARE my_ename VARCHAR(32) default ''; 
 if(my_empno %2=0) then 
 select ename into my_ename from emp where empno=my_empno;
	select my_ename;
 else 
 select my_empno;
 end if;
END;
$$
Delimiter ;
-- 调用
call test_if(7369);

特点:

1,条件语句最基本结构: if() then ... else ... end if;

2,if判断返回逻辑真或者假,表达式可以是任意返回真或假的表达式

2,存储过程的条件语句应用示例

需求:根据用户传入的empno参数判断:

(1)如果用户sal小于2000,则给用户加薪200

(2)如果用户sal小于1000,则给用户加薪500

(3)其他情况加薪100

Delimiter $$;
create procedure test_if_else(IN my_empno int);
BEGIN
	DECLARE my_sal int default 0;
 select sal into my_sal from emp where empno=my_empno;
 if(my_sal<1000) then 
 update emp set sal=sal+500 where empno=my_empno; 
 ELSEIF(my_sal<2000)
 then update emp set sal=sal+200 where empno=my_empno; 
 else update emp set sal=sal+100 where empno=my_empno; 
 end if;
END;
$$
Delimiter ;
-- 调用
call test_if_else(7369);

特点:

多条件判断结构:

If()

Then

...

Else if()

Then

...

Else

...

End if;

五、存储过程循环语句

1,while循环

需求:使用循环语句,向表emp中插入10条empno连续的记录。

Delimiter $$;
create procedure test_while();
BEGIN
 DECLARE i int default 0;
 while(i<10) DO
 BEGIN
 set i=i+1;
 insert into acc(id) values(i);
 END;
 END WHILE;
 
END;
$$
Delimiter ;
-- 调用
call test_while();

特点:

1,while语句最基本结构: while() do begin ... end end while;;

2,while判断返回逻辑真或者假,表达式可以是任意返回真或假的表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值