PostgreSql查询中的参数数据类型出错

时间:2011-11-11 17:47:08

标签: c++ sql c postgresql concatenation

我正在尝试使用以下代码在PostgreSQL中执行查询。它是用C / C ++编写的,在声明游标时我不断收到以下错误:

DECLARE CURSOR failed: ERROR:  could not determine data type of parameter $1

在这里和谷歌搜索,我找不到解决方案。任何人都可以找到我所做的和错误以及为什么会发生这种情况吗?

void searchdb( PGconn *conn, char* name, char* offset )
{
// Will hold the number of field in table
int nFields;

// Start a transaction block
PGresult *res  = PQexec(conn, "BEGIN");

if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
    printf("BEGIN command failed: %s", PQerrorMessage(conn));
    PQclear(res);
    exit_nicely(conn);
}

// Clear result
PQclear(res);
printf("BEGIN command  - OK\n");
//set the values to use
const char *values[3] = {(char*)name, (char*)RESULTS_LIMIT, (char*)offset};
//calculate the lengths of each of the values
int lengths[3] = {strlen((char*)name), sizeof(RESULTS_LIMIT), sizeof(offset)};
//state which parameters are binary
int binary[3] = {0, 0, 1};

    res = PQexecParams(conn, "DECLARE emprec CURSOR for SELECT name, id, 'Events' as source FROM events_basic WHERE name LIKE '$1::varchar%' UNION ALL "
            "                 SELECT name, fsq_id, 'Venues' as source FROM venues_cache WHERE name LIKE '$1::varchar%' UNION ALL "
            "                 SELECT name, geo_id, 'Cities' as source FROM static_cities WHERE name LIKE '$1::varchar%' OR FIND_IN_SET('$1::varchar%', alternate_names) != 0 LIMIT $2::int4 OFFSET $3::int4",
    3, //number of parameters
    NULL, //ignore the Oid field
    values, //values to substitute $1 and $2
    lengths, //the lengths, in bytes, of each of the parameter values
    binary, //whether the values are binary or not
    0); //we want the result in text format

// Fetch rows from table
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
    printf("DECLARE CURSOR failed: %s", PQerrorMessage(conn));
    PQclear(res);
    exit_nicely(conn);
}

 // Clear result
PQclear(res);

res = PQexec(conn, "FETCH ALL in emprec");

if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
    printf("FETCH ALL failed");
    PQclear(res);
    exit_nicely(conn);
}

// Get the field name
nFields = PQnfields(res);

  // Prepare the header with table field name
  printf("\nFetch record:");
  printf("\n********************************************************************\n");
    for (int i = 0; i < nFields; i++)
        printf("%-30s", PQfname(res, i));
    printf("\n********************************************************************\n");

// Next, print out the record for each row
for (int i = 0; i < PQntuples(res); i++)
{
    for (int j = 0; j < nFields; j++)
        printf("%-30s", PQgetvalue(res, i, j));
    printf("\n");
}

  PQclear(res);

  // Close the emprec
  res = PQexec(conn, "CLOSE emprec");
  PQclear(res);

  // End the transaction
  res = PQexec(conn, "END");

  // Clear result
 PQclear(res);
}

1 个答案:

答案 0 :(得分:1)

尝试替换

WHERE name LIKE '$1::varchar%'

WHERE name LIKE ($1::varchar || '%')

同样处理'$1::varchar%'的所有其他事件。

有关string concatenation in the manual的更多信息。