文档章节

PostgreSQL SPI 中的错误处理

helloclia
 helloclia
发布于 2018/11/19 20:53
字数 759
阅读 31
收藏 0

PostgreSQL SPI 用于在 C 或是其他编程语言编写的扩展函数(存储过程)中调用数据库本身的解析器、规划器和执行器的功能,以及对 SQL 语句进行执行。

在最重要的一个函数 SPI_execute 的文档中,说明了发生错误时,将会返回下列负值之一:

SPI_ERROR_ARGUMENT 如果command为NULL或者count小于 0

SPI_ERROR_COPY 如果尝试COPY TO stdout或者COPY FROM stdin

SPI_ERROR_TRANSACTION 如果尝试了一个事务操纵命令( BEGIN、 COMMIT、 ROLLBACK、 SAVEPOINT、 PREPARE TRANSACTION、 COMMIT PREPARED、 ROLLBACK PREPARED或者其他变体)

SPI_ERROR_OPUNKNOWN 如果命令类型位置(不应该会发生)

SPI_ERROR_UNCONNECTED 如果调用过程未连接

你一定会奇怪,为什么只有这么几个呢?还有其他的很多情况呢?比如传进去的 SQL 有语法错误,或是实际执行时报错,这些情况下会返回什么呢?

然后文档中又说:注意如果一个通过 SPI 调用的命令失败,那么控制将不会返回到你的过程中。当然啦,你的过程所在的事务或者子事务将被回滚(这可能看起来令人惊讶,因为据文档所说 SPI 函数大多数都有错误返回约定。但是那些约定只适用于在 SPI 函数本身内部检测到的错误)。通过在可能失败的 SPI 调用周围建立自己的子事务可以在错误之后恢复控制。当前文档中并未记载这些,因为所需的机制仍然在变化中。

原来检查 SPI_execute 的源代码可知,只有发生了上面几种情况的错误时,SPI 会返回给你错误代码;而其他更内部的地方发生的所有错误,程序都是直接调用的 ereport 方法,如果错误级别达到 ERROR 及以上时,会中断程序的执行,将事务回滚,并将错误信息:1、记到日志中;2、返回给客户端。

因此,其他情况的错误,你根本就不必处理,PG 也不给你机会处理。你只有在客户端才能看到具体的报错信息。

如果你是在一个很大的逻辑里,不想整个事务被回滚掉,想出错后控制还返回给程序,可以用 PG_TRYPG_CATCHPG_END_TRY 几个宏来通知 ereport 将控制返回给程序,同时用一个子事务把对 SPI 的调用包起来,参考 PL/Python 源代码 plpy_spi.c 中,PLy_spi_subtransaction_<begin/commit/abort> 等方法的处理。

这也是因为 PostgreSQL 是用 C 语言开发的,一个不够强的地方。假如将来用 Rust 重写,

© 著作权归作者所有

共有 人打赏支持
helloclia
粉丝 4
博文 8
码字总数 3647
作品 1
长沙
私信 提问
PostgreSQL 11 preview - 增加强制custom plan GUC开关(plancache_mode),对付倾斜

标签 PostgreSQL , plan cache , generic plan , custom plan , plancache_mode 背景 对于高并发的小事务,使用绑定变量(prepared statement)来缓存执行计划,可以降低简单SQL在sql parse...

德哥
2018/04/18
0
0
在CentOS上编译安装PostgreSQL

第一步:准备阶段 获取必需软件包: CentOS中查看是否安装了某个软件的命令:rpm -qa | grep 软件名。 which命令可查看某个软件的安装路径。 使用 yum install 包名 来安装软件包。 1.GNU ma...

恒者
2014/01/01
0
3
postgresql插入汉字报错

错误信息:peimsmdb=# select '我';ERROR: character with byte sequence 0xe6 0x88 0x91 in encoding "UTF8" has no equivalent in encoding "LATIN1" 查看客户端字符集:peimsmdb=# show cl......

断臂人
01/06
0
0
fedora 20中安装postgresql数据库

在fedora 20中在我2014-8-27日安装pg时,pg版本是9.3.5.1我不知是会由pg开发组自动更新还是别的,但安装后一般是最新的版本了。安装: yum install postgresql yum install postgresql-serv...

上海李浩
2014/08/27
0
1
PostgreSQL 六版齐发,9.1系列最后一次更新

PostgreSQL开发组发布了对数据库系统的所有支持版本的更新,包括9.6.1,9.5.5,9.4.10,9.3.15,9.2.19和9.1.24。 这也是PostgreSQL 9.1系列的最后一次更新,它将迎来生命周期的结束。 此版本修复...

王练
2016/10/28
3.4K
17

没有更多内容

加载失败,请刷新页面

加载更多

windows下docker报错的解决方法:This error may also indicate that the docker daemon is not running.

问题error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.35/info: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon con......

sucre
刚刚
0
0
数据库分片(Database Sharding)详解

本文由云+社区发表 作者:腾讯云数据库 Introduction 导言 任何看到显著增长的应用程序或网站,最终都需要进行扩展,以适应流量的增加。以确保数据安全性和完整性的方式进行扩展,对于数据驱...

腾讯云加社区
2分钟前
0
0
linux定时任务的设置

linux定时任务的设置 Posted on 2010-09-23 23:49 疯狂 阅读(194243) 评论(4) 编辑 收藏 所属分类: java 为当前用户创建cron服务 1. 键入 crontab -e 编辑crontab服务文件 例如 文件内容如下...

rootliu
2分钟前
0
0
Java基础篇

基础篇 面向过程 分析解决问题时,将问题拆分成几个步骤,用函数实现这些步骤,然后依次调用这些函数 面向对象 分析解决问题时,将问题的事务分解成各个对象,各个对象包含各自的属性和行为,...

jackmanwu
10分钟前
0
0
java JSON 使用

Java 中并没有Json 解析,需要引用第三方的类库: Gson: 谷歌开发的 JSON 库,功能十分全面。 FastJson: 阿里巴巴开发的 JSON 库,性能十分优秀。 Jackson: 社区十分活跃且更新速度很快。 fa...

kuchawyz
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部