Hey Steve,

2010/9/11 Steve <steeeeev...@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

Reply via email to