codecamp

PostgreSQL 一行一行地检索查询结果

通常,libpq会收集一个 SQL 命令的整个结果并且把它作为单个PGresult返回给应用。这对于返回大量行的命令是行不通的。 对于这类情况,应用可以使用PQsendQueryPQgetResult 单行模式。 在这种模式中,结果行以一次一行的方式被返回给应用。

要进入到单行模式,在一次成功的PQsetSingleRowMode(或者其他兄弟函数)调用后立即调用PQsendQuery。 这种模式选择只对当前正在执行的查询有效。然后反复调用PQgetResult,直到它返回空,如第 33.4 节中所示。 如果该查询返回行,它们会作为单个的 PGresult对象返回,它们看起来都像普通的查询结果,只不过其状态代码是PGRES_SINGLE_TUPLE而非PGRES_TUPLES_OK。 在最后一行之后或者紧接着该查询返回零行之后,一个状态为PGRES_TUPLES_OK的零行对象会被返回,这就是代表不会有更多行的信号(但是注意仍然有必要继续调用 PQgetResult 直到它返回空)。 所有这些PGresult对象将包含相同的行描述数据(列名、类型等等),这些数据和通常一个查询的PGresult对象的相同。 每一个对象都应该按常规用PQclear释放。

PQsetSingleRowMode

为当前正在执行的查询选择单行模式。

int PQsetSingleRowMode(PGconn *conn);

这个函数只能在调用PQsendQuery或一个其兄弟函数之后立刻调用,并且要在任何连接上的其他操作之前调用,例如PQconsumeInputPQgetResult。 如果在正确的时间被调用,该函数会为当前查询激活单行模式并且返回 1。否则模式会保持不变并且该函数返回 0。 在任何情况下,当前查询结束之后模式都会恢复到正常。

小心

在处理一个查询时,服务器可能返回一些行并且接着遇到一个错误导致查询被中断。通常,libpq会丢弃掉这样的行并且至报告错误。但是在单行模式中,那些行(错误之前返回的行)已经被返回给应用。因此,应用将看到一些PGRES_SINGLE_TUPLE PGresult对象并且然后看到一个PGRES_FATAL_ERROR对象。为了得到正确的事务行为,如果查询最终失败,应用必须被设计为丢弃或者撤销使用之前处理的行完成的事情。


PostgreSQL 异步命令处理
PostgreSQL 取消进行中的查询
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

PostgreSQL SQL语言

PostgreSQL 服务器管理

PostgreSQL 客户端接口

PostgreSQL 服务器编程

PostgreSQL 参考

PostgreSQL 内部

PostgreSQL 附录

PostgreSQL 参考书目

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }