Re: Question about PQexecParams

From: Dmitriy Igrishin <dmitigr(at)gmail(dot)com>
To: Steve <steeeeeveee(at)gmx(dot)net>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: Question about PQexecParams
Date: 2010-09-11 21:52:04
Message-ID: AANLkTikZjB5M=CMVt-bNEnWS+bVN0MSdod_KZKKAZmnJ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

Hey Steve,

2010/9/11 Steve <steeeeeveee(at)gmx(dot)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

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Nathan Grange 2010-09-12 01:31:04 9.0rc1 - query of view produces unexpected results
Previous Message Tom Lane 2010-09-11 18:22:08 Re: Question regarding indices