2024年9月26日:PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

32.3. 命令执行函数 #

一旦成功建立与数据库服务器的连接,此处描述的函数用于执行SQL查询和命令。

32.3.1. 主要函数 #

PQexec #

将命令提交到服务器并等待结果。

PGresult *PQexec(PGconn *conn, const char *command);

返回一个 PGresult 指针或可能是空指针。通常会返回非空指针,除非在内存不足的情况下或出现严重错误(例如无法将命令发送到服务器)。应调用 PQresultStatus 函数来检查返回值是否存在任何错误(包括空指针的值,在这种情况下它将返回 PGRES_FATAL_ERROR)。使用 PQerrorMessage 获取有关此类错误的更多信息。

命令字符串可以包含多个SQL命令(用分号分隔)。在单个 PQexec 调用中发送的多个查询在单个事务中处理,除非查询字符串中包含显式的 BEGIN/COMMIT 命令将其划分为多个事务。(有关服务器如何处理多查询字符串的更多详细信息,请参阅 第 53.2.2.1 节)。但是请注意,返回的 PGresult 结构仅描述从字符串执行的最后一个命令的结果。如果其中一个命令失败,则字符串的处理将停止,并且返回的 PGresult 描述错误情况。

PQexecParams #

将命令提交到服务器并等待结果,并能够单独传递与SQL命令文本不同的参数。

PGresult *PQexecParams(PGconn *conn,
                       const char *command,
                       int nParams,
                       const Oid *paramTypes,
                       const char * const *paramValues,
                       const int *paramLengths,
                       const int *paramFormats,
                       int resultFormat);

PQexecParams 类似于 PQexec,但提供了其他功能:参数值可以与命令字符串本身分开指定,并且可以以文本或二进制格式请求查询结果。

函数参数为

conn

要通过其发送命令的连接对象。

command

要执行的SQL命令字符串。如果使用参数,则在命令字符串中将它们称为 $1$2 等。

nParams

提供的参数数量;它是数组 paramTypes[]paramValues[]paramLengths[]paramFormats[] 的长度。(当 nParams 为零时,数组指针可以为 NULL。)

paramTypes[]

通过 OID 指定要分配给参数符号的数据类型。如果 paramTypesNULL,或数组中的任何特定元素为零,则服务器以与处理未类型化文字字符串相同的方式推断参数符号的数据类型。

paramValues[]

指定参数的实际值。此数组中的空指针表示相应参数为空;否则,指针指向以零结尾的文本字符串(对于文本格式)或服务器期望的格式的二进制数据(对于二进制格式)。

paramLengths[]

指定二进制格式参数的实际数据长度。它将忽略空参数和文本格式参数。当没有二进制参数时,数组指针可以为空。

paramFormats[]

指定参数是文本(在相应参数的数组条目中放置零)还是二进制(在相应参数的数组条目中放置一)。如果数组指针为空,则假定所有参数都是文本字符串。

以二进制格式传递的值需要了解后端期望的内部表示。例如,整数必须以网络字节序传递。传递 numeric 值需要了解服务器存储格式,如 src/backend/utils/adt/numeric.c::numeric_send()src/backend/utils/adt/numeric.c::numeric_recv() 中实现的那样。

resultFormat

指定零以获取文本格式的结果,或指定一以获取二进制格式的结果。(目前没有规定以不同的格式获取不同的结果列,尽管这在底层协议中是可能的。)

PQexecParams 相对于 PQexec 的主要优点是可以将参数值与命令字符串分开,从而避免了繁琐且容易出错的引用和转义。

PQexec 不同,PQexecParams 允许在给定字符串中最多使用一个 SQL 命令。(其中可以包含分号,但不能有多个非空命令。)这是底层协议的限制,但作为针对 SQL 注入攻击的额外防御措施具有一定的实用性。

提示

通过 OID 指定参数类型很繁琐,特别是如果您不想将特定的 OID 值硬编码到程序中时。但是,即使在服务器本身无法确定参数类型或选择与您想要的类型不同的类型的情况下,您也可以避免这样做。在 SQL 命令文本中,将显式转换附加到参数符号以显示您将发送的数据类型。例如

SELECT * FROM mytable WHERE x = $1::bigint;

这将强制将参数 $1 视为 bigint,而默认情况下它将被分配与 x 相同的类型。在以二进制格式发送参数值时,强烈建议强制执行参数类型决策(通过这种方式或通过指定数字类型 OID),因为二进制格式的冗余度低于文本格式,因此服务器检测到类型不匹配错误的可能性较小。

PQprepare #

提交创建具有给定参数的准备语句的请求,并等待完成。

PGresult *PQprepare(PGconn *conn,
                    const char *stmtName,
                    const char *query,
                    int nParams,
                    const Oid *paramTypes);

PQprepare 创建一个准备语句,以便稍后使用 PQexecPrepared 执行。此功能允许重复执行命令,而无需每次都进行解析和计划;有关详细信息,请参阅 PREPARE

该函数根据查询字符串 query 创建一个名为 stmtName 的预处理语句,该字符串必须包含单个 SQL 命令。stmtName 可以是 "" 以创建未命名的语句,在这种情况下,任何现有的未命名语句都会被自动替换;否则,如果在当前会话中已定义了语句名称,则会发生错误。如果使用了任何参数,则在查询中将其引用为 $1$2 等。nParams 是参数的数量,其类型在数组 paramTypes[] 中预先指定。(当 nParams 为零时,数组指针可以是 NULL。)paramTypes[] 通过 OID 指定要分配给参数符号的数据类型。如果 paramTypesNULL,或数组中的任何特定元素为零,则服务器会以与处理未类型化字面字符串相同的方式为参数符号分配数据类型。此外,查询可以使用编号高于 nParams 的参数符号;也会为这些符号推断数据类型。(有关如何找出推断出的数据类型的方法,请参阅 PQdescribePrepared。)

PQexec 一样,结果通常是 PGresult 对象,其内容指示服务器端成功或失败。空结果表示内存不足或根本无法发送命令。使用 PQerrorMessage 获取有关此类错误的更多信息。

可用于 PQexecPrepared 的预处理语句也可以通过执行 SQL PREPARE 语句来创建。

PQexecPrepared #

发送请求以使用给定参数执行预处理语句,并等待结果。

PGresult *PQexecPrepared(PGconn *conn,
                         const char *stmtName,
                         int nParams,
                         const char * const *paramValues,
                         const int *paramLengths,
                         const int *paramFormats,
                         int resultFormat);

PQexecPrepared 类似于 PQexecParams,但要执行的命令是通过命名先前准备好的语句来指定的,而不是提供查询字符串。此功能允许重复使用的命令仅解析和计划一次,而不是每次执行时都解析和计划。该语句必须在当前会话中预先准备。

参数与 PQexecParams 相同,只是给出了预处理语句的名称而不是查询字符串,并且 paramTypes[] 参数不存在(因为它不需要,因为预处理语句的参数类型在创建时已确定)。

PQdescribePrepared #

提交请求以获取有关指定预处理语句的信息,并等待完成。

PGresult *PQdescribePrepared(PGconn *conn, const char *stmtName);

PQdescribePrepared 允许应用程序获取有关先前准备好的语句的信息。

stmtName 可以是 ""NULL 以引用未命名语句,否则它必须是现有预处理语句的名称。成功时,将返回状态为 PGRES_COMMAND_OKPGresult。函数 PQnparamsPQparamtype 可以应用于此 PGresult 以获取有关预处理语句参数的信息,并且函数 PQnfieldsPQfnamePQftype 等提供有关语句的结果列(如果有)的信息。

PQdescribePortal #

提交请求以获取有关指定门户的信息,并等待完成。

PGresult *PQdescribePortal(PGconn *conn, const char *portalName);

PQdescribePortal 允许应用程序获取有关先前创建的门户的信息。(libpq 不提供对门户的任何直接访问,但您可以使用此函数检查使用 DECLARE CURSOR SQL 命令创建的光标的属性。)

portalName 可以是 ""NULL 以引用未命名门户,否则它必须是现有门户的名称。成功时,将返回状态为 PGRES_COMMAND_OKPGresult。函数 PQnfieldsPQfnamePQftype 等可以应用于 PGresult 以获取有关门户的结果列(如果有)的信息。

PQclosePrepared #

提交请求以关闭指定的预处理语句,并等待完成。

PGresult *PQclosePrepared(PGconn *conn, const char *stmtName);

PQclosePrepared 允许应用程序关闭先前准备好的语句。关闭语句会释放服务器上与其关联的所有资源,并允许重用其名称。

stmtName 可以是 ""NULL 以引用未命名语句。如果不存在具有此名称的语句,则没有问题,在这种情况下,操作将是无操作。成功时,将返回状态为 PGRES_COMMAND_OKPGresult

PQclosePortal #

提交请求以关闭指定的门户,并等待完成。

PGresult *PQclosePortal(PGconn *conn, const char *portalName);

PQclosePortal 允许应用程序触发先前创建的门户的关闭。关闭门户会释放服务器上与其关联的所有资源,并允许重用其名称。(libpq 不提供对门户的任何直接访问,但您可以使用此函数关闭使用 DECLARE CURSOR SQL 命令创建的光标。)

portalName 可以是 ""NULL 以引用未命名门户。如果不存在具有此名称的门户,则没有问题,在这种情况下,操作将是无操作。成功时,将返回状态为 PGRES_COMMAND_OKPGresult

PGresult 结构封装了服务器返回的结果。libpq 应用程序程序员应注意维护 PGresult 抽象。使用下面的访问器函数来获取 PGresult 的内容。避免直接引用 PGresult 结构的字段,因为这些字段将来可能会发生变化。

PQresultStatus #

返回命令的结果状态。

ExecStatusType PQresultStatus(const PGresult *res);

PQresultStatus 可以返回以下值之一

PGRES_EMPTY_QUERY #

发送到服务器的字符串为空。

PGRES_COMMAND_OK #

成功完成不返回数据的命令。

PGRES_TUPLES_OK #

成功完成返回数据的命令(例如 SELECTSHOW)。

PGRES_COPY_OUT #

复制输出(来自服务器)数据传输已开始。

PGRES_COPY_IN #

复制输入(到服务器)数据传输已开始。

PGRES_BAD_RESPONSE #

无法理解服务器的响应。

PGRES_NONFATAL_ERROR #

发生非致命错误(通知或警告)。

PGRES_FATAL_ERROR #

发生致命错误。

PGRES_COPY_BOTH #

复制输入/输出(到和来自服务器)数据传输已开始。此功能当前仅用于流式复制,因此此状态不应出现在普通应用程序中。

PGRES_SINGLE_TUPLE #

PGresult 包含来自当前命令的单个结果元组。此状态仅在为查询选择了单行模式时才会发生(请参阅 第 32.6 节)。

PGRES_TUPLES_CHUNK #

PGresult 包含来自当前命令的多个结果元组。此状态仅在为查询选择了分块模式时才会发生(请参阅 第 32.6 节)。元组数量不会超过传递给 PQsetChunkedRowsMode 的限制。

PGRES_PIPELINE_SYNC #

PGresult 代表管道模式中的同步点,由 PQpipelineSyncPQsendPipelineSync 请求。此状态仅在选择了管道模式时才会发生。

PGRES_PIPELINE_ABORTED #

PGresult 代表已从服务器收到错误的管道。PQgetResult 必须重复调用,并且每次调用都会返回此状态代码,直到当前管道结束,此时它将返回 PGRES_PIPELINE_SYNC,并且可以恢复正常处理。

如果结果状态为 PGRES_TUPLES_OKPGRES_SINGLE_TUPLEPGRES_TUPLES_CHUNK,则可以使用下面描述的函数检索查询返回的行。请注意,恰好检索零行的 SELECT 命令仍显示 PGRES_TUPLES_OKPGRES_COMMAND_OK 用于永远不会返回行的命令(INSERT 或不带 RETURNING 子句的 UPDATE 等)。PGRES_EMPTY_QUERY 响应可能表示客户端软件中的错误。

状态为 PGRES_NONFATAL_ERROR 的结果永远不会被 PQexec 或其他查询执行函数直接返回;此类结果将传递给通知处理器(参见 第 32.13 节)。

PQresStatus #

PQresultStatus 返回的枚举类型转换为描述状态代码的字符串常量。调用者不应释放结果。

char *PQresStatus(ExecStatusType status);
PQresultErrorMessage #

返回与命令关联的错误消息,如果未发生错误则返回空字符串。

char *PQresultErrorMessage(const PGresult *res);

如果发生错误,则返回的字符串将包含尾随换行符。调用者不应直接释放结果。当关联的 PGresult 句柄传递给 PQclear 时,它将被释放。

PQexecPQgetResult 调用之后,PQerrorMessage(在连接上)将返回与 PQresultErrorMessage(在结果上)相同的字符串。但是,PGresult 将保留其错误消息直到销毁,而连接的错误消息将在执行后续操作时更改。当您想知道与特定 PGresult 关联的状态时,请使用 PQresultErrorMessage;当您想知道连接上最新操作的状态时,请使用 PQerrorMessage

PQresultVerboseErrorMessage #

返回与 PGresult 对象关联的错误消息的重新格式化版本。

char *PQresultVerboseErrorMessage(const PGresult *res,
                                  PGVerbosity verbosity,
                                  PGContextVisibility show_context);

在某些情况下,客户端可能希望获取先前报告错误的更详细版本。PQresultVerboseErrorMessage 通过计算 PQresultErrorMessage 在生成给定 PGresult 时如果连接的指定详细程度设置生效将产生的消息来满足此需求。如果 PGresult 不是错误结果,则改为报告 PGresult is not an error result。返回的字符串包含尾随换行符。

与大多数用于从 PGresult 中提取数据的其他函数不同,此函数的结果是新分配的字符串。当不再需要字符串时,调用者必须使用 PQfreemem() 释放它。

如果内存不足,则可能返回 NULL。

PQresultErrorField #

返回错误报告的单个字段。

char *PQresultErrorField(const PGresult *res, int fieldcode);

fieldcode 是错误字段标识符;请参见下面列出的符号。如果 PGresult 不是错误或警告结果,或者不包含指定的字段,则返回 NULL。字段值通常不包含尾随换行符。调用者不应直接释放结果。当关联的 PGresult 句柄传递给 PQclear 时,它将被释放。

以下字段代码可用

PG_DIAG_SEVERITY #

严重性;字段内容为 ERRORFATALPANIC(在错误消息中),或 WARNINGNOTICEDEBUGINFOLOG(在通知消息中),或其中之一的本地化翻译。始终存在。

PG_DIAG_SEVERITY_NONLOCALIZED #

严重性;字段内容为 ERRORFATALPANIC(在错误消息中),或 WARNINGNOTICEDEBUGINFOLOG(在通知消息中)。这与 PG_DIAG_SEVERITY 字段相同,只是内容永远不会本地化。这仅出现在由 PostgreSQL 9.6 及更高版本生成的报告中。

PG_DIAG_SQLSTATE #

错误的 SQLSTATE 代码。SQLSTATE 代码标识已发生的错误类型;前端应用程序可以使用它来执行特定操作(例如错误处理)以响应特定的数据库错误。有关可能的 SQLSTATE 代码列表,请参见 附录 A。此字段不可本地化,并且始终存在。

PG_DIAG_MESSAGE_PRIMARY #

主要人类可读的错误消息(通常一行)。始终存在。

PG_DIAG_MESSAGE_DETAIL #

详细信息:可选的辅助错误消息,包含有关问题的更多详细信息。可能运行多行。

PG_DIAG_MESSAGE_HINT #

提示:有关如何解决问题的可选建议。这旨在与详细信息不同,因为它提供建议(可能不合适)而不是硬性事实。可能运行多行。

PG_DIAG_STATEMENT_POSITION #

包含十进制整数的字符串,指示错误光标位置作为原始语句字符串的索引。第一个字符的索引为 1,位置以字符而不是字节为单位测量。

PG_DIAG_INTERNAL_POSITION #

这与 PG_DIAG_STATEMENT_POSITION 字段的定义相同,但它用于光标位置引用内部生成的命令而不是客户端提交的命令时。PG_DIAG_INTERNAL_QUERY 字段在出现此字段时始终会出现。

PG_DIAG_INTERNAL_QUERY #

失败的内部生成的命令的文本。例如,这可能是由 PL/pgSQL 函数发出的 SQL 查询。

PG_DIAG_CONTEXT #

发生错误的上下文指示。目前,这包括活动过程语言函数和内部生成的查询的调用堆栈回溯。跟踪是每行一个条目,最近的条目排在最前面。

PG_DIAG_SCHEMA_NAME #

如果错误与特定数据库对象相关联,则为包含该对象的模式的名称(如果有)。

PG_DIAG_TABLE_NAME #

如果错误与特定表相关联,则为该表的名称。(有关表模式的名称,请参阅模式名称字段。)

PG_DIAG_COLUMN_NAME #

如果错误与特定表列相关联,则为该列的名称。(请参阅模式和表名称字段以识别表。)

PG_DIAG_DATATYPE_NAME #

如果错误与特定数据类型相关联,则为该数据类型的名称。(有关数据类型模式的名称,请参阅模式名称字段。)

PG_DIAG_CONSTRAINT_NAME #

如果错误与特定约束相关联,则为该约束的名称。请参阅上面列出的字段以了解关联的表或域。(为此,索引被视为约束,即使它们不是使用约束语法创建的。)

PG_DIAG_SOURCE_FILE #

报告错误的源代码位置的文件名。

PG_DIAG_SOURCE_LINE #

报告错误的源代码位置的行号。

PG_DIAG_SOURCE_FUNCTION #

报告错误的源代码函数的名称。

注意

模式名称、表名称、列名称、数据类型名称和约束名称的字段仅适用于有限数量的错误类型;请参见 附录 A。不要假设任何这些字段的存在都能保证另一个字段的存在。核心错误源遵守上面提到的相互关系,但用户定义的函数可能会以其他方式使用这些字段。同样,不要假设这些字段表示当前数据库中的当代对象。

客户端负责格式化显示的信息以满足其需求;特别是它应该根据需要换行。错误消息字段中出现的换行符应被视为段落分隔符,而不是换行符。

libpq 内部生成的错误将具有严重性和主要消息,但通常没有其他字段。

请注意,错误字段仅可从 PGresult 对象获取,而不是 PGconn 对象;没有 PQerrorField 函数。

PQclear #

释放与 PGresult 关联的存储。每个命令结果都应在不再需要时通过 PQclear 释放。

void PQclear(PGresult *res);

如果参数是 NULL 指针,则不执行任何操作。

您可以根据需要保留 PGresult 对象;当您发出新命令时,它不会消失,即使您关闭连接也不会消失。要删除它,您必须调用 PQclear。如果不这样做,会导致应用程序出现内存泄漏。

32.3.2. 获取查询结果信息 #

这些函数用于从表示成功查询结果的 PGresult 对象中提取信息(即状态为 PGRES_TUPLES_OKPGRES_SINGLE_TUPLEPGRES_TUPLES_CHUNK 的结果)。它们还可以用于从成功的 Describe 操作中提取信息:Describe 的结果包含与实际执行查询提供的所有相同的列信息,但它没有行。对于具有其他状态值的 对象,这些函数的行为就像结果具有零行和零列。

PQntuples #

返回查询结果中的行数(元组)。(请注意,PGresult 对象最多只能包含 INT_MAX 行,因此 int 结果就足够了。)

int PQntuples(const PGresult *res);
PQnfields #

返回查询结果每一行中的列数(字段)。

int PQnfields(const PGresult *res);
PQfname #

返回与给定列号关联的列名。列号从 0 开始。调用者不应直接释放结果。当关联的 PGresult 句柄传递给 PQclear 时,它将被释放。

char *PQfname(const PGresult *res,
              int column_number);

如果列号超出范围,则返回 NULL

PQfnumber #

返回与给定列名关联的列号。

int PQfnumber(const PGresult *res,
              const char *column_name);

如果给定名称与任何列都不匹配,则返回 -1。

给定名称被视为 SQL 命令中的标识符,即除非加双引号,否则会被转换为小写。例如,给定从以下 SQL 命令生成的查询结果:

SELECT 1 AS FOO, 2 AS "BAR";

我们将得到以下结果:

PQfname(res, 0)              foo
PQfname(res, 1)              BAR
PQfnumber(res, "FOO")        0
PQfnumber(res, "foo")        0
PQfnumber(res, "BAR")        -1
PQfnumber(res, "\"BAR\"")    1
PQftable #

返回从其中获取给定列的表的 OID。列号从 0 开始。

Oid PQftable(const PGresult *res,
             int column_number);

如果列号超出范围,或者指定的列不是对表列的简单引用,则返回 InvalidOid。您可以查询系统表 pg_class 以准确确定引用了哪个表。

当您包含 libpq 头文件时,将定义类型 Oid 和常量 InvalidOid。它们都将是某种整数类型。

PQftablecol #

返回构成指定查询结果列的列(在其表中)的列号。查询结果列号从 0 开始,但表列具有非零编号。

int PQftablecol(const PGresult *res,
                int column_number);

如果列号超出范围,或者指定的列不是对表列的简单引用,则返回零。

PQfformat #

返回指示给定列格式的格式代码。列号从 0 开始。

int PQfformat(const PGresult *res,
              int column_number);

格式代码零表示文本数据表示,而格式代码一表示二进制表示。(其他代码保留供将来定义。)

PQftype #

返回与给定列号关联的数据类型。返回的整数是类型的内部 OID 编号。列号从 0 开始。

Oid PQftype(const PGresult *res,
            int column_number);

您可以查询系统表 pg_type 以获取各种数据类型的名称和属性。该OID内置数据类型的定义在 PostgreSQL 安装的 include 目录中的 catalog/pg_type_d.h 文件中。

PQfmod #

返回与给定列号关联的列的类型修饰符。列号从 0 开始。

int PQfmod(const PGresult *res,
           int column_number);

修饰符值的解释是特定于类型的;它们通常表示精度或大小限制。值 -1 用于表示““无可用信息””。大多数数据类型不使用修饰符,在这种情况下,值始终为 -1。

PQfsize #

返回与给定列号关联的列的大小(以字节为单位)。列号从 0 开始。

int PQfsize(const PGresult *res,
            int column_number);

PQfsize 返回数据库行中为此列分配的空间,换句话说,是数据类型服务器内部表示的大小。(因此,它对客户端来说并不是很有用。)负值表示数据类型是可变长度的。

PQbinaryTuples #

如果 PGresult 包含二进制数据,则返回 1;如果包含文本数据,则返回 0。

int PQbinaryTuples(const PGresult *res);

此函数已弃用(除了与 COPY 结合使用的情况),因为单个 PGresult 可以包含某些列中的文本数据和其他列中的二进制数据。 PQfformat 更为推荐。 PQbinaryTuples 仅当结果的所有列都是二进制的(格式 1)时才返回 1。

PQgetvalue #

返回 PGresult 的一行的一个字段值。行号和列号从 0 开始。调用者不应直接释放结果。当关联的 PGresult 句柄传递给 PQclear 时,它将被释放。

char *PQgetvalue(const PGresult *res,
                 int row_number,
                 int column_number);

对于文本格式的数据,PQgetvalue 返回的值是字段值的以 null 结尾的字符字符串表示形式。对于二进制格式的数据,该值采用由数据类型的 typsendtypreceive 函数确定的二进制表示形式。(在这种情况下,该值实际上也后跟一个零字节,但这通常没有用,因为该值可能包含嵌入的 null。)

如果字段值为 null,则返回空字符串。请参阅 PQgetisnull 以区分 null 值和空字符串值。

PQgetvalue 返回的指针指向属于 PGresult 结构的存储。不应修改它指向的数据,并且如果要在 PGresult 结构本身的生命周期之外使用它,则必须将其显式复制到其他存储中。

PQgetisnull #

测试字段是否为 null 值。行号和列号从 0 开始。

int PQgetisnull(const PGresult *res,
                int row_number,
                int column_number);

如果字段为 null,此函数返回 1;如果字段包含非 null 值,则返回 0。(请注意,对于 null 字段,PQgetvalue 将返回空字符串,而不是 null 指针。)

PQgetlength #

返回字段值的大小(以字节为单位)。行号和列号从 0 开始。

int PQgetlength(const PGresult *res,
                int row_number,
                int column_number);

这是特定数据值的实际数据长度,即 PQgetvalue 指向的对象的大小。对于文本数据格式,这与 strlen() 相同。对于二进制格式,这是基本信息。请注意,不应依赖 PQfsize 来获取实际数据长度。

PQnparams #

返回已准备语句的参数数量。

int PQnparams(const PGresult *res);

此函数仅在检查 PQdescribePrepared 的结果时有用。对于其他类型的结果,它将返回零。

PQparamtype #

返回指示的语句参数的数据类型。参数号从 0 开始。

Oid PQparamtype(const PGresult *res, int param_number);

此函数仅在检查 PQdescribePrepared 的结果时有用。对于其他类型的结果,它将返回零。

PQprint #

将所有行以及(可选)列名打印到指定的输出流。

void PQprint(FILE *fout,      /* output stream */
             const PGresult *res,
             const PQprintOpt *po);
typedef struct
{
    pqbool  header;      /* print output field headings and row count */
    pqbool  align;       /* fill align the fields */
    pqbool  standard;    /* old brain dead format */
    pqbool  html3;       /* output HTML tables */
    pqbool  expanded;    /* expand tables */
    pqbool  pager;       /* use pager for output if needed */
    char    *fieldSep;   /* field separator */
    char    *tableOpt;   /* attributes for HTML table element */
    char    *caption;    /* HTML table caption */
    char    **fieldName; /* null-terminated array of replacement field names */
} PQprintOpt;

此函数以前由 psql 用于打印查询结果,但现在已不再使用。请注意,它假定所有数据都采用文本格式。

32.3.3. 获取其他结果信息 #

这些函数用于从 PGresult 对象中提取其他信息。

PQcmdStatus #

返回生成 PGresult 的 SQL 命令的命令状态标记。

char *PQcmdStatus(PGresult *res);

通常这只是命令的名称,但它可能包含其他数据,例如处理的行数。调用者不应直接释放结果。当关联的 PGresult 句柄传递给 PQclear 时,它将被释放。

PQcmdTuples #

返回 SQL 命令影响的行数。

char *PQcmdTuples(PGresult *res);

此函数返回一个字符串,其中包含生成SQL语句影响的行数。此函数只能在执行 SELECTCREATE TABLE ASINSERTUPDATEDELETEMERGEMOVEFETCHCOPY 语句,或包含 INSERTUPDATEDELETEMERGE 语句的已准备查询的 EXECUTE 之后使用。如果生成 PGresult 的命令是其他任何内容,则 PQcmdTuples 返回空字符串。调用者不应直接释放返回值。当关联的 PGresult 句柄传递给 PQclear 时,它将被释放。

PQoidValue #

如果命令是将恰好一行插入到具有OID的表中的INSERT命令,或者是对包含合适INSERT语句的已准备查询的EXECUTE命令,则返回插入行的OIDSQL否则,此函数返回InvalidOid。如果受INSERT语句影响的表不包含OID,则此函数也将返回InvalidOid

Oid PQoidValue(const PGresult *res);
PQoidStatus #

此函数已弃用,建议使用PQoidValue,并且它不是线程安全的。它返回一个包含插入行OID的字符串,而PQoidValue返回OID值。

char *PQoidStatus(const PGresult *res);

32.3.4. 转义字符串以包含在SQL命令中 #

PQescapeLiteral #
char *PQescapeLiteral(PGconn *conn, const char *str, size_t length);

PQescapeLiteral 转义字符串以在SQL命令中使用。这在将数据值作为SQL命令中的文字常量插入时非常有用。某些字符(如引号和反斜杠)必须转义,以防止SQL解析器对其进行特殊解释。PQescapeLiteral 执行此操作。

PQescapeLiteral 返回str参数的转义版本,该版本存储在使用malloc()分配的内存中。当不再需要结果时,应使用PQfreemem()释放此内存。不需要终止零字节,也不应将其计入length中。(如果在处理length字节之前找到终止零字节,则PQescapeLiteral在零处停止;因此,其行为类似于strncpy。)返回字符串将所有特殊字符替换,以便它们可以被PostgreSQL字符串文字解析器正确处理。还会添加一个终止零字节。结果字符串中包含必须围绕PostgreSQL字符串文字的单引号。

发生错误时,PQescapeLiteral返回NULL,并在conn对象中存储适当的消息。

提示

在处理从不可信来源接收的字符串时,进行正确的转义尤其重要。否则存在安全风险:您容易受到SQL注入攻击,其中不需要的SQL命令被馈送到您的数据库。

请注意,当数据值作为PQexecParams或其同级例程中的单独参数传递时,无需也不正确地进行转义。

PQescapeIdentifier #
char *PQescapeIdentifier(PGconn *conn, const char *str, size_t length);

PQescapeIdentifier 转义字符串以用作SQL标识符,例如表、列或函数名称。当用户提供的标识符可能包含特殊字符时,这很有用,否则SQL解析器不会将其解释为标识符的一部分,或者当标识符可能包含应保留其大小写的大写字符时。

PQescapeIdentifier 返回str参数作为SQL标识符转义的版本,该版本存储在使用malloc()分配的内存中。当不再需要结果时,必须使用PQfreemem()释放此内存。不需要终止零字节,也不应将其计入length中。(如果在处理length字节之前找到终止零字节,则PQescapeIdentifier在零处停止;因此,其行为类似于strncpy。)返回字符串将所有特殊字符替换,以便它将被正确处理为SQL标识符。还会添加一个终止零字节。返回字符串也将用双引号括起来。

发生错误时,PQescapeIdentifier返回NULL,并在conn对象中存储适当的消息。

提示

与字符串文字一样,为了防止SQL注入攻击,当从不可信来源接收SQL标识符时,必须对其进行转义。

PQescapeStringConn #
size_t PQescapeStringConn(PGconn *conn,
                          char *to, const char *from, size_t length,
                          int *error);

PQescapeStringConn 转义字符串文字,类似于PQescapeLiteral。与PQescapeLiteral不同,调用者负责提供大小合适的缓冲区。此外,PQescapeStringConn不会生成必须围绕PostgreSQL字符串文字的单引号;它们应该在结果插入到的SQL命令中提供。from参数指向要转义的字符串的第一个字符,length参数给出此字符串中的字节数。不需要终止零字节,也不应将其计入length中。(如果在处理length字节之前找到终止零字节,则PQescapeStringConn在零处停止;因此,其行为类似于strncpy。)to应指向一个缓冲区,该缓冲区能够容纳至少比length值的两倍多一个字节,否则行为未定义。如果tofrom字符串重叠,行为也未定义。

如果error参数不是NULL,则成功时*error设置为零,错误时设置为非零。目前,唯一可能的错误条件涉及源字符串中的无效多字节编码。输出字符串在错误时仍然会生成,但可以预期服务器会将其拒绝为格式错误。发生错误时,无论error是否为NULL,都会在conn对象中存储适当的消息。

PQescapeStringConn返回写入to的字节数,不包括终止零字节。

PQescapeString #

PQescapeStringPQescapeStringConn的旧版本,已弃用。

size_t PQescapeString (char *to, const char *from, size_t length);

PQescapeStringConn唯一的区别是PQescapeString不接受PGconnerror参数。因此,它无法根据连接属性(如字符编码)调整其行为,因此它可能会给出错误的结果。此外,它无法报告错误条件。

PQescapeString可以安全地用于一次仅使用一个PostgreSQL连接的客户端程序(在这种情况下,它可以找出它需要幕后了解的信息)。在其他情况下,它是一种安全隐患,应避免使用,而应使用PQescapeStringConn

PQescapeByteaConn #

转义二进制数据以在SQL命令中与类型bytea一起使用。与PQescapeStringConn一样,这仅在将数据直接插入SQL命令字符串时使用。

unsigned char *PQescapeByteaConn(PGconn *conn,
                                 const unsigned char *from,
                                 size_t from_length,
                                 size_t *to_length);

某些字节值在用作语句中的bytea文字的一部分时必须转义。SQLPQescapeByteaConn使用十六进制编码或反斜杠转义来转义字节。有关更多信息,请参见第 8.4 节

from参数指向要转义的字符串的第一个字节,from_length参数给出此二进制字符串中的字节数。(不需要终止零字节,也不计入。)to_length参数指向一个变量,该变量将保存结果转义字符串的长度。此结果字符串长度包括结果的终止零字节。

PQescapeByteaConn返回from参数二进制字符串的转义版本,该版本存储在使用malloc()分配的内存中。当不再需要结果时,应使用PQfreemem()释放此内存。返回字符串将所有特殊字符替换,以便它们可以被PostgreSQL字符串文字解析器和bytea输入函数正确处理。还会添加一个终止零字节。必须围绕PostgreSQL字符串文字的单引号不是结果字符串的一部分。

发生错误时,将返回空指针,并在conn对象中存储适当的错误消息。当前,唯一可能的错误是结果字符串的内存不足。

PQescapeBytea #

PQescapeByteaPQescapeByteaConn的旧版本,已弃用。

unsigned char *PQescapeBytea(const unsigned char *from,
                             size_t from_length,
                             size_t *to_length);

PQescapeByteaConn唯一的区别是PQescapeBytea不接受PGconn参数。因此,PQescapeBytea只能安全地用于一次仅使用一个PostgreSQL连接的客户端程序(在这种情况下,它可以找出它需要幕后了解的信息)。如果在使用多个数据库连接的程序中使用它,则它可能会给出错误的结果(在这种情况下,请使用PQescapeByteaConn)。

PQunescapeBytea #

将二进制数据的字符串表示形式转换为二进制数据——这是PQescapeBytea的反向操作。当以文本格式检索bytea数据时需要此操作,但以二进制格式检索时则不需要。

unsigned char *PQunescapeBytea(const unsigned char *from, size_t *to_length);

from参数指向一个字符串,例如当应用于bytea列时,PQgetvalue可能返回的字符串。PQunescapeBytea将此字符串表示形式转换为其二进制表示形式。它返回一个指向使用malloc()分配的缓冲区的指针,或者在出错时返回NULL,并将缓冲区的大小放入to_length中。当不再需要结果时,必须使用PQfreemem释放它。

此转换并非PQescapeBytea的完全反向操作,因为从PQgetvalue接收到的字符串不应被转义。特别是这意味着无需考虑字符串引用,因此无需PGconn参数。

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用此表单报告文档问题。