libpq的PQexecPrepared和SQL EXECUTE的正确行为

时间:2018-06-12 16:56:25

标签: sql postgresql prepared-statement

看起来像postgres,有两种方法来准备和执行预准备语句。您可以直接使用libpq中的PQpreparePQexecPrepared功能;或者您可以发出SQL语句:PREPAREEXECUTE。两种方法的语句名称相同,因此您可以使用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

问题

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

1 个答案:

答案 0 :(得分:1)

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

要获取语句,必须使用日志文件。

对于PQexecPrepared,如果打开语句记录,您将看到该语句为LOG消息,参数为DETAIL

使用PREPAREEXECUTE,您别无选择,只能在会话中找到PREPARE(两者都具有相同的会话标识符,即%c在{ {1}})。