Fullstar

Archives

  • August 2026
  • 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

Looking for a Shorter Overview?

AI Summary

存储过程可通过输入、输出参数及条件和循环逻辑封装数据库操作,存储函数则直接返回计算结果。文章还给出游标逐行读取结果集、触发器记录数据变更,以及视图复用查询的基本写法。

Key Moments

AI-generated
1

存储过程的参数与控制流程

存储过程可使用输入参数、输出参数、条件判断和循环,将分类或累加等数据库逻辑封装后通过 CALL 调用。
2

游标的声明、读取与关闭

在存储过程或函数中,按 DECLARE、OPEN、FETCH、CLOSE 的顺序操作游标,以逐行处理查询结果集。
3

游标遍历需要未找到数据处理器

循环读取游标时,应在游标声明后定义 NOT FOUND 处理器,通过状态变量在结果集读完后退出循环。
4

函数、触发器与视图的用途

存储函数通过 RETURNS 返回查询结果,触发器在数据变更前后自动执行行级逻辑,视图提供基于查询的虚拟表。
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 观看视频讲解

Related Posts

AI-generated

JDBC操作Hive概述

通过配置 Beeline、启动 HiveServer2、添加 hive-jdbc 依赖,Java 程序即可连接 Hive、查询 t_test 表,并规范关闭 ResultSet、Statement 与 Connection。
41.1% match September 24, 2021

Linux运行程序与shell编程

从g++生成可执行文件,到重定向标准输出与错误输出,再用变量、test、条件分支和循环组织Shell命令,快速建立Linux命令行自动化基础。
41% match December 8, 2020

Questions Answered

AI-generated

存储过程如何接收参数并返回处理结果?

通过输入输出参数、条件判断和查询语句完成数据库端逻辑。

游标怎样安全地遍历查询结果集?

依次声明、打开、读取和关闭,并处理无数据状态。

触发器如何获取更新前后的行数据?

更新触发器使用旧值和新值记录字段变更。

视图与普通表有什么核心区别?

视图不保存实际数据,查询时动态计算结果。

Next Up

Hive JDBC 实战
掌握Shell脚本
容器性能取舍
Shell 实用指令
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

排查 LiteLLM 经 Cloudflare 访问出现 502:Nginx Response Header 太大

  • Brandon
  • August 16, 2026
View Post
  • Code

Letta部署记录

  • Brandon
  • December 26, 2025
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

Leave a Reply Cancel reply

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

Fullstar

Input your search keywords and press Enter.

JDBC操作Hive概述

Linux运行程序与shell编程

Java 容器

Linux shell常用指令

cmake应用

算法伪代码

UP NEXT

JDBC操作Hive概述

41.1% match September 24, 2021 0