看起来像postgres,有两种方法来准备和执行预准备语句。您可以直接使用libpq
中的PQprepare
和PQexecPrepared
功能;或者您可以发出SQL语句:PREPARE
和EXECUTE
。两种方法的语句名称相同,因此您可以使用PQPrepare
准备语句,然后通过发出EXECUTE
查询(或使用PREPARE
查询)执行它,然后执行PQexecPrepared
)。
所以这两种方法(库函数与SQL查询)是等价的。但是,看起来当您使用PQexecPrepared
时,query
的{{1}}列是带有占位符的基础预准备语句。如下所示:
pg_stat_activity
但是当您使用SELECT * from users where name in ($1, $2, $3);
查询时,EXECUTE
包含pg_stat_activity
的SQL,例如:
EXECUTE
答案 0 :(得分:1)
你是对的,执行预准备语句的两种方式在底层都做同样的事情,但由于它们在SQL级别以不同的方式被调用,它们在pg_stat_activity
中看起来不同。没有办法改变它。
要获取和语句,必须使用日志文件。
对于PQexecPrepared
,如果打开语句记录,您将看到该语句为LOG
消息,参数为DETAIL
。
使用PREPARE
和EXECUTE
,您别无选择,只能在会话中找到PREPARE
(两者都具有相同的会话标识符,即%c
在{ {1}})。