PostgreSQL: связь между типами, заданными с заполнителями, и типами в параметре PQexecPrepared () paramValues - PullRequest
0 голосов
/ 18 января 2019

Если у меня есть заполнитель, заданный как $1::text, означает ли это, что соответствующий paramValues, который я передаю PQexecPrepared(), должен быть строкой в ​​стиле C? До сих пор я делал это таким образом, и пока это работает. (И до сих пор мне нужно было дать ::text вместе с заполнителем, или я получаю ошибку). Но что, если я объявлю заполнитель как $1:int? Могу ли я дать строку в стиле C в paramValues? Должен ли дать строку в стиле C? Документы на этом немного расплывчаты и не очень ясны в отношении того, что делать с параметром paramTypes для PQprepare(), который я все равно оставил NULL.

Что еще более важно, что, если мне нужно выразить массив, например $1::text[]? Документы ничего не говорят об этом, и решения, которые я видел до сих пор, не кажутся очень эффективными или даже очень надежными, такие как https://stackoverflow.com/a/36930781/1676382. До сих пор я давал значения 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);

Пока что это работает, но что, если бы я хотел получить

WHERE col = ANY ($1::text[])

? Как бы я выразил values, который передается в PQexecPrepared()?

Мой проект в GNU C ++ с использованием PostgreSQL 9.6.

1 Ответ

0 голосов
/ 18 января 2019

Если вы отправили нетипизированные строковые аргументы, как в вашем примере, они будут иметь тип unknown и будут преобразованы в правильный тип, если это возможно. Это очень похоже на строковые литералы в операторах SQL.

Нет необходимости приводить к text в операторе SQL. Мне было бы любопытно, какой тип col, если вы считаете, что этот бросок необходим.

Если вы хотите передать text[] в текстовом формате, просто используйте его строковое представление, например

{first element,two,three}

Это также будет работать для целых чисел и других типов; просто используйте текстовое представление значения.

Вы также можете использовать аргумент paramTypes для PQexecParams, чтобы указать, какой тип это явно. Возможные значения находятся в столбце oid pg_type, и они являются постоянными для системных типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...