概要

PostgreSQL从设计上是可扩展的,从用户的角度可以通过四种方式对PostgresSQL进行扩展

  • query language functions (functions written in SQL)
  • procedural language functions (functions written in, for example, PL/pgSQL or PL/Tcl)
  • internal functions
  • C-language functions

本文重点介绍C-language functions,即函数通过contrib模块进行扩展。

  • 用户定义函数简介

用户定义函数(User-defined functions),可以是使用C(或者与C兼容的开发语言,比如C++)编写,这样函数可以被编译成动态库,并被PostgreSQL服务进程加载。用户定义函数与internal functions内部函数本质上是一样的,只不过内部函数是需要重新编译PostgresSQL内核的。编写上也可以参考内部函数的源码,可以给我们提供了丰富的例子。

实例

  • PostgreSQL开发环境搭建
    参考上一篇文章源码编译安装postgresql

  • 编写代码
    1.进入postgres目录,会看到contrib目录,如下图

[root@10 postgres]# cd contrib/

进入目录后会看到好多文件夹,每一文件夹就代表一个用户定义模块,里面可能包括一个或多个用户定义函数。

2.创建用户定义函数的目录

[root@10 contrib]# mkdir pginvoke

3.C范例程序pginvoke.c

#include "postgres.h"
#include "fmgr.h"#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endifPG_FUNCTION_INFO_V1(pgEuropean);Datum pgEuropean(PG_FUNCTION_ARGS)
{float ret,a,b;a=PG_GETARG_FLOAT4(0);b=PG_GETARG_FLOAT4(1);ret = a / b;PG_RETURN_FLOAT4(ret);
}

4.编写sql文件pginvoke–1.0.sql

/* contrib/pginvoke/pginvoke--1.0.sql */--complain if script is sourced in psql rather than via ALTER EXTENSION
\echo Use "CRAETE EXTENSION test_tabble" to load this file. \quit
CREATE TABLE pg_invoke(para1 float4,para12 float4, ret float);/* 创建一个表格 */CREATE FUNCTION pgEuropean(float4,float4)/* 创建一个函数 */
RETURNS float4
AS 'MODULE_PATHNAME' , 'pgEuropean'
LANGUAGE C STRICT PARALLEL RESTRICTED;

5.编写控制文件pginvoke.control

# pginvoke extension comment = 'only pginvoke publication'
default_version = '1.0'
module_pathname = '$libdir/pginvoke'
relocatable = true

6.编写Makefile

# contrib/pginvoke/MakefileMODULES = pginvokeEXTENSION = pginvoke
DATA = pginvoke--1.0.sql
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
else
subdir = contrib/pginvoke
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
endif

编译

1.完成后目录结构如下

[root@10 pginvoke]# pwd
[root@10 pginvoke]# pwd
/root/git/postgres/contrib/pginvoke
[root@10 pginvoke]# ll
total 16
-rw-r--r-- 1 root root 334 Feb 17 20:52 Makefile
-rw-r--r-- 1 root root 296 Feb 17 20:51 pginvoke--1.0.sql
-rw-r--r-- 1 root root 265 Feb 17 20:50 pginvoke.c
-rw-r--r-- 1 root root 136 Feb 17 20:51 pginvoke.control

2.在上级目录下修改Makefile

[root@10 pginvoke]# cd ../
[root@10 contrib]# pwd
/root/git/postgres/contrib
[root@10 contrib]# vi Makefile###51                 unaccent        \52                 vacuumlo        \53                 test            \54                 pginvoke

3.编译

[root@10 contrib]# cd /root/git/postgres/contrib/
[root@10 contrib]# make
.....
[root@10 contrib]# cd pginvoke/
[root@10 pginvoke]# pwd
/root/git/postgres/contrib/pginvoke
[root@10 pginvoke]# ll
total 36
-rw-r--r-- 1 root root   334 Feb 17 21:11 Makefile
-rw-r--r-- 1 root root   381 Feb 17 21:11 pginvoke--1.0.sql
-rw-r--r-- 1 root root   267 Feb 17 21:12 pginvoke.c
-rw-r--r-- 1 root root   144 Feb 17 21:12 pginvoke.control
-rw-r--r-- 1 root root  1800 Feb 17 21:12 pginvoke.o
-rwxr-xr-x 1 root root 16320 Feb 17 21:12 pginvoke.so

可以看到在pginvoke目录下回生成pginvoke.so

安装

1.自动安装
直接执行make install
2.手动安装
copy 下面3个文件到postgres的安装目录

cp pginvoke.control /usr/local/pgsql/share/extension
cp pginvoke--1.0.sql  /usr/local/pgsql/share/extension/
cp pginvoke.so '/usr/local/pgsql/lib/

验证

1.查看已安装的用户定义函数,目前并没有我们创建的函数。

su[root@10 ~]# su - postgres
Last login: Thu Feb 17 15:21:04 CST 2022 from 10.0.2.2 on pts/1
[postgres@10 ~]$ psql
psql (15devel)
Type "help" for help.postgres=# \dList of relationsSchema |          Name           | Type  |  Owner
--------+-------------------------+-------+----------public | pg_stat_statements      | view  | postgrespublic | pg_stat_statements_info | view  | postgrespublic | test_table              | table | postgres
(3 rows)

2.查看可安装的函数,可以看到pginvoke

postgres=# select name from pg_available_extensions;name
--------------------plpgsql
.....pg_trgmpginvoke
(44 rows)
postgres=#

3.创建扩展模块pginvoke

postgres=# create extension pginvoke;
CREATE EXTENSION

4.再次查看已安装模块

已经创建成功。

5.查看函数创建脚本

postgres=# \sf
function name is required
postgres=# \sf pgEuropean
CREATE OR REPLACE FUNCTION public.pgeuropean(real, real)RETURNS realLANGUAGE cPARALLEL RESTRICTED STRICT
AS '$libdir/pginvoke', $function$pgEuropean$function$

6.调用函数

postgres=# select pgEuropean(10.0,3.0);pgeuropean
------------3.3333333
(1 row)

7.移除用户扩展函数

postgres=# drop extension pginvoke;
DROP EXTENSION
postgres=# \dList of relationsSchema |          Name           | Type  |  Owner
--------+-------------------------+-------+----------public | pg_stat_statements      | view  | postgrespublic | pg_stat_statements_info | view  | postgrespublic | test_table              | table | postgres
(3 rows)

postgresql自定义函数实现,通过contrib模块进行扩展相关推荐

  1. PostgreSQL自定义函数

    PostgreSQL自定义函数 函数语法 实例 动态执行语句 话不多说,下面直接拿实例说话. 函数语法 CREATE [OR REPLACE] FUNCTION function_name (argu ...

  2. laravel中的自定义函数的加载和第三方扩展库加载

    一.自定义公共函数 1. 创建文件 app/Helpers/functions.php 2. 修改项目 composer.json 3.运行composer dump-auto 4.OK,然后你就可以 ...

  3. PostgreSQL自定义函数实现十六进制转十进制

    在PostgreSQL我们可以直接通过下面的方式来将十六进制转换成十进制: bill@bill=>select x'ab'::int;int4 ------171 (1 row) 但是这仅仅只能 ...

  4. [postgresql]postgresql自定义函数查询ETL作业依赖的实例

    --------------------------------------------------- ---需求:查找ETL依赖关系 ---描述:根据作业ID,查找上游依赖的作业ID ---依赖表结 ...

  5. 自定义_Excel中的自定义函数(自定义函数的基础内容)

    各位朋友,你们好. 最近和网友沟通交流Excel问题,好些问题都没法直接实现,因此用了很多自定义函数,也给头条里的朋友写过几个自定义函数(比如颜色计算的函数.提取不重复内容的函数.汉字转拼音的函数-- ...

  6. Linux的excel函数怎么编写,Excel中怎么编写自定义函数

    Excel中的函数已经很方便,但仍然有时会觉得如果还能更方便就好了,这个时候,自定义函数就登场了.下面学习啦给大家分享Excel中编写自定义函数的方法吧. Excel中编写自定义函数的方法 我们要判断 ...

  7. postgresql中自定义函数脚本的备份及恢复

    [转自 housonglin1213 的博客]http://blog.csdn.net/housonglin1213/article/details/51005540 1.自定义函数脚本备份 CREA ...

  8. 《第六部分-练习题2:使用递归-模块-自定义函数(8道题)》

    目录 关联文章 一.登录银行系统并显示余额(登录.注册功能) 二.将字符串处理成key:value或json格式 三.计算"斐波那契数列"个数 四.登录.注册功能 五.字符串的消除 ...

  9. Python之系统函数、自定义函数、模块、递归合集

    一.函数(function)引入 1.函数(计算机函数)是程序中一段相对独立的代码,这段代码能够实现某一项具有独立.完整的功能.指可以直接被另一段程序代码引用的程序代码. 2.函数分为系统函数和自定义 ...

最新文章

  1. openpyxl.utils.exceptions.IllegalCharacterError错误
  2. [C++] NEW Advanced Usage
  3. Excel表格快速将公式运用到一整列
  4. python怎么读文件夹下的文件夹-python如何获取当前文件夹下所有文件名详解
  5. 用 Go 构建一个区块链 -- Part 3: 持久化和命令行接口
  6. # 字符串从右往左查找_python数据类型及字符串(2)
  7. 使用UAA OAuth2授权服务器–客户端和资源
  8. [译作]Class in Jscript Part I
  9. 不重复的两两比较(洛谷P5728题题解,Java语言描述)
  10. 数据工程师需要掌握的 18 个 Python 库
  11. C#-WinForm-ListView-表格式展示数据、如何将数据库中的数据展示到ListView中、如何对选中的项进行修改...
  12. 虫师Selenium2+Python_11、自动化测试项目实战
  13. 赶个项目,博客稍后更新
  14. 信号与线性系统分析第4版吴大正课后习题答案
  15. Unity+罗技G29方向盘+Realistic Car Controller 制作简单的模拟驾驶
  16. win10笔记本网络重置后没有网络连接了
  17. 封装:el-upload上传图片组件(解决图片闪动、多选问题)
  18. iis服务器.webp文件无法访问的解决办法
  19. 抽象类和接口不能直接实例?
  20. my97时间控件的使用

热门文章

  1. #.数学函数3D图的绘制
  2. Unity3d调用Android版so库
  3. 阿里云实践 - iTerm2登录服务器脚本(ssh)
  4. 论文阅读-FDA Federated Defense Against Adversarial Attacks for Cloud-Based IIoT Applications
  5. sa蛋OpenCV参数说明
  6. Python爬虫之煎蛋网妹子图(一)
  7. 【教程】用安卓厨房制作你自己的卡刷包!你也可以是Romer !
  8. java李兴华笔记 pdf_李兴华视频教程笔记.pdf
  9. visual studio2019改了账户登录选项也无法登陆的解决办法
  10. java读取word带格式化,poi读取word简历(伪word格式的doc文件 )提取文本内容报错...