libpq 的 PQexecPrepared 和 SQL EXECUTE 的正确行为
Posted
技术标签:
【中文标题】libpq 的 PQexecPrepared 和 SQL EXECUTE 的正确行为【英文标题】:Correct behavior of libpq's PQexecPrepared and SQL EXECUTE 【发布时间】:2018-06-12 16:56:24 【问题描述】:看起来,使用 postgres,有两种方法可以准备和执行准备好的语句。您可以直接从libpq
使用函数PQprepare
和PQexecPrepared
;或者您可以发出 SQL 语句:PREPARE
和 EXECUTE
。两种方法中的语句名称相同,因此您可以使用PQPrepare
准备一个语句,然后通过发出EXECUTE
查询来执行它(或使用PREPARE
查询然后用PQexecPrepared
执行它)。
所以这两种方法(库函数与 SQL 查询)是等价的。但是,看起来当您使用PQexecPrepared
时,pg_stat_activity
的query
列是带有占位符的基础准备好的语句。所以像:
SELECT * from users where name in ($1, $2, $3);
但是当你使用EXECUTE
查询时,pg_stat_activity
包含EXECUTE
的SQL,比如:
EXECUTE user_query('joe', 'bob', 'sally');
问题
-
有没有办法让两种不同的执行预准备语句的方式获得相同的输出?
有没有办法在执行预准备语句时同时查看查询和绑定参数?
【问题讨论】:
【参考方案1】:您是对的,两种执行预准备语句的方式在后台执行相同的操作,但由于它们在 SQL 级别上以不同的方式调用,因此它们在 pg_stat_activity
中看起来不同。没有办法改变它。
要获得语句和你必须求助于日志文件的参数。
在PQexecPrepared
的情况下,如果您打开语句日志记录,您将看到该语句为LOG
消息,参数为它的DETAIL
。
使用PREPARE
和EXECUTE
,您别无选择,只能在会话的早期找到PREPARE
(两者具有相同的会话标识符,即log_line_prefix
中的%c
)。
【讨论】:
以上是关于libpq 的 PQexecPrepared 和 SQL EXECUTE 的正确行为的主要内容,如果未能解决你的问题,请参考以下文章