SQL 存储过程&触发器
2023-12-15 12:35:20
单个SQL语句 实现不了复杂的实际应用,需要一组SQL语句来实现,创建函数,以方便应用。
存储过程?
? ? ? ??可编程的函数,完成特定功能编写的SQL语句&控制语句的预编译的集合,再次调用时不再编译。
? ? ? ? 优点:
- 允许标准组件式编程
- 较快的执行速度? (预编译)
- 减少网络流量
- 安全
存储过程的创建
? ? ? ??
create procedure 存储过程名 ([参数列表[,...]])
过程体;
/*参数列表 由 输入输出类型,参数名,参数类型 组成.
[in|out|inout] 参数名 类型
*/
e.g.
-- 这部分是存储过程的定义,用于获取学生表中的记录数
delimiter $$
create procedure proc_stucent(out cnt int)
begin
-- 使用子查询获取学生表中的记录数,并将结果赋值给cnt变量
set cnt = (select count(*) from student);
end $$
delimiter ;
-- 调用存储过程,将结果存储在@nu变量中
call proc_stucent(@nu);
查看所有的存储过程
select * from information_schema.routines
[where routine_name = '名称'];
修改存储过程
alter procedure sp_name [characteristic ..]
characteristic"
{contains SQL | no SQL | reads SQL data| modifies SQL data}
-- alter 只能需改存储过程的特性,不能修改存储过程定义的内容
-- e.g.
alter proc1 modifies sql data sql security invoker;
删除存储过程
drop procedure [if exist] 函数名;
函数只能返回一个 返回值or表对象
存储过程 可以返回参数 如,记录集?
delimiter $$ create procedure register(username varchar(20), userpwd varchar(20)) begin if exists( select * from user where uname = username) then select 'existed'; else insert into user(uname,upwd) values(username ,userpwd); end if; end $$ delimiter ; call register('admin','123456');
e.g. 注册过程? 用户名不能重复
e.g. 修改密码
delimiter $$ create procedure register(name varchar(20), oldupwd varchar(20),newpwd varchar(20)) begin if (select count(*) from user where upwd = oldpwd) then select '不是你'; else update user set upwd=newpwd where uname = username; end if; end $$ delimiter ; call register('admin','123456');
游标
查询语句返回多条记录,逐条读取查询结果集中的记录
declare cursorname cursor for selevt _ statement
--声明游标
open cursor _ name
--打开游标
fetch cursor_name into var_name1[, var_name2...]
--读取数据 变量列表
游标写在存储过程里
e.g.:
delimiter $$
create procedure p1()
begin
declare xh char(7);
declare xm varchar(20);
declare cur_stu cursor for select sno,sname from student;
set i=1;
while i<=4 do
open cure_stu;
fetch cur_stu into xh,xm;
-- sno,sname;
set i=i+1;
end while;--循环 输出 4个 单行结果集
select xh,xm;
close cur_stu;
end $$
delimiter ;
文章来源:https://blog.csdn.net/SHI_56/article/details/134926292
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!