网页
综合
更新时间 2026-11-13 19:43:28
33.3. 命令执行函数
自动蜘蛛
www.runoob.com
正文约 3975 字
一旦到一个数据库服务器的连接被成功建立,这里描述的函数可以被用来执行 SQL 查询和命令。
返回一个PGresult指针或者可能是一个空指针。除了内存不足的情况或者由于严重错误无法将命令发送给服务器之外,一般都会返回一个非空指针。PQresultStatus函数应当被调用来检查返回值是否代表错误(包括空指针的值,它会返回PGRES_FATAL_ERROR)。用PQerrorMessage可得到关于那些错误的详细信息。
命令字符串可以包括多个 SQL 命令(用分号分隔)。在一次PQexec调用中被发送的多个查询会在一个事务中处理,除非其中有显式的BEGIN/COMMIT命令将该查询字符串划分成多个事务。但是注意,返回的PGresult结构只描述该字符串中被执行的最后一个命令的结果。如果一个命令失败,该字符串的处理会在它那里停止并且返回的PGresult会描述错误情况。
提交一个命令给服务器并且等待结果,它可以在 SQL 命令文本之外独立地传递参数。
PQexecParams与PQexec相似,但是提供了额外的功能:参数值可以与命令字符串分开指定,并且可以以文本或二进制格式请求查询结果。PQexecParams只在 3.0 协议及其后的连接中被支持,当使用 2.0 协议时它会失败。
要执行的 SQL 命令字符串。如果使用了参数,它们在该命令字符串中被引用为$1、$2等。
提供的参数数量。它是数组paramTypes[]、paramValues[]、paramLengths[]和paramFormats[]的长度(当nParams为零时,数组指针可以是NULL)。
通过 OID 指定要赋予给参数符号的数据类型。如果paramTypes为NULL或者该数组中任何特定元素为零,服务器会用对待未知类型文字串的方式为参数符号推测一种数据类型。
指定参数的实际值。这个数组中的一个空指针表示对应的参数为空,否则该指针指向一个以零终止的文本字符串(用于文本格式)或者以服务器所期待格式的二进制数据(用于二进制格式)。
指定二进制格式参数的实际数据长度。它对空参数和文本格式参数被忽略。当没有二进制参数时,该数组指针可以为空。
指定参数是否为文本(在参数相应的数组项中放一个零)或二进制(在参数相应的数组项中放一个一)。如果该数组指针为空,那么所有参数都会被假定为文本串。
以二进制格式传递的值要求后端所期待的内部表示形式的知识。例如,整数必须以网络字节序被传递。传递numeric值要求关于服务器存储格式的知识,正如src/backend/utils/adt/numeric.c::numeric_send()以及src/backend/utils/adt/numeric.c::numeric_recv()中所实现的。
指定零来得到文本格式的结果,或者指定一来得到二进制格式的结果(目前没有规定要求以不同格式得到不同的结果列,尽管在底层协议中这是可以实现的)。
PQexecParams相对于PQexec的主要优点是参数值可以从命令串中分离,因此避免了冗长的书写、容易发生错误的引用以及转义。
和PQexec不同,PQexecParams至多允许在给定串中出现一个 SQL 命令(其中可以有分号,但是不能有超过一个非空命令)。这是底层协议的一个限制,但是有助于抵抗 SQL 注入攻击。
通过 OID 指定参数类型很罗嗦,特别是如果你不愿意将特定的 OID 值硬编码到你的程序中时。不过,即使服务器本身也无法确定参数的类型,你可以避免这样做,或者选择一种与你想要的不同的类型。在 SQL 命令文本中,附加一个显式造型给参数符号来表示你将发送什么样的数据类型。例如:
这强制参数$1被当作bigint,而默认情况下它将被赋予与x相同的类型。当以二进制格式发送参数值时,我们强烈推荐以这种方式或通过指定一个数字类型的 OID 来强制参数类型决定。因为二进制格式比文本格式具有更少的冗余,并且因此服务器将不会有更多机会为你检测一个类型匹配错误。
提交一个请求用给定参数创建一个预备语句并且等待完成。
PQprepare创建一个后面会由PQexecPrepared执行的预备语句。这种特性允许将被反复执行的命令只被解析和规划一次,而不是在每次被执行时都解析和规划。PQprepare只在协议 3.0 及之后的连接中被支持,当使用协议 2.0 时它将失败。
该函数从query串创建一个名为stmtName的预备语句,该串必须包含一个单一 SQL 命令。stmtName可以是""来创建一个未命名语句,在这种情况下任何已存在未命名语句将被自动替换。如果语句名称已经在当前会话中被定义,则是一种错误。如果使用了任何参数,它们在查询中以$1、$2等引用。nParams是参数的个数,其类型在数组paramTypes[]中被预先指定(当nParams为零时,该数组指针可以是NULL)。paramTypes[]通过 OID 指定要赋予给参数符号的数据类型。如果paramTypes是NULL或者该数组中任何特定元素为零,服务器会用对待未知类型文字串的方式为参数符号推测一种数据类型。还有,查询能够使用编号高于nParams的参数符号,它们的数据类型也会被自动推测(找出推测出的数据类型的方法见PQdescribePrepared)。
正如PQexec一样,结果通常是一个PGresult对象,其内容代表服务器端成功或失败。一个空结果表示内存不足或者根本无法发送命令。关于错误的更多信息请见PQerrorMessage。
用于PQexecPrepared的预备语句也能通过执行 SQL PREPARE语句来创建。还有,尽管没有libpq函数来删除一个预备语句,SQL DEALLOCATE语句可被用于此目的。
发送一个请求来用给定参数执行一个预备语句,并且等待结果。
PQexecPrepared像PQexecParams,但是要被执行的命令是用之前准备的语句的名字指定,而不是指定一个查询串。这个特性允许将被重复使用的命令只被解析和规划一次,而不是在每次被执行时都被解析和规划。这个语句必须之前在当前会话中已经被准备好。PQexecPrepared仅被协议 3.0 及之后的连接支持,当使用协议 2.0 时它会失败。
参数和PQexecParams相同,除了给定的是一个预备语句的名称而不是一个查询语句,以及不存在paramTypes[]参数(因为预备语句的参数类型已经在它被创建时决定好了)。
提交一个请求来获得有关指定预备语句的信息,并且等待完成。
PQdescribePrepared允许一个应用获得有关一个之前预备好的语句的信息。PQdescribePrepared仅被协议 3.0 及之后的连接支持,当使用协议 2.0 时它会失败。
stmtName可以用""或者NULL来引用未命名语句,否则它必须是一个现有预备语句的名字。如果成功,一个PGresult以及状态PGRES_COMMAND_OK会被返回。函数PQnparams和PQparamtype可以被应用到这个PGresult来得到关于该预备语句参数的额外信息,而函数PQnfields、PQfname、PQftype等提供该语句结果列(如果有)的信息。
提交一个请求来得到有关指定入口的信息,并且等待完成。
PQdescribePortal允许一个应用获得有关一个之前被创建的入口的信息(libpq不提供对入口任何直接的访问,但是你可以使用这个函数来观察一个通过DECLARE CURSOR SQL 命令创建的游标的属性)。PQdescribePortal仅被协议 3.0 及之后的连接支持,当使用协议 2.0 时它会失败。
portalName可以用""或者NULL来引用未命名入口,否则它必须是一个现有入口的名字。如果成功,一个PGresult和状态PGRES_COMMAND_OK会被返回。函数PQnfields、PQfname、PQftype等可以被应用到PGresult来获得有关该入口结果列(如果有)的信息。
PGresult结构封装了由服务器返回的结果。libpq应用程序员应该小心地维护PGresult的抽象。使用下面的存储器函数来得到PGresult的内容。避免直接引用PGresult结构的域,因为它们可能在未来更改。
PQresultStatus能返回下列值之一:
一个返回数据的命令(例如SELECT或者SHOW)成功完成。
发生了一次非致命错误(一个提示或警告)。
向服务器复制数据/从服务器复制数据的传输开始。这个特性当前只被用于流复制,因此这个状态应该不会在普通应用中出现。
PGresult包含来自于当前命令的一个单一结果元组。这个状态只在查询选择了单一行模式时发生(见第 33.5 节)。
如果结果状态是PGRES_TUPLES_OK或者PGRES_SINGLE_TUPLE,那么下面所描述的函数能被用来检索该查询所返回的行。注意,一个恰好检索零行的SELECT命令仍然会显示PGRES_TUPLES_OK。PGRES_COMMAND_OK用于从不返回行的命令(不带RETURNING子句的INSERT或者UPDATE等)。一个PGRES_EMPTY_QUERY可能表示客户端软件中的一个缺陷。
一个状态为PGRES_NONFATAL_ERROR的结果将不会被PQexec或者其他查询执行函数直接返回,这类结果将被传递给提示处理器(见 第 33.12 节)。
将PQresultStatus返回的枚举转换成描述状态编码的字符串常量。调用者不应该释放结果。
本页为82搜索生成的网页快照,内容来自站内索引;演示数据的原文链接仅作示例。