1.3 执行命令的函数
数据库连接成功地建立以后,可以用本节介绍的函数发送SQL命令给数据库执行。
1.3.1 主要的函数
PQexec
发送一个命令给数据库执行,然后等待命令执行结束。
PGresult *PQexec(PGconn *conn, const char *command);
如果返回值是一个空指针,表示遇到了错误,调用PQerrorMessage 可以得到详细的错误信息。
可以在同一个命令字符串中包含多条SQL命令,不同的SQL命令用分号隔开。如果PQexec中的命令字符串含有多条命令,而且这些命令中没有BEGIN和COMMIT,这些命令将在同一个事务里面被执行,如果其中含有BEGIN和COMMIT,则这些命令将在多个事务中被执行。只要有一条命令执行失败,剩下的命令就会被停止执行,返回的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类似,但它还具备其它的功能,包括SQL命令可以带有参数,指定查询结果用二进制或文本的格式表示。
该函数的参数如下:
conn
数据库连接对象。
command
被执行的SQL命令。如果里面含有参数,用$1, $2,…,$n表示。
nParams
被执行的SQL命令中含有的参数的个数。它也是数组paramTypes[]、paramValues[]、paramLengths[]和paramFormats[]的长度,如果nParams的值是0,这些指针的值应该是NULL。
paramTypes[]
指定SQL命令中对应的参数的数据类型,用OID表示。如果paramTypes是一个空指针或者数组paramTypes的某个元素的值是0,数据库会自动推断对应的参数的数据类型。
paramValues[]
指定SQL命令中对应的参数的值。如果这个数组中的某个元素的值是一个空指针,意思是对应的参数的值是null,否则对应的参数的值是这个指针指向的一个以/0终止的字符串(文本格式),或者是二进制数据(二进制格式)。
paramLengths[]
指定二进制格式的参数的值的长度。对于文本格式的参数,它的值被忽略。如果SQL命令中没有二进制类型的参数,指针paramLengths可以为空。
paramFormats[]
指定参数的值的格式。0表示参数是文本格式,1表示是二进制格式。如果paramFormats是一个空指针,则表示所有的参数都是文本格式。
resultFormat
指定查询结果的格式。0表示是文本格式,1表示是二进制格式。
使用PqexecParams的另一个好处是,因为参数的值没有出现在SQL命令中,而是被另外指定,可以避免使用转义字符。
与PQexec 不同的是,使用PQexecParams一次只能执行一条SQL命令,SQL命令字符串中可以出现分号,但里面只能有一个非空的命令。
提示: 使用OID来指定参数的数据类型是一个繁琐的工作,而且这样也会导致程序缺乏一致性,因为同一类型的OID在不同的数据库版本之间可能会发生变化。推荐在SQL命令中使用强制类型转换指定参数的数据类型。例如:
SELECT * FROM mytable WHERE x = $1::bigint;
在这个例子中,参数$1的类型将是bigint,默认的情况下,它与x的类型相同。
PQprepare
发一个请求给数据库,要求创建一个准备好的SQL语句。
PGresult *PQprepare(PGconn *conn,
const char *stmtName,
const char *query,
int nParams,
const Oid *paramTypes);
函数 PQprepare 创建一个准备好的语句,以后可以用 PQexecPrepared 执行这个准备好的语句。如果一条语句经常被执行,可以使用 PQprepare 为它创建查询计划,以后再用 PQexecPrepared 执行它时,就可以直接使用以前创建的查询计划,直接执行,提高了执行的效率。
参数stmtName指定准备好的语句的名字,如果它是一个空串,则创建一个未命名的语句,如果以前存在未命令的语句,则将用新的语句代替以前的语句。参数query指定具体的SQL命令,如果query中含有参数,则用$1,$2,…,$n表示。nParams是数组paramTypes的大小。数组paramTypes确定query中的参数的数据类型,用OID表示。如果nParams的值是0,paramTypes应该是一个空指针。如果paramTypes是一个空指针或者它的某个元素的值是0,数据库将自动推断query中对应的参数的数据类型。query中的参数的个数也可以大于nParams,数据库将自动推断多余的参数的数据类型。
函数的返回值是一个指向PGresult的指针。如果它为空,表示遇到错误,调用PQerrorMessage 可以得到详细的错误信息。
也可以使用SQL命令PREPARE创建准备好的语句。libpq没有提供删除准备好的语句的函数,可以用SQL命令DEALLOCATE删除准备好的语句。
PQexecPrepared
执行一条准备好的语句。
PGresult *PQexecPrepared(PGconn *conn,
const char *stmtName,
int nParams,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
参数nParams、paramValues、paramLengths、paramFormats和resultFormat与函数PQexecParams 中的参数是一样的。 StmtName是已经准备好的语句的名字。
PQdescribePrepared
得到准备好的语句的相关信息。
PGresult *PQdescribePrepared(PGconn *conn, const char *stmtName);
stmtName 如果是NULL或""表示引用未命名的准备好的语句,否则引用指定的准备好的语句。如果执行成功,PGresult的状态是PGRES_COMMAND_OK。函数PQnparams 和PQparamtype 可以从 PGresult中得到准备好的语句的参数的信息。函数PQnfields 、PQfname 和PQftype 可以从 PGresult中得到语句的查询结果包含的每个列的信息(准备好的语句也可能不返回任何列)。
PGresult结构封装了服务器返回的结果的所有信息。可以使用下面列出的函数来得到PGresult的具体内容。不要直接引用PGresult的成员,因为PGresult的结构在将来可能会发生变化。
|