POSTGRESQL服务器编程将带你学习PostgreSQL函数的基础部分。在学习过程中,你将会使用各种程序语言(不限于自带的PL/pgSQL语言)进行函数的编写。你会看到我们是如何创建可用的库文件,如何将这些库文件组装成更有用的组件,并把这些组件分发到社区中;你也会看到我们是如何从大量的外部数据源中抽取数据,并通过扩展PostgreSQL完成数据的本地化抽取;同时,你也可以在以上过程中使用一个超级棒的调试界面,这个调试界面可以让你在整个学习过程中变得更加得心应手、事半功倍。
目录
- 前 言
- 第1章 PostgreSQL服务器简介 1
- 1.1 为什么在服务器中进行程序设计 2
- 1.2 关于本书的代码示例 5
- 1.3 超越简单函数 7
- 1.4 使用触发器管理相关数据 8
- 1.5 审核更改 11
- 1.6 数据清洗 16
- 1.7 定制排序方法 17
- 1.8 程序设计最佳实践 18
- 1.8.1 KISS——尽量简单(keep it simple stupid) 18
- 1.8.2 DRY——不要写重复的代码(don’t repeat yourself) 19
- 1.8.3 YAGNI——你并不需要它(you ain’t gonna need it) 19
- 1.8.4 SOA——服务导向架构(service-oriented architecture) 19
- 1.8.5 类型的扩展 20
- 1.9 关于缓存 21
- 1.10 总结——为什么在服务器中进行程序设计 21
- 1.10.1 性能 21
- 1.10.2 易于维护 22
- 1.10.3 保证安全的简单方法 22
- 1.11 小结 22
- 第2章 服务器程序设计环境 24
- 2.1 购置成本 25
- 2.2 开发者的可用性 26
- 2.3 许可证书 26
- 2.4 可预测性 27
- 2.5 社区 28
- 2.6 过程化语言 28
- 2.6.1 平台兼容性 29
- 2.6.2 应用程序设计 30
- 2.6.3 更多基础 32
- 2.7 小结 35
- 第3章 第一个PL/pgSQL函数 36
- 3.1 为什么是PL / pgSQL 36
- 3.2 PL/pgSQL函数的结构 37
- 3.3 条件表达式 39
- 3.3.1 通过计数器循环 43
- 3.3.2 对查询结果进行循环 45
- 3.3.3 PERFORM与SELECT 47
- 3.4 返回记录 47
- 3.5 处理函数结果 50
- 3.6 结论 51
- 第4章 返回结构化数据 52
- 4.1 集合与数组 52
- 4.2 返回集合 53
- 4.3 使用返回集合的函数 54
- 4.4 基于视图的函数 56
- 4.5 OUT参数与记录集 59
- 4.5.1 OUT参数 59
- 4.5.2 返回记录集 60
- 4.5.3 使用RETURNS TABLE 61
- 4.5.4 不返回预定义结构 62
- 4.5.5 返回SETOF ANY 63
- 4.5.6 可变参数列表 65
- 4.6 RETURN SETOF变量总结 66
- 4.7 返回游标 66
- 4.7.1 对从另一个函数中返回的游标进行迭代处理 68
- 4.7.2 函数返回游标(多个游标)的小结 69
- 4.8 处理结构化数据的其他方法 69
- 4.8.1 现代复杂数据类型——XML和JSON 69
- 4.8.2 XML数据类型和从函数中返回XML数据 70
- 4.8.3 以JSON格式返回数据 72
- 4.9 小结 74
- 第5章 PL/pgSQL触发器函数 75
- 5.1 创建触发器函数 75
- 5.2 简单的“嘿,我被调用了”触发器 76
- 5.3 审核触发器 79
- 5.4 无效的DELETE 81
- 5.5 无效的TRUNCATE 83
- 5.6 修改NEW记录 83
- 5.7 不可改变的字段触发器 84
- 5.8 当触发器被调用时的控制策略 85
- 5.8.1 有条件的触发器 86
- 5.8.2 在特定字段变化的触发器 87
- 5.9 可视化 87
- 5.10 传递给PL/pgSQL TRIGGER函数的变量 88
- 5.11 小结 88
- 第6章 PL/pgSQL调试 90
- 6.1 使用RAISE NOTICE进行“手动”调试 91
- 6.1.1 抛出异常 92
- 6.1.2 文件日志 94
- 6.2 可视化调试 95
- 6.2.1 安装调试器 96
- 6.2.2 安装pgAdmin3 96
- 6.2.3 使用调试器 96
- 6.3 小结 98
- 第7章 使用无限制的开发语言 99
- 7.1 不受信任的语言是否比受信任的语言差 99
- 7.2 不受信任的语言是否会拖垮数据库 100
- 7.3 为什么不受信任 100
- 7.4 PL/Python快速介绍 101
- 7.4.1 最小的PL/Python函数 101
- 7.4.2 数据类型转换 102
- 7.4.3 使用PL/Python编写简单函数 103
- 7.4.4 在数据库中运行查询 106
- 7.4.5 使用PL/Python编写触发器函数 108
- 7.4.6 构建查询 113
- 7.4.7 处理异常 113
- 7.4.8 Python中的原子性 115
- 7.4.9 PL/Python调试 116
- 7.5 跳出“SQL 数据库服务器”的限制进行思考 119
- 7.5.1 在保存图像时生成缩略图 119
- 7.5.2 发送一封电子邮件 120
- 7.6 小结 121
- 第8章 使用C编写高级函数 122
- 8.1 最简单的C函数——返回(a+b) 123
- 8.1.1 add_func.c 123
- 8.1.2 Makefile 125
- 8.1.3 创建add(int,int)函数 126
- 8.1.4 add_func.sql.in 126
- 8.1.5 关于写C函数的总结 127
- 8.2 为add(int, int)添加功能 127
- 8.2.1 NULL参数的智能处理 128
- 8.2.2 与任何数量的参数一起运作 129
- 8.3 C函数编写的基础指南 134
- 8.4 来自C函数的错误报告 136
- 8.4.1 并非错误的“错误”状态 136
- 8.4.2 消息何时被发送到客户端 137
- 8.5 运行查询与调用PostgreSQL函数 137
- 8.5.1 使用SPI的示例C函数 138
- 8.5.2 数据更改的可见性 139
- 8.5.3 SPI_*函数的更多相关信息 140
- 8.6 将记录集作为参数或返回值处理 140
- 8.6.1 返回复杂类型的单个元组 141
- 8.6.2 从参数元组中提取字段 143
- 8.6.3 构建一个返回元组 143
- 8.6.4 插曲——什么是Datum 144
- 8.6.5 返回一个记录集 144
- 8.7 快速获取数据库变更 147
- 8.8 在提交/回滚时处理情况 148
- 8.9 在后端间进行同步 148
- 8.10 C语言的额外资源 149
- 8.11 小结 149
- 第9章 使用PL/Proxy扩展数据库 151
- 9.1 简单的单服务器通话 151
- 9.2 处理跨多数据库的成功分表 157
- 9.2.1 什么扩展计划有用和什么时候有用 158
- 9.2.2 跨多服务器的数据分区 158
- 9.2.3 PL/Proxy——分区语言 162
- 9.2.4 从单数据库移动数据到分区的数据库 168
- 9.3 小结 169
- 第10章 发布自己的PostgreSQL扩展程序 170
- 10.1 什么时候创建扩展程序 170
- 10.2 未封装的扩展程序 171
- 10.3 扩展程序版本 172
- 10.4 .control文件 173
- 10.5 构建扩展程序 173
- 10.6 安装扩展程序 174
- 10.7 发布扩展程序 175
- 10.7.1 关于PostgreSQL Extension Network的简介 175
- 10.7.2 注册以发布扩展程序 176
- 10.7.3 创建扩展项目的简单方法 178
- 10.7.4 提供扩展程序的相关元数据 179
- 10.7.5 编写扩展代码 182
- 10.7.6 创建程序包 183
- 10.7.7 向PGXN提交程序包 183
- 10.8 安装PGXN上的扩展程序 185
- 10.9 小结 185