13.postgresql--函数

news2024/10/6 8:31:51

文章目录

  • 标量示例
  • 复合示例
  • 有返回值
  • 函数返回void
  • RETURN NEXT ,RETURN QUERY
  • RETURN EXECUTE
  • IF THEN END IF
  • FOREACH,LOOP
  • SLICE

(1)如果函数返回一个标量类型,表达式结果将自动转行成函数的返回类型。但要返回一个复合(行)值,必须写一个所需列集合的表达式。

标量示例

create or replace function fn_scalar() returns numeric as 
$$
declare 
begin 
	return (3+4*2)-(2*2-1);
end
$$
language plpgsql
select * from fn_scalar();

在这里插入图片描述

select * from fn_scalar() as cnt

在这里插入图片描述

复合示例

create or replace function fn_scalars() returns record as 
$$
declare 
begin 
	return (1,2,'hello world'::text);
end
$$
language plpgsql

select * from fn_scalars() as (no1 int,no2 int,msg text);

在这里插入图片描述

(2)如果声明带输出参数的函数,只需要写不带表达式的RETURN,输出参数变量的当前值被返回

有返回值

create or replace function fn_out_return(out rcd text) returns text as 
$$
declare 
begin 
	select name into rcd from product where id = 1 ;
end

$$
language plpgsql

select * from fn_out_return ()

在这里插入图片描述

函数返回void

如果声明函数返回void,RETURN可以用来提前结果函数,但函数最后不要写RETURN

create or replace function fn_void_return() returns void as 
$$
declare 
begin 
	raise notice '执行第一行....';
	raise notice '执行第二行....';
return;
	raise notice '执行第三行....';
end

$$ 
language plpgsql

select * from fn_void_return() 

执行第一行…
执行第二行…

RETURN NEXT ,RETURN QUERY

当函数被声明为返回returns setof sometype,规则和直接return sometype有所不同。这种情况下,返回的个体项被RETURN NEXT或者RETURN QUERY 命令序列指定,并接着会用一个不带参数的RETURN命令来指示这个函数已经完成执行。

(1)RETURN NEXT可以返回标量和复合类型,对于复合类型,将返回一个完整的结果“表”(结果集)。

create or replace function fn_return_nexts() returns setof product as 
$$
declare 
r product%rowtype;
begin 
	for r in select * from product
	loop
		
		raise notice 'name is :%',r.name;
	    return next r;
	end loop;
return;
end

$$
language plpgsql

select * from fn_return_nexts()

name is :diam
name is :vestibulum aliquet
name is :lacinia erat
name is :scelerisque quam turpis
name is :justo lacinia
name is :ultrices mattis odio
name is :hendrerit
name is :in hac habitasse
name is :orci eget orci
name is :pellentesque
name is :sit amet nunc
name is :sed vestibulum
name is :turpis eget
name is :cursus vestibulum
name is :orci nullam
name is :est quam pharetra
name is :posuere
name is :ligula
name is :convallis
name is :nulla elit ac

在这里插入图片描述

(2)RETURN QUERY 将执行一个查询的结果追加到一个函数结果中。

create or replace function fn_return_query() returns setof product as 
$$
declare 
r record;
begin 
	return query(select * from product);

end

$$
language plpgsql

select * from fn_return_query()

返回结果同上所示

RETURN EXECUTE

create or replace function fn_query_execute(v_name varchar) returns setof product as 
$$
declare 
_sql text;
begin 
	_sql := 'select * from product where name like '''|| v_name || '%'';';
	raise notice 'sql====%',_sql;
return query execute _sql;
end

$$ 
language plpgsql

select * from fn_query_execute('s')

sql====select * from product where name like ‘s%’;

在这里插入图片描述

IF THEN END IF

create or replace function fn_if_else(uid int) returns text as
$$
declare
v_value text;
begin
if uid = 1 then
v_value='参数值为1';
else
v_value='参数值不为1';
end if;
return v_value;
end 
$$
language plpgsql

FOREACH,LOOP

https://blog.csdn.net/qq_39727113/article/details/115756087

SLICE

create or replace function fn_foreach(int[]) returns void as 
$$
declare 
x int;
begin 
	foreach x slice 0 in array $1
	loop 
	  raise notice '输出value=%',x;	
	end loop;
	
end

$$
language plpgsql

select * from fn_foreach(array[[1,2,3],[4,5,6]]);
输出value=1
输出value=2
输出value=3
输出value=4
输出value=5
输出value=6

select * from fn_foreach(array[1,2,3])
输出value=1
输出value=2
输出value=3

create or replace function fn_foreach(int[]) returns void as 
$$
declare 
x int[];
begin 
	foreach x slice 2 in array $1
	loop 
	  raise notice '输出value=%',x;	
	end loop;
	
end

$$
language plpgsql

select * from fn_foreach(array[[1,2,3],[4,5,6]]);
输出value={{1,2,3},{4,5,6}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/768120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python如何打包整个项目成exe文件?

首先需要进入项目打包文件所在的目录 运行以下命令打包 build_medicalgraph.py文件 pyinstaller -D build_medicalgraph.py 打包完成后一定要记得下面这个步骤,否则运行会发现报错 把数据文件给放到exe文件同级别目录下 除了以下文件保留,其他文件可以…

EXISTS和IN的区别

一.EXISTS和IN的介绍 1. exists exists返回的是true(空)和flase(非空) 对user表的每行数据逐条取出,每取一行,就判断exists后面的子语句的结果是否为空,是空,这行数据就不要,不是空,这行数据就留下. 如下: select * from user where exists (select 1); 对user表…

js计算数组中每个元素出现的次数

tip:空值合并运算符(??)是一个逻辑运算符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。reduce() 方法对数组中的每个元素按序执行一个提供的 reducer 函数&#xff0…

VUE之基本组成和使用

参考资料: 参考视频 视频资料及个人demo vue官网 vue官网-vue.js组成说明 VUE之基本部署及VScode常用插件 关闭驼峰命名法的使用异常 VUE项目结构介绍: 通过上文步骤(VUE之基本部署及VScode常用插件),我们创建了一个基本的…

【业务功能篇48】后端接口开发的统一规范

业务背景:日常工作中,我们开发接口时,一般都会涉及到参数校验、异常处理、封装结果返回等处理。而我们项目有时为了快速迭代,在这方面上有所疏忽,后续导致代码维护比较难,不同的开发人员的不同习惯&#xf…

5、Java入门教程【数组】

数组是用于存储同种类型的多个数据的容器。 一、声明 //语法 dataType[] arrayRefVar; // 首选的方法 或 dataType arrayRefVar[]; // 效果相同,但不是首选方法//示例 double[] myList; // 首选的方法 或 double myList[]; // 效果相同&…

服务机器人应用

随着时代的发展,机器人技术在各个领域越来越普及。在服务领域,服务机器人的应用也越来越受到人们的欢迎。服务机器人将会在商业、医疗、教育、酒店等领域得到应用,并成为未来发展的趋势。 在商业领域中,服务机器人可以承担很多工作…

分类预测 | MATLAB实现LSTM(长短期记忆神经网络)分类预测

分类效果 基本介绍 长短期记忆网络Q通常被称为LSTM,是一种特殊的RNN,能够学习长期依赖性。由Hochreiter和Schmidhuber(1997)提出的,并且在接下来的工作中被许多人改进和推广。 LSTM在各种各样的问题上表现非常出色,现在被广泛使用。LSTM被明确设计用来避免长期依赖性问…

vue3基础+进阶(一、Vue3项目创建并相比vue2熟悉项目结构)

目录 第一章、认识create-vue 1.1 简介 1.2 使用create-vue创建项目 1.2.1 创建步骤以及注意事项 1.2.2 注意事项 1.2.3 熟悉项目,与vue2区分 第一章、认识create-vue 1.1 简介 create-vue是Vue官网新的脚手架工具,底层切换到了vite(下一代前端工…

苍穹外卖-【day03】-【公共字段自动填充】-【新增】-【分页】-【删除】-【修改】

苍穹外卖-day03 课程内容 公共字段自动填充新增菜品菜品分页查询删除菜品修改菜品 **功能实现:**菜品管理 菜品管理效果图: 1. 公共字段自动填充 1.1 问题分析 在上一章节我们已经完成了后台系统的员工管理功能和菜品分类功能的开发,在…

SeLa:Self Labeling Via Simultaneous Clustering and Representation Learning

方法论 有监督的分类任务实现 给定一个将数据I映射至特征向量 x ∈ R D x ∈ R^D x∈RD 的深度神经网络 Φ Φ Φ ,即 x Φ ( I ) x Φ ( I ) xΦ(I)。使用有N个样本 I 1 , … , I N I_1 , … , I_N I1​,…,IN​, 且具有标签 y 1 , … , y N ∈ { 1 , … , K }…

线性DP———最长公共子序列问题(LCS)

LCS问题 求两序列具有相同元素的最长子序列&#xff0c;我们可以用到动态规划的方法来解决问题 我们用 来表示序列 与序列 能组成的LCS的长度&#xff0c;的状态转移方程如下&#xff1a; 使用两层for循环就可以解决此问题&#xff0c;时间复杂度为,可以处理n<7000左右…

pycharm里debug时torch数组显示不全

pycharm里查看torch数组全部值 一、在Pycharm运行torch数组时&#xff0c;通常只能看到数组的一部分二、解决办法1、debug后&#xff0c;鼠标右键想要查看完整的数组&#xff0c;选择Evaluate Expression2、输入np.array(x0.data)&#xff0c;x0为想要查看的数组名&#xff0c;…

C#中的抽象类(abstract)

C#中的抽象类&#xff08;abstract&#xff09;。 1&#xff1a;抽象方法只作声明&#xff0c;而不包含实现&#xff0c;可以看成是没有实现体的虚方法 2&#xff1a;抽象类不能被实例化 3&#xff1a;抽象类可以但不是必须有抽象属性和抽象方法&#xff0c;但是一旦有了抽象方…

HTML5学习简记(更新中~)

HTML定义 HTML是一种超文本标记语言&#xff0c;超文本即我们在网页中看到的链接&#xff0c;标记指的是语言中的标签 标签 标签一般成对出现&#xff0c;结束标签比开始标签多一个/ 此外标签一般分为单标签与双标签 HTML基本骨架 其中,HTML标签代表整个网页&#xff0c;hea…

ubuntu迁移anaconda到另外的目录,完美解决问题

背景&#xff1a;anaconda放在/home/下&#xff0c;但是太大了&#xff0c;需要迁移到/data/&#xff0c;找了很多资料&#xff0c;都没解决问题。 一、你可以先做一下尝试&#xff1a; ①拷贝anaconda到你想要的新目录 cp -r /home/anaconda3 /data/ ②将原来的anaconda备…

我国开设大数据相关专业的大学有哪些?

社会对大数据相关专业的人才有着巨大的需求&#xff0c;据预测&#xff0c;到2030年&#xff0c;大数据及相关产业规模达到上万亿元&#xff0c;大数据产业将成为重要的经济增长点。数据是企业最宝贵的资源&#xff0c;大数据分析技术在提升企业经营管理、提高销售业绩、降低管…

微服务组件Sentinel

什么是Sentinel Sentinel 是一种用于流量控制、熔断降级和系统负载保护的开源框架。它由阿里巴巴集团开发并开源&#xff0c;旨在帮助开发人员构建可靠和稳定的分布式系统。 Sentinel 提供了以下主要功能&#xff1a; 流量控制&#xff1a;Sentinel 可以通过限制请求的速率或…

怎么学习Java I/O相关的知识和技术? - 易智编译EaseEditing

要学习Java I/O&#xff08;输入输出&#xff09;相关的知识和技术&#xff0c;可以按照以下步骤进行&#xff1a; 理解Java I/O基础知识&#xff1a; 首先&#xff0c;了解Java I/O的基本概念和术语&#xff0c;包括输入流和输出流、字节流和字符流、文件读写等。掌握Java中…

1.12 springboot 整合log4j打印日志

1.除去springboot自带的日志 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><!-- 除去springboot自带的日志 --><exclusion><groupId>org.sprin…