Re: Question about PQexecParams

Поиск
Список
Период
Сортировка
От Dmitriy Igrishin
Тема Re: Question about PQexecParams
Дата
Msg-id AANLkTikZjB5M=CMVt-bNEnWS+bVN0MSdod_KZKKAZmnJ@mail.gmail.com
обсуждение исходный текст
Ответ на Question about PQexecParams  ("Steve" <steeeeeveee@gmx.net>)
Ответы Re: Question about PQexecParams
Список pgsql-sql
Hey Steve,

2010/9/11 Steve <steeeeeveee@gmx.net>
Hello list,

I would like to call a function from my C application by using libpq and PQexecParams. My problem is that I don't know how to specify that I want to send an array to the function.

Assume the function is called lookup_data and takes the following parameters: lookup_data(integer,integer,bigint[])

I would like to specify the OID with my query. How would I do that? Assume I would like to query 3 values for bigint:

const char *paramValues[5];
Oid paramTypes[5];
int paramLengths[5];
int paramFormats[5];

int32_t ivalue1 = htonl(value1);
paramValues[0]  = (char *)&ivalue1;
paramTypes[0]   = INT4OID;
paramLengths[0] = sizeof(ivalue1);
paramFormats[0] = 1;

int32_t ivalue2 = htonl(value2);
paramValues[1]  = (char *)&ivalue2;
paramTypes[1]   = INT4OID;
paramLengths[1] = sizeof(ivalue2);
paramFormats[1] = 1;

etc...

How would I tell libpq that the next 3 values are an array of bigint?

I tried to use INT8OID and specify the query like below but that did not work:
SELECT * FROM lookup_data($1,$2,{$3,$4,$5})
Incorrect.

Probably I have to set the query to be:
SELECT * FROM lookup_data($1,$2,{$3})
Incorrect.

Or:
SELECT * FROM lookup_data($1,$2,$3)
Correct. You may specify a data type by OID (1016 for bigint[],
please refer to http://www.postgresql.org/docs/9.0/static/catalog-pg-type.html
to obtain information about types) or attach an explicit cast to a
parameter symbol to force treating it as bigint[] (or any specified type), e.g.
SELECT * FROM lookup_data($1, $2, $3::bigint[])


But what would I set for paramTypes? How can I say that the values are an array of bigint? I assume that I can set paramValues to be an array and paramLengths to be sizeof one value multiplied by the amount of elements in the array.
Please note, that in this case, you must pass to paramValues[2] a textual representation
of bigint[], e.g. '{1,2,3}'.
Its not necessary to specify a length of text-format parameters (its ignored).
The length is essential only if you transmit data in a binary format.
 

I am somehow lost and don't know how to call the function and pass an array to libpq.

Can any one help me with this?
Hope this helps.

Regards,
Dmitriy

В списке pgsql-sql по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: Question regarding indices
Следующее
От: Nathan Grange
Дата:
Сообщение: 9.0rc1 - query of view produces unexpected results