Fullstar

Archives

  • December 2025
  • August 2024
  • July 2024
  • February 2024
  • November 2023
  • August 2023
  • July 2023
  • January 2023
  • November 2022
  • October 2022
  • September 2022
  • February 2022
  • January 2022
  • September 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020

Categories

  • Code
  • Lens
  • Life
0
Fullstar
  • Code

SQL存储函数、过程、视图、游标、触发器

  • August 2, 2020
  • Brandon
Total
0
Shares
0
0
0

一.存储过程

create PROCEDURE p1 (in height int)
begin
  declare line varchar(20) default '';
  if height>175 then
    set line='high';
  elseif height=175 then
    set line='mid';
  else
    set line='low';
  end if;
  select line;
end;
--调用:call p1(178);
create PROCEDURE p2 (in height int,out line varchar(20))
begin
  if height>175 then
    set line='high';
  elseif height=175 then
    set line='mid';
  else
    set line='low';
  end if;
end;
--调用:
--call p2(175,@description);
--select @description;
--@变量名表示用户会话变量
--计算从1加到n的值
create procedure p3(in n int)
begin
  declare result int default 0;
  declare h int default 1;
  while h<=n do
    set result = result+h;
    set h = h+1;
  end while;
  select result;
end

二.游标
游标相当于一个容器,存储查询结果集,在存储过程和存储函数中可以使用游标对结果集进行循环处理。游标基本语法如下:

1.DECLARE游标:

DECLARE cursor_name CURSOR FOR select_statement;

2.OPEN游标

OPEN cursor_name;

3.FETCH游标

FETCH cursor_name INTO var_name [,var_name]...

4.CLOSE游标

CLOSE cursor_name;
create procedure p4()
begin
  --声明输出变量
  declare c_id varchar(8);
  declare c_title varchar(50);
  declare c_dept_name varchar(20);
  declare c_credits decimal(2,0);
  --声明游标,其中容器内的内容即为for后面的查询语句所得到的数据集
  declare cursor_a cursor for
	  select * from course where credits=2;
  --打开游标
  open cursor_a;
  --从游标内获取一条数据并将其赋值于变量
  fetch cursor_a into c_id,c_title,c_dept_name,c_credits;
  --输出变量值,若超出集合数目则会报错
  select concat('id',c_id,'title',c_title,'dept_name',c_dept_name,'credits',c_credits);
  --关闭游标
  close cursor_a;
end
create procedure p5()
begin
  declare c_id varchar(8);
  declare c_title varchar(50);
  declare c_dept_name varchar(20);
  declare c_credits decimal(2,0);
  declare has_data int default 1;
  --变量声明必须在声明游标之前
  declare cursor_a cursor for select * from course where credits=3;
  --mysql自带的句柄机制,声明当没有数据时退出程序并将has_data设置为0
  --且其必须置于游标声明语句之下
  declare exit HANDLER for not found set has_data=0;
		
  open cursor_a;

  while has_data!=0 do
    fetch cursor_a into c_id,c_title,c_dept_name,c_credits;
    select concat(c_id,' ',c_title,' ',c_dept_name,' ',c_credits);
  end while;
	
  close cursor_a;
end

三.存储函数

create function f1(c_credit decimal(2,0))
returns int
begin
  declare num int default 0;
  select count(*) into num from course where credits=c_credit;
	return num;
end
--调用:select f1(3);
--由于有返回值因此直接采用select调用即可

四.触发器

NEW与OLD

语法结构:

create trigger trigger_name
before/after insert/update/delete
on tbl_name
[ for each row ] --加上则代表为行级触发器,mysql只支持行级触发器
begin
  trigger_stmt;  --触发所需完成内容
end;
create trigger t1
after update
on emp
for each row
begin
  --update中new表示新修改后的行,old表示旧的行数据
  insert into emp_logs(id,operate_params) values(new.id,concat(old.id,'->',new.id));
end

五.视图

create view v1 as select * from course;
--则创建出的v1即出现在show tables;指令中,因此可以对其进行与普通表相同的操作
--其与实际表的不同在于视图并不是真的存储数据,而是每次都需要进行计算

结尾:
上述知识来自于B站视频教程,可转自 https://www.bilibili.com/video/BV1UQ4y1P7Xr?p=11 观看视频讲解

Total
0
Shares
Share 0
Tweet 0
Pin it 0
Brandon

Previous Article
  • Code

Java 编码

  • July 31, 2020
  • Brandon
View Post
Next Article
  • Code

Java 容器

  • August 3, 2020
  • Brandon
View Post
You May Also Like
View Post
  • Code

WordPress 后台任务利器:使用 BGRunner 构建可靠的异步处理

  • Brandon
  • December 14, 2025
View Post
  • Code

WordPress image offload

  • Brandon
  • December 14, 2025
View Post
  • Code

ComfyUI应用手册

  • Brandon
  • December 6, 2025
View Post
  • Code

Leetcode Java常用代码

  • Brandon
  • February 17, 2024
View Post
  • Code

Golang入门

  • Brandon
  • February 4, 2024
View Post
  • Code

Setting Up and Maintaining a Ubuntu Environment for My Home Server

  • Brandon
  • November 24, 2023
View Post
  • Code

Swift Learning Log

  • Brandon
  • August 31, 2023
View Post
  • Code

English Learning – Food Related

  • Brandon
  • August 31, 2023

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Fullstar

Input your search keywords and press Enter.