转载

【每日一博】PostgreSQL 用 C 完成存储过程例子

目的:用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
正文到此结束
Loading...