数据库之函数、存储过程

函数、存储过程

1.函数

函数,常用于对一个或多个输入参数进行操作,主要目的是返回一个结果值,就是一种方法,在postgre里存放的位置叫function,比如创建一个计算长方面积的函数。

举例:建立一个计算长方形面积的函数,代码如下

sql 复制代码
create or replace function area_of_rectangle(lenth integer,height integer)--声明函数名及需要的参数,(变量名1 变量类型 , 变量名2 变量类型,...)
returns integer as  --returns,注意有s奥
$$
declare                  --表示声明变量
	area integer := 0;   --函数赋值初始化,用:=
begin
	area := lenth * height;
	return area;           --函数要写返回值
end
$$
language 'plpgsql';   --固定

调用函数:

sql 复制代码
select area_of_rectangle(5,9);

结果截图:

2.存储结构

存储过程通常包含一系列的SQL语句或其他代码块,主要目的是执行一系列的操作,跟函数差不多,但是它不能用在select后边,不能用于sql语句,不需要返回值,一定要有的话需要用OUT关键字,具体功能我也不太清楚,我觉得用函数更方便。

举例代码如下:

一个求长方体体积的存储过程。

sql 复制代码
CREATE PROCEDURE volume_of_cuboid(lenth integer,width integer,height integer, OUT volume integer)
LANGUAGE plpgsql AS--跟函数的区别,他的这个LANGUAGE写上边了
$$
DECLARE
	area integer := 0;
BEGIN
    area := lenth * width;
    volume := area * height;
END;
$$

调用存储过程

sql 复制代码
CALL volume_of_cuboid(10, 20, 30 total);
-- 或
SELECT * FROM volume_of_cuboid(10, 20, 30);

存储过程的变量类型:

存储过程中,对变量赋值需要两个值类型一致,如经常碰到bigint类型值赋值到integer变量中,导致运行报错。常用类型如下:

3.基本流程语句

3.1 if语句:

sql 复制代码
IF ... THEN ... END IF;
IF ... THEN ... ELSE ... END IF;
IF ... THEN ... ELSE ... THEN ... ELSE ... END IF;
--例:
if student_name = '张静' then
	RAISE NOTICE '我是张静';
else if student_name like '%李%' then
	RAISE NOTICE '我姓李';
else
	RAISE NOTICE '我不是张静,也不姓李';
end if;

3.2 case语句:

sql 复制代码
CASE ... WHEN ... THEN ... ELSE ... END CASE;
CASE WHEN ... THEN ... ELSE ... END CASE;
--例:
case student_name when '张静','晓静' then
	RAISE NOTICE '张静和晓静都是我的名称';
else 
	RAISE NOTICE '你叫错名字了';
end case;
--例:
case when student_name = '张静' or student_name = '晓静' then
	RAISE NOTICE '张静和晓静都是我的名称';
else
	RAISE NOTICE '你叫错名字了';
end case;

这个例子用select之后会报错,我明天问问我🐕头师父看看怎么事再做修改

2024年5月28日整明白了

举例代码如下:

sql 复制代码
CREATE OR REPLACE FUNCTION qufen(name VARCHAR)
returns VARCHAR as
$$
DECLARE
notice VARCHAR ;
BEGIN 

CASE name 
	WHEN '张静','晓静' THEN
	notice := '张静和晓静都是我的名称';
	ELSE
	notice :=  '你叫错名字了';
	END case;
	RETURN notice;
		
END 
$$
LANGUAGE 'plpgsql';

首先最上边理论部分只是简单说了一下形式,实际上当我真正敲代码的时候发现这个代码我写完之后,也套在函数的形式里边了,然后输出的时候,无论我输出哪个人名都是返回的是0,并且前面messa中写 '你叫错名字了'。我就很疑惑,然后今天讲解之后发现,首先不能用RAISE NOTICE,用notice才对,通过不同的输入情况给notice赋值,然后我缺少返回值,应该最后返回notice,就能达成根据输入的不同形成输出 '张静和晓静都是我的名称' '你叫错名字了'这两句话,这回调整之后就对了

3.3 2.循环

(1)简单循环 中括号为可选项

sql 复制代码
[ <<label>> ]
LOOP
    循环体语句;
    EXIT [ label ] [ WHEN 判断条件表达式 ];
END LOOP [ label ];

--例-计算1到100的和:
sum := 0;
i := 0;
loop
	i := i + 1;
	sum := sum + i;
	exit when i = 100 ;
end loop;
RAISE NOTOCE '1到100的和为:%',sum;

2024年5月27日这个也有问题,我怎么才能不设置参数直接运行呢?

2024年5月28日这个今天也整明白了,见我下边代码

sql 复制代码
CREATE OR REPLACE FUNCTION yidaoyibaidehe()
returns INTEGER as
$$
DECLARE
sum INTEGER;
i INTEGER;
BEGIN
sum := 0;
i := 0;
loop
	i := i + 1;
	sum := sum + i;
	exit when i = 100 ;
end loop;
RAISE notice '1到100的和为:%',sum;
return sum;
END
$$
LANGUAGE 'plpgsql';

首先,我的函数名后边留个空括号,就是代表不用入参的意思,然后方法体里边因为有sum和i,这两个比不能直接用,得先在declare后边声明一下才能用,所以才会有我昨天的报错"sum和i未声明或者未定义",就差declare后边声明这一步了,敲里哇,雾我大半宿

(2)for循环

sql 复制代码
[ <<label>> ]
FOR 循环控制变量 IN [ REVERSE ] 循环范围 [ BY expression ] LOOP
    循环体语句;
END LOOP [ label ];

--计算1到100的和:
--例1 - 循环执行过程类似于:for(i=1;i<=100;i++){}
sum := 0;
for i in 1..100 loop
	sum := sum + i;
end loop;
RAISE NOTOCE '1到100的和为:%',sum;

--例2 - 循环执行过程类似于:for(i=100;i>=1;i--){}
sum := 0;
for i in REVERSE 100..1 loop
	sum := sum + i;
end loop;
RAISE NOTOCE '1到100的和为:%',sum;

--计算1到100之间所有奇数的和
--例3 - 循环执行过程类似于:for(i=1;i<=100;i=i+2){}
sum := 0;
for i in 1..100 by 2 loop
	sum := sum + i;
end loop;
RAISE NOTOCE '1到100的和为:%',sum;
相关推荐
java_heartLake6 小时前
PostgreSQL数据库参数调优实践
数据库·postgresql·调优
xnuscd7 小时前
Milvus概念
数据库·学习·mysql
代码欢乐豆7 小时前
软件工程第13章小测
服务器·前端·数据库·软件工程
小gpt&8 小时前
实现qt拖拽显示或者播放
数据库·qt·音视频
望获linux9 小时前
在 ARM 平台上如何实现Linux系统的1秒启动
linux·服务器·开发语言·数据库·操作系统·嵌入式操作系统·arm平台
漫天转悠9 小时前
MySQL 七种JOIN连接详解
数据库·mysql
尘浮生9 小时前
Java项目实战II基于Java+Spring Boot+MySQL的智能停车计费系统(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·mysql·微信小程序·maven
quintin-lee9 小时前
PostgreSQL中的内存上下文管理
数据库·postgresql
蚂蚁在飞-9 小时前
一个高度可扩展的 Golang ORM 库【GORM】
数据库·oracle·golang
hai405879 小时前
Spring Boot整合Redis Stack构建本地向量数据库相似性查询
数据库·spring boot·redis