PostgreSql | 数据库 |自定义函数的设计和实现

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: PostgreSql | 数据库 |自定义函数的设计和实现

前言:

数据库中的函数概念

和开发语言,Java,PHP,Python等等类似,关系型数据库也是有函数的,函数指的是动态的封装一部分特定功能的集合。

例如,查询任意表的记录数,复制指定表,这些函数可以简化一些数据库的操作

那么,最为简单直观的方法还是用一些演示示例来说明函数是什么以及函数的特性。

一,

查询任意表的记录数

create or replace function getsum(in talename VARCHAR)
RETURNS int as $$
DECLARE
   stmt VARCHAR;
   count int;
begin
  stmt:=format('select count(1) from %s', talename);
  raise notice '%',stmt;
  EXECUTE stmt into count;
  return count;
  EXCEPTION --捕获异常
  WHEN OTHERS THEN
    RETURN 1111;
end; $$ LANGUAGE plpgsql;

可以看到,该函数是一个带参函数,参数就是要查询的表的名称

调用函数:

select getsum('emp');

结果如下:

test=# select getsum('emp');
NOTICE:  select count(1) from emp
 getsum 
--------
     14
(1 row)

如果查询的是不存在的表,那么,将会返回函数定义的1111:

test=# select getsum('erwe');
NOTICE:  select count(1) from erwe
 getsum 
--------
   1111
(1 row)

查询指定表的记录数:

CREATE OR REPLACE FUNCTION "public"."totalrecords"()
  RETURNS "pg_catalog"."int4" AS $BODY$  
declare  
    total integer;  
BEGIN  
   SELECT count(*) into total FROM emp;  
   RETURN total;  
   EXCEPTION --捕获异常
    WHEN OTHERS THEN
    RETURN 1111;
END;  
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

调用该函数:

test=# select totalrecords();
 totalrecords 
--------------
           14
(1 row)

二,

利用函数优雅的创建用户

CREATE OR REPLACE FUNCTION "public"."__tmp_create_user"()
  RETURNS "pg_catalog"."void" AS $BODY$
BEGIN
  IF NOT EXISTS (
          SELECT                       -- SELECT list can stay empty for this
          FROM   pg_catalog.pg_user
          WHERE  usename = 'postgres_exporter') THEN
    CREATE USER postgres_exporter;
  END IF;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

该函数有if逻辑,其它没有什么太特殊的地方。

三,

复制指定表emp的数据不包括索引,约束,外键,指定份数:

create or replace function copytable(tablename varchar,times int)
RETURNS INT as $$
DECLARE
   stmt VARCHAR='create table %s_%s as select * from emp;';--
begin
   for i in 1..times loop
       raise notice 'd当前次数%',i;
       raise notice '%',format(stmt,tablename,i,tablename);
       EXECUTE format('drop table if EXISTS %s_%s;',tablename,i) ;
       EXECUTE format(stmt,tablename,i,tablename) ;
   end loop;
   return 100 
END; $$  LANGUAGE plpgsql;

该函数是for循环参数,循环创建指定名称的复制表,源表的名称是emp,emp表是真实存在的

四,

函数做加法

CREATE OR REPLACE FUNCTION "public"."add"("a" int4, "b" numeric)
  RETURNS "pg_catalog"."numeric" AS $BODY$
  SELECT a+b;
$BODY$
  LANGUAGE sql VOLATILE
  COST 100
select add(3,4);

调用函数:

test=# select add(55,6);
 add 
-----
  61
(1 row)

五,

函数复制表--同时复制索引,主键,约束,tablename1是新表名称加复制次数,tablename2是要复制的源表名称

CREATE OR REPLACE FUNCTION "public"."copytable"("tablename1" varchar, "tablename2" varchar, "times" int4)
  RETURNS "pg_catalog"."int4" AS $BODY$
DECLARE
   stmt1 varchar(1000);
   stmt2 varchar(1000);
begin
   for i in 1..times loop
       raise notice '当前次数%',i;
       stmt1 := format('create table "%1$s_%3$s" (like "%2$s" INCLUDING INDEXES INCLUDING DEFAULTS);',tablename1,tablename2,i);
       stmt2 := format('insert into "%1$s_%3$s" select * from "%2$s" ;',tablename1,tablename2,i);
       raise notice '%',stmt1;
       raise notice '%',stmt2;
       EXECUTE format('drop table if EXISTS "%1$s_%3$s";',tablename1,tablename2,i) ;
       EXECUTE stmt1 ;
       EXECUTE stmt2 ;
   end loop;
   return 110;      
END; $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

该函数的调用示例(emp是源表,test表是新表,此函数将会建立两个表,表名分别是test_1和test_2)

另外,需要注意的是,该函数是冥等函数,也就是说,可以反复执行任意次,结果都是不变的。

test=# select copytable('test','emp',2);
NOTICE:  当前次数1
NOTICE:  create table "test_1" (like "emp" INCLUDING INDEXES INCLUDING DEFAULTS);
NOTICE:  insert into "test_1" select * from "emp" ;
NOTICE:  当前次数2
NOTICE:  create table "test_2" (like "emp" INCLUDING INDEXES INCLUDING DEFAULTS);
NOTICE:  insert into "test_2" select * from "emp" ;
 copytable 
-----------
       110
(1 row)
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
2月前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
27天前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
2月前
|
SQL 关系型数据库 数据库
PostgreSQL数据库报错 ERROR: multiple default values specified for column "" of table "" 如何解决?
PostgreSQL数据库报错 ERROR: multiple default values specified for column "" of table "" 如何解决?
252 59
|
1天前
|
SQL 关系型数据库 数据库
PostgreSQL性能飙升的秘密:这几个调优技巧让你的数据库查询速度翻倍!
【10月更文挑战第25天】本文介绍了几种有效提升 PostgreSQL 数据库查询效率的方法,包括索引优化、查询优化、配置优化和硬件优化。通过合理设计索引、编写高效 SQL 查询、调整配置参数和选择合适硬件,可以显著提高数据库性能。
6 1
|
4天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
19 4
|
24天前
|
SQL 关系型数据库 数据库
使用 PostgreSQL 和 Python 实现数据库操作
【10月更文挑战第2天】使用 PostgreSQL 和 Python 实现数据库操作
|
2月前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
194 2
|
2月前
|
缓存 关系型数据库 数据库
如何优化 PostgreSQL 数据库性能?
如何优化 PostgreSQL 数据库性能?
52 2
|
27天前
|
存储 关系型数据库 MySQL
四种数据库对比MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
四种数据库对比 MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
|
2月前
|
关系型数据库 数据库 网络虚拟化
Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例
由于时间和空间限制,我将在后续的回答中分别涉及到“Python中采用lasso、SCAD、LARS技术分析棒球运动员薪资的案例集锦”以及“Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例”。如果你有任何一个问题的优先顺序或需要立即回答的,请告知。
62 0