如何解决PostgreSQL sqlca.sqlerrd[2] 行触摸计数
当通过 ecpg(例如,PREPARE 和 EXECUTE)使用动态 SQL 时,sqlca 结构包含一个值数组,其中包括事务触及的行数。 sqlca.sqlerrd[2]中返回行数(与Oracle一致)。
在 64 位系统上使用 PostgreSQL 时,我发现 long sqlca.sqlerrd[2] 的低位和高位整数被交换。这可能与 sqlerrd 的类型被定义为“BigInt”(8 字节整数)有关。为了标准化该值,我必须交换低阶和高阶整数以获得正确的行数。我没有测试任何行数超过 int4 大小的情况。
字节/整数顺序交换是“BigInt”数据类型的函数吗?我没有遇到过需要“交换”PostgreSQL 返回的任何其他数据值。
DESCRIBE 功能为序列号返回 BigInt 数据类型,但我没有找到“BigInt”数据类型(未在头文件中定义)的翻译。这不是问题;似乎标准不支持某些 PostgreSQL 内部数据类型。
unsigned long swap_long(unsigned long num)
{
int mynum[2],mytmp;
memcpy(&mynum,&num,sizeof(mynum));
mytmp = mynum[0];
mynum[0] = mynum[1];
mynum[1] = mytmp;
memcpy(&num,&mynum,sizeof(num));
return num;
}
void my_dynmaic_sql(char* my_sqlcmd,unsigned long *touched)
{
EXEC SQL PREPARE sql_statement FROM :my_sqlcmd;
if (sqlca.sqlcode == SQL_SUCCESS)
{
EXEC SQL EXECUTE sql_statement;
*touched = swap_long(sqlca.sqlerrd[2]);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。