C语言 postgres占位符顺序

sd2nnvve  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(109)

我正在使用libpq与postgres数据库通信。在postgres中,当使用函数PQexecParams和PQprepare时,可以使用占位符,并且可以通过const char指针绑定到值。
我有问题找到关于这个功能的详细解释。例如,考虑这样的查询:

INSERT INTO ... VALUES ($1, $2, $3, $4), ($1, $5, $3, $6), ($1, $7, $3, $8)

其中$1和$3来自多行中使用的单个值,例如int或double和$2,$5,$7来自一个集合,比如vector,而$6,$7,$8来自另一个集合。
占位符是在查询执行时解析以匹配const char偏移量,还是纯粹基于索引,即占位符的索引与char指针上的偏移量匹配?即假设

const char** data

作为数据参数传递到PQexecParams或PQprepare中。以下Map有效:

data[0] -> $1
data[1] -> $2
data[3] -> $3
...
data[7] -> $8

假设我在语句中交换了两个占位符。比如,我切换前两个占位符:

INSERT INTO ... VALUES ($2, $1, $3, $4), ($1, $5, $3, $6), ($1, $7, $3, $8)

请注意,2美元现在是第一位,1美元是第二位。当基于索引时,我期望以下Map:

data[0] -> $2
data[1] -> $1
...

当解析时,我希望原始Map仍然有效,即

data[0] -> $1
data[1] -> $2

哪个是真的?

eanckbw9

eanckbw91#

这里肯定有一些事情超出了计算占位符和它们的位置:我对一个有两列col1和col2的表进行了以下查询:

INSERT INTO mytable (col1, col2) VALUES ($1, $2);

这适用于postgres和sqlite。当我用$4替换$2时,它可以在sqlite中使用find,但是我从libpq得到一条错误消息:

INSERT INTO mytable (col1, col2) VALUES ($1, $4);

错误消息为:

Status code: 7
    error string: PGRES_FATAL_ERROR
    error message: ERROR:  could not determine data type of parameter $2

相关问题