Backend - postgresSQL DB 存储过程(数据库存储过程)

目录

一、存储过程的特性

(一)作用

(二)特点

(三)编码结构的区别

二、定时执行存储过程

三、2种编码结构

 (一)函数结构

1. SQL代码

 2. 举例

(1)例1-循环批量插入数据

① 首先,声明函数

② 调用函数

(2)例2-计算面积

① 首先,声明函数

② 调用函数

(二)存储过程结构

1. SQL代码

 2. 举例

(1)首先声明存储过程

(2)调用存储过程

(3)结果是  

​编辑

(三)注意

四、异常处理

1. 异常写法

2. OTHERS

3. RAISE EXCEPTION

4. SQLERRM

五、raise level format 语句

(一)作用

(二)异常等级

(三)举例

1. 展示正常信息

(1)声明时

(2)调用时

(3)结果是

2. 显示异常

(1)声明时

(2)调用时

(3)结果是

六、查询获取数据库的值

1. 声明时

2. 调用时

七、查询多笔记录

(一)第一种

1. 声明时

2. 调用时

3. 结果是

(二)第二种

1. 声明时

2. 调用时

3. 结果是

七、控制结构

(一)if条件

(二)循环

1. while … loop

(1)代码

(2)例子

① 声明时

② 调用存储过程时

2. for 

(1)声明时

(2)调用存储过程时


一、存储过程的特性

(一)作用

        可以将SQL语句存放在数据库服务器上。

(二)特点

        存储于数据库服务器。

        一次编译后,可多次调用。

        有两种编码结构:函数和存储过程。

(三)编码结构的区别

        函数可以在select、update等SQL语句中被调用,而存储过程不能。

        存储过程无需return返回值,函数必须有return返回值。

        存储过程必须用call调用,函数可用select即可。

二、定时执行存储过程

        针对pgadmin软件,使用pg_cron插件或pg_agent插件。但是pg_cron是安装在Unix上,pg_agent

        目前也没有实现Windows安装。

        所以,现在只能用代码调用存储过程。

三、2种编码结构

 (一)函数结构

1. SQL代码

create [or replace] function 函数名(参数名 参数类型, … ) 
returns 返回值类型 as$body$declare 变量名 变量类型;变量名 类型 := 值;变量名 类型; 变量名 := 值;begin 函数体; exception when others then raise exception '(%)', sqlerrm;end$body$
language plpgsql;

 2. 举例

(1)例1-循环批量插入数据
① 首先,声明函数
create or replace function test001 (num int
) returns void as 
$$
begin while num <10loop insert into public.rep_updhist(id, lastupdate, tablename, starttimekey, endtimekey) values (num, '2024-03-27 15:33:14.014 +0800', 'test0521', '20240101073054822149', '20240327153311867313');num = num +1;end loop;
exception when others then raise exception '(%)', sqlerrm;
end
$$ 
language plpgsql;
② 调用函数
select test001(8);
(2)例2-计算面积
① 首先,声明函数
create or replace function test002 (w int, h int
) returns int as 
$calculator_area$
declare res int := 0;
beginres := w * h;return res;
exception when others then raise exception '(%)', sqlerrm;
end
$calculator_area$ 
language plpgsql;
② 调用函数
select test002(4,5);

(二)存储过程结构

1. SQL代码

create [or replace] procedure 存储过程名(参数名 参数类型, … )
language plpgsql as
$body$declare 变量名 变量类型;变量名 类型 := 值;变量名 类型; 变量名 := 值;begin SQL 语句; exception when others then rollback;end
$body$

 2. 举例

(1)首先声明存储过程
create or replace procedure testpro001("w" in integer, "h" in integer, "msg" inout text)
language plpgsql as
$$
declareres_area integer := 0;
begin res_area := w * h;msg := msg||res_area;raise notice '控制台展示面积数据:%', res_area;
end;
$$
(2)调用存储过程
call testpro001(4,6, '面积的计算结果是');
(3)结果是  

(三)注意

1. 每句末尾必须带分号隔开。

2. 字串相加的连接符号是 ||,而不是+。

3. format部分中,%是占位符,接收变量的值。例如, aa变量值是23, bb := '结果是%',aa;  则bb的值是'结果是23'。

4. 在函数中,若returns返回值类型是void,则无需return,否则得写上 return 变量名。

5. 报错

        SQL 错误 [42725]: ERROR: procedure testpro001(integer, integer, integer) is not unique
  Hint: Could not choose a best candidate procedure. You might need to add explicit type casts.
  Position: 6

        解决:查看存储过程文件夹中,是否有重复的方法名(或存储过程名)。

6. 执行函数时,若函数名已经存在,但参数类型有变,则会生成函数名重复的函数。同理,执行过程也是。

7. 保留大小写,需要加上双引号。

        解决:使用“”,或者使用quote_ident('XXX'),给字符串加上双引号

四、异常处理

1. 异常写法

exception when others then rollback;raise exception '异常是%', sqlerrm;

2. OTHERS

        表示除了声明外的错误。

3. RAISE EXCEPTION

        抛出异常。

        举例:raise exception '出现了异常,请检查!'; 

4. SQLERRM

        储存当前错误的详细信息。

        举例:raise exception '异常是%', sqlerrm;

五、raise level format 语句

(一)作用

        显示消息或异常。

(二)异常等级

        DEBUG(向服务器日志写信息)、

        LOG(向服务器日志写信息,优先级更高)、

        INFO、NOTICE和WARNING(把信息写到服务器日志以及转发到客户端应用,优先级逐步升高)、

        EXCEPTION抛出一个错误(强制关闭当前事务)

(三)举例

1. 展示正常信息

(1)声明时
create or replace function get_data()
returns void as 
$$
declare strval text;
begin strval := '一个大写字母' || quote_ident('B') || '!';raise notice '这是%', strval;
exception when others thenraise WARNING '出现异常:(%)', sqlerrm;
end;
$$
language plpgsql;
(2)调用时
select get_data();
(3)结果是

2. 显示异常

(1)声明时
create or replace function get_data()
returns void as 
$$
declarestrval text;
begin raise notice '这是%', xx;
exception when others then-- raise EXCEPTION '出现异常:(%)', sqlerrm;raise WARNING '出现异常:(%)', sqlerrm;
end;
$$
language plpgsql;
(2)调用时
select get_data();
(3)结果是

六、查询获取数据库的值

1. 声明时

create or replace procedure testpro001()
language plpgsql as
$calculator_area$
declare qry_book text := '';qry_author text := '';
beginselect name into qry_book from public."myApp_book" where bid = 3; -- 第1种execute 'select author from public."myApp_book" where bid = 3' into qry_author; -- 第2种raise notice '书籍ID为是3的书名是:%,作者是:%', qry_book, qry_author;
end;
$calculator_area$

2. 调用时

call testpro001();

七、查询多笔记录

(一)第一种

        在声明函数时,定义输出的值(指定out参数,使用return next)

1. 声明时

create or replace function get_record(out out_bid int, out out_card character varying)
returns setof record as 
$$
declare r record;
begin for i in 1..5 loopselect * into r from public."myApp_book" where bid=i;out_bid := r.bid;out_card := r.card;return next;end loop;
end
$$
language plpgsql;

2. 调用时

select * from get_record();

3. 结果是

(二)第二种

        在调用时,定义获取的值(使用return query)

1. 声明时

create or replace function get_record()
returns setof record as 
$$
declare r record;
begin for i in 1..5 loopreturn query(select bid, card from public."myApp_book" where bid=i);end loop;
end
$$
language plpgsql;

2. 调用时

select * from get_record() as t(id integer, card character varying);

3. 结果是

七、控制结构

(一)if条件

if … then … elseif … then … else … end if;

其中,end if的后面一定要带上分号;elseif的写法是连接在一起的,中间无空格隔开。

例子:

create or replace procedure testpro001("w" in integer, "h" in integer, "msg" inout text)
language plpgsql as
$$
declareres_area integer := 0;
begin res_area := w * h;msg := msg||res_area;if res_area <= 10 thenraise notice '面积数据:%,小于10', res_area;elseif res_area <= 20 thenraise notice '面积数据:%,小于20', res_area;elseraise notice '面积数据:%,大于20', res_area;end if;
end;
$$
call testpro001(3,6, '求w的值');

(二)循环

1. while … loop

(1)代码
while … loop # 函数体;
end loop;
(2)例子
① 声明时
create or replace procedure testpro001("w" in integer, "h" in integer, "msg" inout text)
language plpgsql as
$$
declareres_area integer := 0;
begin while w<=h loopw = w+1;end loop;msg := 'w的值是' || w;
end;
$$
② 调用存储过程时
call testpro001(3,6, '求w的值');

2. for 

(1)声明时
create or replace procedure testpro001()
language plpgsql as
$$
declaresumval int := 0;
begin for i in 1..6 loopsumval := sumval+i;end loop;raise notice '总和值:%',sumval;
end;
$$
(2)调用存储过程时
call testpro001();

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

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

相关文章

考场作弊行为自动抓拍分析系统

考场作弊行为自动抓拍分析系统采用了AI神经网络和深度学习算法&#xff0c;考场作弊行为自动抓拍分析系统通过人形检测和骨架勾勒等技术&#xff0c;实时计算判断考生的异常动作行为。通过肢体动作识别技术&#xff0c;系统可以详细分析考生的头部和手部肢体动作&#xff0c;进…

乡村振兴的乡村旅游新模式:挖掘乡村旅游资源,创新旅游开发方式,打造乡村旅游新品牌,助力美丽乡村建设

目录 一、引言 二、乡村旅游资源挖掘 1、自然景观资源 2、人文历史资源 3、农业产业资源 三、旅游开发方式创新 1、多元化旅游产品 2、体验式旅游模式 3、智慧旅游建设 四、乡村旅游新品牌打造 1、品牌定位与策划 2、品牌传播与推广 3、品牌维护与提升 五、助力美…

当代家庭教育杂志社《当代家庭教育》杂志社24年第6期目录

家庭教育资讯 《家庭教育蓝皮书2024:中国家庭养育环境报告》出炉 4 2024年4月至7月北京市将开展“双减”专项行动 5 小学生玩“烟卡”到底该不该禁&#xff1f; 5 家庭教育理论探索 新时代家长家庭教育素养&#xff1a;意涵、关键要素及其培育 周起煌; 6-10 …

轻松上手ClickHouse:ClickHouse入门

引言 在数字化时代&#xff0c;大数据处理和分析已经成为了各行各业不可或缺的一环。而ClickHouse&#xff0c;作为一款高性能的列式数据库管理系统&#xff0c;以其卓越的查询性能和灵活的扩展性&#xff0c;赢得了众多企业和开发者的青睐。本文将带领大家走进ClickHouse的世…

Kubernetes常用命令

目录 一.资源管理办法 1.陈述式资源管理方法 &#xff08;1&#xff09;kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 &#xff08;2&#xff09;kubectl 是官方的CLI命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在…

VC++学习(3)——认识MFC框架,新建项目,添加按钮

目录 引出第三讲 MFC框架新建项目Windows搜索【包含内容的搜索】如何加按钮添加成员变量添加成功 添加按钮2杂项 总结 引出 VC学习&#xff08;3&#xff09;——认识MFC框架&#xff0c;新建项目&#xff0c;添加按钮 MFC(Microsoft Foundation Classes)&#xff0c;是微软公…

零基础小白撸空投攻略:空投流程是什么样的? 如何操作?

在Web3的世界中&#xff0c;空投&#xff08;Airdrop&#xff09;是一种常见的营销和推广策略&#xff0c;通过向特定用户群体免费分发代币&#xff0c;项目方希望能够吸引更多的用户和关注。对于许多刚刚接触加密货币和区块链的新手来说&#xff0c;都会疑惑空投的流程究竟是什…

LeetCode-Pow(x, n)【递归 数学】

[TOC](LeetCode-Pow(x, n)【递归 数学】) 题目描述&#xff1a; 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000 示例 2&#xf…

HTML | 在IDEA中配置Tomcat时遇到的一些问题的解决办法

目录 IDEA中没有web文件夹目录 Tomcat在哪里配置服务器 IDEA中没有web文件夹目录 首先说在IDEA中没有web这个文件夹的解决办法 在菜单栏中帮助中点击查找操作搜索添加框架支持&#xff08;因为我的IDEA会出现无法点击这个操作&#xff0c;所以我对该操作添加了快捷键&#xf…

聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用

哈喽大家好&#xff0c;我是咸鱼。 最近写的一个 Python 项目用到了 jwcrypto 这个库&#xff0c;这个库是专门用来处理 JWT 的&#xff0c;JWT 全称是 JSON Web Token &#xff0c;JSON 格式的 Token。 今天就来简单入门一下 JWT。 官方介绍&#xff1a;https://jwt.io/intr…

谓词逻辑(一)

一、句子的谓词符号化 谓词逻辑&#xff0c;也叫一阶逻辑&#xff0c;它对每个最简单的命题尽一步进行分解。 1个体词&#xff1a;可以独立存在的客体。 2谓词&#xff1a;描述一个个体词的属性或多个个体词之间的关系&#xff08;可用一元函数和多元函数来理解&#xff09;…

【qt】QListWidget 组件

QListWidget 组件 一.QListWidget的用途二.界面设计三.QListWidget的添加1.界面添加2.代码添加 四.列表项的设置1.文本2.图标3.复选框4.列表大小 五.字体和图标的设置1.字体&#xff1a;2.图标&#xff1a; 六.设置显示模式1.图标2.列表 七.其他功能实现1.删除2.全选3.反选4.ad…

清空了电脑回收站,之前的文件还能否恢复?

电脑已成为我们日常生活中不可或缺的一部分。我们在电脑上处理文档、保存图片、下载视频等&#xff0c;而电脑中的回收站则成为我们处理不再需要文件的一个便捷工具&#xff0c;当我们想要删除某些文档的话&#xff0c;它并不是立即从硬盘上消失&#xff0c;而是被系统移动到了…

【堡垒机小知识】堡垒机资产监控能监控哪些东西呢?

堡垒机&#xff0c;重要的网络安全工具&#xff0c;其资产监控功能在保障系统稳定运行、防范潜在风险方面发挥着至关重要的作用。但不少小伙伴对于监控内容不清楚&#xff0c;这里我们就来一起简单看看&#xff0c;仅供参考~ 堡垒机资产监控能监控哪些东西呢&#xff1f; 【…

js——数据操作——实现阶梯价格排序——基础积累

最近在写网络报价的时候&#xff0c;遇到一个需求&#xff0c;就是要根据采购数量&#xff0c;找到符合数量的阶梯区间&#xff0c;并找到最便宜的采购价格。 比如下面&#xff1a; let originViewList [{id:1,incrementalQuantity:10,priceList:[{minQuantity:1,price:20},…

Linux —— 线程同步

Linux —— 线程同步 死锁线程同步条件变量pthread_cond_waitpthread_cond_signal初始状态为什么之后会“阻塞”如何修改以持续运行 pthread_cond_broadcast 条件变量的接口抢票模拟 我们今天接着来了解线程&#xff1a; 死锁 死锁&#xff08;Deadlock&#xff09;是计算机科…

基础编程函数题

1.简单输出整数&#xff1a;本题要求实现一个函数&#xff0c;对给定的正整数N&#xff0c;打印从1到N的全部正整数。 #include <stdio.h> void PrintN ( int N ); int main () { int N; scanf("%d", &N); PrintN( N ); return 0; } void Prin…

会所前台装水离子雾化壁炉前和装后对比

会所前台装水离子雾化壁炉前和装后会有明显的对比&#xff1a; 装水离子雾化壁炉之前&#xff1a; 普通前台氛围&#xff1a; 在壁炉安装之前&#xff0c;前台可能显得普通&#xff0c;缺乏独特的装饰元素或焦点。 空间感平淡&#xff1a;前台的氛围可能相对平淡&#xff0c…

Python踩坑系列之使用redis报错:module ‘redis‘ has no attribute ‘Redis‘问题

一步一步往后看哦&#xff01;&#xff01;&#xff01; 纳尼&#xff0c;大伙看看这是什么情况&#xff0c;都是这么写的呢&#xff0c;为啥我这就报错了0.0 出现问题不可怕&#xff0c;解决它就完事了。 方法一、安装redis重新运行程序 pip install redis 无果&#xff0…

金丝雀发布(灰度发布)介绍 及 声明式管理方法简介

目录 一 应用发布策略 1&#xff0c;滚动发布&#xff08;k8s默认&#xff09; 2&#xff0c;蓝绿发布 3&#xff0c;金丝雀发布 二 金丝雀发布&#xff08;Canary Release&#xff09; &#xff08;灰度发布&#xff09; 1&#xff0c;金丝雀发布图解 2&#xff0…