libpq 的 PQexecPrepared 和 SQL EXECUTE 的正确行为

Correct behavior of libpq's PQexecPrepared and SQL EXECUTE

看起来像postgres,有两种方法来准备和执行准备好的语句。您可以直接从 libpq 使用函数 PQprepare and PQexecPrepared;或者您可以发出 SQL 语句:PREPAREEXECUTE。两种方法中的语句名称相同,因此您可以使用 PQPrepare 准备语句,然后通过发出 EXECUTE 查询来执行它(或使用 PREPARE 查询,然后使用PQexecPrepared).

所以这两种方法(库函数 vs SQL 查询)是等价的。但是,当您使用 PQexecPrepared 时,pg_stat_activityquery 列似乎是带有占位符的基础准备语句。所以像:

SELECT * from users where name in (, , );

但是当您使用 EXECUTE 查询时,pg_stat_activity 包含 EXECUTE 的 SQL,例如:

EXECUTE user_query('joe', 'bob', 'sally');

问题

  1. 有没有办法让两种不同的预处理语句执行方式得到相同的输出?
  2. 有没有办法在执行准备语句时同时查看查询和绑定参数?

你是对的,两种执行准备好的语句的方式在幕后做同样的事情,但由于它们在 SQL 级别上以不同的方式被调用,它们在 pg_stat_activity 中看起来不同.没有办法改变它。

要获取语句 参数,您必须求助于日志文件。

PQexecPrepared 的情况下,如果您打开语句日志记录,您将看到作为 LOG 消息的语句和作为其 DETAIL 的参数。

对于 PREPAREEXECUTE,您别无选择,只能在会话中更早地找到 PREPARE(两者具有相同的会话标识符,即 %clog_line_prefix).