PostgreSQL用C完成存储过程例子

d3fw 9年前

目的:用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://my.oschina.net/Suregogo/blog/406798