当前位置: 首页 > news >正文

数据库之函数、存储过程

函数、存储过程

1.函数

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

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

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

调用函数:

select area_of_rectangle(5,9);

结果截图:
请添加图片描述

2.存储结构

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

举例代码如下:

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

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

调用存储过程

CALL volume_of_cuboid(10, 20, 30 total);
-- 或
SELECT * FROM volume_of_cuboid(10, 20, 30);

存储过程的变量类型:

存储过程中,对变量赋值需要两个值类型一致,如经常碰到bigint类型值赋值到integer变量中,导致运行报错。常用类型如下:
在这里插入图片描述

3.基本流程语句

3.1 if语句:

IF ... THEN ... END IF;
IF ... THEN ... ELSE ... END IF;
IF ... THEN ... ELSE ... THEN ... ELSE ... END IF;
--例:
if student_name = '张静' thenRAISE NOTICE '我是张静';
else if student_name like '%李%' thenRAISE NOTICE '我姓李';
elseRAISE NOTICE '我不是张静,也不姓李';
end if;

3.2 case语句:

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

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

2024年5月28日整明白了

举例代码如下:

CREATE OR REPLACE FUNCTION qufen(name VARCHAR)
returns VARCHAR as
$$
DECLARE
notice VARCHAR ;
BEGIN CASE name WHEN '张静','晓静' THENnotice := '张静和晓静都是我的名称';ELSEnotice :=  '你叫错名字了';END case;RETURN notice;END 
$$
LANGUAGE 'plpgsql';

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

3.3 2.循环

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

[ <<label>> ]
LOOP循环体语句;EXIT [ label ] [ WHEN 判断条件表达式 ];
END LOOP [ label ];--例-计算1到100的和:
sum := 0;
i := 0;
loopi := i + 1;sum := sum + i;exit when i = 100 ;
end loop;
RAISE NOTOCE '1到100的和为:%',sum;

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

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

CREATE OR REPLACE FUNCTION yidaoyibaidehe()
returns INTEGER as
$$
DECLARE
sum INTEGER;
i INTEGER;
BEGIN
sum := 0;
i := 0;
loopi := 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循环

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

相关文章:

数据库之函数、存储过程

函数、存储过程 1.函数 函数&#xff0c;常用于对一个或多个输入参数进行操作&#xff0c;主要目的是返回一个结果值&#xff0c;就是一种方法&#xff0c;在postgre里存放的位置叫function&#xff0c;比如创建一个计算长方面积的函数。 举例&#xff1a;建立一个计算长方形…...

安卓启动 性能提升 20-30% ,基准配置 入门教程

1.先从官方下载demohttps://github.com/android/codelab-android-performance/archive/refs/heads/main.zip 2.先用Android studio打开里面的baseline-profiles项目 3.运行一遍app&#xff0c;这里建议用模拟器&#xff0c;&#xff08;Pixel 6 API 34&#xff09;设备运行&a…...

Linux C/C++目录和文件的更多操作

1.access()库函数 用于判断当前用户对目录或文件的存取权限 #include<unistd.h>int accsee(const char *pathname,int mode);参数说明&#xff1a; pathname //目录或文件名 mode //需要判断的存取权限&#xff0c;在<unistd.h>预定义如下#define R_OK 4 //读权…...

如何高效地向Redis 6插入亿级别的数据

如何高效地向Redis插入亿级别的数据 背景不可用的方案可用方案:利用管道插入其他命令&#xff1a;参考&#xff1a; 背景 上一条记录&#xff1b;80G的存储&#xff1b;10几个文件&#xff0c;如何快速导入是一个大问题&#xff0c;也是一个很棘手的问题&#xff1b;如下将给出…...

中国历年肥料进口数量统计报告

数据来源于国家统计局&#xff0c;为1991年到2021年我国每年肥料进口数量统计。 2021年&#xff0c;我国进口肥料909万吨&#xff0c;比上年减少151万吨。 数据统计单位为&#xff1a;万吨 数据说明&#xff1a; 数据来源于国家统计局&#xff0c;为海关进出口统计数 我国肥料…...

即时通讯视频会议平台,WorkPlus本地化部署解决方案

随着现代科技的快速发展&#xff0c;传统的会议方式已经不再满足企业和组织的需求。即时通讯视频会议以其便利性和高效性&#xff0c;成为了现代企业沟通和协作的重要工具。通过即时通讯视频会议&#xff0c;企业可以实现无时差的交流和远程协作&#xff0c;增强团队合作和提高…...

Java的数据库编程-----JDBC

目录 一.JDBC概念&使用条件&#xff1a; 二.mysql-connector驱动包的下载与导入&#xff1a; 三.JDBC编程&#xff1a; 使用JDBC编程的主要五个步骤&#xff1a; 完整流程1&#xff08;更新update&#xff09;&#xff1a; 完整流程2(查询query)&#xff1a; 一.JDB…...

如何获取SSL证书,消除网站不安全警告

获取SSL证书通常涉及以下几个步骤&#xff1a; 选择证书颁发机构&#xff08;CA&#xff09;&#xff1a; 你需要从受信任的SSL证书颁发机构中选择一个&#xff0c;比如DigiCert、GlobalSign、JoySSL等。部分云服务商如阿里云、腾讯云也提供免费或付费的SSL证书服务。 生成证…...

Unity动画系统介绍

Unity动画系统介绍 Animator组件&#xff1a; 这是Unity中用于控制动画状态的组件&#xff0c;它与Animator Controller一起工作&#xff0c;可以基于游戏逻辑来切换不同的动画状态。 Animator Controller&#xff1a; 这是一个用于管理动画状态机的组件&#xff0c;它允许…...

Three.js-实现加载图片并旋转

1.实现效果 2. 实现步骤 2.1创建场景 const scene new THREE.Scene(); 2.2添加相机 说明&#xff1a; fov&#xff08;视场角&#xff09;&#xff1a;视场角决定了相机的视野范围&#xff0c;即相机可以看到的角度范围。较大的视场角表示更广阔的视野&#xff0c;但可能…...

ACM实训第25天

第四套 第一道&#xff08;修改&#xff09; #include<stdio.h> #include<string.h> int cnt[10]; void count_digits(int n,int* cnt){for(int i1;i<n;i){int numi;while(num){cnt[num%10];num/10;}} } int main(){int t;scanf("%d\n",&t);whi…...

GraphQL(2):使用express和GraphQL编写helloworld

1 安装express、graphql以及express-graphql 在项目的目录下运行一下命令。 npm init -y npm install express graphql express-graphql -S 2 新建helloworld.js 代码如下&#xff1a; const express require(express); const {buildSchema} require(graphql); const grap…...

Vue中的计算属性和侦听器:提升响应式编程的艺术

引言 Vue.js是一个用于构建用户界面的渐进式框架&#xff0c;它的核心特性之一是响应式编程。Vue通过数据绑定和响应式系统&#xff0c;使得开发者能够以声明式的方式处理数据变化。在Vue中&#xff0c;计算属性&#xff08;Computed Properties&#xff09;和侦听器&#xff…...

JavaScript倍速播放视频

F12打开开发者工具&#xff0c;打开控制台&#xff0c;输入这行代码&#xff0c;视频即可加速播放&#xff0c; 可以调整倍速&#xff08;2&#xff0c;4&#xff0c;8&#xff0c;16&#xff09; document. getElementsByTagName("video")[0]. playbackRate16...

ER图介绍

在数据库设计和建模中&#xff0c;实体-关系图&#xff08;Entity-Relationship Diagram&#xff0c;简称ER图&#xff09;是一个至关重要的工具。ER图通过图形化的方式描述了现实世界中的实体&#xff08;Entity&#xff09;及其之间的关系&#xff08;Relationship&#xff0…...

Oracle通过datax迁移线上表到历史库

历史数据迁移 线上库数据增长迅速&#xff0c;需要定期清理历史数据&#xff0c;因为异地灾备&#xff0c;但是带宽很小&#xff0c;不能使用数据泵直接往历史库导数&#xff0c;会导致本地机房到灾备机房的带宽被占满&#xff0c;调研过flink、golden gate、datax&#xff0c…...

java基础-深拷贝和浅拷贝

java中有一个概念叫深拷贝和浅拷贝&#xff0c;那这两个是什么意思呢&#xff1f;其实你可以对比一下c中的传值和传引用的问题。 深拷贝 即两个相同的对象地址不同&#xff0c;比如对象A通过拷贝出来对象B&#xff0c;在对B对象进行操作时不会影响到A对象的内容。 浅拷贝 和…...

Java数组操作

数组拓展 1.1 数组拷贝 需求&#xff1a;定义一个方法arraycopy, 从指定源数组中从指定的位置开始复制指定数量的元素到目标数组的指定位置。 1.2. 排序操作 需求&#xff1a;完成对int[] arr new int[]{2,9,6,7,4,1}数组元素的升序排序操作. 1.2.1.冒泡排序 对未排序的各元素…...

C++vector及其实现

第一个参数是类型(可以是自定义也可以是内置类型) 相当于生成一个该类型的数组 allocator是空间配置器 遍历 1.下标遍历 2.迭代器遍历 3.范围for 对象访问 有名对象访问 匿名对象访问 隐式类型转换 成员函数 sort 使用sort需要包含头文件algorithm eg. sort的使用非…...

路由策略实验1

先把地址全部配通 对R1 对R2 对R4 对R3 对R5 对R6 对R7 然后起路由协议 对R1 对R2 对R3 对R4 对R5 对R6 对R7...

PyTorch 2.8镜像工业设计:CAD图纸→AI生成产品渲染视频→营销素材输出

PyTorch 2.8镜像工业设计&#xff1a;CAD图纸→AI生成产品渲染视频→营销素材输出 1. 工业设计新范式&#xff1a;从CAD到营销视频的全流程AI化 传统工业设计流程中&#xff0c;从CAD图纸到产品营销素材的转化往往需要耗费大量时间和人力成本。设计师需要先完成3D建模&#x…...

解密Wallpaper Engine资源宝库:RePKG工具完全实战指南

解密Wallpaper Engine资源宝库&#xff1a;RePKG工具完全实战指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专为Wallpaper Engine设计的开源资源处理工具&#xf…...

SEO_SEO数据监控与分析的关键指标介绍

SEO数据监控与分析的关键指标介绍 在当今数字营销的世界里&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为了每个网站运营者和数字营销人员必不可少的技能。SEO数据监控与分析是SEO工作的重要环节&#xff0c;通过对关键指标的监控和分析&#xff0c;我们可以更好…...

Z-Image Atelier 生成动态效果预览:通过序列图像模拟简单动画过程

Z-Image Atelier 生成动态效果预览&#xff1a;通过序列图像模拟简单动画过程 最近在玩一个挺有意思的AI图像工具&#xff0c;叫Z-Image Atelier。它最吸引我的地方&#xff0c;不是生成单张多么精美的图片&#xff0c;而是它能帮你“脑补”出一段动态过程。简单来说&#xff…...

ZYNQ PS侧DDR3内存配置避坑指南:以ACZ702开发板为例,手把手教你搞定MT41K128M16

ZYNQ PS侧DDR3内存配置实战&#xff1a;从硬件原理到Vivado参数设置全解析 当你第一次拿到ACZ702这样的ZYNQ开发板&#xff0c;准备配置PS侧的DDR3内存时&#xff0c;是否遇到过这样的困惑&#xff1a;为什么在Vivado中找不到DDR管脚约束选项&#xff1f;为什么按照传统FPGA的D…...

软件实施交付转运维学习第三天:Linux系统命令基础(部分)

从实施到运维的蜕变之路&#xff0c;掌握命令就是掌握Linux的灵魂写在前面作为一名从软件实施交付转向运维的工程师&#xff0c;我深刻体会到&#xff1a;Linux命令不仅仅是简单的指令&#xff0c;更是与操作系统对话的语言。当我们站在实施和运维的交界处&#xff0c;掌握Linu…...

新手福音:借力卓晴式AI,在快马平台轻松完成你的首个网页项目

作为一个刚接触编程的新手&#xff0c;想要创建个人网页却不知从何下手是很常见的情况。最近我发现了一个特别适合新手的组合方案&#xff1a;用AI生成代码在线平台实时调试。下面记录我的完整实践过程&#xff0c;希望能帮到同样想入门的朋友。 明确需求清单 首先梳理出网页需…...

OpenCV实战:3种图像降噪滤波器的Python代码对比(附效果图)

OpenCV实战&#xff1a;3种图像降噪滤波器的Python代码对比&#xff08;附效果图&#xff09; 在数字图像处理中&#xff0c;噪声是影响图像质量的主要因素之一。无论是来自传感器的不完美&#xff0c;还是传输过程中的干扰&#xff0c;噪声都会降低图像的清晰度和可用性。对于…...

用Python手撕ZUC算法:国产密码从原理到实现(附完整LFSR代码)

用Python手撕ZUC算法&#xff1a;国产密码从原理到实现&#xff08;附完整LFSR代码&#xff09; 在当今数据安全日益重要的时代&#xff0c;流密码作为加密技术的重要分支&#xff0c;因其高效性和实时性被广泛应用于通信领域。而ZUC算法作为我国自主研发的国际标准密码算法&am…...

S32K312实战:用AUTOSAR Icu模块测量PWM占空比与周期(基于NXP MCAL与EB Tresos)

S32K312实战&#xff1a;AUTOSAR Icu模块精准测量PWM信号的工程实践 在汽车电子开发中&#xff0c;PWM信号的精确测量是ECU功能实现的基础环节。无论是发动机控制单元中的转速信号采集&#xff0c;还是车身电子中的执行器状态反馈&#xff0c;都需要对PWM信号的周期、占空比等参…...