我们正在开发迁移计划。 DB中有近8000万条记录。代码如下:
static int mymigration(struct progargs *args)
{
exec sql begin declare section;
const char *selectQuery;
const char *updateQuery;
long cur_start;
long cur_end;
long serial;
long number;
char frequency[3];
exec sql end declare section;
selectQuery = "select * from mytable where number >= ? and number <= ? for update of frequency ,status";
updateQuery = "update mytable set frequency = ?, "
" status = ? "
" where current of my_cursor";
cur_start= args->start;
cur_end = args->end;
exec sql prepare my_select_query from :selectQuery;
/* Verify the sql code for error here */
exec sql declare my_select_cursor cursor with hold for my_select_query;
exec sql open my_select_cursor using :cur_start, :cur_end;
/* Verify the sql code for error here */
exec sql prepare my_update_query from :updateQuery;
/* Verify the sql code for error here */
while (1)
{
number = 0;
serial = 0;
memset(frequency,0,sizeof(frequency));
exec sql fetch my_select_cursor into number,:serial,:frequency;
if (sqlca.sqlcode != SQL_OK)
break;
exec sql execute my_update_query using :frequency, :frequency;
}
exec sql close my_select_trade_cursor;
}
执行此操作时,我们收到错误消息“-255”。我们找到了一个解决方案,即添加工作和提交工作。由于我们有大量数据,这可能会使事务日志变得混乱。
是否有其他解决方案可用于此问题? informix的IBM网站显示用法是正确的。
提前感谢帮助。
谢谢, Mathew Liju
答案 0 :(得分:0)
错误-255是“不在交易中”。
我看不到BEGIN WORK(或COMMIT WORK或ROLLBACK WORK)语句。
在使用FOR UPDATE子句打开游标之前,需要添加BEGIN WORK。然后,您需要决定是否定期提交以避免过度交易。您使用FOR HOLD游标的事实表明您曾考虑过使用子事务;如果你不打算这样做,你就不会使用那个条款。
请注意,Informix有3种主数据库日志记录模式:
根据您描述的症状,您有一个已记录但不是MODE ANSI数据库。因此,您必须显式编写BEGIN WORK语句。