postgreSQL:DEALLOCATE Statement

gpp925 2013-03-27 03:51:48
当使用PQprepare()创建一个statement,假定名字为“NewStatement”,使用PQexecPrepared()执行之后, 我还想使用这个名字的statement,如果直接再次PQprepare()会出现错误提示:这个statement已经存在。
我从网上搜到解决的方法是,使用DEALLOCATE statement,把这个statement销毁,然后再创建、使用就可以了。
但是在测试的时候发现,如果使用PQexec(conn,"DEALLOCATE NewStatement"),结果会出现错误提示:ERROR: prepared statement "newstatement" does not exist.(注意:这里提示的名字是改为了全部小写)。
不管这个错误,继续PQprepare(),就会出现错误提示:ERROR: prepared statement "NewStatement" already exist.(这里提示的名字又改为了原来正确的含有大写小写的名字)。真是坑爹啊。
请问是我的代码有误,还是其他神马问题啊?

const char *conninfo;
PGconn *conn;
PGresult *res;
int nFields;
int i, j;
const char* prepareStatemnet = "NewStatement";
conninfo = "user = postgres dbname = postgres ";
//创建连接
conn = PQconnectdb(conninfo);
//检查连接
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
PQerrorMessage(conn));
}
//创建prepare语句
res = PQprepare(conn, prepareStatemnet, "select * from test;", 0, NULL);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "prepare statement failed: %s",
PQerrorMessage(conn));
PQclear(res);
}
PQclear(res);
///执行preparedStatement
res = PQexecPrepared(conn, prepareStatemnet, 0, NULL, NULL, NULL, 0);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "execute prepare statement failed: %s",
PQerrorMessage(conn));
PQclear(res);
}
PQclear(res);
//---------在这里销毁prepared statement,(如果名字含有大写字母就会出错,提示不存在)
res = PQexec(conn, "DEALLOCATE NewStatement");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "prepare statement failed: %s",
PQerrorMessage(conn));
PQclear(res);
}
//再次创建prepare语句,(如果名字中含有大写字母,上一步操作提示不存在,而这里又会提示已
//经存在。)
res = PQprepare(conn, prepareStatemnet, "select * from test1;", 0, NULL);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "prepare statement failed: %s",
PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}

PQclear(res);
///执行preparedStatement
res = PQexecPrepared(conn, prepareStatemnet, 0, NULL, NULL, NULL, 0);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "execute prepare statement failed: %s",
PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
PQclear(res);

/* 关闭数据连接并清理 */
PQfinish(conn);
...全文
143 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
trainee 2013-03-27
  • 打赏
  • 举报
回复
postgresql的大小写的问题, 如果对象名不加双引号, 它会自动转换为小写 DEALLOCATE NewStatement - 它会转换为DEALLOCATE newstatement 你要么全用小写, 要么名字加双引号

954

社区成员

发帖
与我相关
我的任务
社区描述
PostgreSQL相关内容讨论
sql数据库数据库架构 技术论坛(原bbs)
社区管理员
  • PostgreSQL社区
  • yang_z_1
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧