ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

PostgreSQL编写自定义extension

2022-03-19 23:37:27  阅读:324  来源: 互联网

标签:PostgreSQL 自定义 extension ysl -- PG 编写 include


众所周知,PG数据库可以添加许多扩展,用的比较多的有pg_show_plans,pg_stat_statments, 扩展提供给我们很多的便利,这篇文章,是我整理的一篇怎样编写自定义的extension,希望对大家有帮助。

举个例子 pg_show_plans插件,在目录中,它最主要的四个文件如图黄框里所示。

 

 

 

一个格式为extension_name.control的控制文件,它告诉Postgres关于您的扩展程序的一些基础知识
一个扩展程序的SQL脚本文件,格式为extension--version.sql
一个c实现的extension_name.c文件,可以根据功能需求编写
一个Makefile文件帮助编译

在本文中,我定义了一个名为ysl的extension,比较简单,扩展包含一个表和一个函数,这边没给表里加入数据,仅仅用一个函数验证extension的功能是否正常。(根据输入的数值来输出:如果数值>10,输出 ‘edg niubi’,如果数值<10,则输出 ‘edg lakua’)

在/opt/postgresql-12.1/contrib/目录下创建ysl目录,并创建如下四个文件。

1.编写ysl–1.0.sql

/* contrib/ysl/ysl--1.0.sql */
 
--complain if script is sourced in psql rather than via ALTER EXTENSION
\echo Use "CREATE EXTENSION ysl" to load this file. \quit
CREATE TABLE tab_ysl(oid integer,namespace_oid integer,name text,time timestamp);        /* 创建一个表格 */
 
CREATE FUNCTION fun_ysl(int)           /* 创建一个函数 */
RETURNS text
AS '$libdir/ysl'
LANGUAGE C STRICT PARALLEL RESTRICTED;

2.编写ysl.control

# ysl extension
 
comment = 'EDG test '
default_version = '1.0'
module_pathname = '$libdir/ysl'
relocatable = true

3.编写Makefile

# contrib/ysl/Makefile
 
MODULES = ysl
EXTENSION =ysl
DATA = ysl--1.0.sql
MODULES = ysl
 
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

4.编写ysl.c

#include "postgres.h"
#include "fmgr.h"
#include "utils/builtins.h"
 
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
 
 
PG_FUNCTION_INFO_V1(fun_ysl);
 
Datum fun_ysl(PG_FUNCTION_ARGS);
 
Datum fun_ysl(PG_FUNCTION_ARGS)
{
        int  a;
        a=PG_GETARG_INT32(0);
 
  if (a > 10)
  {
    PG_RETURN_TEXT_P(cstring_to_text("EDG niubi"));
  }
  else
  {
    PG_RETURN_TEXT_P(cstring_to_text("EDG lakua"));
  }
}

5.安装名为ysl的extension

确认文件无误后

make&&make install

进入数据库

create extension ysl;

 

可以看到ysl的extension创建成功,包含一个表和一个函数。

 

 

 

 

 

标签:PostgreSQL,自定义,extension,ysl,--,PG,编写,include
来源: https://www.cnblogs.com/lishanyang/p/16028584.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有