PostgreSQL 用 C 完成存储过程例子

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

目的:用C完成一个存储过程例子,存储过程实现对表某一段进行update。

准备工作

1、安装数据库

2、建立表test

highgo=# create table test(id int, name text, label int);
CREATE TABLE

3、建立C文件,C代码如下:

#include "postgres.h"
#include "executor/spi.h"
#include "utils/builtins.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

int mydelete(int key);

int
mydelete(int key)
{
    char command[128];  //视命令长短建立相应大小的数组
    int ret;
    int proc;                       //对表数据操作的行数

    /* 将命令赋值到command */
    sprintf(command, "update test set label = 0 where id = %d and label = 1; ", key);

    SPI_connect();             //内部链接
    ret = SPI_exec( command, 0);  //执行操作
    proc = SPI_processed;       //为行数赋值
    SPI_finish();                //中断连接
    return (proc);               //将操作行数作为返回结果
}

数据库api参考文档:http://www.postgresql.org/docs/9.4/static/spi.html

编译到安装

4、gcc编译

gcc -fpic -I/opt/HighGo/db/20150401/include/postgresql/server/ -shared -o myapi.so myapi.c

5、复制到lib目录下

cp myapi.so /opt/HighGo/db/20150401/lib/postgresql/

6、加载到服务器

highgo=# load 'myapi';
LOAD

7、建立函数

highgo=# create function mydele(integer) returns integer as '$libdir/myapi.so','mydelete' language c strict;
CREATE FUNCTION
highgo=#

8、效果

highgo=# insert into test values (1,'jim',1);
INSERT 0 1
highgo=# insert into test values (2,'tom',1);
INSERT 0 1
highgo=# select * from test;
 id | name | label 
----+------+-------
  1 | jim  |     1
  2 | tom  |     1

highgo=# select mydele(1);
 mydele 
--------
      1
(1 row)
highgo=# select * from test;
 id | name | label 
----+------+-------
  2 | tom  |     1
  1 | jim  |     0

文章转载自 开源中国社区 [http://www.oschina.net]

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
存储 关系型数据库 PostgreSQL
PostgreSQL通过DBLINK执行存储过程创建表
在A服务器创建存储存储过程CREATE OR REPLACE FUNCTION "public"."crt_tab"() RETURNS "pg_catalog"."int4" AS $BODY$declare str_sql varchar(100);ret int;begincreate ta...
2358 0
|
存储 SQL Oracle
AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性
AnalyticDB PostgreSQL 7.0 新增了存储过程功能的支持,让用户在使用ADB PG时能够更方便高效地开发业务,并能够更好地兼容Oracle等传统数仓的业务。
689 1
AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性
|
存储 SQL Perl
PostgreSQL plpgsql 存储过程、函数 - 状态、异常变量打印、异常捕获... - GET [STACKED] DIAGNOSTICS
标签 PostgreSQL , GET , STACKED , DIAGNOSTICS 背景 使用GET STACKED DIAGNOSTICS捕获异常时的STACK内容。 使用GET DIAGNOSTICS捕获运行过程中的状态值。
4931 0
|
存储 关系型数据库 Shell
使用 Rust 开发 PostgreSQL 存储过程
pgxr 使用 Rust 来编写 PostgreSQL 的扩展函数(相当于存储过程)。 项目地址:https://github.com/clia/pgxr 使用这个星球上最快的、高效、安全、有趣的编程语言,来为世界上功能最强大的开源关系数据库编写库内的程序! 试想,当你从数据库中查询出 1000 条记录用于程序处理时,当你的程序是数据库内的程序时,你根本无需将这 1000 条结果通过 PostgreSQL 的通讯协议走网络传输到应用程序里,在应用程序里分配这么大一块内存来装这些数据,再来进行处理。
7547 0
|
SQL 存储 XML
【学习资料】快速入门PostgreSQL应用开发与管理 - 7 函数、存储过程和触发器
大家好,这里是快速入门PostgreSQL应用开发与管理 - 7 函数、存储过程和触发器
|
存储 关系型数据库 PostgreSQL
|
SQL 存储 关系型数据库
PostgreSQL 11 新特性解读: 支持存储过程(SQL Stored Procedures)
PostgreSQL 11 版本一个重量级新特性是对存储过程的支持,同时支持存储过程嵌入事务,存储过程是很多 PostgreSQL 从业者期待已久的特性,尤其是很多从Oracle转到PostgreSQL朋友,尽管PostgreSQL提供函数可以实现大多数存储过程的功能,但在函数中无法执行事务实现部分提交,换句话说,函数中的SQL要么都执行成功,要不全部返回失败。
5957 0