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
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 |