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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。