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