PostgreSQL:带有占位符的类型与PQexecPrepared()paramValues参数

时间:2019-01-18 15:04:58

标签: c postgresql prepared-statement type-resolution

如果我给定的占位符为$1::text,这是否意味着我传递给paramValues的相应PQexecPrepared()必须是C样式的字符串?到目前为止,我已经这样做了,到目前为止,它已经成功了。 (到目前为止,我需要给::text加上占位符,否则会出错)。但是,如果我将占位符声明为$1:int怎么办?我还能在paramValues中提供C样式的字符串吗? 应该我给出一个C风格的字符串吗? docs on this含糊不清,目前尚不清楚我该如何使用paramTypes的{​​{1}}的{​​{1}}参数来做什么。

更重要的是,如果我需要表达一个数组,例如PQprepare(),该怎么办?文档对此一无所获,到目前为止,我所见过的解决方案似乎效率不高甚至不可靠,例如https://stackoverflow.com/a/36930781/1676382。到目前为止,我一直以“文本”格式将值提供给NULL,但是我应该在什么条件下切换到“二进制”?

到目前为止,我已经能够摆脱一些非常简单的查询:

$1::text[]

...

PQexecPrepared()

到目前为止,这可行,但是如果我想拥有

const char *query = "SELECT * FROM table WHERE col=$1::text";
const void *types = NULL;    //Wish I knew what could be assigned to an Oid
PQprepare(conn, name, query, 1, static_cast<const Oid *>(types));

?我该如何表达传递给const int *lengths = NULL; //It doesn't seem like these vars are used for anything right now const int *formats = NULL; int result_format = 0; //values is a const char * const * and is the return value of QScopedArrayPointer <char*>::data() res = PQexecPrepared(conn, name, 1, values, lengths, formats, result_format); 的{​​{1}}?

我的项目是使用PostgreSQL 9.6的GNU C ++。

1 个答案:

答案 0 :(得分:0)

如果像示例中那样发送了无类型的字符串参数,则它们将具有类型unknown并尽可能转换为正确的类型。这与SQL语句中的字符串文字非常相似。

在SQL语句中不必强制转换为text。如果您发现需要强制转换,我会很好奇col的类型。

如果要以文本格式传递text[],只需使用其字符串表示形式,例如

{first element,two,three}

这也适用于整数和其他类型;只需使用值的文本表示形式即可。

您还可以使用paramTypes的{​​{1}}参数来明确指定它的类型。可能的值在PQexecParams的{​​{1}}列中,并且对于系统类型来说是恒定的。