目的:用C完成一个存储过程例子,存储过程实现对表某一段进行update。
准备工作
1、安装数据库
2、建立表test
- highgo=# create table test(id int,name text,label int);
- CREATE TABLE
- #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